Skip to content
KitploitKITPLOIT
ToolsBlog
Log in
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2023-24329-lab — Selbstständiges Docker-Lab, das CVE-2023-24329 demonstriert, einen Python-urllib-Parser-Differential, der URL-Schema- und Host-Filter umgeht, mit verwundbaren und gepatchten Umgebungen für praxisorientierte Sicherheitsschulungen. | Kitploit
Tools/GitHubGitHub/jithinodattu/cve-2023-24329-lab
SchwachstellenanalyseExploitationWebsicherheitCTFPenetrationstestsLernen & BildungLabs & Praxis
GitHubjithinodattu/cve-2023-24329-lab

CVE-2023-24329-lab

Selbstständiges Docker-Lab, das CVE-2023-24329 demonstriert, einen Python-urllib-Parser-Differential, der URL-Schema- und Host-Filter umgeht, mit verwundbaren und gepatchten Umgebungen für praxisorientierte Sicherheitsschulungen.

Repository anzeigen
11vor 5 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2023-24329 – Parser-Differential-Labor

Nur zu Bildungszwecken. Dieses Labor existiert, um eine echte Schwachstelle in einer sicheren, isolierten Umgebung zu demonstrieren. Führen Sie dies niemals gegen Systeme aus, die Ihnen nicht gehören. Verwenden Sie den absichtlich defekten Filtercode niemals in einem Produktionssystem.

Ein in sich geschlossenes Docker-Labor, das CVE-2023-24329 demonstriert – ein Parser-Differential in Pythons urllib.parse.urlparse(), das die Umgehung von URL-Schema- und Host-Filtern unter Python < 3.11.4 ermöglicht.

Das Labor zeigt eine API, die explizit file://-URLs und interne Hostnamen blockiert, die dazu verleitet wird, /etc/passwd aus ihrem eigenen Container zu lesen und einen privaten internen Dienst zu treffen – und beweist dann, dass derselbe Exploit auf gepatchtem Python fehlschlägt.


Die Schwachstelle

Pythons urlparse() und die zugrundeliegenden HTTP-/Datei-Abrufer sind sich uneinig, wie URLs mit führenden Leerzeichen zu behandeln sind. In betroffenen Versionen:

from urllib.parse import urlparse

urlparse(" file:///etc/passwd").scheme   # → ""   (leer — Filter besteht)
urlparse(" file:///etc/passwd").hostname # → None (leer — Filter besteht)

Aber urllib.request.urlopen(" file:///etc/passwd") entfernt das Leerzeichen und ruft trotzdem file:///etc/passwd ab.

Diese Lücke zwischen dem, was der Parser sieht, und dem, was der Abrufer tut – das ist die Schwachstelle.

Python 3.11.4 hat dies behoben, indem vor dem Parsen führende Leerzeichen/Steuerzeichen entfernt werden, wodurch die Lücke geschlossen wird.


Demo – Drei Durchläufe

DurchlaufWas Sie sehenWas es lehrt
1 – Basisliniefile:///etc/passwd → 403 blocked schemeDer Filter scheint vernünftig
2 – ExploitGleiche URL mit Leerzeichen-Präfix → 200 + Inhalt von /etc/passwd und internes GeheimnisEin einziges Leerzeichen besiegt den gesamten Filter
3 – PatchGleiche Nutzlast gegen Python 3.11.4 → 403 blockedGepatchtes urlparse entfernt zuerst Leerzeichen; Filter fängt es korrekt ab

Architektur

Vier Dienste in einem isolierten Docker-Bridge-Netzwerk (cve-lab-net):

DienstPython-VersionRolleHost-Port
vulnerable-api3.11.3Ziel-API mit naivem URL-Filter8000
fixed-api3.11.4Gleicher Code, gepatchter Interpreter8000
internal-service3.12Gefälschter interner Metadaten-Endpunktnone
attacker3.12Exploit-Treibernone

internal-service hat keine Host-Port-Zuordnung – es ist nur von innerhalb des Docker-Netzwerks erreichbar und simuliert eine echte Vertrauensgrenze.


Voraussetzungen

  • Docker Desktop (oder Docker Engine + Compose-Plugin)
  • ~500 MB Festplattenspeicher für Images

Schnellstart

git clone <repo-url>
cd CVE-2023-24329-lab

Durchlauf 1 – Basislinie: Filter sollte halten

docker compose -f docker-compose.vulnerable.yml up --build -d
docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py baseline

Durchlauf 1 – Basislinienfilter hält

Durchlauf 2 – Exploit: Filter umgehen

docker compose -f docker-compose.vulnerable.yml exec attacker python exploit.py exploit

Durchlauf 2 – Umgehung erfolgreich, /etc/passwd und internes Geheimnis offengelegt

