DNS-attack

пираты карибского моря в локальной сети:\\ погоня за DNS и воздвижение защитной стены

крис касперски ака мыщъх, a.k.a. nezumi, no-email

приватные локальные сети (получившие большую распространенность в последнее время) оказались совершенно беззащитными перед DNS-атаками, позволяющими перехватывать чужой трафик, а так же скрытно перенаправлять жертву на подложные сайты, занимающиеся сбором паролей или другой хакерской деятельностью. как реализуются такие атаки? можно ли от них защититься? вот об этом мы сейчас и поговорим!

Не будем объяснять читателю, что такое «доменные имена» и зачем они применяются. Читатель, небось, не дурак и сам об этом прекрасно догадывается. Каждый раз, когда мы подключаемся к какому-нибудь сетевому ресурсу, наш узел отправляет доменное имя DNS-серверу (адрес которого автоматически выдается провайдером при входе в Интернет или жестко прописывается в настройках TCP/IP-соединения). В ответ возвращается один из нескольких IP-адресов удаленного сетевого ресурса или сообщение, что узел с данным именем не существует.

Что значит «один из IP-адресов?» — может спросить читатель. А то, что с одним доменным именем может быть ассоциировано множество IP-адресов, что позволяет равномерно распределять нагрузку между узлами, а так же продолжать нормальную работу, если один из серверов ушел в отказ. Но это уже технические детали. Еще существует файл /etc/hosts, хранящийся в папке \WINNT\system32\drivers и занимающийся сопоставлением доменных имен/IP-адресов, имеющий более высокий приоритет чем DNS-сервер.

Это простой текстовой файл, который может изменять как сам пользователь компьютера, так и засланная туда программа, например, вирус, подменяющий истинный IP-адрес службы windows update на хакерский узел со всеми отсюда вытекающими. Или же присваивающий подложные IP-адреса службам mail.ru, webmoney.ru… Однако, чтобы сделать это, в компьютер жертвы необходимо как-то забраться, что не так-то просто, особенно если за ним сидит не лох, а продвинутый гуру, следящий за своей безопасностью, пользующийся антивирусами и регулярно скачивающий свежие заплатки.

На самом деле можно подломать и гуру, причем так, что он ничего подозрительного даже не заметит!!!

dns-attack_image_0.jpg

Рисунок 1 схема атаки на DNS-сервер общим планом, без углубления в детали

Обмен данными между DNS-сервером и DNS-клиентом (встроенным в каждый компьютер) может происходить как по UDP, так и по TCP/IP протоколу. По умолчанию выбирается UDP, как наиболее быстродействующий и не требующий установки соединения, однако, чрезвычайно уязвимый к атакам. И вот почему. Отправив запрос DNS-серверу, узел жертвы охотно принимает фальшивый ответ, если только пакет, сконструированный хакером, отвечает определенным требованиям. Что это за требования?

Прежде всего, узел жертвы формирует «порт-отправителя», на который и ожидает получить ответ от DNS. Алгоритм формирования порта-отправителя не стандартизирован, но в общем случае дело происходит так: при первом запросе порт-отправителя устанавливается в 1023 и затем увеличивается на единицу с каждым DNS-запросом, а при исчерпании 16-битного счетчика, порт-отправителя снова сбрасывается в 1023.

DNS-запрос размещается в UDP-пакете и помимо прочего содержит идентификатор запроса (ID) и доменное имя узла, IP-адрес которого нужно разрешить. DNS-сервер в своем ответе возвращает идентификатор запроса и доменное имя вместе с IP-адресом (ну или адресом более компетентного DNS-сервера к которому следует обратиться за вопросом, но это опять-таки детали).

+—————————+—————————+

ID (the famous :) flags

+—————————+—————————+

numbers of questions numbers of answer

+—————————+—————————+

number of RR authority number of supplementary RR

+—————————+—————————+

\ \

\ QUESTION \

+——————————————————-+

\ \

\ ANSWER \

+——————————————————-+

\ \

\ Stuff etc.. No matter \

+——————————————————-+

Рисунок 2 структура DNS-пакета

