第233篇:TCP 劫持与序列号预测攻击

关键词:TCP劫持、序列号预测、中间人攻击、TCP重置攻击、SYN Cookie、TCP Spoofing

一、引言

TCP协议设计之初假设网络是可信的,任何能注入或修改IP报文的人都能对TCP连接施加影响。TCP劫持(TCP Hijacking)和序列号预测攻击正是利用了TCP协议的这一固有缺陷。

TCP劫持有两种主要形式:有状态劫持(Stateful Hijacking)需要攻击者处于数据路径上,可对已有连接进行接管;无状态劫持(Blind Hijacking)不需要数据路径,通过预测TCP序列号注入恶意报文。这两种攻击均可导致会话劫持、数据篡改、连接中断等严重后果。

二、核心概念

2.1 TCP劫持类型

类型 攻击者位置 条件 难度
有状态劫持 数据路径上(中间人) 能捕获和修改报文 中
无状态劫持 任意位置(盲攻击) 能预测序列号 高
TCP重置攻击 任意位置 能预测序列号 中
SYN Flood劫持 任意位置 利用SYN洪水消耗资源 低

2.2 TCP序列号的作用

TCP使用32位序列号(Sequence Number)确保报文有序传输和重传。序列号的安全性直接决定了TCP连接的安全性。

场景 序列号用途 被预测后的后果
三次握手 初始序列号ISN用于同步 可伪造完成握手
数据传输 按序排列和去重 可注入伪造数据
连接重置 RST报文需携带正确序列号 可强制中断连接
窗口调整 通告接收窗口大小 可控制流量速率

2.3 TCP劫持影响面

影响类型 说明 典型场景
会话劫持 攻击者接管已有TCP会话 HTTP会话、SSH会话
数据篡改 修改传输中的TCP载荷 修改Web页面内容
连接中断 注入RST报文终止连接 DoS攻击、反取证
会话注入 在已有连接中注入数据 Web会话注入恶意脚本
中间人重放 捕获并重放TCP报文 认证绕过

三、技术细节

3.1 TCP三次握手与序列号交换

TCP三次握手与序列号交换 - 图示

攻击者要实现TCP劫持,需要知道正确的源IP、目的IP、源端口、目的端口以及当前序列号。前四项容易获取,序列号是核心难题。

3.2 序列号预测攻击原理

早期TCP实现(如TCP/IP Illustrated描述的BSD实现)使用固定增量或简单算法生成ISN,攻击者可通过观察少量连接准确预测序列号。

时代 ISN生成方式 预测难度 代表系统
1980s 固定增量(每秒递增) 极容易 BSD 4.2
1990s 基于时间的计数器 容易 早期Linux/Windows
2000s 哈希函数(RFC 1948) 困难 现代操作系统
2010s+ 密码学安全随机数 极困难 现代操作系统

RFC 1948提出了基于SHA的ISN生成算法,将源/目的IP、源/目的端口和计数器输入哈希函数,使得攻击者必须大量探测才能预测。

3.3 TCP重置攻击(TCP Reset Attack)

TCP重置攻击不需要完整的序列号预测,只需预测到接近当前的序列号窗口。攻击者构造RST报文发送给通信一方,强制其关闭连接。

TCP重置攻击(TCP Reset Attack) - 图示

RST攻击特别有效的场景: - 代理服务器或防火墙被RST攻击后回话中断 - 基于TCP的VoIP通话被强制断开 - VPN隧道连接被重置

3.4 防护机制

机制 原理 防御目标
随机ISN 使用密码学安全随机数生成序列号 序列号预测
SYN Cookie 不保存SYN等待状态,将ISN编码为Cookie SYN Flood
TCP MD5 为TCP报文添加MD5签名验证 BGP等长连接保护
IPsec AH 认证头部保护IP报文完整性和源认证 IP层欺骗
端口随机化 ephemeral端口大范围随机 降低四元组猜测概率
TCP RST保护 要求RST报文携带正确的ACK号验证 TCP重置攻击

四、实战配置/案例分析

4.1 华为设备TCP安全加固配置

# =============================
# 防火墙TCP安全加固
# =============================

# 1. 启用TCP严格模式(华为USG防火墙)
# 注:以下命令为概念性配置,具体命令因USG型号和VRP版本而异

