第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劫持,需要知道正确的源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报文发送给通信一方,强制其关闭连接。

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"。
排查步骤:
- 在防火墙上开启TCP调试
# 查看TCP会话状态
display firewall session table verbose | include database-ip
# 开启TCP报文调试
terminal debugging
debugging firewall packet match | include database-ip
日志显示有外部IP向数据库服务器发送RST报文,序列号落在接收窗口范围内。
- 抓包分析
# 在防火墙上进行报文捕获
packet-capture interface gei_0/0/2 start
# 抓包结果显示攻击者IP伪造了源IP,发送RST报文
-
根因分析 攻击者从公网发送伪造RST报文,源IP为应用服务器地址。由于防火墙未启用RST严格校验,RST报文通过检查,导致连接被强制中断。
-
解决方案
# 方案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等待队列满载。
排查步骤:
- 检查防火墙会话表
display firewall session table statistics
# 输出显示SYN_SENT和SYN_RECV会话数异常高
display firewall session table | include SYN
# 大量SYN_RECV状态的会话来自不同源IP
- 分析攻击特征
- 源IP随机化(分布式DDoS)
- 目的端口集中在80/443
-
SYN速率超过50000/s
-
解决方案
# 方案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 |
思考
- 为什么TCP序列号从32位增加到64位(如TCP-AO)可以显著提高安全性?
- SYN Cookie机制如何做到不保存SYN等待状态?它在什么场景下不适用?
- 对于加密的TCP连接(如TLS),TCP劫持攻击的效果与明文TCP有何不同?
下篇预告:第234篇:DHCP 饿死攻击与防护