
Exploit di esecuzione di codice in remoto pre-autenticazione per Oracle WebLogic ADF Faces (CVE-2022-21445, CVSS 9.8). Include istruzioni dettagliate per la configurazione dell'ambiente, la generazione del payload e il debug remoto per test di penetrazione.
CVE-2022-21445 (punteggio CVSS 9,8), una vulnerabilità di deserializzazione di dati non affidabili, identificata nel componente ADF Faces, può essere sfruttata da remoto da un utente malintenzionato senza autenticazione (pre-authentication) per eseguire RCE.
La vulnerabilità è stata scoperta da due esperti di sicurezza informatica, PeterJson di VNG Corporation e Nguyen Jang di VNPT. Successivamente Oracle ha ricevuto il rapporto nell'ottobre 2021 e ha impiegato ben 6 mesi, cioè fino all'aprile 2022, per rilasciare una patch.
In questo articolo, lo sfruttamento si concentra su Oracle Business Intelligence versione 12.2.1.4.0
Requisiti: Installare Windows 10+ Pro o Windows Home (x64) con licenza attiva o utilizzare Windows Server (si consiglia di utilizzare prodotti Oracle)
Passo 1: Installare Java, versione jdk 8u112 o superiore (8Ux), link di download: JDKv8U112

Passo 2: Installare Oracle Database 19c, link di download:
Preparare una cartella per l'installazione del database, creare un percorso come quello sottostante ed estrarre il file zip del database appena scaricato in C:\app\oracle\product\19c\db_home1
Eseguire il file setup.application con privilegi di amministratore

Seguire passo passo come indicato in Guida all'installazione del DB
Prestare molta attenzione:
Al passo 8/17, ricordarsi di selezionare Create as Container database per aprire un database plugegabile necessario per il processo di installazione di Fusion Middleware imminente

Al passo 9/17, scegliere il carattere Unicode (AL32UTF8)



Passo 3: Installare SQL Developer, versione no-jre, link di download: SQLDev-NoJRE

Eseguire il file sqldeveloper.application con privilegi di amministratore

Impostare i parametri per una nuova connessione come nell'immagine sottostante, notare di modificare Username e Password (come nell'esempio sopra hr), Hostname (default localhost), Port (default 1521), SID (è il nome del database globale installato al passo 2)

Se cliccando su Test viene visualizzato Success, la connessione è riuscita, cliccare su Connect
Passo 4: Installare Fusion Middleware Infrastructure (FMW) versione 12.2.1.3.0, link di download FMW_ver_12.2.1.3.0

Passo 5: Installare Oracle Business Intelligence (OBIEE) versione 12.2.1.4.0, link di download: OBIEE_ver_12.2.1.4.0
Eseguire il file setup_bi_platform-12.2.1.4.0_win64.exe con privilegi di amministratore

Installare passo passo secondo Guida all'installazione di OBIEE
Nota: Il percorso di BI deve essere uguale al percorso di installazione di FWM, qui è Oracle/Middleware/Oracle_Home

Passo 6: Impostare lo schema BI utilizzando l'utility Repository Creation Utility (RCU)
Al percorso C:\Oracle\Middleware\Oracle_Home\oracle_common\bin, eseguire il file rcu.bat con privilegi di amministratore
Seguire i passaggi indicati




Passo 7: Impostare le variabili d'ambiente per OBIEE

Passo 8: Creare il dominio BI





