主流防火墙策略绕过漏洞的修复方案与加固实践

主流防火墙策略绕过漏洞的修复方案与加固实践

流量关键点分析(攻击手法)

攻击者通过精心构造的TCP序列号攻击恶意标志组合绕过防火墙DPI检测,核心手法如下:

  1. TCP连接建立(正常握手)

    • 1049:客户端 SYN(seq=x)
      45 00 00 34 d5 f8 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      
    • 1053:服务端 SYN-ACK(seq=y, ack=x+1)
      45 00 00 34 a0 8a 00 00 32 06 08 22 ac fd 72 5a c0 a8 00 18
      
    • 1054:客户端 ACK(seq=x+1, ack=y+1)
      45 00 00 28 d5 fa 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      
  2. TLS握手拆分攻击

    • 1055:发送 TLS ClientHello头部(4字节)

      • 标志:PUSH+ACK
      • 数据:16 03 01 02(TLS握手头,版本TLS1.0,长度512字节)
      45 00 00 2c d5 fb 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      
    • 1056:插入 恶意MD5-SIG报文

      • 大包(557字节)含TCP MD5选项
      • 标志:PUSH+ACK → 强制DPI流控重置状态
      45 00 02 2d d5 fb 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      
    • 1057:发送 ClientHello主体(130字节)

      • 标志:ACK(无PUSH)→ 伪装控制包
      • 包含SNI字段起始部分 77 77 77 2e 67 6f 6f(“www.goo”)
      45 00 00 aa d5 fb 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      00 01 00 01 fc 03 03 fc 9e d4 bd e7 e3 e2 90 12 79 b7 4b 68...
      
    • 1058:重传 1056恶意包

      • 触发防火墙"连续大包阻断"规则
      45 00 02 2d d5 fb 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      
    • 1059:发送 ClientHello剩余部分(383字节)

      • 完成SNI字段 67 6c 65 2e 63 6f 6d(“gle.com” → “www.google.com”)
      45 00 01 a7 d5 fb 40 00 40 06 00 00 c0 a8 00 18 ac fd 72 5a
      67 6c 65 2e 63 6f 6d 00 17 00 00 ff 01 00 01 00...
      
  3. 攻击原理

    1055: 合法TLS头部
    1056: 恶意MD5-SIG
    1057: 伪装ACK包
    1058: 重传恶意包
    1059: 剩余TLS数据
    防火墙状态混乱
    SNI提取失败/连接阻断
  • DPI绕过:利用ACK without PUSH(1057)伪装控制包
  • 流控触发:恶意包(1056/1058)触发防火墙阻断规则
  • SNI隐藏:拆分SNI字段(1057+1059)使DPI无法提取域名

防火墙漏洞根源

  1. TCP流控缺陷

    • 依赖PUSH标志判断数据边界 → 被 ACK without PUSH(1057)绕过
    • 未验证序列号连续性 → 允许恶意包(1056)插入合法流
  2. 重组机制缺失

    • 未缓冲分片TLS消息 → 无法重组ClientHello(1055+1057+1059)
    • 未使用TLS长度字段(02 00=512字节)验证完整性
  3. 协议处理漏洞

    • 未过滤异常TCP选项(MD5-SIG)→ 被用作攻击载体
    • 未实现应用层超时机制 → 恶意包阻塞重组缓冲区
  4. IF (TCP.FLAGS & TCP_PUSH) do…; PSH-only 漏洞

错误处理PSH-only包
协议栈丢弃
未记录
攻击者
发送PSH-only恶意包
有漏洞的防火墙
内部网络
无响应
审计遗漏

防火墙修复方案

1. TCP层强化
模块修复措施防御目标
流重组引擎实现状态化TCP重组防止序列号跳跃攻击(1056插入)
- 缓冲数据直到应用层消息完整重组被拆分的ClientHello
- 严格验证SEQ/ACK连续性
标志处理取消对PUSH标志的依赖防御1057帧伪装控制包
- 基于应用层长度判断消息边界
- 验证标志组合合理性
选项过滤默认丢弃MD5-SIG选项包阻止1056/1058攻击载体
if (tcp.option == MD5-SIG) DROP
2. TCP标志位处理优化
关于TCP PUSH标志的澄清

