中间人攻击(MITM)原理与抓包分析
一、什么是中间人攻击
中间人攻击(Man-in-the-Middle Attack,简称 MITM)是一种网络攻击手段,攻击者秘密地拦截并可能篡改双方之间的通信,而通信双方对此毫不知情。
简单来说,攻击者把自己”插”在了客户端和服务端之间,充当一个透明的中转站。
二、正常通信 vs 中间人攻击
2.1 正常通信流程
1 2 3 4 5 6
| ┌──────────┐ ┌──────────┐ │ │ 请求 (Request) │ │ │ 客户端 │ ──────────────────────► │ 服务端 │ │ (Client) │ │ (Server) │ │ │ ◄────────────────────── │ │ └──────────┘ 响应 (Response) └──────────┘
|
在正常通信中,客户端直接与服务端建立连接,数据在两者之间直接传输。
2.2 中间人攻击流程
1 2 3 4 5 6 7 8 9 10 11 12 13
| ┌──────────┐ ┌──────────┐ │ │ 请求 (Request) │ │ │ 客户端 │ ──────────────────────► │ 服务端 │ │ (Client) │ │ (Server) │ │ │ ◄────────────────────── │ │ └─────┬────┘ 响应 (Response) └─────▲────┘ │ │ │ ┌──────────────────────┐ │ │ │ │ │ └───►│ 中间人 (Attacker) │──────────┘ │ │ │ 窃听 / 篡改 / 伪造 │ └──────────────────────┘
|
攻击者在客户端和服务端之间拦截通信:
- 客户端以为自己在和真正的服务端通信
- 服务端以为自己在和真正的客户端通信
- 中间人可以窃听、篡改甚至伪造通信内容
三、HTTPS 下的中间人攻击原理
HTTPS 本身就是为了防止中间人攻击而设计的,那中间人攻击是如何突破 HTTPS 的呢?
3.1 正常 HTTPS 握手流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Client Server │ │ │ 1. ClientHello │ │ (支持的加密套件、随机数) │ │ ──────────────────────────────────────► │ │ │ 2. ServerHello + 证书 │ │ (选定加密套件、服务端证书) │ │ ◄────────────────────────────────────── │ │ │ 3. 客户端验证证书 │ │ (CA 签名验证、域名匹配、有效期检查) │ │ │ │ 4. 生成 Pre-Master Secret │ │ 用服务端公钥加密发送 │ │ ──────────────────────────────────────► │ │ │ 5. 双方生成会话密钥 │ │ (Session Key) │ │ │ │ 6. 加密通信开始 │ │ ◄─────────────────────────────────────►
|
关键点:客户端会验证服务端证书是否由可信 CA 机构签发,如果证书不可信,浏览器会弹出警告。
3.2 中间人攻击 HTTPS 的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Client MITM(Attacker) Server │ │ │ │ 1. ClientHello │ │ │ ────────────────────►│ 1'. ClientHello │ │ │ ──────────────────────►│ │ │ │ │ │ 2'. ServerHello+真证书 │ │ 2. ServerHello │ ◄──────────────────────│ │ + 伪造证书 │ │ │ ◄────────────────────│ │ │ │ │ │ 3. 客户端验证伪造证书 │ │ │ (需要信任伪造CA) │ │ │ │ │ │ 4. 用伪造公钥加密 │ │ │ ────────────────────►│ 4'. 用真公钥加密 │ │ │ ──────────────────────►│ │ │ │ │ ←─ 加密通信 ──→ │ ←─ 加密通信 ──→ │ │ (MITM可解密) │ (正常HTTPS) │
|
核心原理:
- 中间人向客户端提供伪造证书,同时向服务端发起正常的 HTTPS 请求
- 客户端需要信任中间人的 CA 证书(这是关键前提)
- 中间人分别与客户端和服务端建立两段独立的加密连接
- 中间人可以解密客户端发来的数据,查看/修改后,再加密发给服务端
四、抓包原理与过程
抓包(Packet Capture)本质上也是一种”中间人”行为,常见的抓包工具有 Fiddler、Charles、mitmproxy 等。
4.1 抓包工具的工作原理
1 2 3 4 5 6 7 8 9 10 11
| ┌──────────┐ ┌──────────────┐ ┌──────────┐ │ │ │ │ │ │ │ 浏览器 │──────►│ 代理服务器 │──────►│ 目标服务器 │ │ (Browser) │ HTTP │ (Proxy) │ HTTP │ (Server) │ │ │◄──────│ e.g. Fiddler │◄──────│ │ └──────────┘ └──────────────┘ └──────────┘ │ │ │ │ ▼ ▼ 设置代理 抓包 & 展示 127.0.0.1:8888 请求/响应详情
|
抓包工具的核心步骤:
| 步骤 |
说明 |
| 1. 设置代理 |
客户端(浏览器/App)将 HTTP/HTTPS 请求发送到代理服务器 |
| 2. 转发请求 |
代理服务器将请求转发给真正的目标服务器 |
| 3. 接收响应 |
目标服务器返回响应给代理服务器 |
| 4. 返回客户端 |
代理服务器将响应返回给客户端 |
| 5. 记录展示 |
代理服务器在中间记录所有请求和响应数据 |
4.2 HTTP 抓包(明文)
对于 HTTP 请求,数据本身就是明文传输,抓包工具只需要简单地转发即可看到所有内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 浏览器 Fiddler 服务器 │ │ │ │ GET /api/user HTTP/1.1 │ │ │ Cookie: token=abc123 │ │ │ ────────────────────────────►│ GET /api/user HTTP/1.1 │ │ │ Cookie: token=abc123 │ │ │ ────────────────────────────►│ │ │ │ │ │ HTTP/1.1 200 OK │ │ │ {"name":"张三","age":25} │ │ │ ◄────────────────────────────│ │ HTTP/1.1 200 OK │ │ │ {"name":"张三","age":25} │ │ │ ◄─────────────────────────────│ │ │ │ │ │ │ ✅ 完整记录请求和响应 │
|
HTTP 抓包无需任何额外配置,因为数据本身没有加密。
4.3 HTTPS 抂包(加密流量)
HTTPS 流量是加密的,抓包工具需要通过中间人方式解密:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| HTTPS 抓包完整流程
浏览器 Fiddler 服务器 │ │ │ │ ① 设置系统代理 │ │ │ → 127.0.0.1:8888 │ │ │ │ │ │ ② 安装并信任 Fiddler 根证书 │ │ │ (FiddlerRoot Certificate) │ │ │ │ │ │ ③ HTTPS 握手 │ │ │ ClientHello ─────────────────►│ │ │ │ ④ 与服务器建立真实 HTTPS │ │ │ ClientHello ────────────────►│ │ │ ServerHello+真证书 ◄─────────│ │ │ │ │ ⑤ 向浏览器出示伪造证书 │ │ │ ServerHello+伪造证书 ◄────────│ │ │ │ │ │ ⑥ 浏览器验证伪造证书 ✅ │ │ │ (因为已信任 Fiddler 根证书) │ │ │ │ │ │ ⑦ 浏览器用伪造公钥加密数据 ────►│ ⑧ Fiddler 解密数据(明文) │ │ │ ⑨ Fiddler 用真公钥加密 ──────►│ │ │ │ │ │ ⑩ 服务器返回加密响应 ◄────────│ │ │ ⑪ Fiddler 解密(明文) │ │ ⑫ Fiddler 加密返回浏览器 ◄────│ │ │ │ │ │ │ ✅ 中间明文查看所有数据 │
|
4.4 抓包工具实操步骤(以 Fiddler 为例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 步骤流程图:
┌─────────────────────┐ │ 1. 启动 Fiddler │ │ 默认监听 8888 端口 │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ 2. 开启 HTTPS 解密 │ │ Tools → Options │ │ → HTTPS → Decrypt │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ 3. 安装根证书到系统 │ │ 浏览器/系统信任 │ │ FiddlerRoot CA │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ 4. 配置客户端代理 │ │ 127.0.0.1:8888 │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ 5. 正常操作应用 │ │ Fiddler 自动抓包 │ └──────────┬──────────┘ │ ▼ ┌─────────────────────┐ │ 6. 查看请求/响应详情 │ │ Headers、Body、 │ │ Cookies 等 │ └─────────────────────┘
|
五、常见中间人攻击手段
5.1 ARP 欺骗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 局域网拓扑
┌─────────────────────────────┐ │ 交换机 / 路由器 │ └──┬──────────────────────┬───┘ │ │ ▼ ▼ ┌──────────┐ ┌──────────┐ │ 受害者 │ │ 网关 │ │ 192.168 │ │ 192.168 │ │ .1.100 │ │ .1.1 │ └──────────┘ └──────────┘ ▲ │ ARP 欺骗 │ ┌──────────┐ │ 攻击者 │ │ 192.168 │ │ .1.200 │ └──────────┘
|
ARP 欺骗原理:
1 2 3 4 5 6 7 8
| 正常 ARP 表: 被欺骗后的 ARP 表: ┌───────────────────────┐ ┌───────────────────────┐ │ IP MAC │ │ IP MAC │ ├───────────────────────┤ ├───────────────────────┤ │ 192.168.1.1 AA-BB-CC │ │ 192.168.1.1 DD-EE-FF │ ← 被篡改 │ 192.168.1.200 DD-EE-FF│ │ 192.168.1.200 DD-EE-FF│ └───────────────────────┘ └───────────────────────┘ (网关的 MAC 是路由器的) (网关的 MAC 变成了攻击者的)
|
攻击者告诉受害者”我是网关”,受害者的数据就会发给攻击者。
5.2 DNS 欺骗
1 2 3 4 5 6 7 8
| 正常 DNS 解析: DNS 欺骗后:
用户 → DNS服务器 用户 → DNS服务器 (询问: bank.com 的IP?) (询问: bank.com 的IP?) 用户 ← DNS服务器 用户 ← 攻击者(伪造响应) (回答: 93.184.216.34) (回答: 6.6.6.6 ← 恶意IP) 用户 → 93.184.216.34 用户 → 6.6.6.6 (真正的银行服务器) (攻击者的钓鱼网站)
|
5.3 Wi-Fi 热点欺骗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ┌──────────────────────────────────────────┐ │ 公共场所 Wi-Fi 场景 │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 用户 A │ │ 用户 B │ │ │ │ 📱 │ │ 📱 │ │ │ └────┬─────┘ └────┬─────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌────────────────────────────┐ │ │ │ "Free_WiFi" (攻击者热点) │ │ │ │ 📡 恶意 AP │ │ │ └────────────┬───────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────┐ │ │ │ 攻击者笔记本 💻 │ ← 所有流量经过此处 │ │ └──────────────────┘ │ └──────────────────────────────────────────┘
|
攻击者创建一个与合法 Wi-Fi 同名或诱人的免费热点,用户连接后所有流量都经过攻击者。
5.4 SSL 剥离(SSL Stripping)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 正常流程: SSL 剥离攻击:
用户输入 bank.com 用户输入 bank.com │ │ ▼ ▼ 浏览器 → http://bank.com 浏览器 → http://bank.com │ │ ▼ ▼ 服务器 301 重定向 攻击者拦截重定向! → https://bank.com │ │ ▼ ▼ 不转发重定向 建立 HTTPS 安全连接 保持 HTTP 明文连接 │ │ ▼ ▼ ✅ 安全通信 ❌ 攻击者可查看所有数据
用户看到的是 http:// 而不是 https:// 但大多数用户不会注意到这个区别
|
六、如何防御中间人攻击
| 防御手段 |
说明 |
| 始终使用 HTTPS |
确保网站强制使用 HTTPS,启用 HSTS |
| 证书锁定(Certificate Pinning) |
App 内置证书指纹,拒绝其他证书 |
| 验证证书信息 |
检查证书颁发者、有效期、域名是否匹配 |
| 不要连接不信任的 Wi-Fi |
避免使用公共 Wi-Fi 处理敏感信息 |
| 使用 VPN |
加密所有网络流量,防止窃听 |
| DNS over HTTPS (DoH) |
防止 DNS 查询被篡改 |
| 双向 TLS 认证(mTLS) |
客户端也验证服务端,服务端也验证客户端 |
七、总结
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| ┌─────────────────────────────────────────────────────┐ │ 中间人攻击全景图 │ │ │ │ 攻击前提: │ │ ├── 网络层面:ARP/DNS/Wi-Fi 欺骗 │ │ ├── 协议层面:SSL 剥离、降级攻击 │ │ └── 证书层面:伪造 CA、自签名证书 │ │ │ │ 攻击效果: │ │ ├── 窃听:获取敏感信息(密码、Cookie、Token) │ │ ├── 篡改:修改通信内容(注入恶意代码) │ │ └── 伪造:冒充身份进行操作 │ │ │ │ 抓包本质 = 合法的中间人攻击(用于调试/分析) │ │ ├── 需要安装并信任代理工具的根证书 │ │ ├── 代理工具分别与双方建立加密连接 │ │ └── 在中间以明文形式查看和记录数据 │ └─────────────────────────────────────────────────────┘
|
核心认知:抓包工具(Fiddler/Charles/mitmproxy)的原理与恶意中间人攻击完全相同,区别仅在于目的不同——一个用于开发调试,一个用于恶意窃取。理解中间人攻击的原理,是掌握网络安全的基石。
Prev: 安卓模拟器设置
Next: