Bypassing Web Filters Part 2 Host Header Spoofing
在上一篇关于绕过网络过滤器的文章中,我讨论了 SNI 欺骗的工作原理以及网络过滤器如何防止这种技术。本文将介绍另一种绕过技术,称为 Host 头欺骗。
绕过网络过滤器博客系列:
-
绕过网络过滤器第一部分:SNI 欺骗 -
绕过网络过滤器第二部分:Host 头欺骗 -
绕过网络过滤器第三部分:域名前置 -
绕过网络过滤器第四部分:Host 头欺骗和域名前置检测绕过
什么是 Host 头
Host 头是客户端(通常是浏览器)作为 HTTP 请求的一部分发送给网络服务器的 HTTP 请求头,用于指定服务器的主机名 1。由于一个网络服务器可以在同一个 IP 地址上托管多个网站,因此需要这个信息来提供正确的网站。这被称为虚拟主机托管。反向代理也可以使用这个头来确定传入请求应该发送到哪个后端系统。
在下面的例子中,Alice 连接到 IP 地址为 203.0.113.5
的网络服务器,该服务器托管了 a.example.net
、b.example.net
和 c.example.net
这些网站。由于 Alice 的浏览器发送了 Host 头 b.example.net
,网络服务器知道要提供正确目录的文件。
如今,HTTP 流量几乎总是被包裹在 TLS 中,由于 Host 头是 HTTP 请求的一部分,它也被加密。下面对此进行了说明。
首先,浏览器与服务器建立 TLS 会话。在 TLS 握手中,主机名在 SNI ① 中发送。然后,HTTP 请求在 TLS 隧道 ③ 内发送到服务器 ②。作为该请求的一部分,浏览器再次在 HTTP Host 头 ④ 中指定主机名:
注意:通常情况下,你无法检查 TLS 隧道中交换的解密消息。你只会看到加密数据,而不是 HTTP GET 请求。对于这个设置,TLS 密钥是使用 SSLKEYLOGFILE
变量 2,3 导出的,并导入到 Wireshark 中,这允许对 TLS 流量进行实时解密。
基于 Host 头的过滤器
公司经常在代理上拦截和检查 TLS 流量。为了实现这一点,代理的证书颁发机构(CA)证书必须安装在所有客户端设备上。因此,这只在公司环境中可行,公司可以管理所有客户端,从而安装代理 CA。如果没有安装代理 CA,用户会收到 TLS 证书错误,并能够检测到有人在查看他们的流量(这也被称为中间人攻击)。
通过上述设置,代理能够解密和检查所有流量,并使用 HTTP 请求中的信息(如 Host 头)来确定请求是否合法。这种方法用于阻止危险文件(如 .exe 文件)、已知的恶意网站、特定网站类别如游戏,或超过特定大小的文件上传以防止数据泄露。
在大多数情况下,这些过滤器采用黑名单(或已知恶意)方法。然而,在罕见的情况下,我们看到客户实施相反的做法,通过定义一个允许(或已知安全)的网站列表,这些网站可以通过过滤器访问。
使用 Host 头欺骗绕过简单的网络过滤器
当代理仅依赖 Host 头来确定请求是否合法时,这可能被利用来绕过此类网络过滤器。
这需要对 HTTP 请求进行控制,可以通过系统上运行的恶意软件或试图绕过网络过滤器的攻击者或具有系统访问权限的用户来实现。
想象你有以下情况,Alice 能够访问网站 legit.example.net
,但防火墙基于 Host 头 evil.example.com
阻止了对 evil.example.com
的访问:
Alice(或她电脑上的恶意软件)现在可以通过连接到 evil.example.net
(保持 SNI evil.example.net 不变),但在 Host 头中指定 legit.example.net
来绕过网络过滤器:
最终的 IP、TLS 和 HTTP 数据包结构如下所示:
由于我们只更改了 Host 头,而没有更改 SNI,还有一个额外的好处是我们可以绕过执行 SNI 与证书中的主机名/SAN 匹配的网络过滤器(参见前一篇关于 SNI 欺骗的博文)。
使用 curl 的示例
制作这样的请求很简单。使用 curl
,我们可以控制 Host 头,如下所示:
curl -H "Host: legit.example.net" https://evil.example.com
在这里我们可以看到,SNI ① 保持不变以匹配证书主题,但 HTTP 请求 ② 包含了伪造的 Host
头 ③:
Host
头中包含合法主机的连接注意:为了演示目的,TLS 连接再次被解密以允许检查所包含的 HTTP 流量。
我们在项目中发现了这样的绕过方法,例如客户阻止向大多数网站上传大文件以防止数据泄露。在这种情况下,这对我们的 C2(Command and Control)通信造成了限制,因为 C2 植入程序无法将较大的数据块传输回我们的服务器。通过将 Host
头覆盖为不在黑名单中的值(客户自己的文件共享解决方案),可以绕过过滤器,允许我们的 C2 植入程序进行不受限制的通信。
Host 头欺骗保护和限制
上述讨论的绕过技术仅在代理仅使用 Host 头来决定是否应该阻止网站,而忽略其他机制(如 SNI 检查/匹配)时才有效。
然而,在大多数情况下,Web 过滤器会执行额外的检查以提高对此类绕过的抵抗力。例如,代理可以验证 SNI 和 Host
头中的主机名是否相同,并丢弃不同的请求。
示例:Fortinet FortiGate
Fortinet FortiGate 防火墙/代理有一个名为"域名前置保护"(Domain Fronting Protection)4 的功能,可以阻止主机名不匹配的情况:
如果检测到这种情况,HTTP 响应如下所示:
HTTP/1.1 403 Forbidden
[...]
[...]
<h3>403 domain fronting blocked</h3>
<p>The webserver reported that an error occurred while trying to access the website. Please return to the previous page.</p>
[...]
日志中的消息如下所示:
type="utm" subtype="webfilter" eventtype="domain-fronting" srcip=172.17.0.2 dstip=198.51.100.23 dstport=443 hostname="legit.example.net" msg="Domain fronting detected" rawdata="HTTP Host <legit.example.net> does not match SNI <evil.example.com>"
此保护功能默认启用,但可以禁用:
关于域名前置(domain fronting)的更多内容将在下一篇文章中解释。
要点
Host 头欺骗是一种相当简单的绕过技术,而且 - 如果正确配置了 Web 过滤解决方案 - 很容易预防。尽管如此,在您的下一次渗透测试或自己的基础设施中寻找这种技术总是值得的!
还要记住,这并不总是关于能否访问特定站点,还可能涉及绕过其他限制,如大文件上传或下载某些文件类型。
参考文献
-
RFC 2616,HTTP/1.1,"请求标识的资源":https://www.rfc-editor.org/rfc/rfc2616#section-5.2↩︎ -
Everything Curl, SSLKEYLOGFILE
:https://everything.curl.dev/usingcurl/tls/sslkeylogfile.html↩︎ -
互联网草案,TLS 的 SSLKEYLOGFILE
格式,https://www.ietf.org/archive/id/draft-ietf-tls-keylogfile-03.txt↩︎ -
Fortinet 文档,Fortigate,域名前置保护:https://docs.fortinet.com/document/fortigate/7.6.2/administration-guide/639769↩︎
原文始发于微信公众号(securitainment):绕过网络过滤器第二部分:Host 头欺骗
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论