SNI 伪造。
经典屏蔽方式
IP 黑名单
通过 IP 黑洞、TCP RST 重置、HTTP 302重定向等方式阻断。
DNS 污染
DNS 污染(DNS Pollution)指的是 DNS 响应数据被篡改,导致用户获取到错误的 IP 地址。
DNS 缓存投毒:
DNS 缓存投毒(DNS Cache Poisoning)是 DNS 污染最常见的实现方式,典型的旁观者攻击。
主要目标是递归 DNS 服务器的缓存。攻击者利用其在网络拓扑中的特殊位置在真实的 DNS 响应到达递归服务器之前,抢先将一个伪造的包含了恶意信息的 DNS 响应发送给该递归服务器。如果伪造的响应被递归服务器接受并缓存,那么所有后续查询相同域名的用户都将获得错误的 IP 地址。
中间人攻击(MITM,Man-in-the-Middle attack): 就像一个狡猾的邮递员,他截获你的信件,打开并阅读,修改上面的内容,然后重新封装并寄出去。你和收件人都不知道信件被动过手脚。
旁观者攻击: 就像一个狡猾的邮递员,他知道你要收信件,就抢先伪造了一个信件,并让假信件比真信件更早抵达你家。真信件可能最终也会送到,但你已经拿到假的了(先到先得且未经验证)。他并没有拦截或修改真信件,他只是注入了一个假信件。主要利用的是时间差和协议设计的缺陷。由于攻击手段的多样性,有时一个攻击可能会兼具两者的一些特征。例如,DNS 劫持(DNS Hijacking/Redirection)通常被描述为中间人攻击,因为它通常涉及到截获和返回错误信息;但特定于 DNS 缓存投毒的抢先发送又更符合旁观者攻击的定义。因此,在实践中,人们可能不会总是严格区分这两个术语,但理解它们背后的行为模式差异是很重要的。
你可以把 DNS 劫持看作“直接控制车道的交通管理员(甚至修改了地图的权威信息)”,而 DNS 污染/缓存投毒看作“在某段路提前放置了一个错误的路牌,导致司机走错了路”。
(DNS 污染是 DNS 欺骗(DNS Spoofing)成功后的结果状态。)
SNI 阻断
SNI 阻断指的是通过检测和阻断 TLS 握手过程中的 SNI 信息来实现对特定网站的访问限制。
SNI 背景:
当客户端访问 HTTPS 网站时,会先进行 TLS 握手过程。在握手完成之前,客户端和服务器之间无法建立加密通道进行安全通信。
一般 HTTPS 访问流程:
- DNS 明文查询
- TCP 明文连接
- TLS 握手(明文 SNI)
- HTTPS 加密通信
(在 TLS 1.3 版本之前一般用 RSA 算法进行密钥交换,完成握手后使用对称加密)
核心矛盾:
在实际应用场景中,一台服务器通常需要同时托管多个 HTTPS 网站(虚拟主机场景),每个网站都有自己的域名和对应的证书。
而服务器必须在 TLS 握手阶段就提供证书,但此时 HTTP 层面的请求尚未建立,服务器无法读取 HTTP Header 中的 Host 字段来确定客户端想要访问哪个具体网站。
解决方案:
TLS 协议引入了 SNI(Server Name Indication) 扩展机制:客户端在 TLS 握手的初始阶段主动声明要访问的目标主机名(通过 Client Hello 消息中的 SNI 拓展字段),服务器根据这个信息选择对应的证书来完成握手。
设计缺陷:
Client Hello 消息和 SNI 拓展字段是明文传输的。
现代改进:
- ESNI(Encrypted SNI) :加密 SNI 拓展字段
- ECH(Encrypted Client Hello):加密整个 Client Hello 消息
- QUIC(Quick UDP Internet Connections):设计之初就考虑了加密元数据
现代 HTTPS 访问流程:
- DNS 加密查询 (DoH/DoT)
- QUIC 加密传输
- 加密服务器名称 (ECH)
- HTTPS 加密通信
SNI 伪造
先说结论:最简单省心的操作是利用 Sheas-Cealer 工具一键进行 Chromium 系浏览器启动命令参数改造(以管理员身份运行可以进行全局伪造),从而通过 SNI 伪造实现无代理直连 Google 等网站。
笔者特定 HTTPS 访问流程:
- 确定目标站点可直连 IP
- TCP 明文连接
- SNI 伪造
- HTTPS 加密通信
实现条件
- 找到能够反向解析到所访问的域名的可直连 IP
- 有一份在更新维护的伪造规则 Cealing-Host,包含绝大部分常用网站可直连 IP
- 自己寻找直连 IP 的方法:
- 有一份在更新维护的伪造规则 Cealing-Host,包含绝大部分常用网站可直连 IP
- SNI 验证宽松
- 虽然 RFC6066 有明确 SNI 规范,但是大部分服务端对于SNI 拓展字段的解析没有严格限制,即使不指定或存在格式错误时,仍能够正确对 TLS 加密流量进行分流
- 利用 Chromium 内核的启动参数特性伪造 SNI 拓展标记:
--host-rules="MAP truename falsename" --host-resolver-rules="MAP falsename trueip" --test-type --ignore-certificate-errors
- 首先通过
--host-rules
参数将发送给
的请求改为发送给truename
falsename
- 然后通过
--host-resolver-rules
参数将falsename
解析到
的truename
trueip
,确保连接到目标服务器 - 最后通过
--ignore-certificate-errors
参数来忽略因域名错误而导致的证书错误
- 首先通过
域前置
原理是在不同通信层使用不同的域名,在明文的 DNS 请求和 TLS 协商过程中偷用同一台服务器上的无害的域名来初始化连接,而实际要连接的域名(Host 字段)仅在建立加密的 HTTPS 连接后发出。
传统 HTTPS 通信:
客户端 → 直接连接 → 目标服务器
SNI: real-domain.com
Host: real-domain.com
域前置通信:
客户端 → CDN边缘节点 → 真实后端服务器
SNI: cdn-provider.com (CDN域名)
Host: real-domain.com (真实域名)
域前置技术正是利用了:
- SNI 的明文特性 – 用于欺骗检测系统
- Host 头的加密特性 – 用于真实通信
- TLS 扩展的灵活性 – RFC 6066 提供的基础
因此可以说,没有 SNI 机制就没有现代意义上的域前置技术。
发表回复