SNI-Spoofing 绕检核心揭秘:wrong_seq错误序列号手法如何让DPI自食其果
SNI-Spoofing 绕检核心揭秘wrong_seq错误序列号手法如何让DPI自食其果【免费下载链接】SNI-SpoofingBypass DPI with IP/TCP-Header manipulation项目地址: https://gitcode.com/gh_mirrors/sn/SNI-SpoofingSNI-Spoofing 是一个轻量级的 SNI 伪装工具通过 IP/TCP 头部操纵来绕过 DPI 深度包检测。它的核心思路很巧妙在真实 TLS 连接建立过程中向链路上注入一个携带伪造 SNI默认auth.vercel.com的假 TLS ClientHello让 DPI 读到错误的域名而真实连接却不受任何影响。本文重点拆解其中名为wrong_seq错误序列号的绕检手法——它正是让 DPI 自食其果 的关键。SNI-Spoofing 是什么一个绕过 DPI 的 SNI 伪装代理项目整体是一个透明代理运行在 Windows 上依赖 requirements.txt 中的pydivert底层使用 WinDivert 内核驱动需要管理员权限在 config.json 中配置的LISTEN_HOST:LISTEN_PORT默认0.0.0.0:40443上监听客户端流量与CONNECT_IP:CONNECT_PORT指定的真实目标服务器建立正常 TCP 连接在三次握手刚完成的瞬间向链路上注入一个伪造的 TLS ClientHello其中 SNI 字段是FAKE_SNI指定的伪装域名注入成功后代理开始双向转发真实流量。DPI 设备通常依据明文 ClientHello 中的 SNI 扩展做域名级阻断而这个工具的目标就是让 DPI 记录到的 SNI 变成伪装域名从而放行本应被拦截的连接。DPI 如何识别 SNI伪装的前提TLS 握手的第一步 ClientHello 是明文的其中的 SNI 扩展直接写着目标域名——这是 DPI 识别你在访问谁的主要依据。于是问题变成如何在不破坏真实 TCP 连接的前提下让 DPI 读到一段假的 ClientHello直接多发包会被对端 RST修改真实数据流又会污染连接。SNI-Spoofing 给出的答案是 wrong_seq 手法。wrong_seq 核心手法一个服务器忽略、DPI 中招的序列号正常握手中的序列号规则TCP 三次握手后客户端的第一个数据字节必须位于syn_seq 1。这个下一个期望字节位置是对端 TCP 协议栈的底线凡是不符合规则的包TCP 协议栈会按标准语义直接丢弃但它不会主动告诉监听链路的 DPI 设备。把假 ClientHello 塞进错位的区间关键代码在 fake_tcp.py注入包的序列号被设置为fake_seq syn_seq 1 − 假数据长度也就是说这个假数据包的字节区间是[syn_seq 1 − L, syn_seq 1)恰好结束在第一个合法数据字节的位置之前整段落在理论上已经收过的区间里。这样一来出现了精妙的不对称对真实服务器这是一个纯重传形状的包TCP 协议栈按标准语义回一个重复 ACK 并丢弃连接状态完全不变。随后客户端发出的真实数据正好从syn_seq 1开始严丝合缝——连接全程正常。对 DPI它看到链路上第一个数据段里是一个完整的 TLS ClientHelloSNI 是auth.vercel.com。多数 DPI 提取 SNI 的策略是取流上第一段 TLS 数据于是它记录下了伪装域名而真正的 ClientHello 反而被它的流重组逻辑忽略或错序丢弃。这就是让 DPI 自食其果DPI 越依赖 TCP 流的朴素重组和第一个数据包启发式就越容易被这个按协议规则精心错位的包喂到假 SNI。细节上还做了两处伪装增强置位 PSH 标志、把 IP 头的ident加 1避免被按 IP 头去重并同步修正包长度字段让这个包看起来像一个真实的数据推送。注入时机与成功判定main.py 中BYPASS_METHOD固定为wrong_seq。注入流程由 fake_tcp.py 的状态机驱动捕获客户端 SYN记录syn_seq捕获服务器 SYN-ACK记录syn_ack_seqmonitor_connection.py 维护四元组与握手状态捕获客户端握手完成 ACK 后立即派生线程在 1ms 后发出上面描述的错位包等待服务器回应的 ACKfake_data_ack_recv2 秒超时确认链路未被 RST才放行真实流量进入双向转发。假 ClientHello 是怎么造出来的伪造的数据并非手写字节而是 utils/packet_templates.py 中的ClientHelloMaker项目内置了一份真实浏览器抓取的 ClientHello 模板运行时只替换随机数、会话 ID、key_share各 32 字节随机数和 SNI 字段并用 padding 把长度固定为 517 字节。这样注入的 ClientHello 在结构、套件列表、扩展顺序上都是正常浏览器的样子进一步降低被 DPI 指纹化识别的概率。配置与运行指南一键体验 SNI 伪装编辑 config.json设置监听的LISTEN_HOST/LISTEN_PORT、真实目标的CONNECT_IP/CONNECT_PORT以及最重要的FAKE_SNI伪装域名建议选 DPI 白名单内的常见公共服务域名安装依赖pydivert见 requirements.txt以管理员身份运行 main.py启动时会加载 utils/network_tools.py 解析本机出口 IP并用 WinDivert 过滤器只捕获本机 ↔ 目标之间的 TCP 流量将你的代理客户端指向LISTEN_PORT连接即自动完成 SNI 伪装。项目文件结构速览文件职责main.py主程序监听、握手编排、双向流量转发fake_tcp.pywrong_seq 注入状态机与错位包构造核心injecter.py基于 WinDivert 的抓包/放行/改写基类monitor_connection.py连接四元组与握手状态跟踪utils/packet_templates.py真实模板驱动的假 ClientHello 生成器utils/network_tools.py本机出口 IPv4/IPv6 探测config.json监听/目标地址与 FAKE_SNI 配置总结错位序列号为何高明wrong_seq 手法的精髓在于利用了 TCP 协议栈与 DPI 解析器之间的认知差同一个序列号区间协议栈按 RFC 语义判定为可丢弃的重传DPI 却按流重组启发式把它当成流的第一个数据段。伪造的 SNI 就这样被 DPI自愿吞下而真实连接毫发无损。对于想理解 DPI 绕过与 TLS 指纹对抗的新手来说这份不足千行 Python 代码的 fake_tcp.py 与 utils/packet_templates.py 是非常值得逐行阅读的小型协议攻防教材。【免费下载链接】SNI-SpoofingBypass DPI with IP/TCP-Header manipulation项目地址: https://gitcode.com/gh_mirrors/sn/SNI-Spoofing创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →