hacktricks/pentesting-web/h2c-smuggling.md

135 lines
14 KiB
Markdown
Raw Normal View History

# Upgrade Header Smuggling
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
**Try Hard Security Group**
2024-03-14 23:01:13 +00:00
2024-03-26 14:56:40 +00:00
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
2024-03-14 23:01:13 +00:00
{% embed url="https://discord.gg/tryhardsecurity" %}
***
### H2C Smuggling <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
2022-04-28 16:01:33 +00:00
#### HTTP2 Over Cleartext (H2C) <a href="#http2-over-cleartext-h2c" id="http2-over-cleartext-h2c"></a>
H2C, або **http2 через відкритий текст**, відхиляється від норми тимчасових HTTP з'єднань, оновлюючи стандартне HTTP **з'єднання до постійного**. Це оновлене з'єднання використовує бінарний протокол http2 для постійної комунікації, на відміну від одноразового запиту відкритого тексту HTTP.
Суть проблеми контрабанди виникає з використанням **реверс-проксі**. Зазвичай реверс-проксі обробляє та пересилає HTTP запити на бекенд, повертаючи відповідь бекенду після цього. Однак, коли заголовок `Connection: Upgrade` присутній у HTTP запиті (зазвичай спостерігається з вебсокетами), реверс **проксі підтримує постійне з'єднання** між клієнтом і сервером, полегшуючи безперервний обмін, необхідний для певних протоколів. Для H2C з'єднань дотримання RFC вимагає наявності трьох специфічних заголовків:
```
Upgrade: h2c
HTTP2-Settings: AAMAAABkAARAAAAAAAIAAAAA
Connection: Upgrade, HTTP2-Settings
```
Вразливість виникає, коли після оновлення з'єднання зворотний проксі перестає обробляти окремі запити, вважаючи, що його робота з маршрутизації завершена після встановлення з'єднання. Використання H2C Smuggling дозволяє обійти правила зворотного проксі, які застосовуються під час обробки запитів, такі як маршрутизація на основі шляху, аутентифікація та обробка WAF, за умови, що з'єднання H2C успішно ініційоване.
#### Вразливі проксі <a href="#exploitation" id="exploitation"></a>
2022-06-19 13:37:58 +00:00
Вразливість залежить від обробки зворотним проксі заголовків `Upgrade` і іноді `Connection`. Наступні проксі за замовчуванням пересилають ці заголовки під час проксі-передачі, тим самим за замовчуванням дозволяючи H2C smuggling:
2022-06-19 13:37:58 +00:00
* HAProxy
* Traefik
* Nuster
2022-06-19 13:37:58 +00:00
Навпаки, ці сервіси не пересилають обидва заголовки під час проксі-передачі за замовчуванням. Однак їх можна налаштувати ненадійно, що дозволяє не фільтрувати пересилання заголовків `Upgrade` і `Connection`:
2022-06-19 13:37:58 +00:00
* AWS ALB/CLB
* NGINX
* Apache
* Squid
* Varnish
* Kong
* Envoy
* Apache Traffic Server
2022-06-19 13:37:58 +00:00
2024-03-29 18:49:46 +00:00
#### Використання <a href="#exploitation" id="exploitation"></a>
Важливо зазначити, що не всі сервери за замовчуванням пересилають заголовки, необхідні для відповідного оновлення з'єднання H2C. Таким чином, такі сервери, як AWS ALB/CLB, NGINX і Apache Traffic Server, серед інших, природно блокують з'єднання H2C. Проте варто протестувати варіант, що не відповідає стандартам, `Connection: Upgrade`, який виключає значення `HTTP2-Settings` з заголовка `Connection`, оскільки деякі бекенди можуть не відповідати стандартам.
2022-06-19 13:37:58 +00:00
{% hint style="danger" %}
Незалежно від конкретного **шляху**, вказаного в URL `proxy_pass` (наприклад, `http://backend:9999/socket.io`), встановлене з'єднання за замовчуванням переходить на `http://backend:9999`. Це дозволяє взаємодіяти з будь-яким шляхом у цьому внутрішньому кінцевому пункті, використовуючи цю техніку. Отже, вказівка шляху в URL `proxy_pass` не обмежує доступ.
2022-06-19 13:37:58 +00:00
{% endhint %}
Інструменти [**h2csmuggler від BishopFox**](https://github.com/BishopFox/h2csmuggler) та [**h2csmuggler від assetnote**](https://github.com/assetnote/h2csmuggler) полегшують спроби **обійти захист, накладений проксі**, встановлюючи з'єднання H2C, що дозволяє отримати доступ до ресурсів, захищених проксі.
2022-06-19 13:58:11 +00:00
Для отримання додаткової інформації про цю вразливість, особливо щодо NGINX, зверніться до [**цього детального ресурсу**](../network-services-pentesting/pentesting-web/nginx.md#proxy\_set\_header-upgrade-and-connection).
2022-06-19 13:58:11 +00:00
## Websocket Smuggling
2022-06-19 13:58:11 +00:00
Websocket smuggling, на відміну від створення HTTP2 тунелю до кінцевого пункту, доступного через проксі, встановлює Websocket тунель для обходу потенційних обмежень проксі та сприяє прямій комунікації з кінцевим пунктом.
2022-06-19 13:58:11 +00:00
2024-03-29 18:49:46 +00:00
### Сценарій 1
2022-06-19 13:58:11 +00:00
У цьому сценарії зловмисний клієнт намагається отримати доступ до внутрішнього REST API, націлюючись на бекенд, який пропонує публічний WebSocket API поряд з недоступним внутрішнім REST API. Атака розгортається в кілька етапів:
2022-06-19 13:58:11 +00:00
1. Клієнт ініціює, надсилаючи запит Upgrade до зворотного проксі з неправильним значенням протоколу `Sec-WebSocket-Version` у заголовку. Проксі, не перевіряючи заголовок `Sec-WebSocket-Version`, вважає запит Upgrade дійсним і пересилає його до бекенду.
2. Бекенд відповідає кодом статусу `426`, вказуючи на неправильну версію протоколу в заголовку `Sec-WebSocket-Version`. Зворотний проксі, ігноруючи статус відповіді бекенду, вважає, що готовий до WebSocket зв'язку, і передає відповідь клієнту.
3. В результаті зворотний проксі вводиться в оману, вважаючи, що WebSocket з'єднання було встановлено між клієнтом і бекендом, тоді як насправді бекенд відхилив запит Upgrade. Незважаючи на це, проксі підтримує відкритим TCP або TLS з'єднання між клієнтом і бекендом, що дозволяє клієнту отримати необмежений доступ до приватного REST API через це з'єднання.
2022-06-19 13:58:11 +00:00
Постраждалі зворотні проксі включають Varnish, який відмовився вирішити цю проблему, і версію проксі Envoy 1.8.0 або старішу, у новіших версіях механізм оновлення був змінений. Інші проксі також можуть бути вразливими.
2022-06-19 13:58:11 +00:00
2024-02-06 03:10:38 +00:00
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/2-4.png)
2022-06-19 13:58:11 +00:00
2024-03-29 18:49:46 +00:00
### Сценарій 2
2022-06-19 13:58:11 +00:00
Цей сценарій передбачає бекенд з публічним WebSocket API та публічним REST API для перевірки стану, а також недоступним внутрішнім REST API. Атака, більш складна, включає наступні етапи:
2022-06-19 13:58:11 +00:00
1. Клієнт надсилає POST запит для активації API перевірки стану, включаючи додатковий HTTP заголовок `Upgrade: websocket`. NGINX, що виконує роль зворотного проксі, інтерпретує це як стандартний запит Upgrade, спираючись лише на заголовок `Upgrade`, і ігнорує інші аспекти запиту, пересилаючи його до бекенду.
2. Бекенд виконує API перевірки стану, звертаючись до зовнішнього ресурсу, контрольованого зловмисником, який повертає HTTP відповідь з кодом статусу `101`. Ця відповідь, отримана бекендом і переслана до NGINX, вводить проксі в оману, змушуючи його думати, що WebSocket з'єднання було встановлено через його перевірку лише коду статусу.
2022-06-19 13:58:11 +00:00
2024-02-06 03:10:38 +00:00
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-4.png)
2022-06-19 13:58:11 +00:00
> **Увага:** Складність цієї техніки зростає, оскільки вона вимагає можливості взаємодії з кінцевим пунктом, здатним повернути код статусу 101.
2022-06-19 13:58:11 +00:00
Врешті-решт, NGINX вводиться в оману, вважаючи, що WebSocket з'єднання існує між клієнтом і бекендом. Насправді такого з'єднання немає; цільовим був API перевірки стану REST. Проте зворотний проксі підтримує з'єднання відкритим, що дозволяє клієнту отримати доступ до приватного REST API через нього.
2022-06-19 13:58:11 +00:00
2024-02-06 03:10:38 +00:00
![https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png](https://github.com/0ang3el/websocket-smuggle/raw/master/img/3-5.png)
2022-06-19 13:58:11 +00:00
Більшість зворотних проксі вразливі до цього сценарію, але експлуатація залежить від наявності зовнішньої вразливості SSRF, яка зазвичай вважається проблемою низької серйозності.
2022-06-19 13:58:11 +00:00
2024-03-29 18:49:46 +00:00
#### Лабораторії
2022-06-19 13:58:11 +00:00
Перевірте лабораторії, щоб протестувати обидва сценарії в [https://github.com/0ang3el/websocket-smuggle.git](https://github.com/0ang3el/websocket-smuggle.git)
2022-06-19 13:58:11 +00:00
2024-03-29 18:49:46 +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)
**Try Hard Security Group**
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Вивчайте та практикуйте GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Підтримка HackTricks</summary>
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте за нами в** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв.
</details>
{% endhint %}