BlackHat2020 议题 「When TLS Hacks You」 复现
字数 1423 2025-08-06 08:35:19

TLS会话复用攻击(SSRF)技术分析与复现

1. 前置知识

1.1 TLS 1.2握手和会话复用

TLS 1.2握手过程包含以下关键步骤:

  1. 客户端发送ClientHello消息
  2. 服务器响应ServerHello消息
  3. 服务器发送证书
  4. 完成密钥交换

会话复用机制

  • 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 核心思路

  1. 恶意TLS服务器设置特制的sessionID作为payload
  2. 利用DNS重绑定或AAAA/A记录切换使客户端第二次请求时访问不同IP
  3. 客户端在会话复用时发送恶意sessionID到目标服务

2.2 攻击流程

  1. 首次连接:

    • 客户端访问攻击者控制的服务器
    • 服务器返回精心构造的sessionID
  2. IP切换:

    • 通过DNS重绑定或AAAA/A记录切换
    • 使客户端第二次请求访问127.0.0.1或内网IP
  3. 会话复用:

    • 客户端发送之前保存的恶意sessionID
    • 目标服务接收并处理恶意payload

2.3 IP切换方法

方法一:DNS重绑定

  1. 服务器始终返回HTTP 301跳转
  2. 每次跳转前sleep一段时间
  3. 耗尽客户端DNS缓存时间
  4. 客户端重新DNS查询获取新IP

方法二:AAAA和A记录

  1. 设置AAAA记录为服务器IPv6地址
  2. 设置A记录为127.0.0.1
  3. 首次连接使用IPv6地址
  4. 第二次连接时使IPv6地址不可达
  5. 客户端回退到IPv4地址(127.0.0.1)

3. 影响范围

3.1 受影响客户端

  • curl (特定版本)
  • 其他遵循类似TLS会话复用逻辑的客户端

3.2 可攻击目标服务

服务 可利用性 说明
Memcached 对垃圾字符容忍度高
FTP 部分命令可用
SMTP 部分命令可用
Redis 0字节会截断payload

4. 复现步骤

4.1 环境准备

  1. 域名配置:

    dns.example.com A 300 <DNS_IP>
    tlstest.example.com NS 300 dns.example.com
    
  2. 启动DNS服务器:

    python3 alternate-dns.py tlstest.example.com,127.0.0.1 -b 0.0.0.0 -t tlsserverip
    
  3. 启动恶意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. 防御措施

  1. 客户端:

    • 禁用TLS会话复用
    • 更新curl等客户端到最新版本
    • 严格验证sessionID有效性
  2. 服务端:

    • 限制sessionID长度和内容
    • 对敏感服务添加TLS层防护
  3. 网络:

    • 监控异常的TLS会话
    • 限制内部服务的访问权限

6. 参考资料

  1. BlackHat USA 2020议题《When TLS Hacks You》
  2. 赵师傅的西湖论剑2020 Web HelloDiscuzQ题解
  3. TLS-poison GitHub项目
  4. 极客时间《透视HTTP协议》
  5. 相关技术博客和分析文章
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服务器: 启动恶意TLS服务器: 4.2 攻击执行 受害者执行: 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协议》 相关技术博客和分析文章