Суть в том, что для отправки поддельного DNS-ответа нам необходимо знать (угадать, перехватить, подобрать): порт-отправителя, идентификатор запроса и доменное имя узла. Проницательным хакерам удавалось осуществлять даже «слепые» межсегментные атаки, то есть атакующий находился на одном конце земли, а жертва — на другом. Атака обычно осуществляется направленным штормом DNS-ответов с различными параметрами в надежде, что хоть один из них да подойдет. А чтобы настоящий DNS-сервер не успел послать свой ответ вперед хакера, он временно выводится из строя (например, путем DoS/DDoS атаки).

Системы обнаружения вторжений, установленные на магистральных каналах связи, легко распознают такой вид атак и щемят хакеров только так. Но в приватных локальных сетях ситуация совершенно иная.

Локальные сети, собранные на коксиале, позволяют беспрепятственно перехватывать чужой трафик, поскольку, он физически проходит через все машины данного сегмента сети. Пакет, отправленный в сеть, принимается даже теми сетевыми картами, которым он не предназначен. Сетевая карта просто сверяет свой MAC-адрес с MAC-адресом получателя пакета, прописанного в Ethernet заголовке и либо обрабатывает его (в случае совпадения адресов), либо же отбрасывает. Однако, существует возможность программного перевода карты в так называемый «неразборчивый» режим, в котором она «хавает» все пакеты. Именно по этой технологии работают сетевые снифферы (sniffers) как хакерские, так и вполне легальные, предназначенные для диагностики сети.

Но с переходом на витую пару и интеллектуальные маршрутизаторы (а других сегодня, пожалуй, нигде кроме как в музее и не найти) доставляют пакет только тому получателю, чей MAC-адрес совпадает с MAC-адресом, прописанным в заголовке, то есть чужой трафик так просто не перехватить!

Но тут есть один деликатный момент. Физически, Ethernet-сети работают на MAC-адресах, что расшифровывается как Media Access Control address (Управление Доступом к Носителю), в то время как в Интернете рулят IP-адреса.

Каждый узел локальной сети, работающий с TCP/IP протоколом, имеет специальную ARP-таблицу (Address Resolution Protocol —протокол разрешения адресов), предназначенную для преобразования IP-адресов в MAC-адреса, а самим преобразованием занимается ARP-протокол, работающий по следующей схеме: если MAC-адрес получателя неизвестен, в локальную сеть отправляется широковещательный запрос типа «обладатель данного IP, сообщите свой MAC-адрес». Полученный ответ заносится в уже упомянутую ARP-таблицу, кстати говоря, периодически обновляющуюся примерно раз минуту. Точное значение зависит от типа операционной системы, а так же ее конфигурации и варьируется от 30 секунд до 20 минут.

Рисунок 3 структура ARP-пакета

Никакой авторизации для обновления ARP-таблицы не требуется, более того, большинство операционных систем «заглатывают» подложные ARP-ответы даже если им не предшествовали никакие ARP-запросы.

Таким образом, для того, чтобы марштутизатор пересылал чужой трафик на хакерский Ethernet-порт, атакующий должен модифицировать ARP-таблицу жертвы, что осуществляется посылкой подложного направленного или широковещательного ARP-ответа, содержащего IP-адрес DNS-сервера провайдера и свой собственный MAC-адрес.

Жертва послушно обновляет ARP-таблицу, после чего все DNS-запросы поступают прямиком на хакерский узел. Что будет делать с ними хакер?! Да ничего особенного, просто установит у себя любой бесплатный DNS-сервер из многих имеющихся и будет исправно разрешать доменные имена.

Вот только для некоторых особо интересных доменных имен будет сделано исключение и в настойках DNS-сервера хакер пропишет фальшивые IP-адреса, которыми, как нетрудно догадаться, окажутся адреса подконтрольных ему узлов, с установленными «копиями» WEB-серверов или просто proxy-серверами, грабящими весь проходящий трафик. Однако, следует помнить, что если соединение осуществляется по протоколу HTTPS, то в логах proxy не окажется ничего интересного, так что возводить подложные WEB-сервера все же намного более предпочтительно (хоть полное копирование интерфейса чужого сервера — не самое простое занятие).

Для успешного хакерствования в водах карибского моря нам потребуется три вещи: утилита, формирующая поддельные ARP-запросы, DNS-сервер и WEB-сервер. Естественно, если мы хотим перехватывать почтовый трафик, передаваемый по протоколам POP3/SMTP, то и почтовый сервер нам понадобиться тоже.

