BlackHat2020 议题 「When TLS Hacks You」 复现
字数 1423 2025-08-06 08:35:19
TLS会话复用攻击(SSRF)技术分析与复现
1. 前置知识
1.1 TLS 1.2握手和会话复用
TLS 1.2握手过程包含以下关键步骤:
- 客户端发送ClientHello消息
- 服务器响应ServerHello消息
- 服务器发送证书
- 完成密钥交换
会话复用机制:
- ServerHello消息中包含sessionID字段
- 客户端再次连接时发送保存的sessionID
- 找到匹配的sessionID后直接使用主密钥恢复会话
- 跳过证书验证和密钥交换阶段
1.2 DNS重绑定攻击
- 当DNS的TTL(生存时间)设置非常小时
- 首次DNS响应返回合法IP
- 第二次DNS响应返回恶意IP
- 利用客户端DNS缓存过期机制实现IP切换
1.3 AAAA记录和A记录
- AAAA记录:域名的IPv6地址
- A记录:域名的IPv4地址
- curl等客户端会优先尝试IPv6(AAAA记录)
- 若IPv6连接失败,则回退到IPv4(A记录)
2. 攻击原理
2.1 核心思路
- 恶意TLS服务器设置特制的sessionID作为payload
- 利用DNS重绑定或AAAA/A记录切换使客户端第二次请求时访问不同IP
- 客户端在会话复用时发送恶意sessionID到目标服务
2.2 攻击流程
-
首次连接:
- 客户端访问攻击者控制的服务器
- 服务器返回精心构造的sessionID
-
IP切换:
- 通过DNS重绑定或AAAA/A记录切换
- 使客户端第二次请求访问127.0.0.1或内网IP
-
会话复用:
- 客户端发送之前保存的恶意sessionID
- 目标服务接收并处理恶意payload
2.3 IP切换方法
方法一:DNS重绑定
- 服务器始终返回HTTP 301跳转
- 每次跳转前sleep一段时间
- 耗尽客户端DNS缓存时间
- 客户端重新DNS查询获取新IP
方法二:AAAA和A记录
- 设置AAAA记录为服务器IPv6地址
- 设置A记录为127.0.0.1
- 首次连接使用IPv6地址
- 第二次连接时使IPv6地址不可达
- 客户端回退到IPv4地址(127.0.0.1)
3. 影响范围
3.1 受影响客户端
- curl (特定版本)
- 其他遵循类似TLS会话复用逻辑的客户端
3.2 可攻击目标服务
| 服务 | 可利用性 | 说明 |
|---|---|---|
| Memcached | 高 | 对垃圾字符容忍度高 |
| FTP | 中 | 部分命令可用 |
| SMTP | 中 | 部分命令可用 |
| Redis | 低 | 0字节会截断payload |
4. 复现步骤
4.1 环境准备
-
域名配置:
dns.example.com A 300 <DNS_IP> tlstest.example.com NS 300 dns.example.com -
启动DNS服务器:
python3 alternate-dns.py tlstest.example.com,127.0.0.1 -b 0.0.0.0 -t tlsserverip -
启动恶意TLS服务器:
python3 tls.py server --max-ver tls1.2 -k key.pem -c cert.pem 0.0.0.0:11212
4.2 攻击执行
受害者执行:
curl -4 -kvL https://tlstest.example.com:11212
4.3 关键参数
-4:强制使用IPv4-k:忽略证书错误-v:详细输出-L:跟随重定向
5. 防御措施
-
客户端:
- 禁用TLS会话复用
- 更新curl等客户端到最新版本
- 严格验证sessionID有效性
-
服务端:
- 限制sessionID长度和内容
- 对敏感服务添加TLS层防护
-
网络:
- 监控异常的TLS会话
- 限制内部服务的访问权限
6. 参考资料
- BlackHat USA 2020议题《When TLS Hacks You》
- 赵师傅的西湖论剑2020 Web HelloDiscuzQ题解
- TLS-poison GitHub项目
- 极客时间《透视HTTP协议》
- 相关技术博客和分析文章