中间人攻击(MITM)原理与抓包分析

中间人攻击(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) │

核心原理:

  1. 中间人向客户端提供伪造证书,同时向服务端发起正常的 HTTPS 请求
  2. 客户端需要信任中间人的 CA 证书(这是关键前提)
  3. 中间人分别与客户端和服务端建立两段独立的加密连接
  4. 中间人可以解密客户端发来的数据,查看/修改后,再加密发给服务端

四、抓包原理与过程

抓包(Packet Capture)本质上也是一种”中间人”行为,常见的抓包工具有 FiddlerCharlesmitmproxy 等。

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)的原理与恶意中间人攻击完全相同,区别仅在于目的不同——一个用于开发调试,一个用于恶意窃取。理解中间人攻击的原理,是掌握网络安全的基石。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器