
Pre-Authentication-Remote-Codeausführungs-Exploit für Oracle WebLogic ADF Faces (CVE-2022-21445, CVSS 9.8). Enthält detaillierte Umgebungseinrichtung, Payload-Erzeugung und Remote-Debugging-Anweisungen für Penetrationstests.
CVE-2022-21445 (CVSS-Score 9,8), die Schwachstelle ist eine nicht vertrauenswürdige Datendeserialisierung, die im ADF-Faces-Komponenten identifiziert wurde und von Angreifern aus der Ferne ohne Authentifizierung (Pre-Authentication) ausgenutzt werden kann, um RCE zu erreichen.
Die Schwachstelle wurde von zwei Cybersicherheitsexperten entdeckt: PeterJson von der VNG Corporation und Nguyen Jang von VNPT. Oracle erhielt diesen Bericht im Oktober 2021 und benötigte 6 Monate, also bis April 2022, um einen Patch zu veröffentlichen.
In diesem Artikel konzentriert sich die Ausnutzung auf Oracle Business Intelligence Version 12.2.1.4.0
Voraussetzung: Installieren Sie Windows 10+ Pro oder Windows Home (x64) mit aktivierter Lizenz oder verwenden Sie Windows Server (bevorzugt von Oracle)
Schritt 1: Installieren Sie Java, Version jdk 8u112 oder höher (8Ux), Download-Link: JDKv8U112

Schritt 2: Installieren Sie Oracle Database 19c, Download-Link:
Bereiten Sie einen Ordner für die Datenbankinstallation vor, erstellen Sie einen Pfad wie unten und entpacken Sie die heruntergeladene Datenbank-Zip-Datei in C:\app\oracle\product\19c\db_home1
Führen Sie die Datei setup.application als Administrator aus

Führen Sie die Schritte nacheinander gemäß der Anleitung unter Anleitung zur DB-Installation durch
Wichtiger Hinweis:
Achten Sie bei Schritt 8/17 darauf, Create as Container database zu aktivieren, um eine pluggable DB für den bevorstehenden Fusion Middleware-Installationsprozess zu öffnen

Wählen Sie bei Schritt 9/17 als Zeichensatz Unicode (AL32UTF8)



Schritt 3: Installieren Sie SQL Developer, Version no-jre, Download-Link: SQLDev-NoJRE

Führen Sie die Datei sqldeveloper.application als Administrator aus

Richten Sie die Parameter für eine neue Verbindung wie im folgenden Bild ein. Achten Sie darauf, Benutzername und Passwort (wie im obigen Beispiel hr), Hostname (standardmäßig localhost), Port (standardmäßig 1521) und SID (der globalen Datenbankname aus Schritt 2) zu ändern.

Wenn bei der Auswahl von Test die Meldung Success erscheint, ist die Verbindung erfolgreich. Wählen Sie Connect.
Schritt 4: Installieren Sie Fusion Middleware Infrastructure (FMW) Version 12.2.1.3.0, Download-Link: FMW_ver_12.2.1.3.0

Schritt 5: Installieren Sie Oracle Business Intelligence (OBIEE) Version 12.2.1.4.0, Download-Link: OBIEE_ver_12.2.1.4.0
Führen Sie die Datei setup_bi_platform-12.2.1.4.0_win64.exe als Administrator aus

Installieren Sie Schritt für Schritt gemäß Anleitung zur OBIEE-Installation
Hinweis: Der BI-Pfad muss mit dem bereits installierten FMW-Pfad übereinstimmen, hier also Oracle/Middleware/Oracle_Home

Schritt 6: Richten Sie das BI-Schema mit dem Repository Creation Utility (RCU) ein
Führen Sie im Pfad C:\Oracle\Middleware\Oracle_Home\oracle_common\bin die Datei rcu.bat als Administrator aus
Führen Sie die folgenden Schritte nacheinander durch:




Schritt 7: Richten Sie die Umgebungsvariablen für OBIEE ein

Schritt 8: Erstellen Sie die BI-Domain





Wenn in Schritt 4 das System "fail to logon" meldet, überprüfen Sie das Passwort der Domain auf Richtigkeit
Wenn in Schritt 8 ein Fehler wie im folgenden Bild auftritt, überprüfen Sie, ob Ihre Windows-Lizenz aktiviert ist und ob Ihr Windows die beschriebenen Voraussetzungen erfüllt.
![]()
Schritt 9: Nach Abschluss des Setups greifen Sie auf die neu erstellte BI-Domain unter dem Pfad $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao zu
Kopieren Sie alle jar-Dateien von hier in einen separaten Ordner und teilen Sie diesen mit der Angriffsmaschine (im Labor-Setup so vorgehen, bei einem echten Angriff muss auf der Angriffsmaschine ebenfalls eine Installation wie auf der Zielmaschine erfolgen, um den Quellcode zu erhalten)
Fügen Sie zusätzlich die Bibliothek coherence.jar aus dem Pfad $Oracle_Home\coherence\lib zu diesem Ordner hinzu.
Dieser Ordner ist entscheidend für den Erfolg des Payloads, da sich die Versionen von FMW oder BI sowie die Umgebung jeder Maschine unterscheiden können. Daher ist die genaue Version wichtig, um Risiken oder während der Payload-Übertragung auftretende Ausnahmen zu vermeiden.
Schritt 10 (nur durchführen, wenn Remote-Debugging erforderlich ist; noch einmal: Bei Tests in der realen Umgebung kann die Opfermaschine nicht nach Belieben eingerichtet werden, daher muss der Angreifer auch auf seiner Maschine die Zielmaschine einrichten, um per Remote-Debugging Fehler überprüfen zu können)
Installieren Sie Mozilla, fügen Sie Burp-Proxy mit Port 8181 hinzu
Aktivieren Sie Remote Debug auf dem BI-Server
Greifen Sie auf localhost:9500/console zu
Unter Domain Structure -> wählen Sie bi -> Environment -> Servers

