DNS重绑定攻击进阶利用与防御绕过技术详解
字数 4397 2025-12-13 23:18:20

DNS重绑定攻击进阶利用与防御绕过技术详解


1. 知识点的描述

DNS重绑定攻击 是一种将DNS查询的“重绑定”特性与浏览器同源策略(SOP)的弱点相结合的客户端攻击技术。在基础攻击中,攻击者控制一个恶意的DNS服务器,为域名配置一个极短的TTL(生存时间),并返回两个不同的IP地址:先返回一个攻击者控制的、用于托管恶意JavaScript代码的IP(诱导用户访问),在浏览器缓存过期后,立即(重绑定)返回到目标内部网络服务的IP(如路由器管理界面、数据库后台等)。由于浏览器在后续请求中遵循同源策略,而SOP是基于“协议+主机名+端口”判断同源,而非IP地址。因此,当域名被“重绑定”到内部IP后,之前加载的恶意JavaScript代码就获得了向该内部服务发起跨域请求(如同源)的权限,从而窃取数据或执行未授权操作。

进阶利用防御绕过 则聚焦于在更复杂或加固的环境下,如何成功实施此攻击,并规避常见的防御措施。


2. 解题过程循序渐进讲解

第一步:重温基础攻击流程与核心原理

我们先要确保理解攻击的根基,这是进阶的前提。

  1. 攻击者配置

    • 注册一个域名,例如 evil.com
    • 将该域名的DNS记录(A记录)的TTL设置为0或极短(如1秒)。
    • 配置其权威DNS服务器,使其能动态响应查询。首次查询返回IP A(攻击者的服务器IP),后续查询立即返回IP B(目标内网IP,如 192.168.1.1)。
  2. 受害者交互

    • 攻击者诱骗受害者(通过邮件、恶意广告等)访问 http://evil.com
    • 受害者浏览器解析 evil.com,DNS查询返回IP A
    • 浏览器与IP A 建立连接,加载并执行攻击者托管的恶意JavaScript代码。此时,页面的“源”是 http://evil.com
  3. 重绑定与攻击

    • 恶意JavaScript代码执行,并可能等待片刻(超过TTL),或通过向 evil.com 的子域名发起大量请求来主动耗尽DNS缓存
    • 随后,恶意代码发起一个指向 http://evil.com:8080/api/data 的AJAX请求。
    • 浏览器需要再次解析 evil.com。由于TTL极短,缓存已过期,浏览器进行新的DNS查询。
    • 此时,攻击者的DNS服务器返回IP B192.168.1.1)。
    • 浏览器向 192.168.1.1:8080 发送HTTP请求。关键点:浏览器的同源策略检查发现,当前页面的源是 http://evil.com,请求的目标也是 http://evil.com:8080主机名完全相同,因此判定为同源,允许发送请求并读取响应
    • 攻击就这样绕过了SOP,让来自互联网的脚本直接访问了本应受SOP保护的内网服务,窃取数据或调用其API。

核心原理:SOP基于主机名而非IP进行判断。DNS重绑定造成了“主机名不变,背后IP已变”的局面,欺骗了SOP。

第二步:进阶利用技术

在基础攻击之上,攻击者会采用更隐蔽、更强大的技术。

  1. 绕过浏览器/操作系统DNS缓存

    • 子域名爆破:恶意脚本快速、连续地请求大量随机子域名,如 a.evil.comb.evil.com... 每个请求都会触发DNS查询。大多数系统对DNS缓存有容量限制,这种洪水攻击能快速填满缓存,导致早期为 evil.com 解析的IP A 的记录被挤出缓存,加速重绑定。
    • 利用多记录响应:配置DNS服务器在首次响应时,不仅返回IP A,还附带大量其他无关记录。有些缓存实现可能会因为这些额外记录更快地达到容量限制。
  2. 攻击目标扩展

    • 无认证的内部服务:攻击路由器、打印机、IP摄像头、数据库(如Redis、MongoDB的未授权访问端口)、监控系统等无需密码或使用默认密码的服务。
    • 基于主机的认证绕过:一些内部服务(如某些管理后台)采用IP白名单或“主机头”验证。由于请求来自浏览器,其HTTP Host 头会被设置为 evil.com,这可能绕过基于IP的简单过滤。攻击脚本甚至可以篡改Host,尝试伪装成合法的内部主机名。
    • 结合其他漏洞:在访问到内部服务后,如果该服务本身存在漏洞(如RCE、SSRF),攻击载荷可以通过JavaScript动态生成并发送,将攻击链延伸。
  3. 与现代Web技术结合

    • WebSocket连接:DNS重绑定后,恶意脚本可以尝试与 ws://evil.com:port 建立WebSocket连接。如果内网服务(如一些IoT设备)开启了WebSocket且未做Origin检查,可以建立全双工通信通道,进行更复杂的交互。
    • WebRTC 泄露:虽然不完全是重绑定的直接利用,但在某些场景下,可诱导浏览器通过重绑定后的域名访问内部STUN/TURN服务器,辅助内网信息收集。

第三步:防御机制的剖析与绕过

