无代理合法抵御网络监听和开展网络研究

项目地址:
https://github.com/SpaceTimee/Sheas-Cealer

域前置技术原理是在不同通信层使用不同的域名,在明文的 DNS 请求和 TLS 协商中使用无害的域名来初始化连接,而实际要连接的域名(Host 字段)仅在建立加密的 HTTPS 连接后发出,使其不以明文暴露

项目原理

利用 Chromium 内核的启动参数特性伪造 SNI 拓展标记,在浏览器中进行直连
--host-rules="MAP truename falsename" --host-resolver-rules="MAP falsename trueip" --test-type --ignore-certificate-errors

  1. 首先通过 --host-rules 参数将发送给 targetname 的消息改为发送给 falsename
  2. 然后通过 --host-resolver-rules 参数将 falsename 解析到 targetname 的 IP,确保连接到目标服务器
  3. 最后通过 --ignore-certificate-errors 参数来忽略因域名错误而导致的证书错误

注意不适用于:

  • 所有可接受的 SNI 拓展均被阻断的网站 (主要障碍)
  • 所有可用的 IP 地址均被封锁的网站 (目前极少出现)

SNI 是什么

SNI(Server Name Indication) 是 TLS 的一个扩展协议,在该协议下,在握手过程开始时客户端告诉它正在连接的服务器要连接的主机名称,允许服务器在相同的 IP 地址和 TCP 端口号上呈现多个证书

SNI 问题背景

当进行 TLS 连接时,客户端从 Web 服务器请求数字证书,服务器一旦发送证书,客户端就会检查这个证书,并将其尝试连接的名称与证书中包含的名称进行对比

如果发生匹配,则连接正常进行;如果没有找到匹配,则可能会向用户警告该差异,并且可能会中止连接

  1. 首先一个证书覆盖多个主机名是可以做到的,X.509 v3 规范引入 subjectAltName 字段允许一对多
  2. 但是由于缺少所有名称的完整列表,几乎不可能获得覆盖服务器负责的所有主机名的单个证书
  3. 最后 TLS 握手发生在服务器看到 HTTP 头前,服务器不可能用 HTTP 头中的信息决定呈现哪个证书

SNI 解决方案

客户端在 Client Hello 消息的 SNI 扩展中明文发送要连接的主机名称,作为 TLS 协商的一部分

这使服务器能够提前选择正确的主机名称,并向浏览器提供相对应 TLS 证书,从而使得单个 IPv4 地址的服务器可以在获取公共证书不现实的情况下提供一组域名的 TLS 连接