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

Автор: (c)Крис Касперски ака мыщъх

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

Введение

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

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

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

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

Схема атаки на DNS-сервер

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

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-атаки).

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

ARP-атаки в локальных сетях

Локальные сети, собранные на коаксиале, позволяют беспрепятственно перехватывать чужой трафик, поскольку он физически проходит через все машины данного сегмента сети. Пакет, отправленный в сеть, принимается даже теми сетевыми картами, которым он не предназначен. Сетевая карта просто сверяет свой 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 минут.

Структура ARP-пакета

Рисунок 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, то и почтовый сервер нам понадобится тоже.

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

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

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

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

Linux

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

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

Узнаем свой MAC-адрес

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

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

Узнаем IP-адрес DNS-сервера

Рисунок 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 и настраивается с пол-пинка.

Отсюда можно скачать замечательный бесплатный Small HTTP сервер

Рисунок 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".

Коварная Windows

Рисунок 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}. Как найти из них нужный?!

Назначение IP-адреса

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

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

Созерцание протокола обращения к DNS-серверам

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

Заключение

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

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