Es werden zwei Server angezeigt: AdminServer von WebLogic und bi_server1 von BI

Wählen Sie Lock & Edit in der linken unteren Ecke, aktivieren Sie bi_server1, um die Konfiguration zu bearbeiten. Klicken Sie dann auf Configuration -> Server start -> Scrollen Sie nach unten, wählen Sie Advance (falls vorhanden) -> Wählen Sie "In Arguments eingeben" -> Geben Sie den Debug-Parameter ein:
-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
(Sie können es auch mit 0.0.0.0:5005 versuchen, falls später ein Fehler beim Neustart von bi_server1 auftritt)
Geben Sie das WebLogic-Passwort ein (das bei der BI-Domain-Konfiguration festgelegt wurde) -> Apply change & Restart
Öffnen Sie ein Terminal als Administrator -> Navigieren Sie zum Pfad $Oracle_Home\user_projects\domains\bi\bitools\bin und führen Sie ./stop.cmd und ./start.cmd aus, um bi_server1 neu zu starten. Wenn während des Neustarts kein Fehler auftritt, wurde das Debugging geöffnet und hört wie oben auf Port 5005. Tritt ein Fehler auf, überprüfen Sie die Debug-Parameter auf zusätzliche Leerzeichen oder Fehler im Adressteil.
Schritt 1: Laden Sie IntelliJ IDEA Ultimate herunter und aktivieren Sie es mit einem auf GitHub gefundenen Code.
Schritt 2 (Nur durchführen, wenn während des Angriffs ein Fehler wie 500 Server Error, ... auftritt; dies liegt an einer Ausnahme im Payload)
Passen Sie die jdk-/sdk-Version des Projekts an die der Zielmaschine an (Installation wie unter Zielseite - Schritt 1)
Erstellen Sie ein leeres Projekt zur Quellcode-Analyse für das Remote-Debugging. Fügen Sie alle jar-Dateien aus dem von der Zielmaschine erhaltenen Ordner zu diesem Projekt hinzu.
Project Structure -> Modules -> Klicken Sie auf + -> 1 JARS or Directories -> Fügen Sie den gesamten jar-Ordner hinzu.


Richten Sie das Remote-Debugging ein
Run -> Edit Configurations -> + -> Remote JVM Debug

Führen Sie das Remote-Debugging aus. Wenn in der Konsole "Connected ..." erscheint, war es erfolgreich.

Schritt 3:
Klonen Sie den Code aus diesem Repository auf Ihren Rechner, löschen Sie die alte coherence.jar im lib-Ordner und ersetzen Sie sie durch die Datei, die Sie im vorherigen Schritt von der Zielmaschine erhalten haben.
Fügen Sie anschließend ein Projekt hinzu, das mit IntelliJ ausgeführt wird, fügen Sie die jar-Dateien im lib mit der Option Add as library hinzu.
Überprüfen Sie den Namen der Klasse LambdaIdentity$.... auf die richtige Weblogic-Version. Wenn sich dieser geändert hat, refaktorieren Sie die Datei und passen Sie den Namen an.
Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A
Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF
Ändern Sie den Pfad zur Datei LambdaIdentity$....class in der Datei Main.java. Um den genauen Pfad zu erhalten, gibt es zwei Möglichkeiten: Führen Sie javac auf die jar-Datei aus, um .class-Dateien zu generieren; eine andere Möglichkeit besteht darin, den Code der main-Funktion auszukommentieren, dann das Projekt normal auszuführen; der Klassenpfad ist im Verzeichnis target zu finden.
Überprüfen Sie, ob jdk und sdk des Projekts mit denen der Zielmaschine übereinstimmen.
Wir sehen die Datei web.xml, die die Mapping-Beziehungen im Zusammenhang mit servlet-mapping beschreibt. "resources" ist ein Servlet, das mit Systemressourcen zusammenhängt und wichtige Daten und Informationen enthält, daher ist dies eine Stelle, die häufig von Angreifern anvisiert wird.






Analyse der Funktion findResource() in RemoteApplicationResourceLoader.class

Diese Funktion gibt eine Methode zurück, die ein benutzerdefiniertes Protokoll RAStreamHandler() enthält. RAStreamHandler erstellt ein URLConnection-Objekt mit dem Wert new RAURLConnection

