Как пошутить дома над пользователями интернета при помощи Dnschef ?
Dnschef - это прокси DNS принимает запросы и логирует их и не только. Пишет какой хост куда обращается, еще умеет делать подмену DNS запросов. Задумал приколоцо над своими домашними пользователями при запросе страниц в VK всем пользователям домашней сети будет выдаваться страница с надписью - “Ваша карма очищена. VK заблокирован. Медитируйте.”. Да есть более современные аналоги, но я пока поигрался с Dnschef.
Что надо сделать ?
Нужен сервер
Для реализации задуманного уже предполагается, что есть сервер типа Debian ну или что кому больше нравится, если нет то покупаем VPS и настраиваем или сами поднимаем сервак
Хотя и на винде сможет работать или на десктопном линукс, но это не наш метод, все должно быть по красоте 😁
Установить Python Pip Venv Git
Python
Для начала проверить установлен ли Python python3 --version
и Pip pip3 --version
В моем случае на свежем сервере Debian 12 питон по умолчанию стоит выдало такую строку:
$ python3 --version
Python 3.11.2
Если bash: python3: команда не найдена
то установить sudo apt install python3
Pip
Cистема управления пакетами, которая используется для установки и управления программными пакетами, написанными на Python.
А вот pip3
не был установлен:
$ pip3 --version
bash: pip3: команда не найдена
Значит надо установить sudo apt install python3-pip
Проверка:
$ pip3 --version
pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11)
Venv
Виртуальное окружение, что бы не было хаоса и не поняток. Короче, любой проект на питоне запускать в виртуальной среде. Чтобы потом не рыдать и бицо головой ап стену.
Проверка установки Venv
$ python3 -m venv --help
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear] [--upgrade] [--without-pip] [--prompt PROMPT] [--upgrade-deps] ENV_DIR [ENV_DIR ...]
Creates virtual Python environments in one or more target directories.
positional arguments:
ENV_DIR A directory to create the environment in.
options:
-h, --help show this help message and exit
--system-site-packages
Give the virtual environment access to the system site-packages dir.
--symlinks Try to use symlinks rather than copies, when symlinks are not the default for the platform.
--copies Try to use copies rather than symlinks, even when symlinks are the default for the platform.
--clear Delete the contents of the environment directory if it already exists, before environment creation.
--upgrade Upgrade the environment directory to use this version of Python, assuming Python has been upgraded in-place.
--without-pip Skips installing or upgrading pip in the virtual environment (pip is bootstrapped by default)
--prompt PROMPT Provides an alternative prompt prefix for this environment.
--upgrade-deps Upgrade core dependencies: pip setuptools to the latest version in PyPI
Once an environment has been created, you may wish to activate it, e.g. by sourcing an activate script in its bin directory.
Это значит, что установлено. Если нет — будет что-то вроде: “No module named venv” . Значит ставим:
sudo apt install python3-venv
Хотя это не повредит да же, если Venv уже присутствует, в моем случае подтянулись еще некоторые пакеты, думаю они не повредят, пусть будут.
Git
Это не только для кодеров в очках на пол-лица, это ещё и:
- Супер-быстрый способ скачать проект целиком, без браузера и ручного тыканья в архивы.
- Следить за обновлениями проекта: git pull — и всё, ты снова модный.
- Вносить свои правки, если вдруг захотелось кастомизировать тул.
Установка sudo apt install git
Поднять виртуальную среду Python
Теперь настал момент создания виртуальной среды в которой буду творить всякую дичь 😆
python3 -m venv ~/dnschef_env
- Создать виртуальную средуsource ~/dnschef_env/bin/activate
- Активировать
И уже в виртульной среде делаем все остальное:
cd ~/dnschef_env
- Перейти в каталог виртуальной средыgit clone https://github.com/iphelix/dnschef.git
- Клонировать репозиторий dnschefcd dnschef
- Перейти в каталогdnschef
pip install dnslib
- Установка необходимого пакета для работыdnslib
(dnschef_env) $ cd ~/dnschef_env
(dnschef_env) $ git clone https://github.com/iphelix/dnschef.git
(dnschef_env) $ cd dnschef
(dnschef_env) $ pip install dnslib
Collecting dnslib
Downloading dnslib-0.9.26-py3-none-any.whl (64 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 64.2/64.2 kB 2.6 MB/s eta 0:00:00
Installing collected packages: dnslib
Successfully installed dnslib-0.9.26
Проверка работы dnschef вывод помощи по командам и ключам.
(dnschef_env) $ python3 dnschef.py -h
sage: dnschef.py [options]:
_ _ __
| | version 0.4 | | / _|
__| |_ __ ___ ___| |__ ___| |_
/ _` | '_ \/ __|/ __| '_ \ / _ \ _|
| (_| | | | \__ \ (__| | | | __/ |
\__,_|_| |_|___/\___|_| |_|\___|_|
iphelix@thesprawl.org
DNSChef is a highly configurable DNS Proxy for Penetration Testers and Malware Analysts. It is capable of fine configuration of which DNS replies to modify or to simply proxy with
real responses. In order to take advantage of the tool you must either manually configure or poison DNS server entry to point to DNSChef. The tool requires root privileges to run on
privileged ports.
options:
-h, --help show this help message and exit
--fakedomains thesprawl.org,google.com
A comma separated list of domain names which will be resolved to FAKE values specified in the the above parameters. All other domain names will be resolved to
their true values.
--truedomains thesprawl.org,google.com
A comma separated list of domain names which will be resolved to their TRUE values. All other domain names will be resolved to fake values specified in the
above parameters.
Fake DNS records::
--fakeip 192.0.2.1 IP address to use for matching DNS queries. If you use this parameter without specifying domain names, then all 'A' queries will be spoofed. Consider using
--file argument if you need to define more than one IP address.
--fakeipv6 2001:db8::1
IPv6 address to use for matching DNS queries. If you use this parameter without specifying domain names, then all 'AAAA' queries will be spoofed. Consider
using --file argument if you need to define more than one IPv6 address.
--fakemail mail.fake.com
MX name to use for matching DNS queries. If you use this parameter without specifying domain names, then all 'MX' queries will be spoofed. Consider using
--file argument if you need to define more than one MX record.
--fakealias www.fake.com
CNAME name to use for matching DNS queries. If you use this parameter without specifying domain names, then all 'CNAME' queries will be spoofed. Consider
using --file argument if you need to define more than one CNAME record.
--fakens ns.fake.com NS name to use for matching DNS queries. If you use this parameter without specifying domain names, then all 'NS' queries will be spoofed. Consider using
--file argument if you need to define more than one NS record.
--file FILE Specify a file containing a list of DOMAIN=IP pairs (one pair per line) used for DNS responses. For example: google.com=1.1.1.1 will force all queries to
'google.com' to be resolved to '1.1.1.1'. IPv6 addresses will be automatically detected. You can be even more specific by combining --file with other
arguments. However, data obtained from the file will take precedence over others.
Optional runtime parameters.:
--logfile FILE Specify a log file to record all activity
--nameservers 8.8.8.8#53 or 4.2.2.1#53#tcp or 2001:4860:4860::8888
A comma separated list of alternative DNS servers to use with proxied requests. Nameservers can have either IP or IP#PORT format. A randomly selected server
from the list will be used for proxy requests when provided with multiple servers. By default, the tool uses Google's public DNS server 8.8.8.8 when running
in IPv4 mode and 2001:4860:4860::8888 when running in IPv6 mode.
-i 127.0.0.1 or ::1, --interface 127.0.0.1 or ::1
Define an interface to use for the DNS listener. By default, the tool uses 127.0.0.1 for IPv4 mode and ::1 for IPv6 mode.
-t, --tcp Use TCP DNS proxy instead of the default UDP.
-6, --ipv6 Run in IPv6 mode.
-p 53, --port 53 Port number to listen for DNS requests.
-q, --quiet Don't show headers.
Выйти из виртуалки deactivate
Открыть порты
В фаерволе открыть порты. Пользуюсь, если нету читаем - UFW
sudo ufw allow SSH
- Открыть порт 22sudo ufw allow DNS
- Открыть порт 53sudo ufw allow "WWW Full"
- Открыть 80,443 порты
Проверить: sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp (SSH) ALLOW IN Anywhere
53 (DNS) ALLOW IN Anywhere
80,443/tcp (WWW Full) ALLOW IN Anywhere
22/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
53 (DNS (v6)) ALLOW IN Anywhere (v6)
80,443/tcp (WWW Full (v6)) ALLOW IN Anywhere (v6)
Виртуальный хост Apache2
Для реализации прикола нужен вебсервер на котором будет крутиться фейковый сайт, ну или заглушка сайта VK. Про Apche2 тут немного
Создать каталог, где будет находиться сайт sudo mkdir /var/www/fakevk
Конфиг виртуального хоста:
sudo nano /etc/apache2/sites-available/vk-fake.conf
<VirtualHost *:80>
ServerName vk.com
ServerAlias www.vk.com
DocumentRoot /var/www/fakevk
<Directory "/var/www/fakevk">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/vk_error.log
CustomLog ${APACHE_LOG_DIR}/vk_access.log combined
</VirtualHost>
sudo a2ensite vk-fake.conf
- включить фейковый сайтsudo systemctl reload apache2
- применить изменения
Реверс прокси
Если нужен, мало ли:
sudo nano /etc/apache2/sites-available/vk-fake-proxy.conf
sudo a2ensite vk-fake-proxy.conf
sudo systemctl reload apache2
Страница для подмены
sudo nano /var/www/fakevk/index.html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VK</title>
<link rel="icon" href="/favicon.ico" type="image/png">
<style>
@font-face {
font-family: 'Bender';
src: url('/fonts/Bender-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
}
body {
margin: 0;
padding: 0;
background-color: #000;
font-family: 'Bender', sans-serif;
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
color: #fff;
}
.warning-container {
background-color: #000;
padding: 20px;
border: 2px solid #fff;
border-radius: 5px;
max-width: 800px;
text-align: center;
font-size: 24px;
position: relative;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.7);
animation: fadeIn 2s ease-in-out;
}
.warning-container h1 {
margin: 0;
font-size: 48px;
font-weight: bold;
letter-spacing: 2px;
color: #d32f2f; /* Красный цвет */
}
.warning-container h2 {
margin: 0;
font-size: 24px;
font-weight: bold;
letter-spacing: 1px;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
</style>
</head>
<body>
<div class="warning-container">
<h1>WARNING</h1>
<h2>Ваша карма очищена. VK заблокирован. Медитируйте...</h2>
</div>
</body>
</html>
Добавил шрифт Bender-Bold.woff
который будет в папке fonts
так же в корне сайта поместил иконку VK файл favicon.ico
Запуск dnschef
source ~/dnschef_env/bin/activate
- Запустить виртуалку если еще не там.
cd ~/dnschef_env/dnschef
- перейти в каталог.
sudo env "PATH=$PATH" python3 dnschef.py --interface 192.168.30.194 --port 53 --fakeip 192.168.30.194 --fakedomains vk.com,www.vk.com --nameservers 8.8.8.8,1.1.1.1 --logfile /var/log/dnschef.log
Полный разбор команды
sudo env "PATH=$PATH" python3 dnschef.py --interface 192.168.30.194 --port 53 --fakeip 192.168.30.194 --fakedomains vk.com,www.vk.com --nameservers 8.8.8.8,1.1.1.1 --logfile /var/log/dnschef.log
sudo
- Что делает: Выполняет команду от имени root.
- Зачем: Потому что порт 53 (стандартный DNS) — это привилегированный порт (меньше 1024).
Без root-прав Python не сможет его открыть → будет ошибка
Permission denied
.
env "PATH=$PATH"
-
Что делает: Передаёт текущую переменную окружения
PATH
в новое окружение, которое создаётsudo
. -
Зачем:
Без этой штукиsudo
иногда сбрасываетPATH
,
и тогда вместо нормального питона из виртуалки (dnschef_env/bin/python3
)
используется системный/usr/bin/python3
, который не знает про модули (например,dnslib
) → Ошибка: ModuleNotFoundError.Эта магия
env "PATH=$PATH"
спасает положение: она “протаскивает” нормальныйPATH
черезsudo
,
чтобы использовался правильный Python и правильные установленные модули.
python3 dnschef.py
- Что делает: Запускает
dnschef.py
обычным способом. - Важно: Здесь будет использоваться именно тот
python3
, который в текущем окружении.
- Параметры DNSChef:
Параметр | Значение | Что делает |
---|---|---|
--interface 192.168.30.194 |
Локальный IP-адрес сервера | На каком IP будет слушать запросы (обычно IP сервера/виртуалки). |
--port 53 |
Порт 53 | Стандартный порт DNS-запросов. |
--fakeip 192.168.30.194 |
IP адрес подмены | Куда перенаправлять запросы на фейковые домены. |
--fakedomains vk.com,www.vk.com |
Список фейковых доменов через запятую | Какие домены подменять на твой fakeip . |
--nameservers 8.8.8.8,1.1.1.1 |
Резолверы (гугловский и клаудфларовский DNS) | Для всех остальных доменов (которые не подменяются). |
--logfile /var/log/dnschef.log |
Путь к файлу логов | Чтобы записывать туда все события работы dnschef. |
Что делает эта команда:
- Слушает все DNS-запросы на IP
192.168.30.194
на порту 53. - Если кто-то спрашивает
vk.com
илиwww.vk.com
— отдаёт в ответ IP192.168.30.194
(твой сервер). - Все остальные запросы — аккуратно пересылает на 8.8.8.8 или 1.1.1.1.
- Всё пишет в
/var/log/dnschef.log
. - Работает правильно в виртуальном окружении благодаря
env "PATH=$PATH"
.
Дополнительная Заметка
Если хочется вообще избавиться от sudo
и запускать без извращений через обычный python3
,
достаточно один раз сделать:
sudo setcap 'cap_net_bind_service=+ep' /home/wildsoft/dnschef_env/bin/python3
Это даст разрешение питону открывать порты ниже 1024 без root-прав. 🔥
И потом спокойно писать:
python3 dnschef.py --interface 192.168.30.194 --port 53 ...
без sudo
, без env
, без головной боли. ☕
Пока не поменяем настройки роутера пускай он будет на готове.
Настройки маршрутизатора (роутера)
Зайти в вебморду роутера у каждого из них своя харя поэтому не буду особо вдаваться в подробности, где что лежит напишу саму суть того, что нужно сделать:
- Пробросить 53 порт на машину с запущенным dnschef
- Поменять адрес DNS сервера на адрес машины, где запущен dnschef в случае с локальными испытаниями это может быть ip локальной сети, но если есть внешний белый ip то можно указать его, порт если что уже проброшен.
Всё, здесь дела все поделали, выйти из морды роутера.
Результат
По итогу по мимо прикола получаем сканер аномальных активностей. Логи, если захотеть можно конвертировать в удобоваримый формат например для Goaccess и там уже проводить анализ. Будет желание может напишу про анализ логов. А так же сделать ротацию логов, чтобы не заполонили планету 😀
Доработка
dnschef ошибка KeyError: 65
В процессе использования dnschef была поймана ошибка:
...
QTYPE: Invalid forward lookup: [65]
...
Это значит, что прилетел DNS-запрос с типом 65, а DNSChef его вообще не понимает. Он лезет искать в справочник типов (QTYPE), а там ему в ответ:
"Мужик, я не знаю, что такое 65. Иди отсюда!" 😆
И дальше всё падает с красивым “Traceback’ом” (стек вызовов).
А что это за таинственный тип 65 вообще?!
Добро пожаловать в мир новых DNS-запросов! Тип 65 — это HTTPS RR (HTTPS Resource Record), новый стандарт для ускорения и защиты доступа к сайтам через DNS-записи. 🚀
Короче: браузеры (особенно новые Chrome/Edge/Firefox) начали швырять не только обычные A/AAAA-запросы (IPшники), но ещё и всякие новые модные типы:
HTTPS, SVCB (64 тип), и другие.
А dnschef — дедушка старой закалки. Он про такое даже не слышал.
Исправление ошибки в dnschef
Открыть nano ~/dnschef_env/dnschef/dnschef.py
удалить то, что в строке 110 qtype = QTYPE[d.q.qtype]
вставить на ее место qtype = QTYPE.get(d.q.qtype, f"TYPE{d.q.qtype}")
Это значит: если тип есть в списке известных — окей. Если нет — будет строка типа TYPE65, TYPE123 и так далее.
Альтернативные варианты
Если ты ищешь современную альтернативу DNSChef, то стоит обратить внимание на DNSChef-NG — обновлённую версию оригинального инструмента. Она предлагает множество новых функций и улучшений:
- Поддержка Python 3.11+
- Асинхронная архитектура для повышения производительности
- Конфигурация через TOML
- HTTP API для удалённого управления и мониторинга
- Docker-совместимость
- Поддержка передачи файлов через DNS (используя записи
A
,AAAA
,TXT
) (DNSChef (NG) - DNS proxy for Penetration Testers and … - GitHub)
Этот инструмент особенно полезен для тестирования приложений, которые игнорируют системные настройки прокси, таких как некоторые мобильные приложения. С помощью DNSChef-NG можно перенаправить DNS-запросы на локальный прокси-сервер, например, Burp Suite, для анализа трафика.
Если тебе нужны альтернативы с другими возможностями, вот несколько вариантов:
- DNSteal: позволяет извлекать файлы через DNS-запросы, полезно для тестирования утечек данных.
- Fierce: инструмент для разведки DNS, помогает выявлять неочевидные IP-пространства.
- SubBrute и SubFinder: используются для перебора и обнаружения поддоменов, полезны при сборе информации.
- aiodnsbrute: асинхронный инструмент для быстрого перебора DNS-имён. (DNSChef alternatives - Linux Security Expert)
Эти инструменты могут быть полезны в зависимости от конкретных задач, таких как разведка, тестирование на проникновение или анализ безопасности.
Комментарии