Рисунок 4 место, где можно надыбать множество бесплатных ARP-утилит для атаки

Раздобыть ARP-утилиту можно, например, на Packet Storm'e. Просто вводим в строку поиска слово «ARP»и выбираем себе бифштекс по вкусу, благо выбирать там есть из чего. Большинство утилит поставляются непосредственно в исходных текстах и работают только в UNIX-подобных системах, но… с появлением виртуальных машин типа VM Ware это обстоятельство перестало быть существенной проблемой.

Просто ставим себе VM Ware (если не сделали этого ранее) и натягиваем любой Linux (внимание: некоторые ARP-утилиты работают только со строго определенными дистрибутивами Linux'а или BSD, так что чтение инструкции перед установкой — это рулез). Просто запустите атакующую ARP-утилиту и укажите в командной строке свой собственный MAC-адрес и адрес DNS-сервера провайдера, отправив в сеть широковещательный подложный ARP-ответ (см. справку по ключам соответствующей ARP-утилиты).

Рисунок 5 Linux, загружаемый из-под виртуальной машины VM Ware, установленной на Windows, вполне пригоден для запуска атакующих ARP-утилит, при условии, что виртуальной машине разрешен доступ к физической Ethernet сети (конфигурация по умолчанию)

Как узнать свой MAC-адрес? Запустите штатную утилиту ipconfig.exe с ключом /all и она выдаст всю информацию (MAC-адрес будет прописан в графе «физический адрес» для каждой сетевой карты).

Рисунок 6 узнаем свой MAC-адрес с помощью штатной Windows-утилиты ipconfig.exe, запущенной с ключом /all

А как узнать IP-адрес настоящего DNS-сервера? Нет ничего проще! Вызываем штатную Windows-утилиту nslookup.exe и она тут же сообщает «Default DNS Server» (сервер по умолчанию) вместе с его IP-адресом.

Рисунок 7 узнаем IP-адрес DNS-сервера провайдера с помощью штатной Windows-утилиты nslookup.exe

Но, прежде, чем запускать ARP-утилиту, заставляющую всех членов данного сегмента локальной сети забыть о настоящем DNS и валить DNS-запросы на наш хакерский узел, нам, естественно, необходимо установить свой собственный DNS-сервер, который эти самые запросы и будет обрабатывать, иначе произойдет сплошной облом.

Из бесплатных DNS-серверов, работающих под Windows, мыщъх рекомендует Small HTTP Server, включающий в себя: Web Server, HTTP proxy, DNS server, DHCP server, FTP server, SMTP server, POP3 server и много всякой всячины. Ну разве не рулез?! Лежит это добро на http://smallsrv.com и настраивается с пол-пинка.

Рисунок 8 отсюда можно скачать замечательный бесплатный Small HTTP сервер, включающий в себя: Web Server, HTTP proxy, DNS server, DHCP server, FTP server, SMTP server, POP3 server, etc

Ну и как он настраивается?! Поконкретнее, пожалуйста, спросит придирчивый читатель. Короче, значит, запускам инсталлятор, который ничем не отличается от миллионов других таких же точно инсталляторов и никаких вопросов на данном этапе установки у нас не возникает. Затем, зарегистрировав сервер на «Гражданина бывшего СНГ» (регистрация бесплатна и описана в документации), запускам файл http.exe и щелкаем правой кнопкой мыши по иконке, появившейся в системном трее, выбирая в контекстном меню пункт «Settings» (установки).

Рисунок 9 иконка Small HTTP сервера в системном трее

На экран вылезает разлапистое диалоговое окно. Находим в нем пункт «DNS». Там будет пункт «Host file. File with host names and IP address for DNS server» (Хост файл. Файл с доменными именами и IP-адресами, используемый DNS-сервером).

Рисунок 10 настройка параметров DNS-сервера

Хост-файл имеет достаточно сложную структуру и чтобы не грузить читателя лишними детали, мыщъх приводит готовый листинг, заставляющий нас локальный DNS-сервер обращаться к корневым DNS-серверам. Просто создайте host-файл в любом месте диска, скопируете в него следующий текст и укажите путь к файлу в настройках DNS-сервера.

. IN NS a.root-servers.net

a.root-servers.net IN A 198.41.0.4

. IN NS b.root-servers.net

b.root-servers.net IN A 128.9.0.107

. IN NS c.root-servers.net

c.root-servers.net IN A 192.33.4.12

. IN NS d.root-servers.net

d.root-servers.net IN A 128.8.10.90

. IN NS e.root-servers.net

e.root-servers.net IN A 192.203.230.10

. IN NS f.root-servers.net

f.root-servers.net IN A 192.5.5.241

. IN NS g.root-servers.net

g.root-servers.net IN A 192.112.36.4

. IN NS h.root-servers.net

h.root-servers.net IN A 128.63.2.53

Листинг 1 строки, которые необходимо добавить в host-файл, чтобы наш DNS-сервер обращался за разрешением запросов к корневым DNS-серверам

Теперь, получив запрос на разрешение доменного имени от одного из клиентов, наш сервер обратиться к одному из корневых DNS-серверов и вернет ответ жертве как будто бы она обратилась к настоящему DNS-серверу, предоставленному провайдером. Ну и какой в этом кайф?! Фактически мы будем обслуживать чужие DNS-запросы на халяву. А навар?!

А вот и навар! Добавив в host-файл одну или несколько строк вида…

83.239.33.46 www.sysinternals.com

Листинг 2 строка, которую необходимо добавить в host-файл, чтобы заменить истинный IP-адрес сервера www.sysinternals.com, хакерским IP-адресом

…мы сможем изменить IP-адрес узла www.sysinternals.comна любой другой IP-адрес. Например, адрес порно-сервера или нашего собственного WEB-сервера, который можно создать с помощью того же Small HTTP сервера или Microsoft Personal Web-сервера. Тут, как говориться, на вкус и цвет товарищей нет, ну а техника сайтостроения это уже совсем другая тема, которой посвящены сотни книг и тысячи статей. Зачем же мыщъх здесь будет повторяться?!

Проведем небольшой эксперимент. После добавления в host-файл строки, приведенной в листинге 2, запустим браузер и наберем «www.sysinternals.com» и… вместо ожидаемой странички мы попадем в нору мыщъха! Тоже самое произойдет и со всеми остальными атакованными пользователями приватной локальной сети.

При этом следует помнить о двух вещах. Поскольку ARP-таблицы периодически обновляется и хакнутый MAC-адрес вновь заменяется правильным, то атакующую ARP-утилиту следует закинуть в планировщик (курите инструкцию к штатной Windows-команде «at»).

Второе: у некоторых провайдеров стоит система обнаружения вторжений, просекающая попытки (успешные, разумеется) вторжения в ARP-таблицы, после чего провайдеру остается установить вектор атаки (то есть определить Ethernet-порт хакера) и надавать ему по ушам. Однако, в подавляющем большинстве случаев никакой защиты нет и потому методику ее обхода мыщъх решил не рассматривать (во всяком случае пока, а там…).

Хачить чужие компьютеры — это хорошо. Ой, что за чушь я несу?! Это плохо и вообще противозаконно, но еще хуже, когда кто-то захачит нас. Надо же как-то защищаться?! А защититься можно (и нужно) с помощью все того же Small HTTP сервера, установив свой собственный DNS-сервер, напрямую обращающийся к корневым DNS-серверам через TCP-протокол. Тогда нас никакой хакер не взломает!!!

Для этого нужно установить Small HTTP сервер на свой компьютер, активировать DNS по методике, описанной выше, и назначить его основным DNS-сервером, выбросив DNS-сервер провайдера на фиг за полной ненадобностью.

Вообще-то, обращение к корневым серверам — процедура не быстрая и слегка замедляющая WEB-сервфинг, во всяком случае теоретически. Практически же Small HTTP сервер кэширует DNS-запросы, так что задержка возникает лишь при первом посещении данного ресурса, зато потом ответ от локального сервера возвращается практически мгновенно, намного быстрее, чем от DNS-сервера провайдера. Более того, у многих провайдеров DNS серверы не только тормозят, но еще и косячат, то есть отвечают, что нет мол, узла с таким именем, даже если такой узел заведомо есть. В общем, мыщъх уже больше года работает исключительно через локальный DNS и страшно доволен. Исчезли многие глюки и тормоза, так достававшие меня ранее.

В настройках Small HTTP сервера выбираем меню «DNS», находим поле «Size of cache for names (in bytes)» (Размер кэша имен в байтах) и увеличиваем его на сколько не жалко. Чем больше размер кэша, тем больше доменных имен в нем поместиться и тем реже будут происходить повторные обращения к корневым DNS-серверам. (Изменение размера кэша возымеет действие только после перезапуска Small HTTP сервера — просто закройте его, а потом запустите вновь).

Самое главное — необходимо взвести галочку «Enable DNS over TCP» (Использовать TCP протокол для DNS-запросов), что с 99,999% гарантирует невозможность создания подложного пакета, который бы DNS сервер воспринял как правильный.

Остается только прописать адрес нашего локального DNS сервера (всегда равный 127.0.0.1) в качестве основного. На первый взгляд кажется — нет ничего проще! Находим в «Панели управления» папку «Сеть и удаленный доступ к сети», выбираем нужное сетевое соединение, в контекстом меню заходим в «Свойства», лезем в настройки протокола TCP/IP, переводим радио кнопку из положения «Получать адрес DNS-сервера автоматически» в положение «Использовать следующие адреса DNS-серверов» и пишем в нижеследующей графе «127…» И вот тут-то нас ждет облом-с!!! Windows ехидно сообщает «IP-адреса, начинающиеся с 127, не являются допустимыми, поскольку они зарезервированы для адресов замыкания на себя. Укажите другое, допустимое значение в диапазоне от 1 до 223».

Рисунок 11 коварная Windows не позволяет назначать DNS-серверу адрес 127.0.0.1 через графический интерфейс

Обладатели статических IP-адресов, могут просто махнуть хвостом, и прописать свой реальный IP-адрес (который можно узнать с помощью штатной утилиты ipconfig.exe), однако, как быть тем, у кого IP-адрес назначается провайдером динамически и меняется при каждом входе в сеть?!

Приходиться прибегать к прямому редактированию реестра. Запускаем regedit.exe (с правами администратора), захотим в следующую ветвь системного реестра HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\, где видим все имеющиеся у нас сетевые интерфейсы, а точнее соответствующие им идентификаторы вида: {13D988FF-8252-4F2A-94CC-BC36E90EDFA0}. Как найти из них нужный?!

Рисунок 12 назначение IP-адреса локальному DNS-серверу через Редактор Реестра

Поочередно открывая ветви идентификаторов один за другим, смотрим на поле «NameServer», в котором содержится IP-адрес DNS-сервера, назначенного провайдером. Если он совпадет с IP-адресом, выданным утилитой nslookup.exe, то, значит, мы нашли, что искали и меняем этот адрес на «127.0.0.1». Перезагрузка не требуется. Все! С этого момента DNS-сервер провайдера отдыхает и все запросы идут через наш собственный локальный сервер, проследить за активностью которого можно кликнув левой кнопкой мыши по иконке Small HTTP сервера в системном трее. Откроется консольное окно, в которое сервер валит свой лог, созерцанием которого можно наслаждаться часами вплоть до выпадения в полную медитацию.

Рисунок 13 созерцание протокола обращения к DNS-серверам — отличное средство для медитации

Мы проделали большую работу. Самое время подвести итог: мы установили свой собственный DNS-сервер, не только защищающий нас от хакерских атак, не только ускоряющий WEB-серфинг, но еще и позволяющий забыть о глюках DNS-сервера, установленного у нашего провайдера.

С другой стороны, мы получили мощное оружие, позволяющее атаковать других, например, в качестве показательных тестов на проникновение. Криминальная составляющая DNS-атак выходит за рамки данной статьи и за этим лучше обратиться к юристу и запастись толковым адвокатом, на всякий случай оставив в духовке сушить сухари. Шутка. Расслабитесь. Приватные локальные сети как раз тем и хороши, что большинство из них уже находятся вне закона и работают без всякой лицензии, а потому обращаться в суд никто не будет. Впрочем… лично мыщъх предпочитает атаковать свои собственные виртуальные сети в порядке чистого эксперимента и ожидает того же от читателей.