# 启用TCP报文严格检查(状态检测严格模式)
firewall
 tcp strict-mode enable
 # 启用SYN Cookie防御SYN Flood(USG6000E)
 syncookie enable
 # TCP RST报文严格校验(需核实具体VRP版本命令)
 rst-validation enable
 # 启用TCP时间戳(RFC 1323,辅助保护)
 tcp-timestamp enable
quit

# 2. 配置TCP会话安全策略
security-policy
 # 仅允许合法的TCP连接建立
 rule name TCP_Strict_Check
  source-zone any
  destination-zone any
  service tcp
  action permit
  # 启用TCP状态检查(严格模式)
  tcp-option syn-check enable
  tcp-option rst-check enable
  tcp-option fin-check enable
  # 禁止裸IP+端口(无SYN)的TCP报文
  tcp-option no-syn-reject enable
 quit
quit

# 3. 启用TCP拦截防护(华为设备)
# 注:tcp-intercept 为 Cisco 概念,华为设备使用以下等效配置

# 在防火墙上启用TCP SYN Cookie和抗DDoS防护
anti-ddos
 syn-flood
  enable
  detect-threshold 10000
  action syn-cookie
 quit
quit

# 在交换机/路由器上保护管理连接
tcp intercept syncookie
tcp intercept max-syn-retx 3

# 5. 源地址验证(防范IP欺骗)
# 在接口上启用uRPF(逆向路径转发),华为VRP使用 ip source check
interface GigabitEthernet0/0/1
 ip source check enable
quit

4.2 故障排查案例:生产数据库连接被间歇性中断

故障现象:某企业数据库服务器与应用服务器之间的TCP连接每隔几分钟被强制中断一次,应用日志显示"Connection reset by peer"。

排查步骤:

  1. 在防火墙上开启TCP调试
# 查看TCP会话状态
display firewall session table verbose | include database-ip

# 开启TCP报文调试
terminal debugging
debugging firewall packet match | include database-ip

日志显示有外部IP向数据库服务器发送RST报文,序列号落在接收窗口范围内。

  1. 抓包分析
# 在防火墙上进行报文捕获
packet-capture interface gei_0/0/2 start
# 抓包结果显示攻击者IP伪造了源IP,发送RST报文
  1. 根因分析 攻击者从公网发送伪造RST报文,源IP为应用服务器地址。由于防火墙未启用RST严格校验,RST报文通过检查,导致连接被强制中断。

  2. 解决方案

# 方案1:启用TCP RST严格校验
firewall
 tcp strict-mode enable
 rst-validation enable
 # 要求RST报文中的序列号也在接收窗口内(需核实具体VRP版本命令)
 rst-ack-check enable
quit

# 方案2:在接口启用uRPF防止IP欺骗
interface GigabitEthernet0/0/2
 ip source check strict
quit

# 方案3:配置ACL丢弃来自公网的可疑RST报文
# 注:Huawei VRP ACL不支持直接匹配TCP RST标志位
# 建议通过限制源IP或使用USG防火墙的状态检测功能实现
acl number 3000
 rule 10 deny tcp destination 10.0.1.100 0 destination-port eq 3306
 rule 20 permit ip
quit

interface GigabitEthernet0/0/2
 traffic-filter inbound acl 3000
quit

4.3 故障排查案例:SYN Flood攻击导致服务不可用

故障现象:Web服务器在流量洪峰期完全无响应,防火墙SYN等待队列满载。

排查步骤:

  1. 检查防火墙会话表
display firewall session table statistics
# 输出显示SYN_SENT和SYN_RECV会话数异常高
display firewall session table | include SYN
# 大量SYN_RECV状态的会话来自不同源IP
  1. 分析攻击特征
  2. 源IP随机化(分布式DDoS)
  3. 目的端口集中在80/443
  4. SYN速率超过50000/s

  5. 解决方案

# 方案1:启用SYN Cookie(不保存SYN等待状态)
firewall
 syncookie enable
 syncookie-threshold 5000
 syncookie-timeout 30
quit

# 方案2:部署抗DDoS策略
anti-ddos
 # SYN Flood防护
 syn-flood
  enable
  detect-threshold 10000
  action threshold 50000
  # 超过阈值时自动启用SYN Cookie
  action syn-cookie
 quit
 # 启用IP频率限制
 ip-frequency
  enable
  threshold 100
  period 60
  action blackhole
  blackhole-time 300
 quit
quit

# 方案3:配置黑洞路由(极端情况)
ip route-blackhole 0.0.0.0 0.0.0.0

