Как пошутить дома над пользователями интернета при помощи 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 - Клонировать репозиторий dnschef
  • cd 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 - Открыть порт 22
  • sudo ufw allow DNS - Открыть порт 53
  • sudo 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
  1. sudo
  • Что делает: Выполняет команду от имени root.
  • Зачем: Потому что порт 53 (стандартный DNS) — это привилегированный порт (меньше 1024). Без root-прав Python не сможет его открыть → будет ошибка Permission denied.

  1. env "PATH=$PATH"
  • Что делает: Передаёт текущую переменную окружения PATH в новое окружение, которое создаёт sudo.

  • Зачем:
    Без этой штуки sudo иногда сбрасывает PATH,
    и тогда вместо нормального питона из виртуалки (dnschef_env/bin/python3)
    используется системный /usr/bin/python3, который не знает про модули (например, dnslib) → Ошибка: ModuleNotFoundError.

    Эта магия env "PATH=$PATH" спасает положение: она “протаскивает” нормальный PATH через sudo,
    чтобы использовался правильный Python и правильные установленные модули.


  1. python3 dnschef.py
  • Что делает: Запускает dnschef.py обычным способом.
  • Важно: Здесь будет использоваться именно тот python3, который в текущем окружении.

  1. Параметры 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 — отдаёт в ответ IP 192.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)

Эти инструменты могут быть полезны в зависимости от конкретных задач, таких как разведка, тестирование на проникновение или анализ безопасности.