Featured image of post DNS重绑定攻击实验

DNS重绑定攻击实验

实验环境

我使用的是 Ubuntu 24.04.4,基本环境配置见ARP攻击原理学习

核心工具:Docker / Docker-Compose、Firefox浏览器、nano / vim

节点类型 IP 地址 域名 作用说明
靶机(IoT 恒温器) 192.168.60.80 位于内网,被路由器防火墙保护的目标设备
本地 DNS 缓存服务器 10.9.0.53 模拟受害者网络中的 DNS 解析与缓存
攻击者 Web 服务器 10.9.0.180 www.attacker32.com 提供恶意网页或脚本
攻击者 DNS 服务器 10.9.0.153 attacker32.com 控制域名解析,实现 DNS 重绑定

实验原理

IoT 设备部署在内网,外部无法直接访问,同时浏览器同源策略限制跨域请求。

DNS 重绑定的核心在于: 浏览器只校验“域名是否一致”,而不关心该域名解析到的 IP 是否发生变化。

攻击流程本质是:

  • 初始解析:域名 → 攻击者服务器
  • 触发脚本执行(同源)
  • 缓存过期后重新解析:域名 → 内网设备
  • 浏览器继续信任该域名,从而向内网发起请求

最终实现通过浏览器“跳板”访问内网设备。

修改Firefox浏览器的DNS缓存时间

Firefox 浏览器默认会缓存 DNS 查询结果 60 秒。为了提高实验效率,让 DNS 重绑定攻击能快速生效,需人为缩短该缓存时间

在 Firefox 浏览器地址栏输入 about:config并回车,接受风险提示,然后在搜索栏输入network.dnsCacheExpiration

双击出现的两个结果network.dnsCacheExpirationnetwork.dnsCacheExpirationGracePeriod,将值更改为10秒,关闭浏览器使配置生效

这样可以更快触发二次解析

配置本地DNS服务器

将系统 DNS 指向实验环境中的 DNS 服务器

1
sudo nano /etc/resolvconf/resolv.conf.d/head

遇到问题:提示此文件不存在

查看resolvconf文件夹,发现连这个文件夹都不存在,判断是ubuntu版本不同导致文件目录不同

查看/etc/resolv.conf发现虽然文件存在但不可以编辑

可以看到这一行This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved>

说明当前 DNS 由 systemd-resolved 管理

解决方法为修改 systemd-resolved 配置:

1
sudo nano /etc/systemd/resolved.conf

添加这一行

1
DNS=10.9.0.53

然后重启服务:

1
sudo systemctl restart systemd-resolved

使用 resolvectl status 查看,发现 DNS 并未生效:

1
2
Link 2 (ens33)
    DNS Servers: xxx.xxx.xxx.xxx

那就是网卡在控制 DNS

这是因为 systemd-resolved 的优先级机制中,网卡 DNS 高于 resolved.conf 配置,因此需要手动指定网卡 DNS:

1
sudo resolvectl dns ens33 10.9.0.53

这个命令是临时的,重启就没了,好处是适合实验不影响环境

修改本地Host文件

将 IoT 域名映射到真实内网地址: 编辑 hosts 文件

1
sudo nano /etc/hosts

在文件末尾添加以下映射,保存并退出:

1
192.168.60.80    www.seedIoT32.com

启动 Docker 容器

先在虚拟机里下载实验文件,如果没有 wget,也可以用浏览器下载再拖进去

1
wget https://seedsecuritylabs.org/Labs_20.04/Files/DNS_Rebinding/Labsetup.zip

下载完在当前目录解压

1
unzip Labsetup.zip

这里一定要在 Linux 里解压,是因为 Windows 解压会把换行符从 LF 变成 CRLF,容器里的脚本在执行时就可能报 exec format error

解压后进入目录

1
cd Labsetup

启动实验环境

1
2
sudo docker compose build
sudo docker compose up -d

在浏览器中分别访问

确认页面是否可以正常打开

出现问题:访问 www.attacker32.com 显示 GoDaddy 停放页

通过命令验证:

1
dig www.attacker32.com

返回:

1
www.attacker32.com → 198.18.1.137

同时验证攻击机服务:

1
http://10.9.0.180

可以正常访问,说明 Web 服务运行正常

验证同源策略

依次访问并点击修改按钮:

前两个可以成功修改温度,

第三个失败

原因在于浏览器同源策略阻止了跨域请求,可以在控制台看到 CORS 报错。

修改攻击脚本

进入攻击者容器:

1
sudo docker exec -it attacker-www-10.9.0.180 /bin/bash

编辑 JS:

1
nano /app/rebind_server/templates/js/change.js

修改为:

1
let url_prefix = 'http://www.attacker32.com'

重启容器:

1
docker restart attacker-www-10.9.0.180

此时浏览器不再报同源错误,但请求仍然发往攻击者服务器,因此温度不会改变。

DNS 重绑定攻击

进入攻击者 DNS 容器:

1
docker exec -it attacker-ns-10.9.0.153 /bin/bash

修改配置:

1
nano /etc/bind/zone_attacker32.com

调整:

  • 将 TTL 设为较小值(0 或 10)
  • 修改 A 记录:
1
www    IN    A    192.168.60.80

刷新 DNS:

1
2
rndc reload attacker32.com
rndc flush

攻击效果

等待 DNS 缓存过期后重新请求:

浏览器再次解析 www.attacker32.com,此时得到的是内网 IP。

由于域名未变,同源策略不会拦截,请求直接发送到内网 IoT 设备。

可以观察到温度被成功修改。


结论

DNS 重绑定利用了浏览器同源策略仅基于域名进行判断的特性,通过动态修改解析结果,使浏览器在不知情的情况下访问内网资源。

在本实验中,攻击者借助低 TTL 和 DNS 重新解析,将浏览器从访问外网服务器引导至内网设备,实现了对 IoT 设备的越权操作。

本质上,浏览器被利用为攻击者的代理,从而绕过了网络边界防护。

Like 0
本站已不稳定运行 小时 分钟
共发表文章 21 篇 ,总计 67.85 k 字
本站总访问量:
使用 Hugo 构建
主题 StackJimmy 设计