五、TCP安全加固扩展指南

5.1 各操作系统 ISN 生成机制对比

操作系统 ISN生成算法 预测难度 加固建议
Linux 2.6+ SHA-256哈希(IP+端口+时间+计数器) 极困难 保持内核更新
Windows 10+ 密码学安全随机数(CryptoAPI) 极困难 保持补丁更新
FreeBSD PCG随机数生成器 极困难 保持系统更新
华为VRP 加密哈希算法 极困难 升级至最新VRP版本
Cisco IOS-XE 加密随机数 极困难 升级IOS版本
嵌入式IoT 弱随机数(部分设备) 中等 固件更新+网络隔离

5.2 TCP安全状态机检测

防火墙对TCP报文的状态检查矩阵:

报文标志 SYN连接中 Established SYN_SENT FIN_WAIT 默认处置
SYN 允许 丢弃(异常) - 丢弃 丢弃
SYN+ACK - 丢弃 允许 丢弃 丢弃
ACK 允许 允许 丢弃 允许 丢弃
FIN 丢弃 允许 丢弃 丢弃 丢弃
RST 丢弃 严格校验 允许 允许 丢弃
PSH+ACK 丢弃 允许 丢弃 丢弃 丢弃
URG 丢弃 丢弃 丢弃 丢弃 丢弃
全标志(Xmas) 丢弃 丢弃 丢弃 丢弃 丢弃(扫描特征)

5.3 TCP协议攻击检测指标

检测指标 正常阈值 攻击阈值 处置动作
SYN_RECV/ESTABLISHED比值 <0.1 >0.5 启用SYN Cookie
半连接队列使用率 <30% >80% 触发SYN Flood防护
RST报文占比 <1% >5% 启用RST严格校验
零窗口报文频率 偶发 持续 触发TCP窗口攻击告警
异常标志组合 0 出现 丢弃+告警
# 华为USG TCP安全检测配置
firewall
 # 全局TCP安全设置
 tcp strict-mode enable
 syncookie enable
 rst-validation enable
 # TCP时间戳(辅助防护)
 tcp-timestamp enable
 # TCP窗口大小检查
 tcp-window-check enable
 # TCP选项长度检查
 tcp-option-check enable
 # 禁用异常TCP标志组合
 xmas-scan-protection enable
 null-scan-protection enable
 # TCP会话超时设置
 tcp timeout syn-sent 120
 tcp timeout syn-received 60
 tcp timeout established 3600
 tcp timeout fin-wait 120
 tcp timeout close-wait 60
quit

5.4 网络层TCP防护最佳实践

实践项 配置位置 配置方法 防护目标
uRPF严格模式 边界路由器/交换机 ip source check strict IP地址欺骗
BCPC防TCP重置 边界路由器 bpc enable 来自外部网络的RST攻击
SYN Cookie 防火墙/服务器 syncookie enable SYN Flood攻击
TCP拦截代理 防火墙 tcp-intercept syncookie 半连接攻击
RST严格校验 防火墙 rst-validation enable TCP重置攻击
连接数限制 防火墙 每IP最大连接数限制 资源耗尽攻击
TCP选项过滤 防火墙 丢弃异常TCP选项 协议异常探测
# 华为路由器BCPC配置(防TCP重置)
bpc enable
bpc interface GigabitEthernet0/0/1
# BCPC仅在路由器本身发起的TCP连接生效
# 当收到RST时,路由器发送TCP RST-ACK验证
# 对方回复ACK才确认RST有效,否则忽略

六、总结

知识点 要点
TCP劫持 分为有状态(中间人)和无状态(盲攻击)两类
序列号预测 早期ISN算法易预测,现代系统使用密码学随机数
TCP重置攻击 伪造RST报文强制中断连接
SYN Cookie 不保存SYN等待状态,防止SYN Flood
防护策略 SYN Cookie + RST校验 + uRPF + TCP拦截
IP欺骗防范 启用uRPF逆向路径转发验证
华为加固 strict-mode、syncookie、rst-validation

思考

  1. 为什么TCP序列号从32位增加到64位(如TCP-AO)可以显著提高安全性?
  2. SYN Cookie机制如何做到不保存SYN等待状态?它在什么场景下不适用?
  3. 对于加密的TCP连接(如TLS),TCP劫持攻击的效果与明文TCP有何不同?

下篇预告:第234篇:DHCP 饿死攻击与防护