DNS重绑定攻击进阶利用与防御绕过技术详解
1. 知识点的描述
DNS重绑定攻击 是一种将DNS查询的“重绑定”特性与浏览器同源策略(SOP)的弱点相结合的客户端攻击技术。在基础攻击中,攻击者控制一个恶意的DNS服务器,为域名配置一个极短的TTL(生存时间),并返回两个不同的IP地址:先返回一个攻击者控制的、用于托管恶意JavaScript代码的IP(诱导用户访问),在浏览器缓存过期后,立即(重绑定)返回到目标内部网络服务的IP(如路由器管理界面、数据库后台等)。由于浏览器在后续请求中遵循同源策略,而SOP是基于“协议+主机名+端口”判断同源,而非IP地址。因此,当域名被“重绑定”到内部IP后,之前加载的恶意JavaScript代码就获得了向该内部服务发起跨域请求(如同源)的权限,从而窃取数据或执行未授权操作。
进阶利用 和 防御绕过 则聚焦于在更复杂或加固的环境下,如何成功实施此攻击,并规避常见的防御措施。
2. 解题过程循序渐进讲解
第一步:重温基础攻击流程与核心原理
我们先要确保理解攻击的根基,这是进阶的前提。
-
攻击者配置:
- 注册一个域名,例如
evil.com。 - 将该域名的DNS记录(A记录)的TTL设置为0或极短(如1秒)。
- 配置其权威DNS服务器,使其能动态响应查询。首次查询返回IP
A(攻击者的服务器IP),后续查询立即返回IPB(目标内网IP,如192.168.1.1)。
- 注册一个域名,例如
-
受害者交互:
- 攻击者诱骗受害者(通过邮件、恶意广告等)访问
http://evil.com。 - 受害者浏览器解析
evil.com,DNS查询返回IPA。 - 浏览器与IP
A建立连接,加载并执行攻击者托管的恶意JavaScript代码。此时,页面的“源”是http://evil.com。
- 攻击者诱骗受害者(通过邮件、恶意广告等)访问
-
重绑定与攻击:
- 恶意JavaScript代码执行,并可能等待片刻(超过TTL),或通过向
evil.com的子域名发起大量请求来主动耗尽DNS缓存。 - 随后,恶意代码发起一个指向
http://evil.com:8080/api/data的AJAX请求。 - 浏览器需要再次解析
evil.com。由于TTL极短,缓存已过期,浏览器进行新的DNS查询。 - 此时,攻击者的DNS服务器返回IP
B(192.168.1.1)。 - 浏览器向
192.168.1.1:8080发送HTTP请求。关键点:浏览器的同源策略检查发现,当前页面的源是http://evil.com,请求的目标也是http://evil.com:8080,主机名完全相同,因此判定为同源,允许发送请求并读取响应! - 攻击就这样绕过了SOP,让来自互联网的脚本直接访问了本应受SOP保护的内网服务,窃取数据或调用其API。
- 恶意JavaScript代码执行,并可能等待片刻(超过TTL),或通过向
核心原理:SOP基于主机名而非IP进行判断。DNS重绑定造成了“主机名不变,背后IP已变”的局面,欺骗了SOP。
第二步:进阶利用技术
在基础攻击之上,攻击者会采用更隐蔽、更强大的技术。
-
绕过浏览器/操作系统DNS缓存:
- 子域名爆破:恶意脚本快速、连续地请求大量随机子域名,如
a.evil.com,b.evil.com... 每个请求都会触发DNS查询。大多数系统对DNS缓存有容量限制,这种洪水攻击能快速填满缓存,导致早期为evil.com解析的IPA的记录被挤出缓存,加速重绑定。 - 利用多记录响应:配置DNS服务器在首次响应时,不仅返回IP
A,还附带大量其他无关记录。有些缓存实现可能会因为这些额外记录更快地达到容量限制。
- 子域名爆破:恶意脚本快速、连续地请求大量随机子域名,如
-
攻击目标扩展:
- 无认证的内部服务:攻击路由器、打印机、IP摄像头、数据库(如Redis、MongoDB的未授权访问端口)、监控系统等无需密码或使用默认密码的服务。
- 基于主机的认证绕过:一些内部服务(如某些管理后台)采用IP白名单或“主机头”验证。由于请求来自浏览器,其HTTP
Host头会被设置为evil.com,这可能绕过基于IP的简单过滤。攻击脚本甚至可以篡改Host头,尝试伪装成合法的内部主机名。 - 结合其他漏洞:在访问到内部服务后,如果该服务本身存在漏洞(如RCE、SSRF),攻击载荷可以通过JavaScript动态生成并发送,将攻击链延伸。
-
与现代Web技术结合:
- WebSocket连接:DNS重绑定后,恶意脚本可以尝试与
ws://evil.com:port建立WebSocket连接。如果内网服务(如一些IoT设备)开启了WebSocket且未做Origin检查,可以建立全双工通信通道,进行更复杂的交互。 - WebRTC 泄露:虽然不完全是重绑定的直接利用,但在某些场景下,可诱导浏览器通过重绑定后的域名访问内部STUN/TURN服务器,辅助内网信息收集。
- WebSocket连接:DNS重绑定后,恶意脚本可以尝试与
第三步:防御机制的剖析与绕过
了解防御措施,才能理解如何绕过它们。
-
DNS响应过滤/黑名单(网络层防御):
- 防御:企业防火墙或DNS解析器(如Pi-hole)可能会阻止解析到RFC 1918私有地址(
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16)或回环地址(127.0.0.0/8)的公共域名查询。 - 绕过:
- 使用非标准内网段:如果目标内网使用了非RFC 1918的地址段(一些大型企业可能如此),此过滤无效。
- 重绑定到公网IP:攻击公网服务器上只允许
localhost访问的服务(如数据库)。将evil.com重绑定到该服务器的公网IPC。恶意脚本访问http://evil.com:port时,请求被发送到服务器C的port。如果该服务(如Redis)配置为监听0.0.0.0或误绑定了公网IP,但防火墙规则只允许本机(127.0.0.1)访问,那么来自服务器C自身公网IP的请求可能会被放行(因为从网络栈看,源IP是外部,但目标IP是自己,在某些配置下可能成立),从而实现攻击。这是一种更隐蔽的、针对公网服务的“本地”攻击。
- 防御:企业防火墙或DNS解析器(如Pi-hole)可能会阻止解析到RFC 1918私有地址(
-
浏览器缓解策略:
- 防御:现代浏览器实施了多种策略:
- DNS pinning:浏览器在建立与一个主机名的TCP连接后,会在连接的生命周期内将该主机名“固定”到最初解析的IP地址,忽略后续DNS变化。这是最有效的防御之一。
- 更长的最小TTL:浏览器可能强制执行一个最小的TTL下限(如30秒或更长),无视DNS服务器返回的更短TTL。
- 绕过:
- 利用连接池与空闲:DNS pinning通常作用于单个“网络栈上下文”或“连接”。通过关闭所有与
evil.com的连接,或利用iframe导航、Service Worker、WebSocket关闭重开等方式,可能创建新的网络上下文,从而触发新的DNS解析。 - 目标非HTTP/S服务:DNS pinning主要针对
http://和https://的请求。如果攻击目标是使用其他协议/端口的服务(如ws://,ftp://, 或自定义TCP端口),浏览器可能不会应用pinning,或者应用策略不同。 - 多级重绑定:先重绑定到一个中间IP(非目标IP),然后再从中间IP的服务器上发起进一步的重绑定或请求,增加迷惑性。
- 利用连接池与空闲:DNS pinning通常作用于单个“网络栈上下文”或“连接”。通过关闭所有与
- 防御:现代浏览器实施了多种策略:
-
服务端防御(目标应用):
- 防御:内部服务应始终进行强身份认证,不依赖网络位置;在HTTP层验证
Host头;对敏感操作实施CSRF Token等二次验证。 - 绕过:如果服务存在未授权访问端点、默认凭据或其他逻辑漏洞,这些服务端防御就形同虚设。攻击的本质就是利用这些弱点。
- 防御:内部服务应始终进行强身份认证,不依赖网络位置;在HTTP层验证
第四步:综合攻击思路与防御建议
综合进阶攻击链示例:
- 攻击者购买域名
attacker.tld,配置超短TTL,DNS服务器逻辑:首次请求 -> 返回VPS IP_A; 后续请求 -> 返回目标路由器IP_B 192.168.1.1。 - 制作一个包含恶意JS的页面,托管在IP_A。该JS会:
- 加载后静默创建多个隐藏的iframe,src指向数百个随机子域名,以冲刷本地DNS缓存。
- 等待2秒后,尝试向
http://attacker.tld:80和http://attacker.tld:8080发起Fetch请求。
- 诱骗受害者(公司员工)点击链接访问
http://attacker.tld。 - 恶意JS执行。浏览器DNS缓存被快速冲刷。
- JS发起对
http://attacker.tld:80的请求。此时DNS查询返回IP_B (192.168.1.1:80)。假设这是路由器的登录页面。 - JS读取响应HTML,可能包含路由器型号、版本等。
- JS再尝试向
http://attacker.tld:8080发起POST请求,提交默认口令(如admin/admin)。如果登录成功,可能进一步调用路由器重启、端口转发等API。 - 所有窃取的信息或操作结果,被JS通过最初与IP_A建立的WebSocket通道回传给攻击者。
根本性防御建议:
- 客户端/浏览器:难以完全依赖,但用户可启用浏览器安全插件、禁用不必要的JavaScript(NoScript类插件能阻断大部分此类攻击)。
- 网络边界:
- 部署DNS过滤器,阻止解析指向内网地址的公共域名。
- 严格配置防火墙,禁止内网服务(特别是管理接口)从外部直接访问,并限制不必要的出站连接。
- 目标服务:
- 强制身份认证:无一例外。
- 使用CORS:明确设置
Access-Control-Allow-Origin头,只信任确切的源,而不是通配符*或基于动态检查(攻击者可能伪造Origin头,但规范浏览器会发送正确Origin,服务端应严格验证)。 - 实施CSRF保护:对状态修改操作使用CSRF Token。
- 绑定到
localhost:服务只监听127.0.0.1而非0.0.0.0,但这不能防御针对本机其他服务(如数据库)的攻击。
- 开发与运维:
- 在SDLC中纳入威胁建模,识别内部服务暴露的风险。
- 对内网服务进行定期安全评估和渗透测试。
通过以上步骤,您应该能透彻理解DNS重绑定攻击如何从基础原理出发,演化出多种高级利用技巧,并针对现有防御措施进行适应性绕过。其核心始终是利用SOP对主机名的依赖与IP实际可变的矛盾,而防御的关键在于在网络层、客户端层和服务层实施纵深、互补的防护。