
DNSChef - DNS-прокси для тестировщиков на проникновение и аналитиков вредоносного ПО
| | version 0.4 | | / _|
| | __ ___ | | __| |
/ ` | ' / |/ | ' \ / _ \ |
| (| | | | _ \ (| | | | __/ |
_,|| ||/_|| ||___||
Д О К У М Е Н Т А Ц И Я
DNSChef — это высоконастраиваемый DNS-прокси для специалистов по тестированию на проникновение и аналитиков вредоносного ПО. DNS-прокси (также известный как «Fake DNS») — это инструмент, используемый, среди прочего, для анализа сетевого трафика приложений. Например, DNS-прокси можно использовать для подмены запросов к «badguy.com», чтобы они указывали на локальную машину для завершения или перехвата, а не на реальный хост где-то в Интернете.
Существует множество DNS-прокси. Большинство из них просто направляют все DNS-запросы на один IP-адрес или реализуют лишь примитивную фильтрацию. DNSChef был разработан в рамках тестирования на проникновение, когда возникла потребность в более настраиваемой системе. В результате DNSChef является кроссплатформенным приложением, способным подделывать ответы на основе включающих и исключающих списков доменов, поддерживать несколько типов DNS-записей, сопоставлять домены с подстановочными знаками, проксировать истинные ответы для доменов, не попавших под критерии, определять внешние конфигурационные файлы, поддерживать IPv6 и многие другие функции. Ниже вы найдете подробное описание каждой из функций и предлагаемые варианты использования.
Использование DNS-прокси рекомендуется в ситуациях, когда невозможно заставить приложение напрямую использовать другой прокси-сервер. Например, некоторые мобильные приложения полностью игнорируют настройки HTTP-прокси операционной системы. В таких случаях использование DNS-прокси-сервера, такого как DNSChef, позволит вам обмануть это приложение, заставив его перенаправлять соединения на нужный адрес.
Прежде чем вы сможете начать использовать DNSChef, необходимо настроить вашу машину на использование DNS-сервера имен с запущенным на нем инструментом. У вас есть несколько вариантов в зависимости от используемой операционной системы:
Linux — Отредактируйте /etc/resolv.conf, добавив строку в самое начало с хостом анализа трафика (например, добавьте "nameserver 127.0.0.1", если вы работаете локально). В качестве альтернативы вы можете добавить адрес DNS-сервера с помощью таких инструментов, как Network Manager. В Network Manager откройте настройки IPv4, выберите Automatic (DHCP) addresses only или Manual в раскрывающемся списке Method и отредактируйте текстовое поле DNS Servers, указав IP-адрес, на котором запущен DNSChef.
Windows — Выберите Network Connections (Сетевые подключения) в Панели управления. Затем выберите одно из подключений (например, «Подключение по локальной сети»), щелкните по нему правой кнопкой мыши и выберите «Свойства». В появившемся диалоговом окне выберите Internet Protocol (TCP/IP) и нажмите «Свойства». Наконец, выберите переключатель Use the following DNS server addresses (Использовать следующие адреса DNS-серверов) и введите IP-адрес, на котором запущен DNSChef. Например, если вы работаете локально, введите 127.0.0.1.
OS X — Откройте System Preferences (Системные настройки) и щелкните по значку Network (Сеть). Выберите активный интерфейс и заполните поле DNS Server (DNS-сервер). Если вы используете Airport, вам нужно нажать кнопку Advanced... (Дополнительно) и отредактировать DNS-серверы оттуда. В качестве альтернативы вы можете отредактировать /etc/resolv.conf и добавить поддельный сервер имен в самое начало (например, "nameserver 127.0.0.1").
iOS — Откройте Settings (Настройки) и выберите General (Основные). Затем выберите Wi-Fi и нажмите на синюю стрелку справа от активной точки доступа из списка. Отредактируйте запись DNS, указав хост, на котором запущен DNSChef. Убедитесь, что вы отключили сотовый интерфейс (если доступно).
Android — Откройте Settings (Настройки) и выберите Wireless and network (Беспроводные сети и сети). Нажмите на Wi-Fi settings (Настройки Wi-Fi) и выберите Advanced (Дополнительно) после нажатия кнопки Options (Параметры) на телефоне. Включите флажок Use static IP (Использовать статический IP) и настройте пользовательский DNS-сервер.
Если у вас нет возможности вручную изменить настройки DNS на устройстве, у вас все равно есть несколько вариантов, включающих такие методы, как ARP Spoofing, Rogue DHCP и другие творческие подходы.
Наконец, вам необходимо настроить поддельный сервис, на который DNSChef будет направлять все запросы. Например, если вы пытаетесь перехватить веб-трафик, вам необходимо либо поднять отдельный веб-сервер, работающий на порту 80, либо настроить веб-прокси (например, Burp) для перехвата трафика. DNSChef будет направлять запросы на ваш хост прокси/сервера с правильно настроенными сервисами.
DNSChef — это кроссплатформенное приложение, разработанное на Python, которое должно работать на большинстве платформ, где установлен интерпретатор Python. Вы можете использовать прилагаемый исполняемый файл dnschef.exe для запуска на хостах Windows без установки интерпретатора Python. Это руководство будет сфокусировано на средах Unix, однако все приведенные ниже примеры были протестированы и работают в Windows.
Давайте попробуем DNSChef в его самой базовой функции мониторинга. Выполните следующую команду от root (требуется для запуска сервера на порту 53):
# ./dnschef.py
_ _ __
| | version 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
Без каких-либо параметров DNSChef будет работать в режиме полного прокси. Это означает, что все запросы будут просто перенаправляться вышестоящему DNS-серверу (по умолчанию 8.8.8.8) и возвращаться обратно запрашивающему хосту. Например, давайте запросим запись «A» для домена и посмотрим результаты:
$ host -t A thesprawl.org
thesprawl.org has address 108.59.3.64
DNSChef выведет следующую строку журнала, показывающую время, исходный IP-адрес, тип запрошенной записи и, что наиболее важно, какое имя было запрошено:
[23:54:03] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
Этот режим полезен для простого мониторинга приложений, когда вам нужно выяснить, какие домены оно использует для связи.
DNSChef имеет полную поддержку IPv6, которая активируется с помощью флагов -6 или --ipv6*. Он работает точно так же, как и режим IPv4, за исключением того, что интерфейс прослушивания по умолчанию переключается на ::1, а DNS-сервер по умолчанию переключается на 2001:4860:4860::8888. Вот пример вывода:
# ./dnschef.py -6
_ _ __
| | version 0.2 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
[email protected]
[*] Using IPv6 mode.
[*] DNSChef started on interface: ::1
[*] Using the following nameservers: 2001:4860:4860::8888
[*] No parameters were specified. Running in full proxy mode
[00:35:44] ::1: proxying the response of type 'A' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'AAAA' for thesprawl.org
[00:35:44] ::1: proxying the response of type 'MX' for thesprawl.org
ПРИМЕЧАНИЕ: По умолчанию DNSChef создает UDP-слушатель. Вы можете использовать TCP вместо него с аргументом --tcp, который будет рассмотрен позже.
Теперь, когда вы знаете, как запустить DNSChef, давайте настроим его на подмену всех ответов, чтобы они указывали на 127.0.0.1, используя параметр --fakeip:
# ./dnschef.py --fakeip 127.0.0.1 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[23:55:57] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[23:55:57] 127.0.0.1: proxying the response of type 'AAAA' for google.com
[23:55:57] 127.0.0.1: proxying the response of type 'MX' for google.com
В приведенном выше выводе вы видите, что DNSChef был настроен на проксирование всех запросов на 127.0.0.1. Первая строка журнала в 08:11:23 показывает, что мы «подменили» ответ для записи «A», указав на 127.0.0.1. Однако последующие запросы для записей «AAAA» и «MX» просто проксируются с реального DNS-сервера. Давайте посмотрим вывод запрашивающей программы:
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address 2001:4860:4001:803::1001
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
Как видите, программа была обманута и использовала 127.0.0.1 для IPv4-адреса. Однако информация, полученная для IPv6 (AAAA) и почтовых записей (MX), выглядит полностью легитимной. Цель DNSChef — минимально влиять на корректную работу программы, поэтому если приложение полагается на определенный почтовый сервер, оно правильно получит его через этот проксированный запрос.
Давайте подделаем еще один запрос, чтобы проиллюстрировать, как одновременно нацеливаться на несколько записей:
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[*] Cooking all AAAA replies to point to ::1
[00:02:14] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
[00:02:14] 127.0.0.1: cooking the response of type 'AAAA' for google.com to ::1
[00:02:14] 127.0.0.1: proxying the response of type 'MX' for google.com
В дополнение к флагу --fakeip, я теперь указал --fakeipv6, предназначенный для подмены запросов записи «AAAA». Вот обновленный вывод программы:
$ host google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
Опять же, все записи, явно не переопределенные приложением, были проксированы и возвращены с реального DNS-сервера. Однако IPv4 (A) и IPv6 (AAAA) были подделаны, чтобы указывать на локальную машину.
DNSChef поддерживает несколько типов записей:
+--------+--------------+-----------+--------------------------+
| Запись | Описание | Аргумент | Пример |
+--------+--------------+-----------+--------------------------+
| A | IPv4-адрес | --fakeip | --fakeip 192.0.2.1 |
| AAAA | IPv6-адрес | --fakeipv6| --fakeipv6 2001:db8::1 |
| MX | Почтовый сервер|--fakemail| --fakemail mail.fake.com |
| CNAME | CNAME-запись |--fakealias| --fakealias www.fake.com|
| NS | Сервер имен |--fakens | --fakens ns.fake.com |
+--------+--------------+-----------+--------------------------+
ПРИМЕЧАНИЕ: Для удобства не все типы DNS-записей доступны из командной строки. Дополнительные записи, такие как PTR, TXT, SOA и т. д., можно указать с помощью флага --file и соответствующего заголовка записи. См. раздел внешний файл определений ниже для подробностей.
Наконец, давайте посмотрим, как приложение обрабатывает запросы типа ANY:
# ./dnschef.py --fakeip 127.0.0.1 --fakeipv6 ::1 --fakemail mail.fake.com --fakealias www.fake.com --fakens ns.fake.com -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking all A replies to point to 127.0.0.1
[*] Cooking all AAAA replies to point to ::1
[*] Cooking all MX replies to point to mail.fake.com
[*] Cooking all CNAME replies to point to www.fake.com
[*] Cooking all NS replies to point to ns.fake.com
[00:17:29] 127.0.0.1: cooking the response of type 'ANY' for google.com with all known fake records.
Запросы DNS ANY записей приводят к тому, что DNSChef возвращает все известные поддельные записи для применимого домена. Вот вывод, который увидит программа:
$ host -t ANY google.com localhost
google.com has address 127.0.0.1
google.com has IPv6 address ::1
google.com mail is handled by 10 mail.fake.com.
google.com is an alias for www.fake.com.
google.com name server ns.fake.com.
Используя приведенный выше пример, представьте, что вы хотите перехватывать запросы только для thesprawl.org и оставлять запросы ко всем остальным доменам, таким как webfaction.com, без изменений. Вы можете использовать параметр --fakedomains, как показано ниже:
# ./dnschef.py --fakeip 127.0.0.1 --fakedomains thesprawl.org -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking replies to point to 127.0.0.1 matching: thesprawl.org
[00:23:37] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 127.0.0.1
[00:23:52] 127.0.0.1: proxying the response of type 'A' for mx9.webfaction.com
Из приведенного выше примера запрос для thesprawl.org был подделан, однако запрос для mx9.webfaction.com остался без изменений. Фильтрация доменов очень полезна, когда вы пытаетесь изолировать одно приложение, не нарушая работу остальных.
ПРИМЕЧАНИЕ: DNSChef не будет проверять, существует ли домен, прежде чем подделать ответ. Если вы указали домен, он всегда будет разрешаться в поддельное значение, независимо от того, существует он на самом деле или нет.
В другой ситуации вам может потребоваться подделывать ответы для всех запросов, кроме определенного списка доменов. Вы можете выполнить эту задачу, используя параметр --truedomains, следующим образом:
# ./dnschef.py --fakeip 127.0.0.1 --truedomains thesprawl.org,*.webfaction.com -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] Cooking replies to point to 127.0.0.1 not matching: *.webfaction.com, thesprawl.org
[00:27:57] 127.0.0.1: proxying the response of type 'A' for mx9.webfaction.com
[00:28:05] 127.0.0.1: cooking the response of type 'A' for google.com to 127.0.0.1
В приведенном выше примере происходит несколько вещей. Во-первых, обратите внимание на использование подстановочного знака (*). Все домены, соответствующие *.webfaction.com, будут обратно сопоставлены и разрешены в свои истинные значения. Запрос для 'google.com' вернул 127.0.0.1, потому что он не был в списке исключенных доменов.
ПРИМЕЧАНИЕ: Подстановочные знаки привязаны к позиции. Маска типа *.thesprawl.org будет соответствовать www.thesprawl.org, но не www.test.thesprawl.org. Однако маска типа ..thesprawl.org будет соответствовать thesprawl.org, www.thesprawl.org и www.test.thesprawl.org.
Могут возникнуть ситуации, когда определение одной поддельной DNS-записи для всех соответствующих доменов может быть недостаточным. Вы можете использовать внешний файл с набором пар DOMAIN=RECORD, точно определяющих, кудПо соображениям безопасности DNSChef по умолчанию прослушивает локальный интерфейс 127.0.0.1 (или ::1 для IPv6). Вы можете заставить DNSChef прослушивать другой интерфейс с помощью параметра --interface:
# ./dnschef.py --interface 0.0.0.0 -q
[*] DNSChef started on interface: 0.0.0.0
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
[00:50:53] 192.0.2.105: proxying the response of type 'A' for thesprawl.org
или для IPv6:
# ./dnschef.py -6 --interface :: -q
[*] Using IPv6 mode.
[*] DNSChef started on interface: ::
[*] Using the following nameservers: 2001:4860:4860::8888
[*] No parameters were specified. Running in full proxy mode
[00:57:46] 2001:db8::105: proxying the response of type 'A' for thesprawl.org
По умолчанию DNSChef использует общедоступный DNS-сервер Google для выполнения прокси-запросов. Однако вы можете задать собственный список серверов имен с помощью параметра --nameservers:
# ./dnschef.py --nameservers 4.2.2.1,4.2.2.2 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 4.2.2.1, 4.2.2.2
[*] No parameters were specified. Running in full proxy mode
[00:55:08] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
Можно указать нестандартный порт сервера имен, используя нотацию IP#PORT:
# ./dnschef.py --nameservers 192.0.2.2#5353 -q
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 192.0.2.2#5353
[*] No parameters were specified. Running in full proxy mode
[02:03:12] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
В то же время можно запустить сам DNSChef на альтернативном порту, используя параметр -p порт#:
# ./dnschef.py -p 5353 -q
[*] Listening on an alternative port 5353
[*] DNSChef started on interface: 127.0.0.1
[*] Using the following nameservers: 8.8.8.8
[*] No parameters were specified. Running in full proxy mode
Протокол DNS может использоваться через UDP (по умолчанию) или TCP. DNSChef реализует режим TCP, который можно активировать флагом --tcp.
Ниже приведена информация о внутреннем устройстве на случай, если вам потребуется адаптировать инструмент под свои нужды. DNSChef построен на основе модуля SocketServer и использует многопоточность для параллельной обработки нескольких запросов. Инструмент предназначен для прослушивания TCP- или UDP-портов (по умолчанию порт 53) для входящих запросов и пересылки этих запросов при необходимости на реальный DNS-сервер через UDP.
Отличная библиотека dnslib используется для разбора и сборки DNS-пакетов. Она особенно полезна при формировании ответных пакетов на основе запросов.
DNSChef может изменять запросы для записей типа "A", "AAAA", "MX", "CNAME", "NS", "TXT", "PTR", "NAPTR", "SOA", "ANY". Очень легко расширить или изменить поведение для любой записи. Просто добавьте еще один блок if qtype == "ТИП ЗАПИСИ") и укажите, что отвечать.
Наслаждайтесь инструментом и направляйте все запросы и комментарии на iphelix [at] thesprawl.org.
Удачного взлома! -Питер