在TCP协议中:

  1. PUSH标志(PSH) 用于指示接收方应立即将数据传递给应用层
  2. ACK标志 是大多数数据包的默认标志
  3. 合法标志组合
    • ACK (最常见)
    • PSH|ACK (带数据的推送)
    • RST|ACK (连接重置)
    • FIN|ACK (连接终止)
异常标志处理规则
  1. 丢弃规则:

    • 所有 PSH-only 包 (无ACK标志) → 立即丢弃
    • 所有 non-ACK 数据包 (已建立连接中) → 丢弃
  2. 验证逻辑伪代码:

   if (tcp.flags == PSH && !(tcp.flags & ACK)) {log("Invalid PSH-only packet", packet);DROP;}if (connection_state == ESTABLISHED && !(tcp.flags & ACK)) {log("Non-ACK packet in established connection", packet);DROP;}

标志位处理增强方案

异常标志处理规则
异常标志组合风险等级处理措施攻击防护目标
PSH-only高危立即丢弃防止强制刷新攻击
Non-ACK高危丢弃并记录日志防止状态机污染
**SYNPSH**中危丢弃
FIN-only中危丢弃防止连接异常终止
RST-only高危丢弃并生成警报防止拒绝服务攻击
ACK-only低危SEQ验证+流重组防止伪装控制包(如1057)
PSH/ACK正常延迟处理至应用层消息完整防TLS拆分绕过
PSH-only 攻击漏洞修复测试矩阵
测试用例测试场景测试包构造预期结果验证指标
PSH-only攻击基本漏洞验证flags=PSH
无负载
立即丢弃1. 防火墙丢弃计数增加
2. 无审计日志记录
3. 目标主机无接收
合法PSH+ACK正常业务验证flags=PSH+ACK
含TLS ClientHello
正常处理1. SNI成功提取
2. 审计日志完整记录
3. 应用层正常响应
混合标志攻击高级绕过尝试flags=PSH+URG
flags=PSH+SYN
立即丢弃1. 异常标志告警触发
2. 连接成功率=0%
3. CPU占用<5%
洪水攻击压力测试1000+ PSH-only包
10Gbps速率
全部丢弃1. 吞吐量保持>9.5Gbps
2. 内存波动<2%
3. 无漏包
渗透测试真实攻击模拟使用Metasploit模块:
auxiliary/scanner/portscan/tcp_psh
完全阻断1. IDS告警率100%
2. 扫描成功率=0%
3. 无异常连接
处理逻辑伪代码
def handle_tcp_packet(packet):# 丢弃所有PSH-only包if packet.flags == TCP.PSH:log("Invalid PSH-only packet", packet)return DROP# 在已建立连接中丢弃所有non-ACK包if connection.state == ESTABLISHED and not (packet.flags & TCP.ACK):log("Non-ACK packet in established connection", packet)return DROP# 特殊标志组合处理if packet.flags & TCP.SYN and packet.flags & TCP.PSH:log("Suspicious SYN|PSH packet", packet)return DROP# ACK-only包需要严格SEQ验证if packet.flags == TCP.ACK:if not validate_seq(packet.seq, expected_seq):return handle_out_of_order(packet)# PSH|ACK包进入重组缓冲区if packet.flags == (TCP.PSH | TCP.ACK):buffer_packet(packet)if is_application_message_complete():process_application_layer()return PROCESS
TCP 状态机加固实现
flags=PSH
established & !ACK
flags=SYN|PSH
valid flags
flags=ACK
flags=PSH|ACK
seq==expected
seq!=expected
msg complete
msg incomplete
FlagCheck
PSHonly
NonACK
SYNPSH
Normal
Drop
ACKonly
PSHACK
SeqCheck
Valid
Invalid
Process
ReassemblyBuffer
Wait
操作系统对TCP标志的标准处理
PSH-only
flags=0x08
ACK-only
flags=0x10
PSH+ACK
flags=0x18
其他组合
合规
违规
接收TCP包
标志位检查
立即丢弃
正常处理
正常处理
RFC合规性检查
处理
RFC 793 明确要求