Die Funktion RAURLConnection ruft die Funktion _getPathBean auf

Die Funktion _getPathBean enthält ein Bean-Objekt, das durch den Aufruf der Funktion getInstanceFromString() erstellt wird, die die eingehende Zeichenfolge verarbeitet, um die entsprechenden Schlüssel (Filter) zu extrahieren.

Die eingehende Bean-Zeichenfolge wird über die Klasse SerializationUtils von einer URL-kodierten Form in ein URLEncoderPathBean-Objekt umgewandelt. Wenn alles in Ordnung ist, wird die Eingabe weiter an die Funktion fromURLEncodeString() übergeben.


Falls die Eingabezeichenfolge auf einen Fehler stößt, wird eine Ausnahme ausgelöst. Die Ausnahme stammt hauptsächlich aus der im Payload verwendeten Bibliothek, aufgrund von Versionsunterschieden oder eines falschen Pfads zur Lambda-Datei.
In der Funktion fromURLEncodedString() wird eine Funktion fromString mit dem Parameter url zurückgegeben, deren Code wie folgt aussieht:

In der Funktion fromString werden Daten mit readObject() gelesen und zurückgegeben. Man sieht, dass die Eingabe von Anfang an nicht gefiltert wird, durch mehrere Funktionen läuft und schließlich in fromString() deserialisiert wird. Dies ist die Senke für die Ausnutzung. Nachdem die Senke gefunden ist, muss nun die Quelle gefunden werden.
Daher benötigen wir einen Regex der Form „/.*/remote/(.*)“, um auf die oben genannte Klasse zuzugreifen. Wenn also der Router oder der eingehende Pfad die Form /em/afr/foo/remote/payload hat, erfüllt er die in dieser Datei festgelegte Struktur, und RemoteApplicationResourceLoader wird als Loader in doGet verwendet, und die entsprechende Klasse oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader ruft die darin überschriebene Funktion findResource() auf. Wenn die Nutzlast also an die richtige Adresse gesendet wird, werden die Daten problemlos übertragen, ohne auf einen Filter zu stoßen.
Dies ist die endgültige URL für die Ausnutzung:
__hostname:port/contextApp/afr/remote/payload/__
Wobei contextApp einer der Pfade ist, die bei einer frischen OBIEE-Installation vorhanden sind, wie z. B. /em; /bicomposer; …
Foo ist eine beliebige Zeichenfolge
Payload ist die Zeichenfolge, die beim Ausführen der Main-Funktion des vorbereiteten Angriffsprojekts generiert wird.
### Analyse des zur Erstellung der Nutzlast verwendeten Codes
Dieses Projekt folgt der Gadget-Chain von CVE-2020-14644

Die Klasse LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A, die von AbstractRemotable erbt, wird für die Interaktion mit dem entfernten System verwendet.
Durch die Verwendung der Java Reflection API kann ein Angreifer problemlos den WorkAdapter aus dem aktuellen Ausführungsthread abrufen.
Anschließend wird das Feld connectionHandler des WorkAdapter abgerufen und eine Abfrage durchgeführt, um ServletRequest und ServletResponse aus dem connectionHandler zu erhalten.
Als nächstes wird der Wert des Headers „cmd“ aus der Anfrage (ServletRequest) abgerufen. Wenn „cmd“ nicht leer ist, wird ein Shell-Befehl ausgeführt, der dem aktuell laufenden Betriebssystem (Windows oder Linux/Unix) entspricht.
Das Ergebnis des Shell-Befehls wird gelesen und als Antwort (ServletResponse) zurückgesendet.
Wenn während der Ausführung Fehler auftreten, werden diese über die Methode printStackTrace() auf der Konsole ausgegeben.
Die ID hinter dem Klassennamen LambdaIdentity hängt von der Version des WebLogic-Servers ab; sie ist eine Zeichenfolge, die aus dem MD5-Hashwert der Klasse com.tangosol.internal.util.invoke.ClassIdentity kodiert wird. Da diese Klasse in jeder Version unterschiedlich ist, muss, wie bereits erwähnt, sorgfältig geprüft werden, dass die Nutzlast nicht fehlschlägt.
Hier wird eine Variable cmd aus dem Header der eingehenden Anfrage extrahiert und dann dem Befehl Runtime.getRumtime.exec() unten hinzugefügt. Sie wird im Hex-MD5-Format kodiert und dekodiert. Nach der Übertragung an das OBIEE-System wird der deserialisierte Wert zurückgegeben.
Schließlich wird in der Main-Funktion ein RemoteConstructor-Objekt erstellt, das mithilfe der Bibliothek SerializationUtils in eine URL-kodierte Zeichenfolge umgewandelt wird. Diese Zeichenfolge wird direkt in die URL-Quelle eingefügt, was Angreifern die Möglichkeit gibt, beliebige __cmd__-Befehle einzuschleusen.

## Nachstellung des Exploits


## Referenzen
1. https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2
2. https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316
## Autor der Schwachstelle: Jang Nguyen & Duc PeterJson