此漏洞允许攻击者污染 BIND 解析器的 DNS 缓存,从而在合法用户不知情的情况下将其重定向到恶意 IP 地址。
攻击依赖于利用信任。受害者信任解析器,而解析器(BIND)信任从权威服务器收到的答案。漏洞在于 BIND 会处理并缓存 DNS 响应中 ADDITIONAL 部分提供的未经请求的数据,即使这些数据属于完全不同的、未请求的域。
设置:攻击者控制一个针对特定域(例如 poc.lab)的恶意权威 DNS 服务器。攻击者等待目标解析器(BIND)查询该域。
注入:当解析器查询攻击者服务器获取 poc.lab 时,攻击者会回复一个针对 poc.lab 的合法答案,但在 ADDITIONAL 部分中包含一个针对不同域(在我们的示例中是 www.hacker.com,但可以是任何合法域,如 facebook.com)的未经请求的答案,指向一个恶意 IP 地址。
污染:由于漏洞,解析器接受未经请求的"附加"记录并将其存储在缓存中。它不验证攻击者是否对未经请求的域没有权威。
受害者的查询:当受害者稍后查询解析器获取未经请求的域(www.hacker.com)时,解析器从其缓存中返回被污染的记录,将受害者重定向到攻击者控制的恶意 IP 地址。
[!IMPORTANT]
此 PoC 的关键要点
间接攻击:受害者从不直接与攻击者通信。
信任锚点受损:受害者的机器运行正常;是基础设施(DNS)在撒谎。
机制:该利用利用对附加部分的处理,注入从未请求过的记录。
[!CAUTION]
此 PoC 仅供教育用途。未经授权使用此信息来破坏系统是非法且不道德的。在测试或利用任何网络或系统上的漏洞之前,请始终获得许可。
本演示使用以下虚拟机 (VM):
以下命令用于在基于 Debian 的系统上设置 BIND 9.21.12,以演示 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 域。当被询问该域或任何子域时,他添加一个指向他 IP 地址的未经请求的答案记录(www.hacker.com)。
当受害者查询域 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
[!NOTE]
此视频是对所解释漏洞的演示:https://drive.google.com/file/d/1PATD0tUqw8-BipfSf6TkQQfnJBvV110Z/view?usp=sharing