Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/hienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic
Analisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebPenetration TestingStrumento di Accesso RemotoSviluppo Payload
GitHubhienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic

CVE-2022-21445-for-12.2.1.3.0-Weblogic

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.

Vedi Repository
53472 anni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Panoramica

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

Analisi - Riproduzione della vulnerabilità

Configurazione dell'ambiente

Lato macchina vittima/target

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

  • Aggiungere JAVA_HOME con il percorso che punta alla directory jdk (non jre) Immagine 1.1: Installazione Java

Passo 2: Installare Oracle Database 19c, link di download:

Oracle 19c
  1. 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

  2. Eseguire il file setup.application con privilegi di amministratore Immagine 2.1: Eseguire setup DB

  3. Seguire passo passo come indicato in Guida all'installazione del DB

  4. 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 Immagine 2.2: Creazione Pluggable Database

Al passo 9/17, scegliere il carattere Unicode (AL32UTF8) Immagine 2.3: Scelta Unicode

  1. Al termine del processo di installazione, controllare attentamente nei Servizi di Windows per assicurarsi che i 4 servizi principali come nell'immagine sottostante siano in stato RUNNING Immagine 2.4: Installazione riuscita

Immagine 2.5: Controllo servizi

  1. Creare un nuovo account oracle database seguendo i passaggi:
  • Terminale Amministratore -> sqlplus / as sysdba
  • Creare utente di sistema system: alter user system identified by system_password account unlock;
  • Verificare l'esistenza dell'utente system: select username from dba_users;
  • Impostare l'ambiente: alter session set “_oracle_script”=true;
  • Creare un utente normale hr: create user hr identified by user_password;
  • Concedere privilegi: grant all privileges to hr;
  • Sbloccare l'account – modificare la password: alter user hr identified by hr_pass account unlock;
  • Creare un nuovo account di sistema: alter user sys identified by sys_pass account unlock;

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

  • Eseguire il file sqldeveloper.application con privilegi di amministratore Immagine 3.2: Avvio SQL Developer

  • 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) Immagine 3.3: Impostazione parametri SQL Developer

  • 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 Immagine 4.1: Download FMW

  • Creare un percorso per la directory di installazione di FMW nel formato C:\Oracle\Middleware\Oracle_Home
  • Seguire i passaggi secondo la guida: Guida all'installazione di FMW

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 Immagine 5.1: Esecuzione file di installazione OBIEE

  • 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 Immagine 5.2: Il percorso di BI deve essere uguale a quello di FWM

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

Immagine 6.1: Create Repository

Immagine 6.2: Database Connection Detail

Immagine 6.3: Select Component

Immagine 6.4: Schema Password

  • Alla fine, cliccare su Create per far creare al sistema lo schema BI

Passo 7: Impostare le variabili d'ambiente per OBIEE

  • Vai su Pannello di controllo > Sistema > Impostazioni di sistema avanzate > Avanzate > Variabili d'ambiente > Nuova variabile di sistema Immagine 7.1: Variabili d'ambiente

Passo 8: Creare il dominio BI

  1. Al percorso C:\Oracle\Middleware\Oracle_Home\bi\bin, eseguire il file config.cmd con privilegi di amministratore

Immagine 8.1: Esecuzione file config

  1. Al passo 1: Selezionare tutti e 3 i componenti, dove Essbase è il server OLAP, Business Intelligence Enterprise Edition è BI Analytics e Business Intelligence Publisher è BI Publisher

Immagine 8.2: Selezione componenti

  1. Al passo 3: Impostare un nuovo dominio come nell'immagine sottostante, !! RICORDARE LA PASSWORD DEL DOMINIO PERCHÉ SARÀ MOLTO DIFFICILE RECUPERARLA. e lasciare il dominio come bi perché è predefinito.

Immagine 8.3: Account dominio

  1. Al passo 4: Aggiornare le informazioni del dominio per il Database

Immagine 8.4: Aggiornamento informazioni

  1. Al passo 8: Se il processo va a buon fine, si avrà un risultato come nell'immagine sottostante

