免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

DNS欺骗与ARP欺骗:从原理到防御的完整实战指南

DNS欺骗与ARP欺骗:从原理到防御的完整实战指南 1. 项目概述与合法测试边界1.1 核心需求解析一次“模拟DNS劫持”的实验场DNS欺骗攻击说白了就是让受害者的电脑在访问某个域名时拿到一个你希望它访问的IP地址而不是真实的IP地址。用户在浏览器里输入example.com回车之后看到的内容可能根本就不是真正的目标网站。这招在合法授权的渗透测试里非常常见常用于验证企业的域名解析链路是否存在脆弱点、员工终端是否容易落入钓鱼页面的陷阱以及检测内网DNS监控手段能不能及时报警。我之所以决定把这次演示完整记录下来是因为在实际项目中遇到过太多“想当然”的假设不少安全管理员认为内网部署了防火墙、装了杀毒软件DNS欺骗这种事情就不可能发生。但真实测试结果往往很打脸。这篇博文的内容我特意定位在“实验室环境 合法授权下复现攻击路径”一方面把整个技术链路拆开讲清楚另一方面也帮你建立一套可以反复使用的自查流程。阅读本文需要的基础不多——懂一点TCP/IP基础、会用Kali Linux的基本命令就够了。1.2 演示环境的逻辑与工具选型任何一次DNS欺骗演示都需要回答三个问题局域网里能不能在两个终端之间建立中间人位置攻击机的系统环境是否可控能不能在演示结束后一键还原网络状态我搭建这套环境时遵循的就是这种“确定性优先”的思路尽量减少无关变量。环境清单如下攻击机Kali Linux虚拟机IP192.168.1.20自带ettercap、dnschef等工具靶机Windows 10虚拟机IP192.168.1.88关闭防火墙方便验证网关192.168.1.1家用路由器域名解析关系访问test.example.com时期望将其劫持到192.168.1.20上自建的临时Web页面工具为什么最终选定了ettercap原因其实很简单它能够在一条命令行里同时完成ARP欺骗和DNS欺骗的编排天然适合快速验证。而dnschef则需要手动处理流量转发和监听地址适合更精细的控制场景。如果你后续想在实验里加入复杂的DNS响应规则比如针对特定子域返回不同地址dnschef会更有优势但日常测试用ettercap已经非常顺手了。实操时另配一台Wireshark抓包机专门用于观察DNS响应包方便事后做证据留存。注意下面演示里的所有内容都必须发生在你自己拥有授权或完全控制的实验环境中。未授权的扫描与欺骗属于违法行为没有任何商量的余地。设备有争议请自行查阅当地适用规则与职业准则我这里只讨论技术本身和合法的授权测试场景。2. 核心原理拆解2.1 DNS解析流程与“隐形关卡”DNS是整个互联网寻址体系里的基础设施它负责把人类容易记忆的域名翻译成机器能够路由的IP地址。正常流程是这样的客户端向配置好的DNS服务器发起查询请求DNS服务器逐级迭代最终返回正确的A记录客户端建立TCP连接开始访问目标服务。整个过程对用户来说是透明的虽然每次查询只有几十毫秒但这里面有大量可以被干预的环节。用生活里的场景类比DNS就像你在手机里存的通讯录你写了个“李哥”拨号时通信录帮你转换成真实号码。如果你手机通讯录被人偷偷改过“李哥”对应的号码换成了一家诈骗公司的电话你还以为自己打通了李哥的电话。DNS欺骗就是在通讯录这个环节动了手脚。对终端用户而言他访问的域名没变、界面看起来也差不多但背后连接的服务器已经完全不一样了。从攻击者的角度来说干预DNS解析链路有两个方向一种是直接攻击DNS服务器本身篡改域名记录另一种是在客户端和DNS服务器之间伪造应答。前者的门槛高需要找到DNS服务器的漏洞或者管理权限后者在局域网中几乎等于“零成本实现”因为你不需要攻击真正的DNS服务器只需要欺骗客户端让它相信你发过去的那个伪造DNS响应才是真的。2.2 欺骗攻击的三种主要手法常见的DNS欺骗可以粗分为三类理解这些手法对后面的防御思路很有帮助。第一类是ID欺骗。DNS数据包头部里有一个16位的Transaction ID用于对应用户的查询请求与服务器的应答。攻击者可以提前嗅探到客户端发出的查询请求然后在真实的DNS应答到达之前伪造一个带有相同ID的响应包反向发给客户端。如果伪造包先到达客户端就会接受这个错误结果。这类攻击的优势是不需要在网络上建立中间人位置劣势是必须非常准确地预测或捕获到请求ID而且对时序要求极高。第二类是缓存投毒。当攻击者能够向DNS服务器发送查询并让服务器缓存一个恶意应答时后续所有请求该域名的客户端都会拿到错误IP。这种攻击的影响范围以DNS服务器的缓存时间为周期危害很广但在内网自建DNS的情况下更常见对家用路由器环境而言反而不太好直接演示。第三类也是本篇文章实操的核心——结合ARP欺骗的DNS应答伪造。攻击者先在局域网里发送伪造的ARP应答让网关和靶机都认为攻击机的MAC地址就是对方的MAC地址从而把所有流量引流到攻击机攻击机再把需要转发的流量做一次代理转发同时对靶机的DNS查询请求注入伪造的DNS响应。这样一来靶机发出的域名解析请求会被攻击机截获攻击机伪装成真正的DNS服务器回答一个自定义地址靶机就会乖乖连接攻击者指定的服务器。2.3 ARP欺骗为何必然伴随DNS欺骗有人可能会好奇我直接往局域网里发伪造的DNS响应不就行了为什么要先做ARP欺骗这个问题我也曾经困惑过后来在实验里对比过两种方式的成功率才彻底想明白。在普通的交换机网络里交换机只会把数据帧转发给目标MAC地址所在端口你在自己的电脑上收到的包本质上只有广播帧、发给本机MAC的帧以及混杂模式下才能捕获到的流量。如果你没有开启混杂模式根本无法得知靶机发出的DNS查询内容更别提伪造对应Transaction ID的应答包。就算你开了混杂模式在Switch环境下依然只能捕获到能到达本机的广播和组播流量大量的单播DNS查询包根本不会经过你的网卡。而ARP欺骗解决了这个问题它通过向靶机宣布“网关的IP对应的MAC是攻击机的MAC”让靶机把发往网关的数据包统统交给攻击机转交。同理向网关宣布“靶机的IP对应的MAC是攻击机的MAC”网关也会把发给靶机的包交给攻击机。这样一来攻击机就处于一条双向必经之路上靶机的DNS查询流量自然也会被攻击机看到并截获。有了这个中间人位置DNS欺骗的成功率就变得非常高了。3. 实操过程全记录3.1 第零步网络环境确认与地址规划动手之前先花五分钟确认网络环境这能省掉后面很多排错的麻烦。我在实验时习惯用一条命令同时检查攻击机IP、网关和网卡接口在Kali里执行ip addr确认当前活动网卡是eth0并记录IP比如192.168.1.20/24。再用ip route查看默认网关正常情况下会输出类似default via 192.168.1.1 dev eth0的内容网关就是192.168.1.1。靶机用Windows系统时会方便一点命令行直接执行ipconfig /all确认本机IP、网关和DNS服务器地址。这里有个小细节靶机的DNS服务器经常被设为路由器的IP如192.168.1.1或者运营商分配的DNS如114.114.114.114这会影响ettercap的检测效果。因为后面伪造的DNS响应是针对“从靶机发出的DNS查询”来应答的只要你做了ARP双向欺骗无论靶机的DNS服务器填写什么都无所谓——查询流量都会流经攻击机攻击机负责的那次应答就会生效。但为了让演示过程更直观我提前把靶机的DNS配置成了192.168.1.1这样和网关保持一致排查问题时更容易定位。地址规划方面我建议把攻击机和靶机固定在静态IP上不要走DHCP动态分配。原因在于后面的命令需要频繁引用这两个IP如果中途路由器重启导致IP变动ARP缓存和防火墙规则很容易错乱演示效果全毁。此外确认一下局域网里没有其他设备占用这两个IP可用arp -a或ip neigh快速梳理一遍。3.2 第一步开启IP转发与ARP欺骗中间人位置依赖系统内核把收到的数据包从一个网卡转发到另一个网卡默认情况下Linux的ip_forward是关闭的不处理转发就会导致靶机断网立刻引起用户警惕。所以首先需要手动开启IP转发echo 1 /proc/sys/net/ipv4/ip_forward为了让这个设置在重启后依然生效在Kali中需要写入/etc/sysctl.conf添加net.ipv4.ip_forward1然后执行sysctl -p加载配置。我在一开始实验时只用了临时命令结果中途靶机重启导致网络恢复原状后续半天都在纠结为什么攻击不生效后来把配置固化后就没再出过这类问题。开启转发后就可以启动ettercap的文本界面了。使用下面的命令建立双向ARP欺骗ettercap -T -i eth0 -M arp:remote /192.168.1.88/ /192.168.1.1/参数说明-T使用文本界面不弹图形界面适合远程演示-i eth0指定监听和发送数据包的网卡-M arp:remote启用ARP欺骗模式的remote选项表示建立双向欺骗/192.168.1.88/靶机IP/192.168.1.1/网关IP命令执行后ettercap会周期性发送伪造的ARP应答同时不停地打印截获到的连接信息。此时在靶机上访问一次外网如果页面能正常打开说明IP转发生效了如果靶机断网优先检查cat /proc/sys/net/ipv4/ip_forward是否为1其次检查攻击机的防火墙是否把转发流量拦截了。为了验证中间人位置是否真实建立可以在攻击机上用Wireshark抓包抓取一段时间内的ARP包。如果看到大量arp应答包雷同地宣告“网关在攻击机MAC”就说明ARP欺骗已经生效。验证这一步非常关键不要跳过去直接做DNS欺骗否则会出现“DNS规则配置正确但靶机死活不上钩”的尴尬局面。3.3 第二步配置DNS欺骗规则ettercap实现DNS欺骗依赖一个规则文件etter.dns默认路径在/etc/ettercap/etter.dns。编辑这个文件需要注意格式否则ettercap启动时会直接报错并忽略整条规则。我的建议是先备份原文件再在文件底部追加自己的测试规则。打开编辑sudo nano /etc/ettercap/etter.dns文件内部是类似于下面的条目结构test.example.com A 192.168.1.20 test.example.com PTR 192.168.1.20 *.example.com A 192.168.1.20 *.example.com PTR 192.168.1.20这里的核心字段说明如下A记录把域名解析指向自定义的IP演示中指向攻击机192.168.1.20PTR记录反向域名解析可选项但加上后能应对某些应用程序的校验场景通配符*匹配该域名下的所有子域名测试时很方便这里有一个常见的坑ettercap事件默认只会对“它捕获到的DNS请求”进行应答如果靶机已经缓存了test.example.com的正确解析结果就不会再发出查询请求。解决方式通常有两个一个是修改靶机hosts文件不现实另一个是在靶机上用ipconfig /flushdns清理DNS缓存再打开新的浏览器隐私窗口发起访问。配置完成后在运行中的ettercap界面按下d键切换插件开关或者你可以直接换用带插件的命令行参数重启整个过程。常见做法是这样的ettercap -T -i eth0 -M arp:remote -P dns_spoof /192.168.1.88/ /192.168.1.1/-P dns_spoof参数显式加载DNS欺骗插件这样启动后插件就会自动启用。3.4 第三步效果验证与抓包证据靶机端执行ipconfig /flushdns再访问test.example.com如果前面的环节全部正常浏览器不会打开真实站点而是连接到攻击机192.168.1.20——我在攻击机上事先放了一个临时Web页面头部文字写着“这是DNS欺骗演示页面”方便肉眼确认。光凭肉眼确认还不够严谨。为了把攻击链路记录下来我在Wireshark里针对dns协议做了过滤并且把目标地址设为test.example.com。抓到的数据包里能看到一个非常关键的特征DNS应答的源IP并不是靶机配置的DNS服务器192.168.1.1而是攻击机192.168.1.20但是应答中包含正确的Transaction ID和目标域名。这就解释了为什么客户端会乖乖相信——它并没有验证来源地址只知道Transaction ID匹配了就照单全收。另一个细节是应答包里的TTL生存时间设置得比较低。正常DNS解析的TTL可能是300秒起而ettercap默认的TTL很小这样能让伪造结果快速过期避免靶机长时间缓存错误记录也是为了保证测试结束后网络状态能够尽快恢复正常。3.5 第四步攻击清除与现场还原测试收尾阶段有三个动作必须做否则网络会一直处于中间人的畸形状态造成其他设备访问异常。第一步在Kali上按CtrlC终止ettercap运行。终止之后ettercap通常不会主动恢复它之前覆盖的ARP缓存你需要手动清理。第二步在攻击机上清空ARP缓存并重新获取网关MACip neigh flush all ping -c 3 192.168.1.1第三步在靶机上执行同样的清理操作arp -d逐条删除或者直接重启网络适配器。最稳妥的方法是靶机也重启一下重启后ARP缓存和DNS缓存全部重置不会留下任何测试痕迹。提示攻击机在演示结束后不要立即休眠或关机务必确认靶机能正常恢复与其他设备的通信。我在一次演示后没有清ARP缓存结果靶机直到ARP记录老化前都访问不了外部网站现场相当尴尬。这条经验希望你一次都不要踩。4. 常见问题与排错速查4.1 靶机断网或延迟明显这个现象算是ARP欺骗演示里出现频率最高的问题。多数原因是ip_forward没有开启或者被局域网里其他设备抢占了IP导致ARP表混乱。每秒检查一次转发状态cat /proc/sys/net/ipv4/ip_forward输出必须是1如果是0用前文提到的临时命令重新开启。另外检查攻击机的防火墙策略在Kali上执行iptables -L看看FORWARD链的默认策略是否为DROP如果生产环境加固过防火墙需要允许192.168.1.0/24网段之间的流量通过。延迟明显的情况通常和攻击机的性能以及无线网络环境有关。我测试时优先用有线连接虚拟机分配至少两核CPU和2GB内存既保证转发吞吐也减少延迟抖动对演示效果的影响。4.2 DNS重定向不生效靶机访问test.example.com后仍打开真实网站这种问题几乎集中在三个方面。第一靶机DNS缓存未清理先执行ipconfig /flushdns第二ettercap的dns_spoof插件没有随启动加载重新确认命令行中的-P dns_spoof参数第三etter.dns文件里规则的域名和靶机实际访问的域名不完全匹配注意大小写和结尾点。还有一个容易忽略的点ettercap插件需要“看到”DNS请求才会触发应答如果靶机浏览器开了DoHDNS over HTTPSDNS查询会被加密隐藏在HTTPS流量里ettercap就完全无法感知。遇到这类情况只能通过HTTPS解密或禁用DoH来验证但在内网实验中更建议直接用HTTP环境测试。4.3 被安全软件拦截Kali自带的防火墙/入侵检测工具比如snort、fail2ban有时会误判ettercap的ARP广播行为或者DNS响应注入行为直接拦截攻击机发出的数据包。当一切配置看起来都正确却不生效时先临时关闭或者放行这些服务测试完再恢复策略。靶机侧的杀毒软件也可能拦截异常内核驱动或网络行为不过Windows 10虚拟机在未联网更新病毒库的情况下拦截概率很低通常不会影响演示。如果被安全软件拦截与其跟杀软较劲不如把软硬件环境单独隔离出一台专用的实验交换机确保实验环境和业务环境完全隔离这样又安全又省心。4.4 抓包看不到任何DNS应答包出现这种情况十有八九是ARP欺骗并没有真正建立起来攻击机根本没获得完整的双向流量。用Wireshark查看ARP包确认攻击机是否周期性地宣告“网关的IP对应攻击机的MAC”以及“靶机的IP也对应攻击机的MAC”。如果只有单向的欺骗比如只欺骗了靶机而没有欺骗网关那么靶机发出的流量虽然到了攻击机但攻击机转交出去的包可能被交换机识别为异常来源访问目标服务时出现不对称路由导致后续应答跑偏。重新执行一次双向欺骗命令再抓包对比即可。还有一种少见情况是交换机启用了端口安全或DHCP Snooping直接丢弃了伪造的ARP包。这种环境多出现在办公网交换机上家用路由器一般不会做这类拦截。遇到这种情况换成接在同一台傻瓜交换机下的两台直连设备进行测试基本能绕开。5. 检测与防御建议5.1 从攻击视角看检测思路防御的前提是能看见攻击。DNS欺骗的核心症结在于客户端无条件相信DNS应答而且没有验证应答来源。要发现这类攻击可以关注以下几个特征。第一ARP层面出现大量异常的地址解析更新。正常网络里ARP条目建立后会在很长一段时间内保持稳定如果短时间内出现大量的who-has和is-at广播并且同一IP对应的MAC不断变动就要警惕是否存在ARP欺骗。第二DNS应答的源IP和配置的DNS服务器IP不一致。在客户端和网关之间做一次全流量镜像或者在关键节点部署一个DNS监控代理比对每一个DNS响应的源IP和预配置是否匹配。这个方法对简单的DNS欺骗非常有效。第三DNS响应时间异常偏快。伪造的应答通常由攻击机实时生成进程处理速度极快而真实DNS解析需要经过递归服务器、权威服务器的多级查询正常情况下二者存在可观测的时延差。不过这个特征容易受网络环境影响只能作为辅助判断依据。很多人觉得加密DNSDoH是解决DNS欺骗的银弹。它可以防伪造吗确实能因为在客户端和加密DNS服务器之间的流量不可见、不可篡改甚至可以隐藏DNS查询内容。但doH也有一个适配问题企业内部为了流量审计或内容过滤可能需要禁用DoH、强制流量绕过加密通道这会直接和用户隐私保护产生冲突。我的建议是在高风险业务场景中优先启用加密DNS同时保留旁路审计设备来记录连接日志和异常流量特征。5.2 防御加固的六个要点结合多次实验和真实排障的体会以下防御动作是我认为性价比最高的几条在交换机上启用端口安全Port Security和DHCP Snooping限制每个端口所能承载的MAC地址数量从源头阻断大量伪造ARP报文进入网络。家用路由器没有这些功能但在企业级环境里这是第一道有效防线。部署静态ARP绑定针对网关和关键服务器在终端系统里手动绑定IP与MAC。使用下一代防火墙或终端EDR的ARP欺骗检测模块定期对局域网内的IP-MAC对应关系做一致性巡检。对关键的Web业务系统提前启用HTTPS和HSTS。DNS欺骗只能把用户带到攻击者的服务器但HTTPS证书验证会直接阻断伪装即使DNS记录被篡改用户浏览器也会弹出证书错误警告大幅降低欺诈成功率。定期对内部网络进行自评估测试包括DNS欺骗和ARP欺骗两类项目用攻击工具验证监控系统的响应能力、告警能力和阻断能力。对员工进行安全意识培训重点讲解公共WiFi环境下访问敏感网站的风险以及对非预期证书警告的应对方式。我见过不少被DNS欺骗配合仿冒门户拿下一手口令的案例货真价实的安全事件从来都不是因为技术链条多高明而是人的链路早早开了口子。6. 写在最后的经验小结这篇演示文章的核心目的是帮助大家掌握DNS欺骗攻击的技术实现细节并把它转化为网络防御实践。从原理上讲DNS欺骗之所以在局域网中屡试不爽本质上还是缺乏足够强的双向认证机制客户端无法区分正常DNS响应和伪造DNS响应。在合法的授权测试中使用它做安全验证可以为后续加固提供非常清晰的技术依据。我在实际操作中养成的习惯是每次做DNS欺骗演示都会把攻击机、靶机、Wireshark抓包窗口按顺序启动先确认ARP欺骗成功再加载DNS规则最后检查应答包来源。整个过程看似多花两分钟实际上能避免大量返工。多做几个不同域名的欺骗规则你还会发现不同操作系统、不同浏览器对DNS欺骗结果的缓存策略差别很大这本身就是一块值得深挖的实验田。希望这篇记录能让你少走弯路也希望每个人都能善用这份技术守住法规和道德的底线。
返回列表