
CVE-2023-22518 in Confluence
CVE-2023-22518: Questa vulnerabilità è descritta come “vulnerabilità di autorizzazione impropria nel database e nei server di Confluence”. L'errore interessa le versioni on-premises dei prodotti Atlassian.
Configurazione dell'ambiente Usare la versione vulnerabile 8.0.4 URL di download: https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.0.4-x64.exe

Selezionare Trial Installation, quindi fare clic sul link per ottenere la chiave di prova gratuita. Successivamente configurare il cluster: scegliere non-cluster.

Successivamente passare alla configurazione del database -> Scegliere MySQL

Seguire le istruzioni:

Configurare il database, creare l'utente e la tabella password
CREATE DATABASE securedb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'admin123'@'localhost' IDENTIFIED BY 'supersecure';
GRANT ALL PRIVILEGES ON securedb.* TO 'admin123'@'localhost';
GRANT SUPER ON *.* TO 'your_username'@'your_host';
FLUSH PRIVILEGES;
Quindi modificare /etc/mysql/my.cnf. Aggiungere le seguenti righe:
transaction-isolation = READ-COMMITTED
log_bin_trust_function_creators = 1

Quindi riavviare MySQL e Confluence. Poi andare alla pagina di installazione su localhost:8090 e usare il database creato per compilare i campi.

Verificare che la connessione sia riuscita, fare clic su Next. Quindi registrarsi.

Debug
*Diff Confrontare i due file jar delle due versioni in IntelliJ. Nello specifico, ho confrontato le versioni 8.0.4 e 7.19.16.
Come descritto, confrontare il file confluence.jar delle due versioni tra loro.

La differenza tra la versione patchata e quella non patchata è @WebSudoRequired e @SystemAdminOnly
WebSudoRequired è una funzionalità per aumentare la sicurezza delle sessioni di amministrazione. Quando si tenta di accedere all'area admin, il sistema richiede di inserire nuovamente la password anche se si è già autenticati. Aggiunge un ulteriore passaggio di verifica per garantire l'accesso amministrativo.
SystemAdminOnly: È una funzionalità che limita le funzioni di amministrazione ai soli account amministratore. Ciò garantisce che solo gli account autorizzati possano eseguire operazioni importanti che influenzano il sistema.
Impostare un breakpoint su validate() in RestoreAction.class

La funzione salva il file caricato tramite getRestoreFileFromUpload

getExportDescriptor viene utilizzato per decomprimere e leggere il contenuto del file zip.


Tuttavia, dopo il debug, non sono ancora riuscito a trovare la causa principale della vulnerabilità.
La causa descritta nella CVE è una vulnerabilità di autorizzazione. Questo porta a rivolgere l'attenzione alle ricerche sulle vulnerabilità del linguaggio Java nel processo di gestione dei permessi da parte degli sviluppatori.
Spostiamo l'attenzione sul file struts.xml, che contiene informazioni sulle action e sul routing basato sui namespace, nonché sugli interceptor.




Vediamo che il namespace /json estende le funzionalità del namespace /admin. Pertanto, le route create per il namespace /admin possono essere raggiunte anche tramite il namespace /json.
Nel contesto del namespace /json, il processo di routing delle richieste passa attraverso una serie di interceptor. Uno di questi interceptor, chiamato WebSudoInterceptor, esegue controlli basati sull'URI della richiesta.
Nello specifico, WebSudoInterceptor esegue i seguenti controlli:
Se il percorso della richiesta è /authenticate.action, viene ignorato. Se il percorso della richiesta è /admin, controlla se l'attributo WebSudoNotRequired è vuoto.
Se una richiesta viene inviata a '/json', la richiesta a '/json/action' viene inoltrata a '/setup/action' e 'admin/action'. In questa CVE, il percorso vulnerabile è '/json/setup-restore.action?synchronous=true'.
Catturando la richiesta con Burp Suite, GET /json/setup-restore.action. Tuttavia si riceve una risposta "Method Not Allowed". Provando con POST /json/setup-restore.action?synchronous=true si riceve una risposta 200.


Caricare il file xmlexport-200123123001.zip e ottenere la risposta.


Ora possiamo accedere con l'account admin:admin.

E otteniamo il seguente risultato.
