文章目录
-
- [一、为什么 HTTP/HTTPS 是安全人的「必修课」?](#一、为什么 HTTP/HTTPS 是安全人的「必修课」?)
- [二、HTTP 协议安全速览](#二、HTTP 协议安全速览)
-
- [2.1 明文传输的风险](#2.1 明文传输的风险)
- [2.2 无状态与会话](#2.2 无状态与会话)
- [2.3 安全相关 HTTP 头(预览)](#2.3 安全相关 HTTP 头(预览))
- 三、实验环境
-
- [3.1 拓扑(延续专栏 Host-Only)](#3.1 拓扑(延续专栏 Host-Only))
- [3.2 受害机:同时提供 HTTP 与 HTTPS](#3.2 受害机:同时提供 HTTP 与 HTTPS)
- [3.3 打快照](#3.3 打快照)
- [四、HTTP 抓包实战(Wireshark)](#四、HTTP 抓包实战(Wireshark))
-
- [4.1 本机直连抓包](#4.1 本机直连抓包)
- [4.2 过滤器](#4.2 过滤器)
- [4.3 Follow HTTP Stream](#4.3 Follow HTTP Stream)
- [4.4 结合 ARP MITM 抓 HTTP](#4.4 结合 ARP MITM 抓 HTTP)
- [4.5 HTTP 抓包分析清单](#4.5 HTTP 抓包分析清单)
- [五、HTTPS 基础:TLS 在保护什么?](#五、HTTPS 基础:TLS 在保护什么?)
-
- [5.1 HTTPS = HTTP + TLS](#5.1 HTTPS = HTTP + TLS)
- [5.2 握手阶段(TLS 1.2 简图)](#5.2 握手阶段(TLS 1.2 简图))
- [5.3 SNI:域名在加密前暴露](#5.3 SNI:域名在加密前暴露)
- [六、HTTPS 抓包:看不见内容时看什么?](#六、HTTPS 抓包:看不见内容时看什么?)
-
- [6.1 无密钥时的分析价值](#6.1 无密钥时的分析价值)
- [6.2 识别弱配置](#6.2 识别弱配置)
- [七、HTTPS 解密实战(三种合法路径)](#七、HTTPS 解密实战(三种合法路径))
-
- [7.1 方法一:SSLKEYLOGFILE(浏览器导出密钥)](#7.1 方法一:SSLKEYLOGFILE(浏览器导出密钥))
- [7.2 方法二:Burp Suite / mitmproxy(代理 MITM)](#7.2 方法二:Burp Suite / mitmproxy(代理 MITM))
- [7.3 方法三:服务端私钥(自有服务器)](#7.3 方法三:服务端私钥(自有服务器))
- [7.4 三种方法对比](#7.4 三种方法对比)
- [八、Wireshark 解密操作详解](#八、Wireshark 解密操作详解)
-
- [8.1 配置 TLS 密钥日志](#8.1 配置 TLS 密钥日志)
- [8.2 验证解密成功](#8.2 验证解密成功)
- [8.3 常见问题](#8.3 常见问题)
- 九、证书陷阱全解析
-
- [9.1 证书链与信任](#9.1 证书链与信任)
- [9.2 常见证书陷阱](#9.2 常见证书陷阱)
- [9.3 用户心理:「有小锁就安全」](#9.3 用户心理:「有小锁就安全」)
- [9.4 渗透视角:Burp 证书与主机名](#9.4 渗透视角:Burp 证书与主机名)
- [9.5 HSTS:防降级的重要防线](#9.5 HSTS:防降级的重要防线)
- [十、HTTP → HTTPS 迁移与安全加固](#十、HTTP → HTTPS 迁移与安全加固)
-
- [10.1 全站 HTTPS 检查表](#10.1 全站 HTTPS 检查表)
- [10.2 nginx 强制跳转示例](#10.2 nginx 强制跳转示例)
- [10.3 开发常见坑](#10.3 开发常见坑)
- [十一、蓝队:如何发现异常 HTTPS?](#十一、蓝队:如何发现异常 HTTPS?)
-
- [11.1 主机侧](#11.1 主机侧)
- [11.2 网络侧](#11.2 网络侧)
- [11.3 日志](#11.3 日志)
- 十二、攻击链位置
- [十三、完整实验步骤(120 分钟)](#十三、完整实验步骤(120 分钟))
- 十四、常见踩坑
- 十五、法律与伦理
- 十六、本篇小结
- [附录 A:Wireshark 过滤器速查](#附录 A:Wireshark 过滤器速查)
- [附录 B:curl 证书调试](#附录 B:curl 证书调试)
- [附录 C:mitmproxy 快速命令](#附录 C:mitmproxy 快速命令)
- [附录 D:与专栏前篇关联](#附录 D:与专栏前篇关联)
一、为什么 HTTP/HTTPS 是安全人的「必修课」?
上一篇 [ARP 欺骗](#ARP 欺骗) 把流量引到中间人后,你第一眼看到的往往是 HTTP 或 HTTPS:
text
ARP MITM 成功
├─► HTTP → 明文,直接 Follow Stream
└─► HTTPS → 密文,但证书、握手、解密仍有大量学问
| 场景 | 协议 | 攻击者能看到什么 |
|---|---|---|
| 老旧内网系统 | HTTP | URL、Cookie、密码、响应体 |
| 现代网站 | HTTPS | 域名(SNI)、证书信息;内容需解密 |
| 配置错误 | HTTPS + 忽略证书 | 用户点「继续访问」= 主动放弃保护 |
| 企业审计 | HTTPS | 合法 MITM 代理解密(需用户信任企业根证书) |
本文覆盖三条线:HTTP 抓包分析 、HTTPS 解密实战 、证书陷阱与防御。
二、HTTP 协议安全速览
2.1 明文传输的风险
HTTP 报文以明文在网络上传输(应用层),二层 MITM 后可直接阅读:
text
GET /login HTTP/1.1
Host: 192.168.56.30
Cookie: session=abc123
User-Agent: curl/8.0
HTTP/1.1 200 OK
Set-Cookie: session=xyz789; Path=/
敏感信息常见位置:
| 位置 | 风险 |
|---|---|
| URL 查询参数 | ?token=xxx 进访问日志 |
| Cookie | 会话劫持 |
| Authorization 头 | Basic 编码非加密,等同明文 |
| 响应体 | API 返回 token、个人信息 |
2.2 无状态与会话
HTTP 本身无状态,靠 Cookie / Session / JWT 维持登录。
攻击者嗅探到 session Cookie 即可 会话劫持(Session Hijacking),无需知道密码。
2.3 安全相关 HTTP 头(预览)
| 头部 | 作用 |
|---|---|
Strict-Transport-Security |
HSTS,强制 HTTPS |
Set-Cookie; Secure; HttpOnly; SameSite |
防窃听、防 XSS 读 Cookie、防 CSRF |
Content-Security-Policy |
限制脚本与资源加载 |
X-Frame-Options |
防点击劫持 |
HTTPS 篇会深入;HTTP 抓包时先学会认这些头。
三、实验环境
3.1 拓扑(延续专栏 Host-Only)
text
受害机 Ubuntu/nginx 192.168.56.30 HTTP :80 / HTTPS :443
Kali(抓包/代理) 192.168.56.10
分析机(可选) 本机 Wireshark
网段 192.168.56.0/24
3.2 受害机:同时提供 HTTP 与 HTTPS
bash
# 安装 nginx
sudo apt install -y nginx openssl
# 自签名证书(靶场用)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt \
-subj "/CN=192.168.56.30"
# nginx HTTPS 站点(片段)
sudo tee /etc/nginx/sites-available/default <<'EOF'
server {
listen 80;
server_name _;
root /var/www/html;
location / { try_files $uri $uri/ =404; }
}
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
root /var/www/html;
}
EOF
sudo nginx -t && sudo systemctl reload nginx
测试页 /var/www/html/index.html:
html
<h1>Lab HTTP/HTTPS</h1>
<form action="/login" method="post">
<input name="user" value="admin">
<input name="pass" type="password" value="P@ssw0rd">
</form>
bash
curl -k https://192.168.56.30
curl http://192.168.56.30
3.3 打快照
victim-web-clean / kali-clean
四、HTTP 抓包实战(Wireshark)
4.1 本机直连抓包
在受害机或同网段 Kali:
bash
sudo wireshark -i eth1 -f "host 192.168.56.30 and tcp port 80"
受害机浏览器访问 http://192.168.56.30,提交表单。
4.2 过滤器
| 目的 | 过滤器 |
|---|---|
| 只看 HTTP | http |
| 指定主机 | ip.addr == 192.168.56.30 && http |
| 登录相关 | http.request.uri contains "login" |
| 含 Cookie | http.cookie |
4.3 Follow HTTP Stream
text
右键 HTTP 包 → Follow → HTTP Stream
应看到 POST 体中的 user=admin&pass=P@ssw0rd ------ 这就是 HTTP 明文的风险。
4.4 结合 ARP MITM 抓 HTTP
Kali 双向 ARP 欺骗后(见前篇):
bash
sudo ettercap -T -q -i eth1 -M arp:remote /192.168.56.1// /192.168.56.30//
sudo wireshark -i eth1 -f "host 192.168.56.30 and http"
受害机访问外网 HTTP 站点(靶场自建,勿扫公网),Kali 同样可 Follow Stream。
4.5 HTTP 抓包分析清单
text
□ 请求方法 GET/POST 是否合理
□ URL 是否带 token
□ Cookie 是否 HttpOnly
□ 是否混用 HTTP 加载 HTTPS 页面的资源(混合内容)
□ 响应码 302 跳转是否降到 HTTP
五、HTTPS 基础:TLS 在保护什么?
5.1 HTTPS = HTTP + TLS
text
应用层 HTTP(方法、路径、头、体)
↓ 加密
传输层 TLS 记录层(密文)
↓
网络层 TCP
TLS 提供(简化):
| 能力 | 说明 |
|---|---|
| 机密性 | 对称加密保护内容 |
| 完整性 | MAC/AEAD 防篡改 |
| 认证 | 证书链验证服务器身份 |
5.2 握手阶段(TLS 1.2 简图)
text
Client Server
│ ClientHello(套件、随机数) │
├──────────────────────────────►│
│◄──────────────────────────────┤ ServerHello + 证书 + ServerKeyExchange
│ ClientKeyExchange │
├──────────────────────────────►│
│ ChangeCipherSpec + Finished │
│◄──────────────────────────────┤ ChangeCipherSpec + Finished
│ Application Data(HTTP 密文) │
Wireshark 未配置密钥时 :握手可见,Application Data 为密文。
5.3 SNI:域名在加密前暴露
ClientHello 中含 SNI(Server Name Indication),未加密前可见访问域名:
text
过滤器:tls.handshake.extensions_server_name
蓝队可用 SNI 做审计;攻击者 MITM 时也需要正确 SNI 选证书。
六、HTTPS 抓包:看不见内容时看什么?
6.1 无密钥时的分析价值
| 可见 | 用途 |
|---|---|
| TLS 版本、套件 | 弱套件排查 |
| 证书 CN/SAN、颁发者 | 是否自签、是否过期 |
| ALPN(h2/http/1.1) | 协议协商 |
| 证书透明度、OCSP | 合规与吊销 |
| 流量时序、大小 | 元数据分析(侧信道) |
过滤器:
text
tls
tls.handshake.type == 1 # ClientHello
tls.handshake.type == 2 # ServerHello
ssl.handshake.certificate # 证书(旧版显示名)
6.2 识别弱配置
text
· TLS 1.0 / 1.1 仍启用
· 套件含 EXPORT、RC4、3DES
· 证书过期、hostname 不匹配
七、HTTPS 解密实战(三种合法路径)
解密前提:你拥有密钥 或用户信任你的 CA------靶场/授权渗透/本机调试,非未授权窃听。
7.1 方法一:SSLKEYLOGFILE(浏览器导出密钥)
适用:本机 Chrome/Firefox 访问站点,Wireshark 解密。
步骤:
bash
# 启动 Chrome 并写密钥日志
export SSLKEYLOGFILE=/tmp/sslkeys.log
google-chrome https://192.168.56.30 # 或 chromium
# Wireshark:Edit → Preferences → Protocols → TLS
# (Pre)-Master-Secret log filename → 选 /tmp/sslkeys.log
# 重新打开抓包或 live capture,Application Data 可解密为 HTTP/2 或 HTTP/1.1
原理:浏览器把 TLS 会话密钥写入日志,Wireshark 用同一密钥解密记录层。
局限 :只能解本机该浏览器产生的流量,不能解他人手机上的 HTTPS。
7.2 方法二:Burp Suite / mitmproxy(代理 MITM)
适用 :渗透测试、API 调试;客户端需信任 Burp/mitm 根证书。
Burp 流程(Kali 常见):
text
1. 启动 Burp,Proxy → 127.0.0.1:8080
2. 浏览器代理指向 Kali:8080
3. 访问 http://burp → 下载 CA 证书并导入系统/浏览器信任
4. 访问 https://192.168.56.30 → Burp 用自签证书冒充目标,解密后重签转发
mitmproxy 命令行:
bash
mitmproxy --listen-host 0.0.0.0 --listen-port 8080
# 客户端设代理 192.168.56.10:8080,安装 mitm.it 证书
text
流量路径:
浏览器 ──TLS(信任mitm CA)──► mitmproxy ──TLS(信任真实站)──► 真实服务器
↑ 此处明文 HTTP
与 ARP 欺骗组合(靶场):ARP 把流量引到 Kali,再配合透明代理或 WPAD ------ 见专栏后续 SSL 剥离篇。
7.3 方法三:服务端私钥(自有服务器)
若你控制 nginx 且持有 /etc/ssl/private/nginx-selfsigned.key:
text
Wireshark → TLS → RSA keys list → 添加 IP:443 + 私钥文件
仅适用于 RSA 密钥交换 的旧套件;现代 TLS 1.3 / ECDHE 前向保密 ,无法用长期私钥批量解密历史流量,只能逐会话拿密钥(KEYLOG 或代理)。
7.4 三种方法对比
| 方法 | 谁信任谁 | 典型场景 |
|---|---|---|
| SSLKEYLOGFILE | 本机浏览器 | 开发调试、协议学习 |
| Burp/mitmproxy | 用户导入攻击者 CA | 授权渗透、QA 测 API |
| 服务端私钥 | 仅 RSA 旧握手 | 自有服务器日志分析 |
八、Wireshark 解密操作详解
8.1 配置 TLS 密钥日志
text
Edit → Preferences → Protocols → TLS
(Pre)-Master-Secret log filename: /tmp/sslkeys.log
抓包后应出现 Decrypted TLS 或下层 HTTP 协议树。
8.2 验证解密成功
text
过滤器:http && ip.addr == 192.168.56.30
能看到 GET /、POST /login 即成功。
8.3 常见问题
| 现象 | 原因 |
|---|---|
| 仍全是 Application Data | 密钥日志路径错、抓包与浏览器不是同一会话 |
| 只解了部分包 | 抓包开始晚于握手,需从头抓或 KEYLOG 持续写 |
| HTTP/2 显示乱码 | 需启用 HTTP/2 解析,Follow HTTP/2 Stream |
九、证书陷阱全解析
HTTPS 安全高度依赖 PKI(公钥基础设施) 与用户是否验证证书。
9.1 证书链与信任
text
根 CA(内置在系统/浏览器)
└─► 中间 CA
└─► 站点证书(CN/SAN = 域名)
验证项包括:签名有效、未过期、域名匹配、链完整、未吊销(OCSP/CRL)。
9.2 常见证书陷阱
| 陷阱 | 表现 | 攻击/风险 |
|---|---|---|
| 自签名证书 | 浏览器大红警告 | 用户点「继续」→ MITM 可同样自签 |
| 域名不匹配 | CN=foo.com 访问 bar.com | 钓鱼站、错误配置 |
| 过期证书 | NET::ERR_CERT_DATE_INVALID | 运维疏忽;用户习惯忽略警告 |
| 弱 CA 被入侵 | 合法链但恶意签发 | 历史案例:DigiNotar |
| 企业透明代理 | 安装公司根证书 | 合法审计 vs 隐私争议 |
| 免费证书滥用 | Let's Encrypt 自动签发 | 钓鱼站也能有「小锁」 |
| 证书固定绕过 | 移动端无用户确认 | 需逆向/Hook,难度高 |
9.3 用户心理:「有小锁就安全」
text
误区 1:HTTPS = 网站可信(只保证传输加密与身份核验流程,不保证站非钓鱼)
误区 2:警告页点「高级 → 继续」无后果(等于信任未知证书)
误区 3:HTTP 页面里的登录框「也算安全」(表单可 HTTP POST 明文)
蓝队话术 :培训用户 绝不 在证书警告页继续访问生产系统。
9.4 渗透视角:Burp 证书与主机名
Burp 为 https://192.168.56.30 动态签发证书,SAN 含该 IP/域名。
若客户端未导入 Burp CA:
text
浏览器报错:您的连接不是私密连接
导入后:
text
地址栏仍显示锁(信任的是 Burp CA,不是 DigiCert)
这就是 授权 MITM 与 SSL 剥离 的前置条件(下一篇 SSL 剥离会展开)。
9.5 HSTS:防降级的重要防线
服务器发送:
http
Strict-Transport-Security: max-age=31536000; includeSubDomains
浏览器在 max-age 内 强制 HTTPS ,拒绝用户改 HTTP。
首次访问 仍可能被 MITM(无 HSTS 缓存时)------见 HSTS Preload 列表。
检查:
bash
curl -sI https://某站 | grep -i strict
十、HTTP → HTTPS 迁移与安全加固
10.1 全站 HTTPS 检查表
text
□ 80 端口 301 跳转 443
□ 所有资源 https 加载,无 mixed content
□ HSTS + 考虑 preload
□ Cookie:Secure; HttpOnly; SameSite=Lax/Strict
□ 禁用 TLS 1.0/1.1,优先 TLS 1.2+
□ 证书自动续期(acme.sh / certbot)
10.2 nginx 强制跳转示例
nginx
server {
listen 80;
server_name lab.local;
return 301 https://$host$request_uri;
}
10.3 开发常见坑
| 坑 | 后果 |
|---|---|
| API 走 HTTP | 内网 MITM 直接读 token |
| 移动端忽略证书校验 | TrustAllCerts 类库 = 关闭 HTTPS |
| 测试环境自签证书进生产 | 用户学会点「继续」 |
十一、蓝队:如何发现异常 HTTPS?
11.1 主机侧
text
· 是否安装了未知根证书(企业代理除外)
· 系统代理是否被改为 8080
· hosts 文件是否被改
11.2 网络侧
text
· 同一内网 IP 对多目标 TLS 且证书颁发者异常一致(批量 MITM)
· JA3/JA3S 指纹突变(恶意代理工具特征)
· DNS 解析到内网 IP 却声称公网域名
11.3 日志
Web 服务器 access.log 中 HTTP 明文请求;WAF 记录 TLS 版本与套件。
十二、攻击链位置
text
ARP 欺骗 / DNS 劫持
└─► HTTP 明文嗅探(无需证书)
└─► HTTPS
├─► 诱骗用户忽略证书警告
├─► 导入恶意根证书(社工/恶意软件)
├─► Burp/mitmproxy(授权测试)
└─► SSL 剥离(专栏第 15 篇)
十三、完整实验步骤(120 分钟)
text
□ 1. nginx 同时开 80/443,自签证书
□ 2. Wireshark 抓 HTTP,Follow Stream 看 POST 密码
□ 3. 抓 HTTPS,确认 Application Data 密文
□ 4. 分析 ClientHello 中 SNI、证书链
□ 5. SSLKEYLOGFILE + Chrome 访问,Wireshark 解密 HTTPS
□ 6. mitmproxy 8080,受害机设代理并安装 mitm.it 证书,复现解密
□ 7. 不安装证书访问 HTTPS,记录浏览器警告页
□ 8. 安装后对比「锁」的变化,理解信任的是 mitm CA
□ 9. 配置 HSTS 头,观察 HTTP 是否被浏览器自动升 HTTPS
□ 10. 撰写实验报告:明文风险 + 解密条件 + 证书陷阱
十四、常见踩坑
| 问题 | 解决 |
|---|---|
| Wireshark 解不出 HTTPS | 确认 KEYLOG 与抓包同会话;检查 TLS 协议设置 |
| mitmproxy 证书装错用户 | Android 7+ 用户证书不被 app 信任,需系统证书或调试 |
| curl -k 习惯 | 测试可用,生产脚本勿 -k |
| 只抓 lo 看不到 VM | 在 Kali eth1 或受害机本机抓 |
| HTTP/2 在 Wireshark 显示差 | 用 Follow HTTP/2 或导出到 Burp |
| 认为 TLS 1.3 能拿私钥解密 | ECDHE 前向保密,历史流量不可逆 |
十五、法律与伦理
text
✅ 允许:自有 VM、本机 KEYLOG、授权渗透中 Burp、企业授权审计
❌ 禁止:咖啡厅 WiFi 抓他人 HTTPS、未授权部署透明代理
❌ 禁止:伪造银行证书钓鱼
企业 MITM 需告知员工并符合当地隐私法规(GDPR、个保法等)。
十六、本篇小结
text
┌─────────────────────────────────────────────────────────────┐
│ HTTP/HTTPS 核心记忆 │
├─────────────────────────────────────────────────────────────┤
│ HTTP 明文 → MITM 直接读 Cookie/密码 │
│ HTTPS 密文 → 握手/证书可见,内容需密钥或用户信任代理 CA │
│ 解密三路径:KEYLOG、Burp/mitmproxy、RSA 服务端私钥(旧) │
│ 证书陷阱:自签、过期、名不符、用户点「继续」 │
│ HSTS 防降级;全站 HTTPS + Secure Cookie 是基线 │
└─────────────────────────────────────────────────────────────┘
下一篇预告:《TLS 1.3 握手过程动画级讲解 + Wireshark 验证》------逐字段对照 ClientHello/ServerHello,把加密协商看懂。
附录 A:Wireshark 过滤器速查
text
http
http.request.method == "POST"
http.cookie contains "session"
ip.addr == 192.168.56.30 && tcp.port == 443
tls
tls.handshake.extensions_server_name
tls.alert_message
附录 B:curl 证书调试
bash
# 查看证书链
curl -vI https://192.168.56.30 2>&1 | grep -A5 "Server certificate"
# 指定 CA 文件
curl --cacert /path/to/ca.crt https://lab.local
# 测试(靶场)跳过校验 --- 勿用于生产
curl -k https://192.168.56.30
附录 C:mitmproxy 快速命令
bash
# 交互界面
mitmproxy -p 8080
# 无界面保存
mitmdump -p 8080 -w flows.mitm
# 指定上游(链式)
mitmproxy --mode upstream:http://corp-proxy:3128
附录 D:与专栏前篇关联
| 前篇 | 关联 |
|---|---|
| ARP 欺骗 | MITM 后抓 HTTP/注入代理 |
| Wireshark | http、tls 过滤器 |
| DNS 安全 | 假 IP + 假证书钓鱼链 |
| 靶场搭建 | 56.30 nginx 实验机 |