Al passo 4, il sistema segnala fail to logon: controllare se la password del dominio è corretta
Al passo 8, se il sistema segnala un errore come nell'immagine sottostante, verificare se la licenza di Windows è attiva e se Windows soddisfa i requisiti descritti.
![]()
Passo 9: Dopo la configurazione, accedere al dominio BI appena creato al percorso $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao
Copiare tutti i file jar qui presenti in una cartella separata, condividerla con la macchina attaccante (nell'ambiente lab si fa così, nell'attacco reale anche la macchina attaccante deve installare come la macchina target per ottenere il codice sorgente)
Aggiungere anche la libreria coherence.jar al percorso $Oracle_Home\coherence\lib in questa cartella.
Questa è una cartella importante che determina il successo del payload perché ogni versione di FMW o BI o l'ambiente di ogni macchina installata è spesso diverso, quindi è necessario avere la versione esatta per ridurre i rischi o le eccezioni durante la trasmissione del payload.
Passo 10 (da eseguire solo se è necessario il debug remoto, ribadiamo: se si testa in un ambiente reale, poiché non è possibile configurare la macchina della vittima a piacere, l'attaccante deve eseguire anche la configurazione della macchina target sulla propria macchina per poter eseguire il debug remoto e controllare gli errori)
Installare mozilla, aggiungere il proxy Burp sulla porta 8181
Attivare Remote Debug sul lato server BI
Accedere a localhost:9500/console
In Domain Structure -> selezionare bi -> Environment -> Servers

Verranno visualizzati due server: AdminServer di weblogic e bi_server1 di BI

Selezionare Lock & Edit nell'angolo in alto a sinistra, selezionare bi_server1 per modificare la configurazione. Qui, selezionare Configuration -> Server start -> Scorrere fino in fondo, selezionare Advance (se presente) -> Selezionare per inserire Arguments -> Inserire i parametri di debug:
-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
(si può provare con 0.0.0.0:5005 se in seguito non si riesce a riavviare bi_server1)
Inserire la password di weblogic (impostata in precedenza nella sezione Config BI Domain)-> Applica le modifiche e riavvia
Avviare il terminale come Amministratore -> Navigare al percorso $Oracle_Home\user_projects\domains\bi\bitools\bin eseguire ./stop.cmd e ./start.cmd per riavviare bi_server1; durante il riavvio, se non si verificano errori, il debug è stato attivato e ascolta sulla porta 5005 come sopra. Se si verificano errori, controllare i parametri di debug per spazi extra o errori nella parte address.
Passo 1: Scaricare IntelliJ IDEA Ultimate, attivarlo con un codice trovato su github.
Passo 2 (Eseguire questo passaggio solo se durante l'attacco si verifica un errore come 500 Server Error, ... , ciò è dovuto a un'eccezione nel payload)
Modificare la versione jdk – sdk del progetto in modo che corrisponda a quella della macchina target (installazione come in Parte macchina target - Passo 1)
Creare un progetto vuoto per analizzare il codice sorgente, per il debug remoto, 3. Aggiungere tutti i file jar ricevuti dalla cartella della macchina target a questo progetto
Project Structure -> Modules -> Selezionare il segno + -> 1 JARS or Directories -> Aggiungere l'intera cartella jar.


Impostare Remote Debug
Run -> Edit Configurations -> + -> Remote JVM Debug

Eseguire Remote Debug, se nella console viene visualizzato: Connected … allora è riuscito.

Passo 3:
Clonare il codice da questo repository sulla propria macchina, eliminare il vecchio file coherence.jar nella cartella lib e sostituirlo con il file ricevuto dalla macchina target al passo precedente.
Successivamente, aggiungerlo a un progetto eseguito con IntelliJ, aggiungere i file jar in lib con l'opzione Add as library
Controllare che il nome della classe LambdaIdentity$.... corrisponda alla versione di Weblogic, se ci sono modifiche, rifattorizzare il file e modificare il nome del file.
Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A
Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF
Modificare il percorso per il file LambdaIdentity$....class nel file Main.java. Per ottenere il percorso esatto, ci sono due modi: eseguire javac sul file jar per generare il file .class; un altro approccio è commentare il codice della funzione main, quindi eseguire il progetto normalmente, il percorso del file class può essere trovato nella cartella target.
Controllare che jdk e sdk del progetto corrispondano a quelli della macchina target.
Vediamo il file web.xml, questo file descrive le relazioni di mapping relative a servlet-mapping. "resources" è il servlet relativo alle risorse di sistema, contiene dati e informazioni importanti, pertanto è spesso preso di mira dagli attaccanti.






Analisi della funzione findResource() in RemoteApplicationResourceLoader.class

Questa funzione restituisce un metodo che contiene un protocollo personalizzato RAStreamHandler(). RAStreamHandler crea un oggetto URLConnection con valore new RAURLConnection

La funzione RAURLConnection chiama la funzione _getPathBean

La funzione _getPathBean contiene un oggetto bean creato tramite la chiamata alla funzione getInstanceFromString() che elabora la stringa in input per ottenere le chiavi corrispondenti (filtro).

La stringa bean in input viene convertita tramite la classe SerializationUtils dalla forma URL encoded in un oggetto URLEncoderPathBean. Se tutto procede correttamente, l'input successivo viene passato alla funzione fromURLEncodeString().


Se la stringa in input incontra un errore, viene lanciata un'eccezione. L'eccezione proviene principalmente dalla libreria utilizzata nel payload, a causa di versioni non corrispondenti o di un percorso errato per il file Lambda.
Nella funzione fromURLEncodedString(), viene restituita una funzione fromString con parametro url, e il suo codice è il seguente:

Nella funzione fromString i dati vengono readObject() e restituiti. Si può notare che l'input non viene filtrato. Passa attraverso diverse funzioni e alla fine viene deserializzato in fromString(). Questo è il sink per lo sfruttamento. Ora che abbiamo il sink, dobbiamo trovare la source.
Pertanto, per chiamare la classe sopra menzionata, abbiamo bisogno di una regex del tipo “/.*/remote/(.*)”. Di conseguenza, quando il router o il percorso di input ha la forma /em/afr/foo/remote/payload, soddisfa la struttura definita in questo file, quindi RemoteApplicationResourceLoader verrà utilizzato come loader in doGet, e il relativo file di classe oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader chiamerà il metodo findResource() che è stato sovrascritto. Pertanto, se il payload viene inviato all'indirizzo corretto, i dati verranno trasmessi facilmente senza essere bloccati dal filtro.
Questo è l'URL finale utilizzato per lo sfruttamento: __hostname:port/contextApp/afr/foo/remote/payload/__
Dove contextApp è uno dei percorsi che OBIEE ha subito dopo l'installazione, come /em; /bicomposer; ….
Foo è una stringa qualsiasi
Payload è la stringa generata quando viene eseguita la funzione Main del progetto di attacco preparato.
### Analisi del codice utilizzato per creare il payload
Questo progetto segue la gadget chain della CVE-2020-14644

La classe LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A, che estende AbstractRemotable, viene utilizzata per interagire con il sistema remoto.
Utilizzando l'API Java Reflection, un attaccante può facilmente ottenere WorkAdapter dal thread di esecuzione corrente.
Successivamente, recupera il campo connectionHandler di WorkAdapter ed esegue una query per ottenere ServletRequest e ServletResponse da connectionHandler.
Successivamente, recupera il valore dell'intestazione "cmd" dalla richiesta (ServletRequest), quindi controlla se "cmd" non è vuoto, esegue un comando shell corrispondente al sistema operativo in esecuzione (Windows o Linux/Unix).
Legge l'output dal comando shell e invia tale risultato nella risposta (ServletResponse).
Se si verifica un errore durante l'esecuzione, verrà stampato sulla console tramite il metodo printStackTrace().
L'ID dopo il nome della classe LamdaIdentity dipende dalla versione del server Weblogic; è una stringa codificata in base al valore hash MD5 della classe com.tangosol.internal.util.invoke.ClassIdentity, e poiché questa classe varia tra le versioni, come già detto, per evitare errori nel payload è necessario verificare attentamente questo aspetto.
Qui, una variabile cmd viene prelevata dall'header della richiesta in input, quindi viene aggiunta al comando Runtime.getRumtime.exec() sottostante, codificata e decodificata in formato esadecimale md5, e dopo essere stata trasmessa al sistema OBIEE restituirà il valore deserializzato.
Infine, nella funzione Main, viene creato un oggetto RemoteConstructor, che viene convertito in una stringa URL encoded tramite la libreria SerializationUtils. Questa stringa viene passata direttamente nell'URL di origine, dando agli attaccanti l'opportunità di inserire un comando __cmd__ arbitrario.

## Riproduzione dello sfruttamento


## Riferimenti
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
## Autore della vulnerabilità: Jang Nguyen & Duc PeterJson