ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DNS欺骗攻击原理与防御:从ARP劫持到抓包取证

DNS欺骗攻击原理与防御:从ARP劫持到抓包取证 1. 攻击目标、测试场景与武器选择做安全测试这几年我一直觉得 DNS 欺骗是个被低估的入口。很多人把注意力放在 Web 漏洞、系统漏洞上却忽略了“地址解析”这个最基础的环节。一旦域名解析被改写了用户访问的网站、下载的文件、输入的账号密码全都可能落到攻击者手里。更麻烦的是这个过程对普通用户来说完全无感地址栏里的域名没变证书可能也没报错但数据流早就被导走了。我第一次接触 DNS 欺骗是在授权测试的项目里客户想验证办公网内部是否存在“内网投毒”的风险。测试范围限制得很死只能在指定的 VLAN 内使用指定的测试终端不能碰核心业务服务器不能影响生产环境。那次测试下来我对 DNS 协议的脆弱性有了非常直观的认识——一个缺乏验证机制的 UDP 协议在局域网里被“训练”到从善如流数据包说改就改连反悔的机会都没有。先回答很多人的疑问既然是“演示”为什么不直接拿命令行工具做一轮模拟还要搞得这么正式因为 DNS 欺骗攻击的成败跟环境、协议细节、网络拓扑、终端行为都有关系。你在一台机器上看着“好像成功了”换一个网络环境就可能完全失效。做合法授权测试的核心价值是验证“这条链路是否有这类风险”而不是单纯地把攻击工具跑一遍。测试完成之后还要能回答客户的两个问题风险是怎么发生的该怎么修所以这篇文章的环境、步骤、验证方式都是按照“合法授权测试”的场景来写的。适合谁看企业安全团队的蓝队成员、做内网风险评估的渗透测试工程师以及刚入门想系统理解 DNS 欺骗原理的初学者。1.1 从一个实验环境聊起先说明我这里说的“演示”全部在隔离的虚拟机环境中完成所有设备都在同一台物理宿主机上运行不涉及任何真实业务流量。实验拓扑很简单攻击机、目标机、网关三台虚拟机外加一个模拟的域名服务器环境。这里有个关键点很多人做实验喜欢直接用宿主机参与这非常不建议。DNS 欺骗经常需要配合 ARP 欺骗来劫持链路如果你把宿主机卷进来可能把整个家庭网络的 DNS 请求都带偏排查起来极其痛苦。我的环境配置如下攻击机Kali Linux网卡接入 vmnet2 虚拟交换机IP 为 192.168.50.10。目标机Windows 10同一虚拟交换机IP 为 192.168.50.20DNS 设置为网关。网关pfSense既做路由也承担 DNS 转发地址 192.168.50.1。外部解析链路通过宿主机的 NAT 出口访问真实 DNS模拟“正常上网”场景。目标机上的浏览器默认访问http://test.example.com。这是一个虚构的测试域名我在本地搭了一个简易的 Web 服务用来模拟正常业务站点。1.2 攻击工具选型的思考业内做 DNS 欺骗演示常用的工具无非就是 Bettercap、Ettercap 这类中间人工具或者自己写脚本伪造 DNS 响应。Bettercap 的优点是集成度高一步就能完成 ARP 欺骗和 DNS 欺骗的联动Ettercap 则更老牌dns_spoof 插件配合一个规则文件就能工作而且资源占用非常低。我更倾向于用 Bettercap。原因很直接它的会话输出是结构化的你可以实时看到 DNS 请求、响应、改写的每一个步骤方便测试时留档。对于授权测试项目审计留痕很重要Bettercap 的日志导出和事件机制可以省不少事。1.3 测试前必须确认的三件事授权测试的“授权”两个字不是一句口号而是落在具体文件上的项目范围和目标域名清单必须由客户书面确认。测试时间窗口明确到几点到几点避免误伤生产业务。应急联系人测试中如果发现问题要能第一时间联系到人。我见过有人拿到授权书就开始“炫技”结果把客户财务系统的域名给改了导致半小时无法结算。这类事故一旦发生就算你有授权后续合作也基本凉了更严重的还可能涉及法律责任。所以我的原则是测试范围里出现一个没有列出的域名我就先停下来确认完毕再继续。2. 原理拆解为什么一个“地址本”能改写整条通信链路要深入理解 DNS 欺骗先得回到一个最基础的事实计算机之间的通信靠 IP 地址而人类习惯用域名。DNS 的作用就是把域名翻译成 IP 地址。你可以把它理解成通讯录你输入一个名字系统找到对应的电话号码。问题是这份通讯录在设计之初并没有内建足够的验证机制默认信任收到的查询响应。尤其是局域网环境里常见的缓存 DNS 服务器收到查询请求后如果缓存里没有记录就会向上游服务器发递归查询然后把结果保存下来用于后续响应。2.1 客户端与服务器的两次“盲信”一个正常的 DNS 查询流程是这样的客户端发出一个 A 记录查询test.example.com 的 IP 地址是什么本地 DNS 服务器收到请求查看缓存没有记录于是向根服务器、顶级域服务器、权威服务器依次发起递归查询。权威服务器返回最终结果本地 DNS 服务器缓存结果并转达给客户端。问题出在第 3 步之前的缓存更新阶段。一个配置不当的局域网 DNS 服务器只会盲目接受第一个到达的响应而不会严格校验源 IP 是否真的来自权威服务器。攻击者只需要提前发送一个伪造的 UDP 响应里面包含“test.example.com 恶意 IP”如果这个伪造响应比真实响应先到或者伪造的源端口、事务 ID 碰巧匹配DNS 服务器就可能把假记录存入缓存。整个过程是一次典型的“竞争”谁先到谁就赢。这里有个关键概念叫“事务 ID”Transaction ID。客户端发出查询时会生成一个随机的 16 位整数期望响应里包含同一个 ID。如果攻击者能猜中或者提前嗅探到这个 ID就能构造出看似合法的响应。当年 Kaminsky 攻击利用的就是这个机制通过不断发起不存在的子域名查询大幅提高猜中事务 ID 的概率从而实现对真实域名的缓存污染。2.2 局域网场景中的“讨巧”手法上面说的是针对 DNS 服务器缓存投毒的传统手法需要猜测事务 ID成功率取决于网络条件和攻击者的耐心。但局域网里的 DNS 欺骗往往不需要这么复杂直接配合 ARP 欺骗把 DNS 请求引到攻击机然后返回一个伪造响应就行。攻击者不需要猜事务 ID因为请求已经从物理层面被劫持到自己的机器上了。这也是为什么我强调实验环境要隔离。ARP 欺骗本身就会对网络造成干扰如果在生产环境里启动可能导致其他机器断网、网关 ARP 表混乱后果很难控制。测试前你要用 arp 命令确认目标机的 ARP 缓存并记录网关 MAC 地址测试结束后恢复现场。2.3 欺骗的“变体”代理响应 vs 直接污染代理响应型攻击者拿到 DNS 请求后把原请求替换成恶意应答然后返回给客户端。这是中间人模式的典型用法特点是灵活可以按域名选择性地放行或篡改。缓存污染型攻击者向 DNS 服务器发送大量伪造响应企图让服务器把假记录缓存下来。这种方式影响面更大因为只要服务器缓存了假记录所有依赖这台服务器的客户端都会被牵连。授权测试里这两种手法我都遇到过实际需求。第一种多用于验证终端侧的防护能力第二种多用于验证内网 DNS 服务器的配置健壮性。3. 合法授权环境下的完整演示现在进入实操环节。整个演示分三步环境预检、实施攻击、验证结果。每步我都做了记录方便后续复盘。3.1 环境预检与欺骗前置先确认所有虚拟机网络通信正常。攻击机和目标机分别尝试 ping 网关再在目标机上执行一下 nslookupnslookup test.example.com 192.168.50.1目的有两个第一确认目标机的 DNS 服务器确实配置为 192.168.50.1第二记录正常的解析结果作为对比基线。假设正常情况下解析出来的 IP 是 192.168.50.100这就是 Web 服务的真实地址。这一步很值得做。没有基线数据的演示后面验证“是否被欺骗”会缺乏说服力。我见过一些人直接开攻击工具然后刷新浏览器看到“变了”就宣称成功了——可如果目标站点本身就有多个 IP或者负载均衡轮询你看到的可能只是正常现象。基线对比可以帮你排除这种干扰。3.2 启动 Bettercap 并执行 DNS 欺骗在攻击机上打开终端先做一次快速检查确认网络接口sudo bettercap -iface eth0进入交互模式后先启用 ARP 欺骗模块。这里我使用更明确的方式只欺骗目标机和网关的通信net.probe on set arp.spoof.targets 192.168.50.20 arp.spoof on启动后Bettercap 会开始持续向目标机和网关发送伪造的 ARP 响应让目标机以为攻击机就是网关。接着配置 DNS 欺骗规则set dns.spoof.domains test.example.com set dns.spoof.address 192.168.50.10 dns.spoof on这行配置的意义是当检测到目标机查询test.example.com时返回解析结果192.168.50.10也就是攻击机而不是真实 IP。Bettercap 的 dns.spoof 模块在默认情况下会接管所有 DNS 请求无论它们是发往哪个 DNS 服务器的只要 ARP 欺骗生效请求都会先经过这里。此时在 Bettercap 会话窗口里你会看到类似这样的输出[10:23:15] [dns.spoof] 192.168.50.20 192.168.50.10 A test.example.com表示已经捕获并改写了目标机的 DNS 查询。3.3 受害端行为与数据包证据现在回到目标机先清空本地 DNS 缓存ipconfig /flushdns然后再执行一次 nslookupnslookup test.example.com不出意外解析结果已经变成 192.168.50.10而不是之前的 192.168.50.100。用浏览器访问http://test.example.com可以看到攻击机上预先部署的页面内容。为了更好地还原证据链我在攻击机上同时启动了 Wireshark 抓包。目标机发出 DNS 查询后抓包结果里可以看到两个关键角色目标机发出的查询请求目标地址是 192.168.50.1:53。紧接着的响应来源却是 192.168.50.10:53而 192.168.50.10 根本不应该回应这个查询。这就是身份不匹配的典型证据。真实场景中DNS 解析结果应该来自域名对应的权威服务器或至少是网络内合法配置的 DNS 服务器。当响应来源变成了一个“局外人”说明链路已经被中间人接管了。为了确保实验数据更加完善我还做了一个对比把 dns.spoof.address 和真实 Web 服务的地址写进同一份报告再配合抓包文件的响应来源列这份证据就非常清楚了。4. 事后回溯如何用抓包与日志片段复盘攻击链条演示完毕后别急着关工具。合格的安全测试不只是“复现”你的交付物里如果只有几条命令记录客户会质疑你的专业能力。你得能复盘出整个链条解释每一个环节发生了什么以及证据在哪。4.1 关键数据包长什么样打开 Wireshark过滤规则用dns.flags.response 1这条规则会显示出所有 DNS 响应包。正常情况下响应包的 Source 字段应该是指定的 DNS 服务器 IP。但在攻击发生后你会看到源 IP 是攻击机地址的响应包而且这些响应包的出现时间跟目标机的查询时间高度吻合。往深处看还要关注响应包的 TTL 字段。正常解析响应里TTL 是一个服务器设置的缓存有效期比如 3600 秒而 Bettercap 构造的伪造响应为了追求时效性往往会设置一个较短或者很随意的 TTL。这也是 Wireshark 刨根问底的一个信号。4.2 识别“应答来自非权威源”判断是否为“非权威应答”可以在 Wireshark 的 DNS 协议树里找到 “Authoritative” 标志位。正常权威服务器的响应会带上 Authoritative AnswerAA位伪响应通常不会。不过这一点只能作为辅助判断因为很多内部 DNS 服务器在递归查询返回时也不会置该位。更可靠的指标是响应来源 IP 和端口。正常场景下目标机会把 DNS 查询发给 192.168.50.1:53响应也应来自同一个地址。一旦抓包结果显示响应来自 192.168.50.10:53这已经构成了明确的可疑信号。复盘完后我把抓包文件、Bettercap 会话日志、前后 nslookup 的对比结果打包文件名带上了测试日期和测试范围描述存入项目的证据目录。5. 常见问题与排查技巧实录做演示和测试多年踩过不少坑。这里整理几个高频问题方便你动手时快速定位。5.1 明明攻击成功受害机器却依然能上网出现这种情况的常见原因有系统有 DNS over HTTPSDoH或 DNS over TLSDoT保护。Windows 11 或新版浏览器默认开启 DoH 后DNS 查询走的是加密隧道明文抓包和欺骗都会失效。目标机器或浏览器启用了缓存固定策略比如配置了静态 DNS 映射。攻击机的 ARP 欺骗被交换机的端口安全策略拦截了。我的处理思路是先检查目标机的 DNS 客户端解析缓存再抓包看请求是否真的到达了攻击机。如果查询包根本没有出现基本可以确认是 DoH 或者终端策略问题。5.2 ARP 欺骗成功率忽高忽低这与实验室虚拟网络的环境有关也可能跟交换机的 ARP 学习机制有关。有些交换机开启了 Dynamic ARP InspectionDAI只有 DHCP snooping 绑定的合法 ARP 包才能通过。这种情况无论你怎么调工具参数效果都有限。解决思路是先确定实验网络是否存在 DAI 策略。如果存在要么调整交换机的信任端口配置仅限测试环境要么改用物理交换机端口镜像把 DNS 请求直接镜像给攻击机来分析。但后者已经不是“欺骗”了属于被动嗅探两种手段的技术结论不同。5.3 目标机在攻击后出现了断网这通常不是 DNS 欺骗本身造成的而是 ARP 欺骗模块引起的问题。某些工具在停止 ARP 欺骗时没有恢复原始 ARP 表或者攻击机网卡的转发功能没有启用导致目标机把流量发往攻击机后攻击机没有帮忙转发出去。解决办法在启动 arp.spoof 的同时启用内核 IP 转发sudo sysctl net.ipv4.ip_forward1这样可以确保攻击机收到目标机的流量后能正常转发到网关。实验结束后恢复现场要记得把 ip_forward 关掉sudo sysctl net.ipv4.ip_forward05.4 清理现场为什么比攻击本身更重要授权测试结束后一定要把 ARP 表恢复到正常状态。Bettercap 执行arp.cleanup可以催发一次 ARP 广播更新帮助设备重新学习正确的 MAC 地址。我还习惯再用网管视角扫一遍目标网络的连通性确认所有设备的网关 ARP 条目都指向了正确 MAC。这个动作听起来繁琐但可以避免测试结束后客户那边出现“莫名断网”的投诉也让交付环节更专业。6. 防守方视角的加固建议演示做完了攻击链路也梳理清楚了接下来要聊聊更实用的部分怎么防。6.1 最小修复方案从出口监管到终端策略在 DNS 服务器上启用 DNSSEC 验证。它通过签名机制确保应答确实来自权威服务器并且内容未被篡改。虽然部署过程需要迭代推进但局域网内部可以先从关键业务域名开始。终端和浏览器强制执行 DNS over HTTPS避免明文 DNS 请求暴露在链路中。Windows 11 可以直接在“网络设置”里指定 DoH 模板Firefox 和 Chrome 的配置也都很成熟。网络交换机开启 DHCP Snooping 和 Dynamic ARP Inspection。这些功能能从二层上拦截大部分基于 ARP 欺骗的中间人攻击。6.2 配置层面的硬指标DNS 服务器的递归查询范围要受限不要随意接收来自全网段所有 IP 的递归请求。防火墙规则里限制内部终端只能向指定的 DNS 服务器发起 53 端口 UDP/TCP 查询。如果允许网络管理员排查问题基于源 IP 的 53 端口访问日志要保留出现问题时能回溯是哪个终端发出了大量异常 DNS 查询。这些配置本身不复杂难的是坚持。很多网络有“临时开放”的习惯一开放就忘了关时间长了攻击面就回来了。6.3 日常监控与演练建议单次测试只能证明“当时存在风险”不能保证长期安全。建议把 DNS 欺骗验证纳入季度性的内网安全演练项目每个季度随机抽一段办公网做一轮测试重点观察测试期间监控平台是否产生告警。如果你的监控平台里已经具备了“响应来源 IP 与请求目标 IP 不匹配”这条规则那么攻击者来敲门的时候你至少能第一时间察觉。我的一句话总结是没被及时发现的风险比风险本身更可怕。7. 我的一些个人经验最后说点测试之外的东西。DNS 欺骗这类攻击工具门槛很低网上随便搜都能找到现成命令。但正因如此测试人员的技术深度往往体现在对协议的理解、对环境的掌控、对证据链的完整把握上。一个只会在虚拟机里敲命令跑通流程的人和一个能在真实网络里准确评估风险边界、给出可落地防守建议的人区别就体现在这些细节里。我自己的习惯是每次测试结束后都强迫自己写一段简要的复盘包括攻击链路图、抓包关键证据、影响范围、修复建议。这不但方便自己后续做交叉验证也对客户更负责。时间久了这套方法会沉淀成你个人工具箱里最好的“数据库”。
返回列表