Durchlauf 3 – Patch: Gleiche Nutzlast, gepatchtes Python

docker compose -f docker-compose.vulnerable.yml down
docker compose -f docker-compose.fixed.yml up --build -d
docker compose -f docker-compose.fixed.yml exec attacker python exploit.py verify

Durchlauf 3 – Patch hält auf Python 3.11.4

Herunterfahren

docker compose -f docker-compose.fixed.yml down

Verzeichnisstruktur

CVE-2023-24329-lab/
├── docker-compose.vulnerable.yml   # Python 3.11.3 (betroffen)
├── docker-compose.fixed.yml        # Python 3.11.4 (gepatcht)
├── vulnerable-api/
│   ├── app.py                      # Flask-API mit dem naiven Filter
│   ├── requirements.txt
│   └── Dockerfile
├── internal-service/
│   ├── app.py                      # Gefälschter interner Metadaten-Endpunkt
│   ├── requirements.txt
│   └── Dockerfile
└── attacker/
    ├── exploit.py                  # Demo-Treiber (baseline / exploit / verify)
    ├── requirements.txt
    └── Dockerfile

Die anfälligen und gepatchten API-Dienste teilen sich den gleichen Quellcode – nur die Basis-Image-Python-Version unterscheidet sich. Dies ist die wichtigste wissenschaftliche Kontrolleigenschaft des Labors.


Wie der Umgehungsangriff funktioniert

Der anfällige API-Filter (vereinfacht):

parsed = urllib.parse.urlparse(url)

if parsed.scheme.lower() in {"file", "gopher", "ftp", "data"}:
    return 403  # blockiert

if parsed.hostname in {"localhost", "127.0.0.1", "internal-service"}:
    return 403  # blockiert

urllib.request.urlopen(url)  # ruft die ursprüngliche, unveränderte Zeichenkette ab

Die Umgehungsnutzlast ist ein einziges führendes Leerzeichen:

 file:///etc/passwd
^
Leerzeichen (0x20)

Auf Python ≤ 3.11.3 sieht urlparse ein leeres Schema und keinen Hostnamen → Filter besteht. urlopen entfernt das Leerzeichen → ruft file:///etc/passwd ab.

Auf Python ≥ 3.11.4 entfernt urlparse zuerst das Leerzeichen → erkennt korrekt scheme=file → Filter blockiert mit 403.


Der Fix (Was das gepatchte Python tut)

CPython Issue #102153 – der Fix entfernt C0-Steuerzeichen und Leerzeichen vom Anfang der URL vor dem Parsen. Nach dem Patch stimmen Parser und Abrufer darin überein, was die URL ist, sodass der Filter auf diese Weise nicht umgangen werden kann.

Das korrekte defensive Muster unabhängig von der Python-Version:

# Parsen → aus Teilen neu aufbauen → die neu aufgebaute URL an nachgelagerte Stellen übergeben.
# Sowohl der Filter als auch der Abrufer arbeiten dann mit derselben Zeichenkette.
parsed = urllib.parse.urlparse(url)
safe_url = parsed.geturl()  # aus Komponenten neu aufgebaut
urllib.request.urlopen(safe_url)

Wichtige Lernpunkte

  1. Parser-Differentiale sind eine Schwachstellenklasse, kein einmaliger Fehler. Derselbe Gedanke treibt HTTP-Request-Smuggling, SAML-Confusion-Angriffe und die ${jndi:...}-Umgehungen von log4j an.
  2. Blocklisten versagen, wenn der Parser Sie anlügt. Das Aufzählen von schlechten Eingaben ist ein verlorenes Spiel.
  3. Validieren Sie die rekonstruierte URL, nicht die rohe Eingabezeichenkette.
  4. Eine Nebenversion, ein winziger Patch, massive Konsequenz. Der CPython-Fix besteht aus einer Handvoll Zeilen.

Referenzen

  • NVD: CVE-2023-24329
  • CPython Issue: github.com/python/cpython/issues/102153
  • Ursprüngliche Offenlegung: Yebo Cao – suchen Sie "CVE-2023-24329 Yebo Cao"
  • Breitere Klasse: PortSwigger – SSRF-Filterumgehungstechniken
  • Breitere Klasse: James Kettle – HTTP-Desync-Angriffe

Schutzmaßnahmen

  • Setzen Sie nie die Ports von internal-service für den Host frei.
  • Führen Sie dieses Labor nie auf einem Rechner aus, der mit einem Produktionsnetzwerk verbunden ist.
  • Der Filtercode in vulnerable-api/app.py ist absichtlich zu Lehrzwecken defekt – kopieren Sie ihn nicht in ein echtes System.

Lizenz

Tool herunterladen