2023-08-03 19:12:22 +00:00
# 升级头部欺骗
2022-04-28 16:01:33 +00:00
< details >
2023-09-03 01:34:43 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks 云 ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 推特 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
- 你在一家**网络安全公司**工作吗?你想在 HackTricks 中看到你的**公司广告**吗?或者你想获得**PEASS 的最新版本或下载 HackTricks 的 PDF 版本**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
- 发现我们的独家 NFT 收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
- 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
- **加入** [**💬** ](https://emojipedia.org/speech-balloon/ ) [**Discord 群组** ](https://discord.gg/hRep4RUj7f ) 或 [**Telegram 群组** ](https://t.me/peass ),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
- **通过向[hacktricks 仓库](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud)提交 PR 来分享你的黑客技巧**。
2022-04-28 16:01:33 +00:00
< / details >
2023-09-03 01:34:43 +00:00
< figure > < img src = "/.gitbook/assets/image (675).png" alt = "" > < figcaption > < / figcaption > < / figure >
找到最重要的漏洞, 以便更快地修复它们。Intruder 跟踪您的攻击面,运行主动威胁扫描,发现整个技术堆栈中的问题,从 API 到 Web 应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks& utm_source=referral" %}
***
2023-08-03 19:12:22 +00:00
## H2C 欺骗 <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
### 明文 HTTP2 (H2C) <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
2021-04-20 10:02:21 +00:00
2023-09-03 01:34:43 +00:00
通常,普通的 HTTP 连接只持续一个请求的时间。然而, H2C 或者“**明文 HTTP2**”是指将普通的短暂的 HTTP 连接**升级为使用 HTTP2 二进制协议进行持续通信的持久连接**,而不是使用明文 HTTP 协议进行一次请求。
2021-04-20 10:02:21 +00:00
2023-09-03 01:34:43 +00:00
欺骗的第二部分发生在使用**反向代理**时。通常,当向反向代理发送 HTTP 请求时,代理会处理请求,处理一系列路由规则,然后将请求转发到后端,然后返回响应。当 HTTP 请求包含`Connection: Upgrade`头部时,例如用于 WebSocket 连接,反向代理将**维持客户端和服务器之间的持久连接**, **允许这些协议所需的持续通信**。对于 H2C 连接, RFC 要求存在 3 个头部:
2021-10-18 11:21:18 +00:00
```
2021-04-20 10:02:21 +00:00
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings
```
2023-08-03 19:12:22 +00:00
## 漏洞位置
2021-04-20 10:02:21 +00:00
2023-09-03 01:34:43 +00:00
当升级连接时, 反向代理通常会停止处理单个请求, 假设一旦建立连接, 其路由工作就完成了。使用H2C Smuggling, 我们可以绕过反向代理在处理请求时使用的规则, 如基于路径的路由、身份验证或WAF处理, 只要我们能首先建立H2C连接。
2021-04-20 10:02:21 +00:00
2021-10-18 11:21:18 +00:00
![](< .. / . gitbook / assets / image ( 454 ) . png > )
2021-04-20 10:02:21 +00:00
2023-08-03 19:12:22 +00:00
### 受影响的代理 <a href="#exploitation" id="exploitation"></a>
2022-06-19 13:37:58 +00:00
2023-09-03 01:34:43 +00:00
从漏洞的解释中可以看出, 代理服务器需要转发Upgrade标头, 并且有时还需要成功转发Connection标头。
2022-06-19 13:37:58 +00:00
2023-09-03 01:34:43 +00:00
默认情况下, 以下服务在代理传递期间会转发Upgrade和Connection标头, 从而使h2c smuggling开箱即用:
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
- HAProxy
- Traefik
- Nuster
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
默认情况下, 这些服务在代理传递期间不会转发Upgrade和Connection标头, 但可以以不安全的方式进行配置( 通过传递未经过滤的Upgrade和Connection标头) :
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
- AWS ALB/CLB
- NGINX
- Apache
- Squid
- Varnish
- Kong
- Envoy
- Apache Traffic Server
2022-06-19 13:37:58 +00:00
2023-08-03 19:12:22 +00:00
### 攻击 <a href="#exploitation" id="exploitation"></a>
2021-04-20 10:02:21 +00:00
2023-09-03 01:34:43 +00:00
原始博客文章指出, 并非所有服务器都会转发符合H2C连接升级所需的标头。这意味着默认情况下, 负载均衡器( 如AWS ALB/CLB、NGINX和Apache Traffic Server等) 将阻止H2C连接。然而, 在博客文章的结尾处, 他提到“并非所有后端都符合规范, 我们可以使用不符合规范的`Connection: Upgrade`变体进行测试,其中`Connection`标头中省略了`HTTP2-Settings`值”。
2021-04-20 10:02:21 +00:00
2022-06-19 13:37:58 +00:00
{% hint style="danger" %}
2023-09-03 01:34:43 +00:00
请注意,即使`proxy_pass` URL( 代理转发连接的终点) 指向特定的路径, 例如`http://backend:9999/socket.io`,连接也将与`http://backend:9999`建立, 因此您可以滥用此技术来联系该内部终点中的任何其他路径。因此, 在proxy_pass的URL中指定路径并不重要。
2022-06-19 13:37:58 +00:00
{% endhint %}
2023-08-03 19:12:22 +00:00
使用工具[**https://github.com/BishopFox/h2csmuggler**](https://github.com/BishopFox/h2csmuggler)和[**https://github.com/assetnote/h2csmuggler**](https://github.com/assetnote/h2csmuggler), 您可以尝试绕过代理所施加的保护, 建立H2C连接并访问受代理保护的资源。
2021-04-20 10:02:21 +00:00
2023-08-03 19:12:22 +00:00
点击此链接获取有关[Nginx中此漏洞的更多信息](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection)。
2022-04-28 16:01:33 +00:00
2023-08-03 19:12:22 +00:00
## WebSocket Smuggling
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
与之前的技术类似, 这个技术不是创建到通过代理可访问的端点的HTTP2隧道, 而是为相同目的创建一个WebSocket隧道, 绕过潜在的代理限制并直接与端点通信:
2022-06-19 13:58:11 +00:00
2022-06-27 08:48:17 +00:00
![](< .. / . gitbook / assets / image ( 651 ) ( 2 ) ( 1 ) . png > )
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
### 场景1
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
我们有一个后端,公开暴露了**WebSocket API**,并且还有一个**无法从外部访问的内部REST API**。恶意客户端想要访问内部REST API。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
在**第一步**中,客户端发送**升级请求**到反向代理,但在标头`Sec-WebSocket-Version`中使用了**错误的协议版本**。**代理**不验证`Sec-WebSocket-Version`标头,并认为**升级请求是正确的**。然后,它将请求转发到后端。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
在第二步中,后端发送**带有状态码`426`的响应,因为标头`Sec-WebSocket-Version`中的协议版本不正确**。然而,**反向代理不会检查**来自后端的足够响应(包括状态码),并**认为后端已准备好进行WebSocket通信**。然后,它将请求转发到客户端。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
最后,反向**代理认为**客户端和后端之间**建立了WebSocket连接**。实际上并没有WebSocket连接 - 后端拒绝了升级请求。同时, 代理保持客户端和后端之间的TCP或TLS连接处于打开状态。**客户端可以通过在连接上发送HTTP请求轻松访问私有REST API**。
2022-06-19 13:58:11 +00:00
![](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png)
2023-09-03 01:34:43 +00:00
发现以下反向代理受到影响:
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
- Varnish - 团队拒绝修复所描述的问题。
2023-09-03 01:34:43 +00:00
- Envoy proxy 1.8.0(或更早版本)- 在更新的版本中,升级机制已更改。
2023-08-03 19:12:22 +00:00
- 其他 - 待定。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
### 场景2
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
大多数反向代理( 例如NGINX) 在握手部分期间**检查来自后端的状态码**。这使得攻击更加困难,但并非不可能。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
让我们观察第二个场景。我们有一个后端, 公开暴露了WebSocket API和用于健康检查的公共REST API, 同时还有**无法从外部访问的内部REST API**。恶意客户端想要访问内部REST API。NGINX用作反向代理。WebSocket API在路径`/api/socket.io/`上可用, 健康检查API在路径`/api/health`上可用。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
通过发送POST请求来调用健康检查API, 名为`u`的参数控制URL。后端访问由恶意用户控制的外部资源, 并将状态码返回给客户端。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
在**第一步**中, 客户端发送POST请求来调用**健康检查API, 但附加了HTTP标头`Upgrade: websocket`**。NGINX认为这是一个**正常的升级请求**,它只查找`Upgrade`标头,跳过请求的其他部分。然后代理将请求转发到后端。
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
在**第二步**中, 后端调用健康检查API。它访问由恶意用户控制的外部资源, 并返回带有状态码`101`的HTTP响应。后端将该响应转发给反向代理。由于NGINX仅验证状态码, **它将认为后端已准备好进行WebSocket通信**。然后,它将请求转发到客户端。
2022-06-19 13:58:11 +00:00
![](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png)
{% hint style="warning" %}
2023-09-03 01:34:43 +00:00
请注意,这个场景要更复杂一些,因为您需要能够联系某个**返回状态码101**的端点。
2022-06-19 13:58:11 +00:00
{% endhint %}
2023-09-03 01:34:43 +00:00
最后,**NGINX认为**客户端和后端之间**建立了WebSocket连接**。实际上并没有WebSocket连接 - 后端调用了健康检查REST API。同时, 反向代理保持客户端和后端之间的TCP或TLS连接处于打开状态。**客户端可以通过在连接上发送HTTP请求轻松访问私有REST API**。
2022-06-19 13:58:11 +00:00
![](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png)
2023-08-03 19:12:22 +00:00
大多数反向代理应该受到该场景的影响。然而, 利用需要存在外部SSRF漏洞( 通常被认为是低严重性问题) 。
### 实验室
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
检查实验室以测试两种情况:[https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git)
2022-06-19 13:58:11 +00:00
2023-08-03 19:12:22 +00:00
## 参考资料
2022-06-19 13:37:58 +00:00
* [https://blog.assetnote.io/2021/03/18/h2c-smuggling/ ](https://blog.assetnote.io/2021/03/18/h2c-smuggling/ )
* [https://bishopfox.com/blog/h2c-smuggling-request ](https://bishopfox.com/blog/h2c-smuggling-request )
2022-06-19 13:58:11 +00:00
* [https://github.com/0ang3el/websocket-smuggle.git ](https://github.com/0ang3el/websocket-smuggle.git )
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
< figure > < img src = "/.gitbook/assets/image (675).png" alt = "" > < figcaption > < / figcaption > < / figure >
找出最重要的漏洞, 以便更快地修复它们。Intruder跟踪您的攻击面, 运行主动威胁扫描, 发现整个技术堆栈中的问题, 从API到Web应用程序和云系统。[**立即免费试用**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks)。
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks& utm_source=referral" %}
2022-04-28 16:01:33 +00:00
< details >
2023-09-03 01:34:43 +00:00
< summary > < a href = "https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology" > < strong > ☁️ HackTricks Cloud ☁️< / strong > < / a > -< a href = "https://twitter.com/hacktricks_live" > < strong > 🐦 Twitter 🐦< / strong > < / a > - < a href = "https://www.twitch.tv/hacktricks_live/schedule" > < strong > 🎙️ Twitch 🎙️< / strong > < / a > - < a href = "https://www.youtube.com/@hacktricks_LIVE" > < strong > 🎥 Youtube 🎥< / strong > < / a > < / summary >
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
- 您在**网络安全公司**工作吗? 您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
- 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品,[**The PEASS Family**](https://opensea.io/collection/the-peass-family)
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
- 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
- **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组** ](https://discord.gg/hRep4RUj7f )或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
2022-04-28 16:01:33 +00:00
2023-09-03 01:34:43 +00:00
- **通过向[hacktricks repo](https://github.com/carlospolop/hacktricks)和[hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)提交PR来分享您的黑客技巧**。
2022-04-28 16:01:33 +00:00
< / details >