
Доказательство концепции для CVE-2025-40778: отравление кэша DNS BIND 9 через нежелательные записи дополнительных разделов.
Эта уязвимость позволяет атакующему повредить DNS-кэш резолвера BIND, заставляя легитимных пользователей перенаправляться на вредоносные IP-адреса без их ведома.
Атака основана на эксплуатации доверия. Жертва доверяет резолверу, а резолвер (BIND) доверяет ответам, которые он получает от авторитетных серверов. Недостаток заключается в том, что BIND обрабатывает и кэширует незапрошенные данные, предоставленные в дополнительном разделе (ADDITIONAL section) DNS-ответа, даже если эти данные относятся к совершенно другому, незапрашиваемому домену.
Подготовка: Атакующий контролирует вредоносный авторитетный DNS-сервер для определённого домена (например, poc.lab). Атакующий ждёт, пока целевой резолвер (BIND) выполнит запрос к этому домену.
Внедрение: Когда резолвер запрашивает у сервера атакующего poc.lab, атакующий отвечает легитимным ответом для poc.lab, но включает незапрошенный ответ в дополнительном разделе для другого домена (в нашем примере это www.hacker.com, но может быть любой легитимный домен, например facebook.com), указывающий на вредоносный IP-адрес.
Отравление: Из-за уязвимости резолвер принимает незапрошенную «дополнительную» запись и сохраняет её в своём кэше. Он не проверяет, имеет ли атакующий полномочия на незапрошенный домен.
Запрос жертвы: Когда позже жертва запрашивает у резолвера незапрошенный домен (), резолвер возвращает отравленную запись из своего кэша, перенаправляя жертву на вредоносный IP-адрес, контролируемый атакующим.
[!IMPORTANT]
Ключевые выводы для этого PoC
Непрямая атака: Жертва никогда не взаимодействует с атакующим напрямую.
Компрометация доверенной точки: Машина жертвы функционирует корректно; это инфраструктура (DNS) лжёт.
Механизм: Эксплойт использует обработку дополнительного раздела для внедрения записей, которые никогда не запрашивались.
[!CAUTION]
Этот PoC предназначен только для образовательных целей. Несанкционированное использование этой информации для компрометации систем незаконно и неэтично. Всегда получайте разрешение перед тестированием или эксплуатацией уязвимостей в любой сети или системе.
В данной демонстрации используются следующие виртуальные машины (ВМ):
Следующие команды предназначены для настройки BIND 9.21.12 на системе на базе Debian для демонстрации уязвимости CVE-2025-40778.
[!NOTE] Эта демонстрация использует BIND 9.21.12, одну из версий, подверженных данной уязвимости.
Другие известные диапазоны затронутых версий включают:
- 9.11.0 – 9.16.50
- 9.18.0 – 9.18.39
- 9.20.0 – 9.20.13
- 9.21.0 – 9.21.12
Следующие команды установят необходимые зависимости, загрузят исходный код BIND 9.21.12, скомпилируют его и установят на вашу систему.
sudo apt install -y build-essential pkg-config perl meson ninja-build libssl-dev libuv1-dev liburcu-dev libcap-dev liblmdb-dev libnghttp2-dev
cd /usr/local/src
sudo wget -O bind-9.21.12.tar.xz https://isc.mirrorservice.org/bind/9.21.12/bind-9.21.12.tar.xz
sudo tar -xf bind-9.21.12.tar.xz
cd bind-9.21.12
sudo meson setup build --prefix=/usr/local --sysconfdir=/etc --localstatedir=/var
sudo ninja -C build
sudo ninja -C build install
echo /usr/local/lib/x86_64-linux-gnu | sudo tee /etc/ld.so.conf.d/bind9-local.conf
sudo ldconfig
ldconfig -p | grep 'libdns-9.21.12' || true
/usr/local/sbin/named -v
Вот ожидаемый вывод последней команды:
> student@student:/usr/local/src/bind-9.21.12$ /usr/local/sbin/named -v
BIND 9.21.12 (Development Release) <id:9bafc35>
Перед запуском сервера BIND необходимо создать выделенного пользователя и группу для запуска службы named:
sudo groupadd --system named 2>/dev/null || true
sudo useradd --system --no-create-home --home /nonexistent --shell /usr/sbin/nologin --gid named named 2>/dev/null || true
Поскольку эта установка BIND не содержит файлов конфигурации по умолчанию, необходимо вручную создать необходимые каталоги:
sudo mkdir -p /etc/bind
sudo mkdir -p /var/cache/bind
sudo mkdir -p /var/log/named
sudo mkdir -p /var/run/named
sudo chown -R named:named /var/cache/bind /var/log/named /var/run/named
sudo chmod 750 /var/cache/bind /var/log/named /var/run/named
Следующий шаг — создание основного файла конфигурации /etc/bind/named.conf со следующим содержимым:
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.logging";
include "/etc/rndc.key";
Для конфигурации параметров создайте файл /etc/bind/named.conf.options со следующим содержимым:
options {
directory "/var/cache/bind";
recursion yes;
allow-recursion { 192.168.174.0/24; };
allow-query { 192.168.174.0/24; };
listen-on { 192.168.174.131; 127.0.0.1; };
listen-on-v6 { none; };
dnssec-validation no;
forwarders {
1.1.1.1;
8.8.8.8;
};
minimal-responses no;
// for manual start
pid-file "/var/run/named/named.pid";
};
Чтобы настроить зону пересылки для домена poc.lab для пересылки запросов на DNS-сервер атакующего по адресу 192.168.174.130 на стандартный порт 53, необходимо отредактировать файл /etc/bind/named.conf.local следующим образом:
zone "poc.lab" {
type forward;
forward only;
forwarders { 192.168.174.130; };
};
Для конфигурации журналирования создайте файл /etc/bind/named.conf.logging со следующим содержимым:
logging {
channel queries_file {
file "/var/log/named/queries.log" versions 3 size 20m;
severity info;
print-time yes;
print-category yes;
};
channel default_stderr {
stderr;
severity info;
print-time yes;
print-category yes;
};
category queries { queries_file; };
category default { default_stderr; };
};
Наконец, необходимо настроить RNDC:
sudo /usr/local/sbin/rndc-confgen -a -c /etc/bind/rndc.key
sudo chown root:named /etc/bind/rndc.key
sudo chmod 640 /etc/bind/rndc.key
Во-первых, необходимо убедиться, что порт 53 не используется каким-либо другим сервисом (в нашем случае пришлось отключить systemd-resolved):
sudo systemctl disable --now systemd-resolved || true
sudo ss -lunp | grep ':53' || true # To verify that port 53 is free
Наконец, можно запустить сервер BIND с помощью следующей команды:
sudo /usr/local/sbin/named -g -u named -c /etc/bind/named.conf
[!TIP]
Чтобы проверить, что BIND работает корректно, можно использовать следующую команду:
ss -lunpt | grep :53
Для машины жертвы необходимо настроить использование сервера BIND в качестве DNS-резолвера. Также нужно отключить systemd-resolved во избежание конфликтов:
sudo systemctl disable --now systemd-resolved
Затем можно установить статический DNS-сервер с помощью команд:
sudo rm -f /etc/resolv.conf
sudo nano /etc/resolv.conf
> nameserver 192.168.174.129
> options timeout:1 attempts:1
sudo chattr +i /etc/resolv.conf #block overwrites
На машине атакующего необходимо запустить скрипт, предоставленный в репозитории (attacker.py).
В нашем сценарии атакующий контролирует домен poc.lab. Когда поступает запрос к нему или любому поддомену, он добавляет незапрошенную запись ответа (www.hacker.com), указывающую на его IP-адрес.
Когда жертва запрашивает домен poc.lab, сервер BIND пересылает запрос на DNS-сервер атакующего. Атакующий отвечает незапрошенной записью ответа, которая отравляет кэш сервера BIND. Когда жертва обратится к www.hacker.com, она будет перенаправлена на IP-адрес атакующего вместо легитимного.
Вот демонстрация запросов жертвы к обоим доменам:
student@student:~/Desktop$ dig www.poc.lab +noall +answer
www.poc.lab. 60 IN A 192.168.174.99
student@student:~/Desktop$ dig www.hacker.com +noall +answer
www.hacker.com. 60 IN A 192.168.174.130
Как показано выше, DNS-запрос жертвы для www.hacker.com возвращает IP-адрес атакующего (192.168.174.130).
[!NOTE]
Это видео является демонстрацией описанной уязвимости: https://drive.google.com/file/d/1PATD0tUqw8-BipfSf6TkQQfnJBvV110Z/view?usp=sharing