“The ACK bit MUST be set in all packets after the initial SYN packet, unless the RST bit is set.”
(在初始SYN包之后的所有数据包中,除非设置了RST位,否则必须设置ACK位)

3. TLS深度检测增强
# TLS重组伪代码
def handle_tls_packet(packet):session = get_session(packet.stream_id)# 验证SEQ连续性(防御1056插入)if packet.seq != session.expected_seq:if not is_valid_tls_header(packet.data):  # 检查0x16握手标识return DROP  # 丢弃插入包session.buffer += packet.data# 检查TLS头完整性(前5字节)if len(session.buffer) >= 5:tls_len = (session.buffer[3] << 8) + session.buffer[4] + 5# 缓冲完整消息(防御1055/1057/1059拆分)if len(session.buffer) >= tls_len:process_clienthello(session.buffer[:tls_len])  # 提取SNIsession.buffer = session.buffer[tls_len:]# 设置超时(防御阻塞攻击)session.timer = set_timeout(500ms, flush_buffer)
4. 流控机制加固
序列号连续性引擎
class SeqTracker:def __init__(self):self.expected_seq = None  # 预期序列号self.reassembly_buffer = []  # 重组缓冲区self.max_gap = 8192  # 最大允许序列号间隔def process_packet(self, packet):# 初始序列号设置if self.expected_seq is None:self.expected_seq = packet.seq + len(payload)return PROCESS# 计算序列号差距seq_gap = packet.seq - self.expected_seq# 完美连续包if seq_gap == 0:self.expected_seq += len(packet.payload)return PROCESS# 可接受范围内的乱序包if 0 < seq_gap <= self.max_gap:self._buffer_packet(packet)return BUFFERED# 恶意序列号跳跃 (如1056插入)if seq_gap > self.max_gap:log_alert(f"Sequence jump attack detected: gap={seq_gap}")return DROP# 重复或旧包 (如1058重传)if seq_gap < 0:return DUPdef _buffer_packet(self, packet):# 按序列号插入缓冲区bisect.insort(self.reassembly_buffer, packet, key=lambda p: p.seq)# 检查连续性self._check_continuity()def _check_continuity(self):# 尝试重组连续数据next_seq = self.expected_seqfor p in sorted(self.reassembly_buffer, key=lambda x: x.seq):if p.seq == next_seq:self.reassembly_buffer.remove(p)next_seq += len(p.payload)else:break# 更新预期序列号if next_seq > self.expected_seq:self.expected_seq = next_seq
应用层感知流控
TLS
HTTP
未知
超时500ms
收到数据包
应用层协议识别
启动TLS状态跟踪
启动HTTP状态跟踪
通用流控
检测ClientHello
SNI提取成功?
执行SNI策略
缓冲至完整消息
检测Host头
执行URL过滤
允许/阻断连接
终止连接
恶意重传防御系统
  1. 重传检测矩阵:

    特征正常重传恶意重传处理方式
    SEQ差异=0=0需进一步检查
    有效负载相同不同标记恶意
    时间间隔>RTO<最小阈值(10ms)标记恶意
    标志位相同异常组合丢弃
  2. 防御规则:

    • IF 重传包.有效负载 != 原始包.有效负载 THEN DROP
    • IF 重传间隔 < 10ms AND 重传次数 > 3 THEN BLOCK_SESSION
    • IF 重传包.flags 包含非常规标志(如URG) THEN DROP

