
DNSChef (NG) — DNS-прокси для специалистов по пентесту и аналитиков вредоносного ПО
[!NOTE] Это обновлённая версия DNSChef, изначально написанного @iphelix``` _ _ __
| | v0.7 | | / |
| | __ ___ | | | | ______ _ __ __ _ /| '_ \/ __|/ __| '_ \ / _ \ _|______| '_ \ / _| | (| | | | _ \ (__| | | | __/ | | | | | (| | _,|| ||/_|| ||___|| || ||_, | / | |_/ D O C U M E N T A T I O N
DNSChef — это высококонфигурируемый DNS-прокси для специалистов по тестированию на проникновение и аналитиков вредоносного ПО. DNS-прокси (также известный как «Fake DNS») — это инструмент, используемый для анализа сетевого трафика приложений и других целей. Например, DNS-прокси можно использовать для подмены запросов к «badguy.com», чтобы они указывали на локальную машину для блокировки или перехвата, а не на реальный хост в Интернете.
Существует несколько DNS-прокси. Большинство из них просто перенаправляют все DNS-запросы на один IP-адрес или реализуют лишь примитивную фильтрацию. DNSChef был разработан в рамках теста на проникновение, когда возникла потребность в более гибко настраиваемой системе. В результате DNSChef — это кроссплатформенное приложение, способное подделывать ответы на основе включающих и исключающих списков доменов, поддерживающее несколько типов DNS-записей, сопоставление доменов с подстановочными знаками, проксирование настоящих ответов для несопоставленных доменов, внешние конфигурационные файлы, IPv6 и многие другие функции. Подробное описание каждой функции и рекомендуемые сценарии использования приведены ниже.
Использование DNS-прокси рекомендуется в ситуациях, когда невозможно заставить приложение напрямую использовать какой-либо другой прокси-сервер. Например, некоторые мобильные приложения полностью игнорируют настройки HTTP-прокси операционной системы. В таких случаях использование DNS-прокси, например DNSChef, позволяет обмануть приложение и заставить его перенаправлять соединения на нужный адрес.
## Новые возможности
- Требуется Python 3.11+
- Поддерживает передачу файлов через DNS (пока только через `A`, `AAAA`, `TXT`...)
- Конфигурационный файл теперь в формате TOML
- Опциональный HTTP API (позволяет запрашивать логи и обновлять конфигурацию удалённо)
- Полностью асинхронный для повышения производительности (использует AsyncIO)
- Структурированное логирование и ряд улучшений качества жизни
- Теперь является Python-пакетом
- Поддержка Docker
- Включён ряд PR и исправлений из оригинального репозитория
## Установка
Для установки последнего релиза следует использовать [pipx](https://pypa.github.io/pipx/) (если только ты не говнюк, который любит грязные стейки):
pipx install dnschef-ng
Если вам нужен HTTP API (требуются дополнительные зависимости):
pipx install dnschef-ng[api]
Установите последнюю версию из Git, используя pipx:
pipx install git+https://github.com/byt3bl33d3r/dnschef-ng.git
Установите последнюю версию из Git с помощью pipx вместе с зависимостями для HTTP API:
pipx install "git+https://github.com/byt3bl33d3r/dnschef-ng.git#egg=dnschef-ng[api]"
## Настройка DNS-прокси
Прежде чем начать использовать DNSChef, необходимо настроить вашу машину на использование DNS-сервера, на котором запущен этот инструмент. У вас есть несколько вариантов в зависимости от операционной системы:
- **Linux** — Отредактируйте */etc/resolv.conf*, добавив в самое начало строку с вашим хостом для анализа трафика (например, добавьте «nameserver 127.0.0.1», если вы работаете локально). Кроме того, можно добавить адрес DNS-сервера с помощью таких инструментов, как Network Manager. В Network Manager откройте *Параметры IPv4*, выберите *Только автоматические (DHCP) адреса* или *Вручную* из выпадающего списка *Метод* и отредактируйте текстовое поле *DNS-серверы*, указав IP-адрес, на котором запущен DNSChef.
- **Windows** — Выберите *Сетевые подключения* в *Панели управления*. Затем выберите одно из подключений (например, «Local Area Connection»), щёлкните по нему правой кнопкой мыши и выберите «Свойства». В появившемся диалоговом окне выберите *Интернет-протокол (TCP/IP)* и нажмите «Свойства». Наконец, выберите переключатель *Использовать следующие адреса DNS-серверов* и введите IP-адрес, на котором запущен DNSChef. Например, если вы работаете локально, введите 127.0.0.1.
- **OS X** — Откройте *Системные настройки* и нажмите на значок *Сеть*. Выберите активный интерфейс и заполните поле *DNS-сервер*. Если вы используете AirPort, вам нужно нажать кнопку *Дополнительно...* и изменить DNS-серверы там. В качестве альтернативы можно отредактировать */etc/resolv.conf* и добавить поддельный DNS-сервер в самое начало (например, «nameserver 127.0.0.1»).
- **iOS** — Откройте *Настройки* и выберите *Основные*. Затем выберите *Wi-Fi* и нажмите на синюю стрелку справа от активной точки доступа в списке. Измените запись DNS, чтобы она указывала на хост, на котором запущен DNSChef. Убедитесь, что вы отключили сотовую связь (если она доступна).
- **Android** — Откройте *Настройки* и выберите *Беспроводные сети*. Нажмите на *Настройки Wi-Fi* и выберите *Дополнительно*, нажав кнопку *Опции* на телефоне. Установите флажок *Использовать статический IP-адрес* и настройте собственный DNS-сервер.
Если у вас нет возможности изменить DNS-настройки устройства вручную, у вас всё ещё есть несколько вариантов, включая такие техники, как [ARP Spoofing](http://en.wikipedia.org/wiki/ARP_spoofing), [Rogue DHCP](http://www.yersinia.net/doc.htm) и другие творческие методы.
Наконец, вам нужно настроить поддельный сервис, на который DNSChef будет направлять все запросы. Например, если вы пытаетесь перехватывать веб-трафик, необходимо поднять отдельный веб-сервер на порту 80 или настроить веб-прокси (например, Burp) для перехвата трафика. DNSChef будет направлять запросы на ваш хост с прокси/сервером, на котором правильно настроены соответствующие сервисы.
## Запуск DNSChef
DNSChef — это кроссплатформенное приложение, разработанное на Python, которое должно работать на большинстве платформ с интерпретатором 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*, который будет рассмотрен позже.
## Запуск HTTP API DNSChef
> [!WARNING]
> API не имеет аутентификации. Разрешайте/запрещайте доступ на уровне сети через security groups, iptables, межсетевой экран и т. д.
`uvicorn dnschef.api:app`
Затем вы можете просмотреть документацию OpenAPI по адресу `http://127.0.0.1:8000/docs````
$ uvicorn dnschef.api:app
INFO: Started server process [28327]
INFO: Waiting for application startup.
_ _ __
| | version 0.6.0 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
@iphelix // @byt3bl33d3r
2023-09-28 11:24:59 cooking replies domain=*.thesprawl.org record=192.0.2.1 section=A
2023-09-28 11:24:59 cooking replies domain=*.thesprawl.org record=2001:db8::1 section=AAAA
-- SNIP --
2023-09-28 11:24:59 cooking replies domain=*.thesprawl.org record=1 . alpn=h2 ipv4hint=127.0.0.1 ipv6hint=::1 section=HTTPS
INFO: Application startup complete.
2023-09-28 11:24:59 DNSChef is active interface=127.0.0.1 ipv6=False nameservers=['8.8.8.8'] port=53 tcp=False
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Теперь, когда вы знаете, как запустить 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 поддерживает несколько типов записей:
ПРИМЕЧАНИЕ: Для удобства не все типы 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.toml:```toml
[A]
".google.com"="192.0.2.1"
"thesprawl.org"="192.0.2.2"
".wordpress.*"="192.0.2.3"
Обратите внимание на заголовок секции `[A]`, он определяет тип записи для DNSChef. Теперь внимательно посмотрим на вывод нескольких запросов:
# ./dnschef.py --file dnschef.toml -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-записей, включая те, которые явно не показаны в командной строке: [A], [AAAA], [MX], [NS], [CNAME], [PTR], [NAPTR] и [SOA]. Например, давайте определим новую секцию [PTR] в файле `dnschef.toml`:```toml
[PTR]
"*.2.0.192.in-addr.arpa"="fake.com"
Давайте посмотрим на поведение DNSChef с этим новым типом записи:
./dnschef.py --file dnschef.toml -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.```toml [SOA] "*.thesprawl.org" = "ns.fake.com. hostmaster.fake.com. 1 10800 3600 604800 3600"
[NAPTR] ".thesprawl.org" = "100 10 U E2U+sip !^.$!sip:[email protected]! ."
Дополнительные примеры см. в образце файла `dnschef.toml`.
## Подготовка файлов
DNSChef может «размещать» любой файл через DNS. В настоящее время размещение файлов поддерживается только с записями `A`, `AAAA` и `TXT` (в дальнейшем будет добавлено больше). Чтобы указать DNSChef разместить файл, добавьте следующий раздел в ваш `dnschef.toml`:```toml
[A]
"*.wat.org" = { file = "/home/payload.exe", chunk_size = 4 }
[AAAA]
"*.gorgetowngeronimos.org" = { file = "/home/payload.exe", chunk_size = 16 }
[!NOTE] Параметр
chunk_sizeявляется необязательным, и его поведение сильно зависит от типа запроса. Например: поскольку запросыAвозвращают IPv4-адрес, максимально допустимыйchunk_sizeравен 4 байтам. Установкаchunk_sizeбольше 4 будет проигнорирована.
Запрос A к *.wat.org, содержащий число в DNS-имени, теперь вернёт соответствующий фрагмент файла. Например, запрос ns0.wat.org вернёт IPv4-адрес, содержащий первый фрагмент файла (4 байта). Запрос для test1.wat.org вернёт второй фрагмент файла и т. д.
При использовании wildcard-доменов, как в приведённых примерах, номера «фрагментов» можно размещать где угодно, и они не обязательно должны быть вместе. Например, A-запрос для 1aliens2.wat.org вернёт 12-й фрагмент файла.
Записи TXT поддерживают дополнительные возможности для промежуточного хранения файлов, так как они обеспечивают большую гибкость:```toml
[TXT]
"ns*.dungbeetle.org" = { file = "~/payload.exe", chunk_size = 189, response_format = "{prefix}test-{chunk}", response_prefix_pool = ["atlassian-domain-verification=", "onetrust-domain-verification=", "docusign=" ] }
При такой конфигурации любой `TXT`-запрос к `ns*.dungbeetle.org` будет возвращать фрагмент нашего файла, расположенного локально в файловой системе по пути `~/payload.exe`.
Настройки `response_format` и `response_prefix_pool` являются необязательными, но позволяют дополнительно настроить DNS-ответ `TXT`.
Настройка `response_format` определяет формат ответа `TXT`:
- Переменная `{prefix}` будет случайным образом заменена на одно из значений, определённых в массиве `response_prefix_pool`.
- Переменная `{chunk}` будет заменена на фрагмент файла.
При указанной выше конфигурации `TXT`-запрос к `ns1.dungbeetle.org` вернёт следующий ответ:```
docusign=test-<BASE64_ENCODED_FILE_CHUNK_N1>
Если вы выполните ещё один TXT-запрос (например, ns10.dungbeetle.org), вы увидите, что префикс изменится:```
atlassian-domain-verification=test-<BASE64_ENCODED_FILE_CHUNK_N10>
## Расширенная фильтрация
Вы можете комбинировать ввод из файла и из командной строки. Например, следующая команда использует оба параметра `--file` и `--fakedomains`:
# ./dnschef.py --file dnschef.toml --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.toml*. Это может быть полезно, если вы хотите переопределить значения в файле конфигурации. slashdot.org по-прежнему резолвится на поддельный IP-адрес, поскольку он был указан в параметре *--fakedomains*. Запрос tor.com просто проксируется, так как он не был указан ни в командной строке, ни в файле конфигурации.
## Другие конфигурации
По соображениям безопасности 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 port#`:
# ./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`.
| Запись | Описание | Аргумент | Пример |
|---|
| 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 |