Запуск DNSChef
DNSChef – это кроссплатформенное приложение, созданное на Python, которое должно запускаться на большинстве платформ, которые имеют интерпретатор Python. На хостах Windows вы можете использовать предоставляемый dnschef.exe для запуска программы без установки интерпретатора Python. Эта инструкция сконцентрирована на окружении Unix (в частности Arch Linux / BlackArch), тем не менее, все примеры из неё также протестировались в работе на Windows.
Если программа у вас ещё не установлена, в BlackArch это можно сделать так:
sudo pacman -S dnschef python2-dnslib python2-ipy
Давайте начнём знакомство с DNSChef с функциональности мониторинга. Выполните следующую команду от рута (требуется для запуска сервера на порту 53):
sudo dnschef _ _ __ | | version 0.3 | | / _| __| |_ __ ___ ___| |__ ___| |_ / _` | '_ \/ __|/ __| '_ \ / _ \ _| | (_| | | | \__ \ (__| | | | __/ | \__,_|_| |_|___/\___|_| |_|\___|_| iphelix@thesprawl.org [*] 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 suip.biz 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: suip.biz has address 185.117.153.79
DNSChef напечатает следующую строку лога, показывающую время, источник IP адреса, тип запрошенной записи и, самое главное, какое имя было в запросе:
[09:30:46] 127.0.0.1: proxying the response of type 'A' for suip.biz
Этот режим полезен для простого мониторинга приложения, где вам нужно выяснить, какие домены оно использует для своих коммуникаций.
DNSChef имеет полную поддержку IPv6, которая может быть активирована флагами -6 или --ipv6. Это работает в точности, как и режим IPv4, за тем исключением, что прослушиваемый по умолчанию интерфейс переключается на ::1, а DNS сервер по умолчанию переключается на 2001:4860:4860::8888. Вот пример вывода:
sudo dnschef -6 _ _ __ | | version 0.3 | | / _| __| |_ __ ___ ___| |__ ___| |_ / _` | '_ \/ __|/ __| '_ \ / _ \ _| | (_| | | | \__ \ (__| | | | __/ | \__,_|_| |_|___/\___|_| |_|\___|_| iphelix@thesprawl.org [*] 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:
sudo dnschef --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. Первая строка в 23:55:57 показывает, что мы «готовим» для ответа запись "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 – иметь наименьшее вмешательство в текущую операцию программы, поэтому если приложение полагается на определённый почтовый сервер, оно корректно получит один из ретранслируемых запросов.
Давайте подменим ещё один запрос для иллюстрации, как нацелиться на множество записей одновременно:
sudo dnschef --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 поддерживает множество типов записи из командной строки:
+--------+--------------+-----------+--------------------------+ | Record | Description |Argument | Example | +--------+--------------+-----------+--------------------------+ | A | IPv4 address |--fakeip | --fakeip 192.0.2.1 | | AAAA | IPv6 address |--fakeipv6 | --fakeipv6 2001:db8::1 | | MX | Mail server |--fakemail | --fakemail mail.fake.com | | CNAME | CNAME record |--fakealias| --fakealias www.fake.com | | NS | Name server |--fakens | --fakens ns.fake.com | +--------+--------------+-----------+--------------------------+
ПРИМЕЧАНИЕ: Для удобства использования не все типы DNS записей представлены в командной строке. Дополнительные записи, такие как PTR, TXT, SOA, SRV, DNSKEY, RRSIG и т.д. могут быть заданы с использованием флага --file и соответствующего заголовка записи. Смотрите ниже секцию указания внешнего файла для подробностей.
Наконец, давайте посмотрим, как приложение обрабатывает запросы ANY (ЛЮБОГО) типа:
sudo dnschef --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.
Фильтрация доменов
Используя пример выше, рассмотрим ситуацию, что вы хотите перехватить запросы только для blackarch.ru и оставить запросы на все другие домены, такие как suip.biz без модификации. Вы можете использовать параметр --fakedomains как проиллюстрировано ниже:
sudo dnschef --fakeip 127.0.0.1 --fakedomains blackarch.ru -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 blackarch.ru 127.0.0.1 [00:23:52] 127.0.0.1: proxying the response of type 'A' for mx9.suip.biz
В примере выше запрос для blackarch.ru был подменён; при этом запрос для mx9.suip.biz остался нетронут. Фильтрация доменов – очень полезна, когда вы пытаетесь изолировать отдельное приложение без поломки остальных.
ПРИМЕЧАНИЕ: DNSChef перед подделыванием запроса не будет верифицировать, существует ли домен или нет. Если вы указали домен, то он всегда будет преобразован на фальшивое значение в независимости от своего существования.
Обратная фильтрация
В другой ситуации вам может понадобится сфальсифицировать ответ для всех запросов кроме определённого списка доменов. Вы можете выполнить эту задачу используя параметр --truedomains следующим образом:
sudo dnschef --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 записи может быть недостаточным. Вы можете использовать внешний файл с набором пар ДОМЕН=ЗАПИСЬ, определяющих в точности, куда вы хотите, чтобы шёл запрос.
Например, давайте создадим следующий файл определений и назовём его dnschef.ini:
[A] *.google.com=192.0.2.1 thesprawl.org=192.0.2.2 *.wordpress.*=192.0.2.3
Обратите внимание на заголовок секции [A], им определён тип записи для to DNSChef. Теперь давайте внимательно посмотрим на вывод множества запросов:
sudo dnschef --file dnschef.ini -q [*] DNSChef started on interface: 127.0.0.1 [*] Using the following nameservers: 8.8.8.8 [+] Cooking A replies for domain *.google.com with '192.0.2.1' [+] Cooking A replies for domain thesprawl.org with '192.0.2.2' [+] Cooking A replies for domain *.wordpress.* with '192.0.2.3' [00:43:54] 127.0.0.1: cooking the response of type 'A' for google.com to 192.0.2.1 [00:44:05] 127.0.0.1: cooking the response of type 'A' for www.google.com to 192.0.2.1 [00:44:19] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 192.0.2.2 [00:44:29] 127.0.0.1: proxying the response of type 'A' for www.thesprawl.org [00:44:40] 127.0.0.1: cooking the response of type 'A' for www.wordpress.org to 192.0.2.3 [00:44:51] 127.0.0.1: cooking the response of type 'A' for wordpress.com to 192.0.2.3 [00:45:02] 127.0.0.1: proxying the response of type 'A' for slashdot.org
И google.com, и www.google.com соответствуют записи *.google.com и корректно преобразованы в 192.0.2.1. С другой стороны запрос www.thesprawl.org был просто передан вместо модификации. Наконец, все значения wordpress.com, www.wordpress.org т.д. соответствуют маске *.wordpress.* и корректно преобразованы в 192.0.2.3. Наконец неопределённый запрос slashdot.org был просто передан на реальный DNS сервер и для него возвращено правдивое значение.
Вы можете указать заголовки секций для всех поддерживаемых DNS типов записей, включая те, которые очевидным образом не используются в командной строке: [A], [AAAA], [MX], [NS], [CNAME], [PTR], [NAPTR] и [SOA]. Например, давайте определим новую секцию [PTR] в файле 'dnschef.ini':
[PTR] *.2.0.192.in-addr.arpa=fake.com
Давайте понаблюдаем за поведением DNSChef с этим новым типом записи:
sudo dnschef --file dnschef.ini -q [sudo] password for iphelix: [*] DNSChef started on interface: 127.0.0.1 [*] Using the following nameservers: 8.8.8.8 [+] Cooking PTR replies for domain *.2.0.192.in-addr.arpa with 'fake.com' [00:11:34] 127.0.0.1: cooking the response of type 'PTR' for 1.2.0.192.in-addr.arpa to fake.com
А здесь то, что может увидеть клиент при выполнении DNS запросов преобразования.
host 192.0.2.1 localhost 1.2.0.192.in-addr.arpa domain name pointer fake.com.
Некоторые записи требуют чёткого форматирования. Хорошие примеры этого записи SOA, NAPTR и SRV:
[SOA] *.thesprawl.org=ns.fake.com. hostmaster.fake.com. 1 10800 3600 604800 3600 [NAPTR] *.thesprawl.org=100 10 U E2U+sip !^.*$!sip:customer-service@fake.com! . [SRV] ; FORMAT: priority weight port target *.*.thesprawl.org=0 5 5060 sipserver.fake.com
Смотрите файл с образцами dnschef.ini для дополнительных примеров.
Продвинутое фильтрование
Вы можете перемешивать и подгонять вывод из файла и командной строки. Например, следующая команда использует параметры --file и --fakedomains:
sudo dnschef --file dnschef.ini --fakeip 6.6.6.6 --fakedomains=thesprawl.org,slashdot.org -q [*] DNSChef started on interface: 127.0.0.1 [*] Using the following nameservers: 8.8.8.8 [+] Cooking A replies for domain *.google.com with '192.0.2.1' [+] Cooking A replies for domain thesprawl.org with '192.0.2.2' [+] Cooking A replies for domain *.wordpress.* with '192.0.2.3' [*] Cooking A replies to point to 6.6.6.6 matching: *.wordpress.*, *.google.com, thesprawl.org [*] Cooking A replies to point to 6.6.6.6 matching: slashdot.org, *.wordpress.*, *.google.com, thesprawl.org [00:49:05] 127.0.0.1: cooking the response of type 'A' for google.com to 192.0.2.1 [00:49:15] 127.0.0.1: cooking the response of type 'A' for slashdot.org to 6.6.6.6 [00:49:31] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 6.6.6.6 [00:50:08] 127.0.0.1: proxying the response of type 'A' for tor.com
Обратите внимание, что указание thesprawl.org в командной строке имеет приоритет над dnschef.ini. Это может быть полезным если вы хотите переписать значения в конфигурационном файле. slashdot.org всё ещё преобразуется к фальшивому IP адресу, поскольку он был указан в параметре –fakedomains. Запросы tor.com просто ретранслируются, поскольку не были обозначены ни в командной строке, ни в конфигурационном файле.
Ведение логов
DNSChef с использованием опции командной строки --logfile log1.txt способен сохранять журнал активности во внешний файл. Ниже выдержка примера сессии DNSChef:
[05/Nov/2014:22:00:49 -0800] DNSChef is active. [05/Nov/2014:22:01:07 -0800] 127.0.0.1: cooking the response of type 'A' for thesprawl.org to 192.0.2.1 [05/Nov/2014:22:07:24 -0800] DNSChef is shutting down.
Другие настройки
По причинам безопасности DNSChef прослушивает по умолчанию локальный интерфейс 127.0.0.1 (или ::1 для IPv6). С параметром --interface вы можете сделать так, что DNSChef будет прослушивать другой интерфейс:
sudo dnschef --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:
sudo dnschef -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:
sudo dnschef --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 можно указать нестандартные сервера имён:
sudo dnschef --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 будет подключаться к удалённому сервера используя протокол UDP. Это поведение можно контролировать более точно, используя нотацию IP#PORT#PROTOCOL, чтобы вместо дефолтного использовать протокол TCP:
sudo dnschef --nameservers 4.2.2.2#53#tcp -q [*] DNSChef started on interface: 127.0.0.1 [*] Using the following nameservers: 4.2.2.2#53#tcp [*] No parameters were specified. Running in full proxy mode [22:08:48] 127.0.0.1: proxying the response of type 'A' for thesprawl.org
В то же самое время сам DNSChef можно запустить на альтернативном порту параметром -p port#:
sudo dnschef -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:
sudo dnschef --tcp -q [*] 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 is running in TCP mode
Использование DNSChef на сервере (VDS)
Если вы хотите, чтобы к вашему фальшивому DNS серверу DNSChef могли подключаться из глобальной сети, то вам нужен белый IP адрес. Самый простой и надёжный способ реализовать это – использовать VDS.
Для возможности запуска DNSChef на VDS вам необходимо и достаточно:
- Установить Arch Linux / BlackArch на VDS / VPS
- Настроить статический IP адрес в Arch Linux / BlackArch
После этого можно запускать DNSChef. Но для того, чтобы к нему могли подключиться из вне, вам нужно явно указать IP вашего сервера после опции -i.
Если вы забыли свой IP, то узнать его можно так:
ip a
В моём случае у сервера IP адрес 185.117.153.79, поэтому команда имеет вид:
sudo dnschef -i 185.117.153.79 --logfile=/root/dns.log &
Здесь
- -i 185.117.153.79 – IP адрес сервера с фальшивым DNS
- --logfile=/root/dns.log – файл, в котором будет записана вся DNS активность
- & – этот символ используется для перевода процесса в фон. Благодаря этому мы можем продолжить работу в терминале. Дополнительную информацию по этому вопросу найдёте в статье «Как закрыть терминал без убийства запущенной в нём команды».
Чтобы проверить, прослушивается ли порт 53 выполните команду:
ss -pnau
После этого адрес вашего DNS сервера можно использовать в качестве адреса первичного DNS сервера.
Посмотреть полученные данные:
cat /root/dns.log
Использование DNSChef для перенаправления на копии оригинальных сайтов
С DNS прокси мы полностью контролируем, что именно откроется в браузере жертвы при попытке открытия любого хоста. Это открывает широчайшие возможности для социальной инженерии и использования копий сайтов. Вы можете установить на тот же самый сервер, где запущен DNSChef, веб-сервер и создать любое количество любых виртуальных хостов: vk.com, facebook.com и т.д.; создать копии оригинальных сайтов (достаточно формы для ввода паролей) и… собирать учётные данные или другую чувствительную информацию. Это можно сделать, например, с помощью Social-Engineer Toolkit (SET).
Для реализации этой схемы необходим установленный веб сервер. Узнать как это сделать можно из статьи «Установка LAMP (Linux, Apache, MySQL/MariaDB, PHP7 и phpMyAdmin) в Arch Linux / BlackArch».
Заключение
Посмотреть другие опции DNSChef вы можете на странице программы в Энциклопедии пентестера.
Подменить популярные сайты не получится из-за отсутствия сертификата, а сейчас hsts вшит в браузер, тогда как сделать редирект при переходе на любой из сайтов на другой домен, даже если юзер перейдет по https ссылке?