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-2026-43512-poc — Ausnutzbarkeits-PoC für CVE-2026-43512 (Apache Tomcat Digest-Authentifizierungs-Bypass) | Kitploit
Tools/GitHubGitHub/covepseng/cve-2026-43512-poc
SchwachstellenanalyseExploitationWebsicherheitPenetrationstestsAuthentifizierungPapers & ForschungLernen & Bildung
GitHubcovepseng/cve-2026-43512-poc

cve-2026-43512-poc

Ausnutzbarkeits-PoC für CVE-2026-43512 (Apache Tomcat Digest-Authentifizierungs-Bypass)

Repository anzeigen
217vor 3 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-2026-43512 — Apache Tomcat DIGEST-Authentifizierungsumgehung

Ergebnis der Exploitability-Analyse: Die Ursache wurde bestätigt. Eine End-to-End-Ausnutzung ist nicht reproduzierbar gegen eine standardmäßige UserDatabaseRealm-Bereitstellung. Siehe Analyse für Details.


Inhaltsverzeichnis

  • Übersicht
  • Betroffene Versionen
  • Ursache
  • Analyse
  • Repository-Struktur
  • Anforderungen
  • Verwendung
  • Erwartete Ausgabe
  • Referenzen
  • Haftungsausschluss

Übersicht

CVE-2026-43512 ist eine Schwachstelle im HTTP-DIGEST-Authentifizierungsmechanismus von Apache Tomcat. Die Methode RealmBase.getDigest() validiert den Rückgabewert von getPassword(username) nicht, bevor sie den A1-Hash-Eingabe konstruiert. Wenn ein Benutzername in der konfigurierten Realm nicht existiert, gibt getPassword() null zurück, was der Java-String-Konkatenationsoperator stillschweigend in das vier Zeichen lange Literal "null" umwandelt.

Der Server berechnet daher:

A1 = MD5("<username>:<realm>:null")

Ein Client, der eine DIGEST-Antwort übermittelt, die mit dem Literal "null" als Passwort berechnet wurde, erzeugt einen identischen Hash. Laut dem Advisory stellt dies eine Authentifizierungsumgehung dar.

Dieses Repository enthält eine minimale reproduzierbare Umgebung und einen auf Go basierenden Proof of Concept, um diese Behauptung gegen eine echte Tomcat-Instanz zu überprüfen.


Betroffene Versionen

Betroffener BereichBehoben in
7.0.0 – 7.0.1097.0.110
8.5.0 – 8.5.1008.5.101
9.0.0.M1 – 9.0.1179.0.118
10.1.0.M1 – 10.1.5410.1.55
11.0.0.M1 – 11.0.2111.0.22

Ursache

Der anfällige Codepfad in RealmBase.java (alle betroffenen Branches):

// RealmBase.java — vulnerable
protected String getDigest(String username, String realmName, String algorithm) {
    if (hasMessageDigest(algorithm)) {
        return getPassword(username);  // returns null for unknown users
    }

    // null is concatenated as the literal "null" by Java
    String a1 = username + ":" + realmName + ":" + getPassword(username);
    return HexUtils.toHexString(
        ConcurrentMessageDigest.digest(algorithm, a1.getBytes(...))
    );
}

Der Fix (Commit 6565a6c fügt eine explizite Null-Überprüfung hinzu:

// RealmBase.java — patched
protected String getDigest(String username, String realmName, String algorithm) {
    String password = getPassword(username);
    if (password == null) {
        return null; 
    }
    ...
}

Analyse

Das Ausführen des PoC gegen Tomcat 11.0.0-M1 mit aktiviertem FINE-Logging zeigt Folgendes:

Digest:        2388e2c78407def640f37f092a8d3a84   ← client
Server digest: 2388e2c78407def640f37f092a8d3a84   ← server
Failed to authenticate user [ghost]

Die Digest-Hashes stimmen überein. Der Fehler in getDigest() ist real und bestätigt. Allerdings schlägt die Authentifizierung dennoch fehl, weil RealmBase.authenticate() eine zweite, unabhängige Prüfung durchführt:

// RealmBase.authenticate()
if (serverDigest.equals(clientDigest)) {
    return getPrincipal(username);  // returns null for non-existent users
}
return null;

In einer standardmäßigen UserDatabaseRealm, die auf tomcat-users.xml basiert, führt getPrincipal() eine Suche in der In-Memory-Benutzerdatenbank durch. Für einen Benutzernamen, der in dieser Datenbank nicht existiert, gibt es null zurück. Der Aufrufer behandelt einen null-Principal als Authentifizierungsfehler und sendet einen 401.


Repository-Struktur

cve-2026-43512-poc/
├── Dockerfile                          # Tomcat 11.0.0-M1 (betroffene Version)
├── tomcat-users.xml                    # Minimale Realm-Konfiguration – kein Benutzer "ghost"
├── web.xml
├── exploit/
│   ├── exploit.go                      # PoC – Go, nur stdlib
│   └── go.mod
└── README.md

Anforderungen

ToolVersionHinweise
Podman≥ 4.0Docker funktioniert auch
Go≥ 1.22Nur zum lokalen Ausführen des Exploits

Verwendung

1. Container bauen und starten

podman build -t tomcat-cve-2026-43512 .
podman run -d --name tomcat-vuln -p 8080:8080 tomcat-cve-2026-43512

Einige Sekunden warten, bis Tomcat vollständig gestartet ist, dann überprüfen, ob es läuft:

curl -si http://localhost:8080/protected/secret.html | head -1
# Erwartet: HTTP/1.1 401

2. Exploit ausführen

cd exploit
go run exploit.go \
  -target   http://localhost:8080 \
  -path     /protected/secret.html \
  -username ghost

Verfügbare Flags:

FlagStandardBeschreibung
-targethttp://localhost:8080Tomcat-Basis-URL
-path/protected/Pfad der geschützten Ressource
-usernameghostZu verwendender Benutzername – darf nicht in tomcat-users.xml existieren

3. Ausführliches Tomcat-Logging aktivieren (optional)

Um den internen Authentifizierungsstatus zu beobachten, eine logging.properties-Datei hinzufügen und einbinden:

org.apache.catalina.authenticator.level = FINE
org.apache.catalina.realm.level = FINE
podman run -d --name tomcat-vuln -p 8080:8080 \
  -v ./logging.properties:/usr/local/tomcat/conf/logging.properties:ro \
  tomcat-cve-2026-43512

Das Log zeigt direkt das Ergebnis des Digest-Vergleichs und bestätigt, ob die Hashes übereinstimmen.

4. Aufräumen

podman stop tomcat-vuln && podman rm tomcat-vuln

Erwartete Ausgabe

============================================================
 CVE-2026-43512 — Tomcat DIGEST Auth Bypass PoC
============================================================
 Target   : http://localhost:8080/protected/secret.html
 Username : "ghost"  (must NOT exist in tomcat-users.xml)
 Password : "null"   (literal string)
------------------------------------------------------------
[1] Sending unauthenticated request to obtain DIGEST challenge...
[+] HTTP 401 received — DIGEST challenge:
    Digest realm="UserDatabase", qop="auth", nonce="...", opaque="..."

[*] realm="UserDatabase"  nonce="..."  qop="auth"  algorithm="MD5"

[2] Computing DIGEST response with password="null"...
    Digest username="ghost", realm="UserDatabase", ...

[3] Sending request with crafted DIGEST credentials...
------------------------------------------------------------
[✗] HTTP 401 — exploit failed.
    The UserDatabaseRealm provides a second line of defence:
    getPrincipal("ghost") returned null after the digest matched.
============================================================

Referenzen

Tool herunterladen