1. 项目概述与核心价值
最近在内部安全演练和授权渗透测试中,DNS劫持作为一种经典的中间人攻击手段,其原理和实操依然是评估网络嗅探与欺骗防御能力的必修课。很多朋友一提到Kali Linux和Ettercap,就觉得是“老古董”组合,但实际上,在隔离网络、内部红蓝对抗或者特定安全教学场景下,掌握这套基于ARP欺骗的DNS劫持流程,远比单纯使用自动化工具更能理解网络协议的底层交互和防御盲点。这次,我就结合最近一次针对内部Web应用的授权测试,详细拆解用Ettercap实现DNS劫持的完整链路,重点分享其中5个决定成败的关键步骤,以及我踩过坑后才总结出的避坑指南。
这个实验的核心价值在于理解攻击链。它不仅仅是让一个网站访问跳转到另一个地址,而是让你亲身体验从网络层(ARP)到应用层(DNS)的完整欺骗过程。通过手动配置和排错,你能深刻体会到为什么内网安全策略需要绑定ARP、为什么DNS查询需要加密(如DoH/DoT)、以及为什么安全意识培训总强调“不要随意连接不可信的Wi-Fi”。对于安全运维人员来说,这也是检验自己网络是否健壮的一把尺子。
2. 实验环境搭建与前置条件解析
2.1 实验拓扑与角色定义
一个标准的DNS劫持实验至少需要三台设备,它们必须处于同一个二层广播域(通常就是一个局域网网段):
- 攻击机(Attacker):运行Kali Linux,并安装配置好Ettercap。这是我们的操作中枢。
- 靶机(Target/Victim):通常是一台Windows 10/11或另一台Linux主机,模拟普通用户的上网设备。
- 网关(Gateway/Router):局域网出口路由器,负责转发内外网流量,也是DNS查询的中转站。
实验目标是:让靶机在访问某个特定域名(例如www.example.com)时,被引导至攻击机指定的IP地址(例如攻击机自身的IP192.168.1.100),而不是真实的服务器地址。
2.2 Kali Linux系统准备
虽然标题提到了“Kali Linux实战”,但并不意味着你必须用物理机安装Kali。对于学习和测试,虚拟机方案是首选,它隔离性好,方便快照恢复。我强烈推荐使用VMware Workstation Pro或VirtualBox。
注意:在VMware中安装Kali时,网络适配器务必选择“桥接模式”(Bridged),而不是NAT模式。桥接模式会让Kali虚拟机从你的物理路由器那里获取一个同网段的IP地址,使其在逻辑上与你的物理机、靶机处于平等地位,这是后续ARP欺骗能够生效的前提。关于预留内存,Kali Linux官方推荐至少2GB,但为了运行图形化界面和工具更流畅,分配4GB内存是更稳妥的选择。
安装完成后,第一件事是更新系统并安装完整工具集(如果安装时选择了“Everything”则无需此步):
sudo apt update && sudo apt upgrade -y sudo apt install ettercap-graphical -y # 安装图形化界面的Ettercap同时,确保你的Kali攻击机拥有一个静态的、与局域网同网段的IP地址,避免DHCP租约变化带来麻烦。
2.3 靶机与网络环境确认
- 确认IP地址:在Kali上使用
ifconfig或ip addr命令,在Windows靶机上使用ipconfig命令,确认三者(攻击机、靶机、网关)的IP地址和子网掩码。例如:- 网关:192.168.1.1
- 攻击机(Kali):192.168.1.100
- 靶机(Win10):192.168.1.50
- 测试连通性:从攻击机ping通靶机和网关,从靶机ping通网关和攻击机,确保基础网络无故障。
- 关闭不必要的防护:在靶机(Windows)上,仅针对本次实验环境,可以暂时关闭Windows防火墙和实时病毒防护,避免其干扰ARP报文或拦截异常流量。在生产环境中绝对不要这样做,但这能帮助你在学习阶段排除干扰,聚焦于核心原理。
3. 核心工具Ettercap与DNS劫持原理深度拆解
3.1 Ettercap:不只是个嗅探器
很多人把Ettercap简单归类为网络嗅探工具,这低估了它的能力。Ettercap的核心是一个“综合性的中间人攻击(MITM)框架”。它支持多种MITM攻击模式,如ARP欺骗、ICMP重定向、DHCP欺骗等。对于本实验,我们使用的是其最经典、最有效的**ARP欺骗(ARP Poisoning)**模式。
ARP(地址解析协议)是局域网内将IP地址映射到MAC地址的协议。它的设计基于信任,没有内置的身份验证机制。Ettercap的ARP欺骗,就是持续地向靶机和网关发送伪造的ARP应答包:
- 告诉靶机:“网关192.168.1.1的MAC地址是攻击机(192.168.1.100)的MAC。”
- 告诉网关:“靶机192.168.1.50的MAC地址也是攻击机(192.168.1.100)的MAC。” 这样一来,靶机和网关之间所有的流量,都会“绕道”攻击机,攻击机就成为了一个透明的中间人,可以查看、修改或转发这些流量。
3.2 DNS劫持在MITM中的位置
当攻击机成功实施ARP欺骗后,它截获了靶机的所有网络流量。DNS劫持是建立在这一基础之上的应用层攻击。具体过程如下:
- 靶机想要访问
www.example.com,首先向DNS服务器(通常是网关或公共DNS如8.8.8.8)发起DNS查询请求:“www.example.com的IP是多少?” - 这个DNS查询请求包经过网络时,被正在实施ARP欺骗的攻击机截获。
- 攻击机上的Ettercap(配合其过滤器或插件)检查这个DNS请求。如果发现查询的域名是它想要劫持的(例如
example.com),它就会立即伪造一个DNS响应包,抢先于真实DNS服务器返回一个伪造的IP地址(例如攻击机自身的IP192.168.1.100)。 - 靶机收到这个伪造的DNS响应,信以为真,于是后续的HTTP/HTTPS请求就直接发向了攻击机(192.168.1.100),而不是真实的网站服务器。
3.3 HTTPS与DNS劫持的局限性
这里必须强调一个关键点:传统的基于Ettercap的DNS劫持,对于HTTPS网站是无效的。这是很多初学者最大的困惑点。
- 原因:即使DNS被劫持,用户浏览器连接到了攻击机的IP,但接下来会进行TLS/SSL握手。浏览器会检查网站提供的证书。如果证书的域名(Common Name)与用户访问的域名(如
www.example.com)不匹配,或者证书不是由受信任的证书颁发机构(CA)签发的,浏览器就会弹出严重的证书警告,阻止用户继续访问。 - 实验目标:因此,我们的实验通常针对HTTP网站,或者我们在攻击机上搭建一个具有有效证书的恶意HTTPS服务(这涉及更复杂的证书伪造或窃取,不在基础DNS劫持范畴)。在基础教学中,我们常用一个简单的HTTP页面来演示效果。
4. 实战五步曲:从配置到劫持验证
4.1 第一步:配置Ettercap的DNS欺骗规则
这是整个实验的“剧本”,告诉Ettercap该对哪些域名进行劫持,以及劫持到哪个IP。
- 定位配置文件:Ettercap的DNS欺骗规则文件是
/etc/ettercap/etter.dns。使用root权限编辑它:sudo nano /etc/ettercap/etter.dns - 编写规则:文件格式是
域名 类型 伪造的IP。例如,我们想将任何访问example.com及其所有子域名的请求,都指向攻击机(192.168.1.100):example.com A 192.168.1.100 *.example.com A 192.168.1.100 www.example.com A 192.168.1.100A记录表示将域名指向一个IPv4地址。*是通配符,表示所有子域名。- 你可以添加任意多条规则,针对不同域名劫持到不同IP。
- 保存并退出。
实操心得:在测试时,我强烈建议使用一个你实际能控制的、不存在的域名,或者在你的本地网络环境中搭建一个测试域名。不要对真实的、重要的公网域名进行劫持测试,这即使在实验环境下也可能产生不可预知的影响。例如,你可以在路由器或攻击机的hosts文件里临时定义一个
test.local指向某个IP,然后在这里劫持它。
4.2 第二步:启动Ettercap图形界面并扫描主机
图形化界面(GTK+)更直观,适合初学者。
- 在Kali终端中输入启动命令:
sudo ettercap -G - 选择网卡:启动后,会弹出“Ettercap启动”对话框。在“Sniffing”标签下,选择你正在使用的网络接口(通常是
eth0或wlan0),勾选“Unified sniffing”(统一嗅探模式),点击“OK”。 - 扫描网络主机:进入主界面后,点击顶部菜单栏的 “Hosts” -> “Scan for hosts”。Ettercap会发送ARP请求来发现当前局域网内存活的主机。扫描完成后,点击 “Hosts” -> “Hosts list” 查看结果。你应该能看到网关、靶机和你自己的攻击机IP。
4.3 第三步:设定攻击目标(Target)
这是最关键的一步,决定了流量劫持的方向。
- 在“Hosts List”中,首先选择网关的IP地址,点击下面的 “Add to Target 1”(添加到目标1)。
- 然后,再选择靶机的IP地址,点击 “Add to Target 2”(添加到目标2)。
- 顺序很重要:通常的MITM攻击模式是“靶机 <-> 攻击机 <-> 网关”。将网关设为Target 1,靶机设为Target 2,意味着Ettercap将欺骗这两者之间的通信。
避坑指南:务必仔细核对IP地址!我曾有一次误将另一台同事的电脑设为了靶机,导致他的网络中断,闹了个大笑话。在实验环境中,最好给靶机设置一个容易识别的静态IP。
4.4 第四步:启动ARP欺骗与DNS欺骗插件
现在开始真正的攻击阶段。
- 启动ARP欺骗:点击顶部菜单 “Mitm” -> “ARP poisoning...”。在弹出的对话框中,务必勾选“Sniff remote connections”(嗅探远程连接),然后点击“OK”。此时,Ettercap开始持续向Target 1和Target 2发送伪造的ARP应答包。
- 激活DNS欺骗:点击顶部菜单 “Plugins” -> “Manage the plugins”。在插件管理窗口中,找到并双击“dns_spoof”插件以激活它。激活后,该插件会高亮显示。这个插件会读取我们第一步配置的
/etc/ettercap/etter.dns文件,并对匹配的DNS查询进行劫持。
4.5 第五步:验证劫持效果与收尾
- 在靶机上验证:
- 打开靶机的命令行(Windows的cmd或PowerShell)。
- 使用
nslookup命令查询你准备劫持的域名。例如:nslookup www.example.com - 如果劫持成功,返回的IP地址应该是你在
etter.dns文件中设置的伪造IP(如192.168.1.100),而不是真实的公网IP。 - 进一步,你可以在攻击机的Kali上启动一个简单的HTTP服务器,来模拟被劫持的网站:
# 在Kali的终端中 cd /var/www/html # 或任何一个目录 echo "<h1>Hacked by Ettercap DNS Spoofing Test!</h1>" > index.html sudo systemctl start apache2 # 如果使用Apache # 或者使用Python快速搭建一个: python3 -m http.server 80 - 然后在靶机的浏览器中访问
http://www.example.com,如果看到你创建的页面,说明DNS劫持和流量转发完全成功。
- 停止攻击:实验完成后,务必回到Ettercap界面,点击 “Mitm” -> “Stop mitm attack(s)” 来停止ARP欺骗。然后可以关闭Ettercap。最好再重启一下靶机的网络(
ipconfig /release和ipconfig /renew在Windows上),或重启其网络接口,以清除被污染的ARP缓存。
5. 常见问题排查与深度避坑指南
即使按照步骤操作,你也可能会遇到问题。下面是我总结的常见故障及其解决方法。
5.1 问题一:Ettercap扫描不到主机或靶机
- 可能原因1:防火墙拦截。靶机或网关的防火墙可能屏蔽了ICMP或ARP探测包。
- 解决:确认实验环境,临时关闭靶机防火墙(仅限实验网络)。确保Kali攻击机的防火墙也未阻止相关流量(
sudo ufw disable可临时关闭Ubuntu系防火墙)。
- 解决:确认实验环境,临时关闭靶机防火墙(仅限实验网络)。确保Kali攻击机的防火墙也未阻止相关流量(
- 可能原因2:网络模式错误。Kali虚拟机网络模式不是桥接(Bridged)。
- 解决:检查虚拟机设置,确保网络适配器为桥接模式,并复制物理网络连接状态。
- 可能原因3:IP不在同一网段。
- 解决:用
ifconfig和ipconfig仔细比对三者的IP地址和子网掩码,确保它们属于同一子网(如192.168.1.x/24)。
- 解决:用
5.2 问题二:ARP欺骗成功,但DNS劫持无效
- 可能原因1:
etter.dns文件配置错误或未生效。- 解决:检查文件路径和权限。确保编辑后已保存。可以在Ettercap中重启dns_spoof插件,或重启Ettercap。使用
cat /etc/ettercap/etter.dns命令确认内容无误。
- 解决:检查文件路径和权限。确保编辑后已保存。可以在Ettercap中重启dns_spoof插件,或重启Ettercap。使用
- 可能原因2:靶机使用了DNS缓存或Hosts文件。
- 解决:在Windows靶机上,用
ipconfig /flushdns清除DNS缓存。同时检查C:\Windows\System32\drivers\etc\hosts文件,看是否有该域名的静态映射。
- 解决:在Windows靶机上,用
- 可能原因3:靶机使用了DoH(DNS over HTTPS)或DoT(DNS over TLS)。
- 解决:这是现代浏览器和操作系统增强的安全功能。传统的基于UDP 53端口的DNS欺骗无法劫持加密的DNS查询。在实验环境中,需要在靶机浏览器或系统网络设置中暂时关闭“使用安全DNS”或“通过HTTPS加密DNS查询”等选项。
- 可能原因4:插件未正确激活。
- 解决:在Ettercap的“Plugins” -> “Manage the plugins”中,确认“dns_spoof”插件已被选中(高亮)。有时需要取消选中再重新双击激活一次。
5.3 问题三:攻击导致网络不稳定或断网
- 可能原因:ARP广播风暴或资源竞争。Ettercap持续发送ARP包可能对老旧交换机或网络造成压力。
- 解决:在Ettercap的“Mitm” -> “ARP poisoning...” 对话框中,有一个“Poisoning”选项,可以尝试勾选“one-way”(单向欺骗),即只欺骗靶机认为攻击机是网关,而不欺骗网关。这有时能增加稳定性,但可能影响从网关到靶机方向流量的嗅探。
- 根本解决:实验应在独立的、不影响生产的网络环境中进行。
5.4 问题四:无法劫持特定域名(如百度、谷歌)
- 可能原因:域名解析结果非A记录。有些大型网站使用CNAME记录或CDN,最终解析的IP地址池非常庞大且经常变动。
- 解决:
etter.dns文件主要针对A记录。对于复杂情况,劫持可能不稳定。我们的实验目的是理解原理,建议使用自己定义的、简单的测试域名。
- 解决:
5.5 高级避坑与优化技巧
- 使用命令行模式进行自动化:图形界面适合学习,但命令行模式(
ettercap -T -q -M arp:remote -P dns_spoof /网关IP// /靶机IP//)更适合写入脚本或进行自动化测试,效率更高。 - 结合其他工具观察流量:在启动Ettercap的同时,可以在另一个终端使用
tcpdump或Wireshark抓包,过滤DNS流量(udp port 53),直观地看到伪造的DNS响应包是如何发出的,加深理解。 - 靶机防护体验:完成攻击实验后,立刻在靶机上尝试启用“静态ARP绑定”(将网关的IP-MAC对应关系写死)或启用防火墙的ARP防护功能,然后再次尝试攻击,你会发现攻击立刻失效。这正是防御方应该采取的措施之一。
- 法律与道德红线:务必牢记,所有技术都应在合法、授权的前提下使用。未经授权对任何网络或设备进行嗅探、欺骗和攻击都是违法行为。本实验仅限用于个人授权的测试环境、CTF比赛或专业安全课程学习。
通过这五个步骤和详细的排错指南,你不仅能成功完成一次DNS劫持实验,更能透彻理解ARP与DNS协议的安全缺陷,以及中间人攻击的基本模型。这种深入原理的动手经验,是成为一名合格网络安全从业者的重要基石。