Bg0EXx

如何直连 Google

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 访问流程:

  1. DNS 明文查询
  2. TCP 明文连接
  3. TLS 握手(明文 SNI)
  4. 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 访问流程:

  1. DNS 加密查询 (DoH/DoT)
  2. QUIC 加密传输
  3. 加密服务器名称 (ECH)
  4. HTTPS 加密通信

SNI 伪造

先说结论:最简单省心的操作是利用 Sheas-Cealer 工具一键进行 Chromium 系浏览器启动命令参数改造(以管理员身份运行可以进行全局伪造),从而通过 SNI 伪造实现无代理直连 Google 等网站。

笔者特定 HTTPS 访问流程:

  1. 确定目标站点可直连 IP
  2. TCP 明文连接
  3. SNI 伪造
  4. HTTPS 加密通信

实现条件

  1. 找到能够反向解析到所访问的域名的可直连 IP
  2. 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 解析到 truenametrueip,确保连接到目标服务器
      • 最后通过 --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 (真实域名)

域前置技术正是利用了:

  1. SNI 的明文特性 – 用于欺骗检测系统
  2. Host 头的加密特性 – 用于真实通信
  3. TLS 扩展的灵活性 – RFC 6066 提供的基础

因此可以说,没有 SNI 机制就没有现代意义上的域前置技术。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注