以下为本文捕获的漏洞利用的IP报文数据:在这里插入图片描述
WireShark 抓包数据:
1049:
0000   45 00 00 34 d5 f8 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1053:
0000   45 00 00 34 a0 8a 00 00 32 06 08 22 ac fd 72 5a
0010   c0 a8 00 181054:
0000   45 00 00 28 d5 fa 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1055:
0000   45 00 00 2c d5 fb 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1056:
0000   45 00 02 2d d5 fb 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1057:
0000   45 00 00 aa d5 fb 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1058:
0000   45 00 02 2d d5 fb 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1059:
0000   45 00 01 a7 d5 fb 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1067:
0000   01 bb 05 ea b3 21 4d 70 f2 2a 75 ec 80 12 ff ff
0010   1e b8 00 00 02 04 05 96 01 01 04 02 01 03 03 081068:
0000   01 bb 05 ea b3 21 4d 70 f2 2a 75 ec 80 12 ff ff
0010   1e b8 00 00 02 04 05 96 01 01 04 02 01 03 03 081069:
0000   45 00 00 34 d5 fe 40 00 40 06 00 00 c0 a8 00 18
0010   ac fd 72 5a1070:
0000   45 00 00 28 a1 39 00 00 32 06 07 7f ac fd 72 5a
0010   c0 a8 00 181071:
0000   45 00 00 28 a1 3a 00 00 32 06 07 7e ac fd 72 5a
0010   c0 a8 00 181072:
0000   45 00 00 28 a1 3b 00 00 32 06 07 7d ac fd 72 5a
0010   c0 a8 00 181073:
0000   01 bb 05 ea b3 21 4d 71 f2 2a 77 f1 50 10 01 09
0010   dc 87 00 001074:
0000   45 00 05 be a1 3d 00 00 32 06 01 e5 ac fd 72 5a
0010   c0 a8 00 18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87545.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泛微OAe9-后端二开常见数据库操作

泛微OAe9-后端二开常见数据库操作 文章目录 泛微OAe9-后端二开常见数据库操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存储过程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 适用于操作 OA 自己的库。OA 数据库…

【数据分析八:hypothesis testing】假设检验

本节我们讲述假设检验和抽样方法 有关假设检验的详细内容&#xff0c;可以参考我以往的博客 概率论与数理统计总复习_概率论与数理统计复习-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞33次&#xff0c;收藏23次。中科大使用的教辅《概率论和数理统计》&#xff0c;带大家复…

AI免费工具:promptpilot、今天学点啥、中英文翻译

promptpilot 激发模型潜能&#xff0c;轻松优化 Prompt https://promptpilot.volcengine.com/startup 今天学点啥 https://metaso.cn/study 能生成网页和语音播报 中英文翻译 沉浸式翻译&#xff0c;浏览器插件&#xff0c;ai翻译

计算机网络学习笔记:TCP三报文握手、四报文挥手

文章目录 前言一、TCP三报文握手二、TCP四报文挥手三、TCP保活计时器 前言 TCP通信&#xff0c;通常需要经历三个阶段&#xff1a;三报文握手->发送&#xff0c;接收数据->四报文挥手。 一、TCP三报文握手 三报文握手处于TCP的连接建立阶段&#xff0c;主要解决了以下的…

kafka部署和基本操作

一、部署kafka 解压 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 导航语法知识点及案例代码(17)

Bootstrap 5 导航语法知识点及案例代码 Bootstrap 5 提供了强大的导航组件&#xff0c;帮助开发者快速构建响应式且美观的导航栏。 一、Bootstrap 5 导航组件概述 Bootstrap 5 提供了多种导航组件&#xff0c;主要包括&#xff1a; 导航栏&#xff08;Navbar&#xff09;&am…

清除 docker 无用的 镜像/容器

清除 docker 无用的 镜像/容器 删除 <none> 的 docker 镜像 使用以下命令删除所有 的 Docker 镜像&#xff08;即悬空镜像 / dangling images&#xff09;&#xff1a; docker image prune -f这会自动删除所有没有 tag 的镜像&#xff08;&#xff09;&#xff0c;不会…

使用Charles抓包工具提升API调试与性能优化效率

在软件开发过程中&#xff0c;网络请求调试和性能优化往往成为开发者遇到的挑战&#xff0c;尤其是在进行API接口调试时。开发者需要确保网络请求的正确性、响应时间以及系统的整体性能。然而&#xff0c;传统的调试方法常常无法提供足够的细节来深入分析问题&#xff0c;进而影…