Immagine 8.5: Configurazione riuscita

  1. Se tutto è Done, salvare il file informativo di OBIEE per il passo successivo, accedere all'url aperto:
  • http://localhost:9500/console*
  • http://localhost:9500/em*
  • http://localhost:9502/xmlpserver*
  • http://localhost:9502/analytics*
  1. Alcuni errori possibili
  • 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.

Immagine 8.6: Errore di licenza

  • Errore: BI_HOME_PRODUCT non aggiunto, rivedere Passo 7
  • Aggiornamento errori ...

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

Immagine 10.1: Domain Structure

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

Immagine 10.2: Elenco server visualizzati

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.

Lato macchina attaccante

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)

  1. Modificare la versione jdk – sdk del progetto in modo che corrisponda a quella della macchina target (installazione come in Parte macchina target - Passo 1)

  2. 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.

Immagine 11.1: Aggiunta file jar

Immagine 11.2: Risultato

  1. Impostare Remote Debug

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

Immagine 12.1: Impostazione Remote Debug

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

Immagine 12.2: Esecuzione Remote Debug

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.

Analisi del codice BI e del codice che genera il payload

Analisi del codice BI

  1. Al percorso $Oracle\Middleware\Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\em\fw8wi5\war\WEB-INF

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.

Immagine 13.1: Relazione servlet-mapping

  1. Approfondendo la classe ResourceServlet, in particolare org.apache.myfaces.trinidad.webapp.ResourceServlet, vedremo la funzione doGet che gestisce le richieste get inviate al server.

Immagine 13.2: funzione doGet

  • Qui, tramite il metodo _getResourceLoader(), viene creato un nuovo loader dalla richiesta in input. Contemporaneamente viene inizializzato un resourcePath che riceve il valore di servletPath e servletInfo tramite il metodo getResourcePath con il parametro request. Quel loader chiama la funzione getResource(resourcePath), cercando di caricare la risorsa dalla request in input e di trovarla tramite la funzione org.apache.myfaces.trinidad.resource.ResourceLoader.getResource.findResource(), infine il valore trovato viene passato a un'istanza url della classe URL.class.

Immagine 13.3: funzione getResource

  • _getResourceLoader mantiene una ConcurrentMap per memorizzare la relazione di mapping tra servletPath e loaders. Questa relazione è definita chiaramente in oracle.adfinternal.view.resource.rich.RenderKitResourceLoader

Immagine 13.3: classe RenderKitResourceLoader

  • Il metodo _register nella funzione RenderKitResourceLoader() viene chiamato e riceve le regex + il loader corrispondente, quindi restituisce super.register che è la sua funzione padre. Questa funzione aggiunge alla concurrentmap_loaders il pattern e il loader corrispondenti. Pertanto, quando il loader viene inizializzato nella funzione doGet() e riceve il parametro request in input, il valore servletPath dall'url della richiesta viene prelevato e passato a _loader.get() per ottenere il servlet corrispondente.

Immagine 13.4: metodo _register

Immagine 13.5: metodo register (metodo padre)

  • L'autore della vulnerabilità ritiene che tra le classi che contengono un override del metodo findResource(), oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader sia la classe che presenta il rischio di deserializzazione. Analizziamola per trovare il motivo.

Analisi della funzione findResource() in RemoteApplicationResourceLoader.class

Immagine 13.6: funzione findResource()

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

Immagine 13.7: metodo RAStreamHandler()

La funzione RAURLConnection chiama la funzione _getPathBean

Immagine 13.8: metodo RAURLConnection ()

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).

Immagine 13.9: funzione _getPathBean

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().

Immagine 13.10: funzione getInstanceFromString()

Immagine 13.11: funzione fromURLEncodedString()

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:

Immagine 13.12: funzione fromString()

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.

  1. Trovare la source: come analizzato sopra, per trovare la source è necessario identificare l'url della richiesta in input. Vediamo che per chiamare la funzione findResource() è necessario poter instradare verso la classe RemoteApplicationResourceLoader. Nella classe RenderKitResourceLoader è definito molto chiaramente:```bash this._register("/./remote/(.)", new RemoteApplicationResourceLoader());
root@kitploit:~
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

![file Lambda](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload2.png)

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.

![Hàm Main](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload1.png)

## Riproduzione dello sfruttamento

![Sfruttamento /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit1.png)

![Sfruttamento /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit2.png)

## 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
Scarica lo strumento