聊到中间人攻击,也就是常说的MITM,很多刚入门的朋友第一反应是“抓包改包”,第二反应是“这不就是个工具用法吗”。但实际参与过漏洞挖掘、做过应急响应的人心里都清楚,MITM从来不是一个孤立的技巧,它是一整套打破信任链的思路,是从网络层打到应用层、从明文流量打到加密协议、从“看见数据”进化到“篡改数据”的过程。这篇文章我想完整拆一遍MITM攻击的原理、复现过程和它在漏洞挖掘里的真实价值,也把我在本地环境里反复踩过的坑一并交代清楚。
需要提前强调的是,所有实操环节必须在你自己搭建的虚拟机、靶场或者拿到授权的测试环境里进行,任何针对未授权目标的扫描、嗅探、流量劫持都是红线,这件事没有灰色地带。
1. MITM攻击的底层逻辑:它到底在攻击什么
很多人把MITM简单理解为“在中间截数据”,这个说法没错,但太粗了。你要真正理解MITM,必须理解网络通信里最基本的信任模型:数据的发送方和接收方,默认相信它们之间的每一个节点都是忠实的邮递员。
1.1 信任链是怎么被打穿的
想象一个最简单的场景:主机A给主机B发一条消息,消息要经过交换机、路由器、可能还有各种网关。正常拓扑下,这些中间设备不拆包、不改内容,只是按地址转发。而MITM做的事,就是在这条链路上插入一个“不忠实的节点”——我自己。插入成功后,我既是A眼中的B,又是B眼中的A,两边各自认为自己在和对方说话,实际上收发全经过我手里。
这个“插入”动作,本质是破坏了两个信任基础:
第一,身份信任。通信双方无法验证对方身份的真实性,或者验证机制存在可以被绕过的缺口。ARP欺骗、DNS欺骗走的就是这条路——我把自己的设备伪装成网关,让目标主机以为我是路由器;或者伪装成某个域名对应的服务器,让目标主机把请求交给我。
第二,协议信任。即使双方用了加密,如果密钥分发过程可以被劫持,或者协议允许降级到不加密的版本,那么加密本身也形同虚设。SSL剥离攻击就是典型:目标原本要访问HTTPS站点,我把页面里的HTTPS链接替换成HTTP,用户看到的是明文流量,我抓到的也是明文。
所以你在看任何一个MITM攻击案例时,不要只盯着“用了哪个工具、敲了什么命令”,第一反应应该是:这个攻击利用的是身份信任缺陷,还是协议信任缺陷?想清楚这一点,你才能在不同场景里切换工具和手法。
1.2 攻击面分析:哪里容易出现中间人
从业内实际的漏洞挖掘经验看,MITM的高发区集中在以下几类场景:
- 公共WiFi环境。开放网络中,攻击者通过恶意热点或ARP欺骗,几乎可以零成本劫持同一网段内所有未加密流量。
- 企业内网。别以为内网就安全,交换网络下ARP欺骗、DHCP欺骗依然是老牌有效的手段,很多老设备甚至不开启DHCP Snooping和动态ARP检测。
- 移动端App通信。开发者没做好SSL Pinning,或者App内置了错误的安全策略,导致抓包工具轻松解密HTTPS流量。
- 物联网设备。很多设备走私有协议但没加密,或者出厂证书固定不可更换,这类设备基本就是裸奔状态。
- 供应链场景。软件升级、依赖包拉取如果没有校验完整性,包管理器被劫持就是一次典型的间接MITM。
做漏洞挖掘或者安全评估时,你可以拿这个清单去对照被测目标:它的通信链路里有没有信任盲区?这些盲区在什么条件下可以被利用?
2. 从零复现一次完整的MITM攻击链路
复现的价值在于“手感”。看完一百篇分析文章,不如自己搭一台靶机,亲手让流量在眼皮底下拐个弯。下面是我在本地环境里反复跑过多轮的一套组合方案,覆盖从环境准备到流量劫持的完整链路。
2.1 实验环境怎么搭最合适
我的建议是三层结构:攻击机、目标机、网关。具体配置参考:
| 角色 | 推荐环境 | 网络连接 | 说明 |
|---|---|---|---|
| 攻击机 | Kali Linux 虚拟机 | NAT模式,与靶机同一虚拟网络 | 自带大量工具,省去安装麻烦 |
| 目标机 | Windows 10 或 Ubuntu 虚拟机 | NAT模式,与攻击机同一虚拟网络 | 模拟普通用户访问Web服务 |
| 网关 | 物理路由或虚拟网络默认网关 | - | 只需记录真实网关IP即可 |
注意一个细节:整个环境尽量放在VMware或者VirtualBox的自定义虚拟网络里,不要直接用NAT共享宿主机网络。原因有两个,一是避免影响宿主机网络,二是靶场环境里通信可控,排查问题更容易。网络模式也不用太纠结,只要攻击机和目标机能互通、能访问同一个网关就行。
工具选型上我的主用组合是BetterCap + Wireshark,辅以Ettercap做交叉验证。BetterCap对网卡和网络栈的处理更稳,会话劫持和后渗透模块也齐全;Ettercap的插件生态成熟,DNS欺骗那套一打就着。两个都装不碍事,但初学者不要同时跑两个工具,容易把网络搞乱。
2.2 第一步:ARP欺骗,让目标把流量交给攻击机
ARP欺骗的原理一句话就能讲完:目标主机会通过ARP广播询问“网关IP对应的MAC地址是谁”,攻击机抢先应答“是我”,目标主机的ARP缓存就被污染了,之后所有发往网关的流量都会被转发到攻击机。
BetterCap命令非常直观:
sudo bettercap -iface eth0 # 进入交互模式后,先开启网络嗅探 net.probe on # 查看局域网内在线主机 net.show # 开启ARP欺骗,目标设为目标机IP,网关设为实际网关IP arp.spoof on拿到目标机IP之后,我用arp.spoof on把目标机的流量定向到攻击机。这时候打开目标机浏览器随便访问一个HTTP站点,攻击机上用Wireshark抓包就能看到目标机发出的明文HTTP请求。
这里有一个新手极其容易踩的坑:ARP欺骗开启时,如果你没在BetterCap里把net.sniff同步打开,流量会经过你的网卡但不会被记录。我正因为漏开这一项,一度以为欺骗失败,排查半天。正确的姿势是net.sniff on和arp.spoof on都开启,二者配合才是完整的“截获+观测”。
另一个坑是ARP欺骗对HTTPS流量无效。你以为抓到的是完整的用户访问记录,其实只拿到了加密数据,这时候就需要上SSL剥离或者证书替换的手法,这我在下一个环节细讲。
2.3 第二步:DNS欺骗,把目标定向到钓鱼服务
ARP欺骗只能让你“看到”流量,要想“改动”流量,DNS欺骗是更深入的一步。DNS欺骗的核心在于:目标的DNS解析请求经过攻击机的转发,攻击机在转发之前先伪造一个虚假的DNS响应,把目标要访问的域名解析到攻击机指定的IP。
BetterCap启动DNS欺骗也不复杂:
# 在交互模式里设置DNS解析规则 set dns.spoof.domains example.com set dns.spoof.address 192.168.44.100 dns.spoof on这个配置的含义是:当目标机请求解析example.com时,攻击机直接返回192.168.44.100这个地址。如果攻击机在这个IP上运行钓鱼页面或者改写的服务,目标用户访问example.com时看到的就是攻击者想让他看的内容。
DNS欺骗的威力不在“改个解析记录”,而在它可以配合社会工程学做完整攻击链。比如你伪造一个和真实登录页一模一样的页面,用户在钓鱼页输入的用户名密码直接落到你手里。在内部渗透测试中,DNS欺骗还能实现针对特定域名段的重定向,比如把测试环境域名、内网管理后台域名统统导向攻击机,实现“全域钓鱼”。
这个环节的踩坑提示:ettercap的老牌插件dns_spoof需要编辑/etc/ettercap/etter.dns文件,格式是域名 A 攻击机IP。我遇到过编辑保存后没生效的情况,原因是没有用root权限重启ettercap,记住修改后重启服务并确认当前用户有权限写入。
2.4 第三步:会话与凭证捕获,从流量中提取高价值数据
前两步完成之后,流量已经在你的手里了,接下来就是“挑东西”。抓到的数据分为两档:
第一档是明文协议信息。HTTP、FTP、Telnet、SMTP这些老牌协议,用户名、密码、会话Cookie、邮件内容全部裸露。用Wireshark跟着TCP流就能完整看到交互内容,也可以直接用BetterCap的net.sniff模块自动解析出HTTP请求里的凭证字段。
第二档是需要处理的加密流量。这时候有两个主流思路:
- SSL剥离:利用用户习惯从HTTP跳转HTTPS的间隙,把页面中的HTTPS替换为HTTP,或者延迟HSTS策略的生效,让流量退回明文。
- 中间人代理证书:在目标设备上安装攻击者生成的根证书,然后攻击机对目标伪装成HTTPS服务器,对真正的服务器伪装成合法客户端,使双向流量在攻击机上解密后重新加密。Burp Suite的
Proxy模块干的就是这个活。
我自己的经验是:实验室环境里先跑通SSL剥离,理解“为什么HSTS是缓解措施”;再配一轮Burp Suite的证书代理,理解“为什么移动App要做SSL Pinning”。这两轮走完,你对HTTPS不是铜墙铁壁这个事实会有切身体感,之后在漏洞挖掘里看到证书校验缺陷时,一眼就能认出来。
2.5 完整的流量劫持模拟:从ARP到数据落地的全过程
把上面几步连成一条线后,完整流程长这样:
- 攻击机开启BetterCap,进行全网段探测。
- 确认目标机与网关信息后开启ARP欺骗,流量切入攻击机。
- 攻击机开启IP转发和嗅探,记录明文数据。
- 针对目标域名开启DNS欺骗,把目标导向攻击机的钓鱼服务。
- 钓鱼服务记录提交的凭证,配合抓到的Cookie尝试会话接管。
这整套链路我在靶场跑通后,最大的感受是:攻击的每一步都依赖目标环境的安全缺陷——没有DHCP Snooping、没有端口安全、没有HSTS、没有证书锁定。你把这套链路反过来看,就是一张防御清单。
3. 漏洞挖掘视角:MITM怎么帮你找到真正的隐患
MITM攻击在漏洞挖掘里的角色很特殊。它不是一种能提交的漏洞类型,而是一个“放大器”——它能把其他看似无害的小缺陷放大成严重漏洞。做SRC或者众测的朋友,很多有价值的发现都来自“我先从流量侧切入,发现了某一个端点的异常”。
3.1 OWASP Top 10里与MITM直接相关的条目
对照OWASP Top 10,至少有四项和MITM强相关:
- A02 加密机制失效。这直接指向通信过程未加密、加密强度不够、证书验证缺失。MITM恰好是检验加密机制最直接的手段。
- A04 不安全的直接对象引用,配合API场景,往往通过劫持会话拿到越权接口的数据。
- A05 安全配置错误。默认证书、开放调试端口、错误HTTP头配置,都能降低MITM的门槛。
- A07 身份识别与认证失败。弱会话管理、Cookie固定、无多因素认证,在MITM下几乎等于裸奔。
做漏洞挖掘时,我的习惯是先判断目标是否存在MITM利用条件,如果存在,再顺藤摸瓜去找加密和认证缺陷。很多测试者只盯着Web层参数,把“抓包改包”当成全部,其实从网络入口切入能发现完全不同的攻击面。
3.2 实操手法:如何用MITM挖到有分量的漏洞
一个比较典型的实战流程是这样的:
目标是一个内部管理系统,Web端登录时使用HTTPS,但App端的某个老版本接口仍然走HTTP。我先在本地环境模拟用户网络,利用ARP欺骗把App测试机的流量导到Burp Suite,然后观察到某个接口明文传输用户的手机号和订单金额。
这份流量同时也暴露了接口的完整路径和参数结构。沿着接口路径继续探测,我发现了一个未做鉴权的导出接口,直接POST过去就能拉取全部用户的订单列表。前前后后不到半小时,从一个“是否能劫持流量”的问题,推进到了“越权读取全量用户数据”的高危漏洞。
中间的关键动作无非是这几步:确认流量可见性、过滤高价值接口、观察参数规律、测试越权和鉴权缺陷。MITM在这里扮演的角色是信息收集器,把目标的全貌展现在你眼前。没有这一步,你只能盲目地对已知接口跑字典,效率低很多。
3.3 由MITM引出的常见漏洞类型速查
我整理了一张在MITM场景下高频出现的漏洞清单,适合做SRC时对照排查:
| 漏洞类型 | 典型特征 | 排查方法 |
|---|---|---|
| 明文传输凭证 | 登录接口走HTTP,或HTTPS证书无效 | 抓包看登录包字段是否可读 |
| 会话固定 | 登录前后SessionID不变 | 抓包对比登录前后的Cookie字段 |
| 弱证书校验 | 客户端不校验证书或允许自签名 | 替换证书后是否仍然正常通信 |
| 任意主机头 | 服务端信任请求中的Host字段 | 修改Host观察是否被重定向到任意站点 |
| 不安全重定向 | 登录成功后跳转地址由参数控制 | 修改跳转URL参数看是否落地钓鱼站 |
| 接口越权 | Token逻辑简单、无权限控制 | 登录低权限账号直接请求高权限接口 |
这张表我用过很多次,每次都能挖到东西。它之所以有效,是因为MITM让所有通信细节无处可藏,测试者进入了一种“上帝视角”,缺陷自然暴露。
4. 从攻击到防御:检测MITM的几个硬核手段
讲完攻击,必须讲防御。做网络安全的,只会打不会防,等于只会出招不会收招。我给自己测过不少防御方案,也看过企业红蓝对抗的报告,下面这些手段是对付MITM最有效的,按优先级排。
4.1 网络层的防护:让ARP和DNS欺骗无法落地
ARP欺骗能成功,前提是内网里的主机可以任意应答ARP请求。所以最基础也最有效的防护就是:
- 开启交换机的动态ARP检测(DAI),它会校验ARP报文中的IP-MAC映射是否合法,非法报文直接丢弃。
- 开启DHCP Snooping,建立可信端口列表,只允许从可信接口接受DHCP响应。
- 配置端口安全,限制每个端口的MAC地址数量,静态绑定关键设备的MAC。
DNS欺骗的防护思路类似,内网部署DNSSEC或使用可信DNS转发策略,同时在终端侧做DNS解析记录比对,发现解析地址变动就告警。对企业网络来说,做好这些基础的准入控制,ARP类MITM基本就废了。
我实测里有一个心得:DAI的配置并不复杂,但很多网络管理员没开,原因是怕影响新设备接入。其实可以在启用DAI的同时把错误报文记录到日志里,观察一段时间,把规则调稳后再收紧,不必一上来就砍掉所有动态接入。
4.2 应用层的防护:证书校验与流量加密的细节
应用层防护的核心是“让加密真正发挥作用”。一个常见误区是觉得“我上了HTTPS就安全了”,但实际上很多部署根本没到位。
- 全站启用HSTS,并在响应头里设置
Strict-Transport-Security,告诉浏览器“这个站点只允许HTTPS访问”,阻断SSL剥离。 - 客户端严格校验服务端证书链,绝不能允许用户点掉证书告警。
- App端实现证书固定(Certificate Pinning),代码里内置服务端证书指纹,只信任预置的证书或公钥。
- 服务端配置证书自动续期,避免证书过期后用户被迫接受风险提示。
值得强调的是HSTS有一个“首次访问”窗口:用户第一次访问若被劫持到HTTP,HSTS尚未生效,所以更可靠的方式是预加载列表。对高安全要求的站点,域名要尽早提交到HSTS预加载列表,把风险窗口压到最小。
4.3 主动检测:如何发现网络里正在发生的MITM
防御不只“不让它发生”,还得“发生了能发现”。几个实战有效的检测方法:
- 监控ARP表中MAC地址的变化,如果一个IP的MAC地址频繁变化,大概率有ARP欺骗。
- 部署基于流量的检测系统,分析同一IP是否在短时间内收发大量异常重定向报文。
- 定期扫描内网同网段存活主机数和域名解析记录,比对基线。
- 利用蜜罐技术,在敏感网段部署假网关或假DNS服务器,一旦有流量触达蜜罐,立刻告警。
我做过一个小实验:在内网服务器上写了定时任务,每10分钟检测网关IP的MAC是否有变化,一旦异常就发钉钉告警。结果某次Red Team演练中,攻击机刚开始ARP欺骗就被发现了,整个攻击面的探测阶段直接暴露。这一类“小而实用”的检测脚本,比买一堆大而全的设备更贴合中小团队的实际需求。
5. 当AI遇上漏洞挖掘:辅助提效与新风险
近期圈内对“AI挖掘漏洞”讨论很多,这和MITM也有交集。我试着把AI工具引入到MITM相关的漏洞发现流程里,确实有一些新体会,也有新的踩坑点。
5.1 用AI辅助从抓包数据里快速筛目标
过去抓完包,面对几千条HTTP请求,靠人工翻找接口和参数,工作量很大。现在我的做法是,把抓到的流量导出成文本格式,丢给AI代码分析工具做初步筛选。
我会给一句很具体的提示语,比如“这是一份导出文本,包含HTTP请求的URL和参数,请帮我列出所有疑似存在敏感信息的请求,并按风险等级排序,标注出包含手机号、身份证、银行卡、Token、密钥等模式的内容”。AI可以在几秒钟内把候选接口列出来,我再人工验证这些接口是否真的暴露了敏感数据。
实测下来,这个模式对两种场景特别有用:一是接口较多的App端测试,二是大规模日志审计。但要注意,AI给出的结果只能作为线索,不能直接当作漏洞证据。它可能会漏报,也可能会因为JSON里的value值恰好匹配“手机号”规则而误报,最终判断必须回到抓包验证上。
5.2 AI在漏洞挖掘里的边界与风险
AI处理文本和模式的速度确实远超人类,但它有个根本短板:不理解真实世界里的业务逻辑。比如一个接口参数isAdmin=0,人工一看就知道是越权攻击点,AI如果不结合前端的逻辑上下文,很可能把它当成普通参数略过去。
还有一个反向风险:AI生成的扫描工具或POC脚本,可能会被不熟悉的人误打到未授权目标上。我见过一个朋友展示AI写的脚本,接口测试URL写死了公网线上域名,我当场提醒他删掉重来。这类问题本质上不是AI的问题,而是使用者对授权边界的判断问题。用AI提效之前,先把“什么能测、什么不能测”这条线刻在脑子里,比任何工具都重要。
5.3 一个AI辅助挖掘的轻量级实践
我分享一个低成本的实践思路,可以在合规靶场里跑通:
- 用BetterCap抓取靶场环境内的Web流量,导出为TXT。
- 用AI工具对该TXT做模式分析,让它标注所有可疑的参数名、路径、敏感数据字段。
- 将AI输出的候选接口逐一用Burp Suite做手动验证,关注认证与越权。
- 把验证通过的发现整理成漏洞描述,附上抓包记录和复现步骤。
这个流程中,AI负责“广撒网”,人负责“深挖坑”,两者配合效率很高。我也见过有人让AI直接生成漏洞利用程序,我的建议是不要在未授权或高敏感性项目上做这一步,即便在授权项目里,也要先和甲方确认利用范围。
我一直认为,AI在漏洞挖掘中的定位是加速器,不是替代者。它帮你减少重复劳动,但判断力、责任感和最终的安全决策必须牢牢握在人的手里。
6. 常见误区与实操心得:我在MITM上踩过的那些坑
写到这里,把实操过程中踩过的坑集中复盘一遍。每个坑背后都是时间和教训,能帮读者少走弯路,远比多列几条命令有价值。
6.1 “网关IP设错了”导致整个环境瘫痪
有一次做ARP欺骗实验,攻击机上设置的网关地址比真实网关少打了一位,导致目标机发往网关的流量全部被转发到攻击机,但攻击机没开IP转发,目标机直接断网。排查时一度以为是路由器故障,后来才发现是自己配置错误。
教训:开启ARP欺骗前,第一件事是确认攻击机的IP转发已打开。Linux下用sysctl -w net.ipv4.ip_forward=1或BetterCap里确认转发状态。别省这一步,断网一分钟影响不大,但排查过程消耗的时间才是真本钱。
6.2 “抓到了HTTPS流量,但内容全是乱码”的困惑
不少朋友第一次嗅探到HTTPS流量,看着Wireshark里的受保护应用数据一团乱码,误以为“攻击失败”。其实这正是正常的加密状态。要解密HTTPS,必须完成证书信任链的替换:导入Burp Suite的CA证书到目标设备的信任库,同时确认代理设置指向攻击机。
这里有个细节:Windows系统证书库和Java证书库是分开的,Android 7.0以上又要求App显式信任用户证书库。我做过一个内部App的测试,因为没把证书导入系统证书库,抓包一直失败,差点怀疑App做了SSL Pinning,后来查实是证书信任域的问题。排查证书问题,先从最简单的环境配置开始,不要一上来就怀疑高难度防御手段。
6.3 “模拟了攻击,但拿不到高分告警”——为什么防御告警总慢半拍
在企业做攻防演练时,MITM攻击的告警触发率低是常态。原因在于大部分安全设备重点盯WAF层面的Web攻击、IPS层面的漏洞利用,对ARP欺骗、DNS重定向这类“低慢”行为缺乏检测规则。
我在演练总结里给过一条建议:把MITM检测能力前置到交换机/NTA/EDR三层。交换机负责阻断ARP异常,NTA负责发现流量反常,EDR负责终端侧ARP缓存比对。三者联动才可能形成一个基本闭环。这种层级化布防的思路,比指望单一设备“万能检测”靠谱得多。
6.4 内网老设备是MITM的“最佳温床”
渗透测试里,最容易出现MITM条件的内网环境往往不是高安全网络,而是藏在会议室角落的打印机、门禁控制器、旧款网络摄像头。这些设备通常不更新固件、不支持证书校验、通信协议老旧,一旦部署在办公室同一个二层网络内,几乎就是摆在那里的跳板。
我做内网评估时,习惯先扫描物联网设备的开放端口和协议,再看它们是否会发起外部通信、通信内容是否加密。很多看似不起眼的设备,恰恰是最容易把人弹进内网核心区的入口。
7. 写在最后的建议:MITM不是终点,而是起点
在本地靶场跑通一遍MITM之后,我建议你把它当成一个起点,而不是一个技术终点。因为这个攻击链路的每一个环节,都能单独延伸成一条深入研究路线:ARP协议的信任模型、DNS解析的生态脆弱性、TLS握手和证书机制的演进、客户端安全编码的细节……每一个都值得单独写一篇文章。
从个人成长角度,我的经验是一套组合技:先能复现攻击,再能做好防御,最后能写成报告讲清楚。技能树越深,你在网安这条路上看到的风景越不一样。记住安全圈最朴实也最重要的一条准则:拿到授权再动手,出报告要负责任。这条底线立住了,你所有的技术积累才有真正的价值。