如何协调各项目关键节点的冲突与依赖

在多项目并行的环境下&#xff0c;关键节点间的冲突与依赖是导致项目延期、资源浪费和沟通误解的主要根源。要高效协调此类问题&#xff0c;企业应重点从建立透明的进度依赖图、使用项目管理工具对齐节点、推动跨部门协同机制入手。其中&#xff0c;通过Gantt图或关键路径法实现…

mongodb单节点改副本集模式

前一阵将三节点的副本集改成了单节点&#xff0c;但后面业务代码出现问题&#xff1a;无法使用事务&#xff0c;因为事务只有在副本集上能用&#xff0c;单节点无法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前仅有一台服务器&#xff0c;所以考虑在一台服务器上…

Android 修改了页面的xml布局,使用了databinding,这时候编译时需要用到apt吗

deepseek回答&#xff1a; 在 Android 开发中使用 DataBinding 时&#xff0c;不需要显式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是详细说明&#xff1a; 1. DataBinding 的编译机制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服务器如何从http升级到https(nginx)

1.证书申请 可以到阿里云或者华为云去申请证书&#xff0c;申请完下载证书是个压缩包&#xff0c;然后解压 可以到到几个文件夹&#xff0c;找到 .Nginx 文件夹打开 会有两个文件&#xff0c;将这两个文件上传至nginx/conf/cert文件夹下&#xff08;cert需要手…

6.19_JAVA_微服务

1、跑后端的时候要把数据库跑起来&#xff0c;否则会报错。 2、predicate断言&#xff1a; 预言&#xff1a;predict 3、gateway&#xff1a;出路口 4、API&#xff1a;List.of("a", "b", "c");把abc编程一个集合。 5、 6、shortcutFieldOrd…

Linux 基础命令:`ls`、`cd`、`du` 快速入门

在 Linux 系统中&#xff0c;ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls&#xff1a;查看目录内容 用途&#xff1a;列出当前或指定目录下的文件和子目录。 常用命令&#xff1a; ls -l # 详细列表&#xff08;权限、大…

408第一季 - 数据结构 - 散列表

散列表 概念 散列表本身就是为了查找 原始人思想 散列表思想 6%5 是 1 1%5 也是1 冲突 冲突怎么办&#xff1f; 线性探测法 就往后找&#xff0c;1跑到索引为2 然后查找&#xff0c;可以发现&#xff0c;只要没冲突就只用查找1次 然后你想找10的话&#xff0c;发现索引为0…

Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)

Elasticsearch 是一个基于 Lucene 的分布式搜索服务器&#xff0c;具有高效的全文检索能力。在现代应用中&#xff0c;尤其是需要强大搜索功能的系统中&#xff0c;Elasticsearch 被广泛使用。 Spring Boot 提供了对 Elasticsearch 的集成支持&#xff0c;使得开发者可以轻松地…

CMake实践:指定gcc版本编译和交叉编译

目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…

详解鸿蒙Next仓颉开发语言中的全屏模式

大家好&#xff0c;今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样&#xff0c;仓颉的新建项目默认是非全屏模式的&#xff0c;如果你的应用颜色比较丰富&#xff0c;就会发现屏幕上方和底部的留白&#xff0c;这是应用自动避让了屏幕上方摄像头区域和底部的导航条…

LoRA 浅析

1. 核心思想 LoRA 是一种参数高效的微调方法&#xff0c;旨在减少微调大型语言模型 (LLMs) 所需的计算资源和存储空间。其核心思想是&#xff1a; 冻结预训练模型权重&#xff1a; 在微调过程中&#xff0c;保持预训练 LLM 的原始权重不变。引入低秩矩阵&#xff1a; 对于 LL…

软件范式正在经历第三次革命

核心主题&#xff1a;软件范式正在经历第三次根本性革命&#xff08;软件3.0&#xff09;&#xff0c;其核心是“智能体”&#xff08;Agent&#xff09;&#xff0c;未来十年将是“智能体的十年”。 逻辑模块解析&#xff1a; 软件的三次重生革命 软件1.0&#xff1a; 传统编…