了解防御措施,才能理解如何绕过它们。

  1. DNS响应过滤/黑名单(网络层防御)

    • 防御:企业防火墙或DNS解析器(如Pi-hole)可能会阻止解析到RFC 1918私有地址(10.0.0.0/8172.16.0.0/12192.168.0.0/16)或回环地址(127.0.0.0/8)的公共域名查询。
    • 绕过
      • 使用非标准内网段:如果目标内网使用了非RFC 1918的地址段(一些大型企业可能如此),此过滤无效。
      • 重绑定到公网IP:攻击公网服务器上只允许 localhost 访问的服务(如数据库)。将 evil.com 重绑定到该服务器的公网IP C。恶意脚本访问 http://evil.com:port 时,请求被发送到服务器 Cport。如果该服务(如Redis)配置为监听 0.0.0.0 或误绑定了公网IP,但防火墙规则只允许本机(127.0.0.1)访问,那么来自服务器 C 自身公网IP的请求可能会被放行(因为从网络栈看,源IP是外部,但目标IP是自己,在某些配置下可能成立),从而实现攻击。这是一种更隐蔽的、针对公网服务的“本地”攻击。
  2. 浏览器缓解策略

    • 防御:现代浏览器实施了多种策略:
      • 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的服务器上发起进一步的重绑定或请求,增加迷惑性。
  3. 服务端防御(目标应用)

    • 防御:内部服务应始终进行强身份认证,不依赖网络位置;在HTTP层验证 Host 头;对敏感操作实施CSRF Token等二次验证。
    • 绕过:如果服务存在未授权访问端点默认凭据其他逻辑漏洞,这些服务端防御就形同虚设。攻击的本质就是利用这些弱点。

第四步:综合攻击思路与防御建议

综合进阶攻击链示例

  1. 攻击者购买域名 attacker.tld,配置超短TTL,DNS服务器逻辑:首次请求 -> 返回VPS IP_A; 后续请求 -> 返回目标路由器IP_B 192.168.1.1
  2. 制作一个包含恶意JS的页面,托管在IP_A。该JS会:
    • 加载后静默创建多个隐藏的iframe,src指向数百个随机子域名,以冲刷本地DNS缓存。
    • 等待2秒后,尝试向 http://attacker.tld:80http://attacker.tld:8080 发起Fetch请求。
  3. 诱骗受害者(公司员工)点击链接访问 http://attacker.tld
  4. 恶意JS执行。浏览器DNS缓存被快速冲刷。
  5. JS发起对 http://attacker.tld:80 的请求。此时DNS查询返回IP_B (192.168.1.1:80)。假设这是路由器的登录页面。
  6. JS读取响应HTML,可能包含路由器型号、版本等。
  7. JS再尝试向 http://attacker.tld:8080 发起POST请求,提交默认口令(如 admin/admin)。如果登录成功,可能进一步调用路由器重启、端口转发等API。
  8. 所有窃取的信息或操作结果,被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实际可变的矛盾,而防御的关键在于在网络层、客户端层和服务层实施纵深、互补的防护

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),后续查询立即返回IP B (目标内网IP,如 192.168.1.1 )。 受害者交互 : 攻击者诱骗受害者(通过邮件、恶意广告等)访问 http://evil.com 。 受害者浏览器解析 evil.com ,DNS查询返回IP A 。 浏览器与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。 核心原理 :SOP基于主机名而非IP进行判断。DNS重绑定造成了“主机名不变,背后IP已变”的局面,欺骗了SOP。 第二步:进阶利用技术 在基础攻击之上,攻击者会采用更隐蔽、更强大的技术。 绕过浏览器/操作系统DNS缓存 : 子域名爆破 :恶意脚本快速、连续地请求大量随机子域名,如 a.evil.com , b.evil.com ... 每个请求都会触发DNS查询。大多数系统对DNS缓存有容量限制,这种洪水攻击能快速填满缓存,导致早期为 evil.com 解析的IP A 的记录被挤出缓存,加速重绑定。 利用多记录响应 :配置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服务器,辅助内网信息收集。 第三步:防御机制的剖析与绕过 了解防御措施,才能理解如何绕过它们。 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 重绑定到该服务器的公网IP C 。恶意脚本访问 http://evil.com:port 时,请求被发送到服务器 C 的 port 。如果该服务(如Redis)配置为监听 0.0.0.0 或误绑定了公网IP,但防火墙规则只允许本机( 127.0.0.1 )访问,那么来自服务器 C 自身公网IP的请求 可能会被放行 (因为从网络栈看,源IP是外部,但目标IP是自己,在某些配置下可能成立),从而实现攻击。这是一种更隐蔽的、针对公网服务的“本地”攻击。 浏览器缓解策略 : 防御 :现代浏览器实施了多种策略: 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的服务器上发起进一步的重绑定或请求,增加迷惑性。 服务端防御(目标应用) : 防御 :内部服务应 始终进行强身份认证 ,不依赖网络位置;在HTTP层验证 Host 头;对敏感操作实施CSRF Token等二次验证。 绕过 :如果服务存在 未授权访问端点 、 默认凭据 或 其他逻辑漏洞 ,这些服务端防御就形同虚设。攻击的本质就是利用这些弱点。 第四步:综合攻击思路与防御建议 综合进阶攻击链示例 : 攻击者购买域名 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实际可变的矛盾 ,而防御的关键在于 在网络层、客户端层和服务层实施纵深、互补的防护 。