
GitLab 任意ファイル読み取りエクスプロイト
このスクリプトは、GitLab Community Edition (CE) および Enterprise Edition (EE) に対するリモートコード実行を提供します。このCVEは任意ファイル読み取りであり、GitLabのsecrets.yamlファイルをダウンロードすることでRailsのsecret_key_baseを抽出できます。さらに、GitLabがA/Bテストのために内部的に使用しているexperimentation_subject_idクッキーを自分で署名することでコード実行が可能になります。クッキーに埋め込まれたペイロードには、GitLabインスタンス上でコードを実行できる逆シリアル化の脆弱性が含まれています。
この任意ファイル読み取りはGitLab EE/CE 8.5以降に存在します。これは12.9.1、12.8.8、12.7.8で修正されました。ただし、RCEは、脆弱なexperimentation_subject_idクッキーが導入された12.4.0以降にのみ影響します。
12.8.1でテスト済み
このモジュールはpython 3.9でテストされており、次の依存関係が必要です:
pipenvがインストールされていれば、pipenv installとpipenv shellを実行してpipenv仮想環境のシェルをすぐに開始できます。
$ ./cve_2020_10977.py --help
usage: cve_2020_10977.py [-h] --url URL -u USERNAME -p PASSWORD [--cmd CMD]
optional arguments:
-h, --help show this help message and exit
--url URL Target URL
-u USERNAME, --username USERNAME
Gitlab username
-p PASSWORD, --password PASSWORD
Gitlab password
--cmd CMD Command to execute
ローカルでの開発やエクスプロイトのテストを容易にするためにMakefileが含まれています。このCVEに対して脆弱なGitLabのローカルバージョンをすばやく立ち上げるために、dockerとdocker-composeに依存しています。
make up
GitLabのローカルインスタンスと、リバースシェルをテストしやすくするためのdebianインスタンスが起動します。GitLabインスタンスはlocalhostのポート5580で利用可能になります。この追加イメージにより、dockerネットワーク内から到達可能なIPが得られます。localhostをdockerコンテナから到達可能にすることも可能ですが、労力に見合わないと思います。また、--privilegedの使用を推奨したくはありません。
RHOST debianインスタンスへの接続は、次のコマンドで簡単に行えます:
make shell
これにより、nc -lnvp 9000でリバースシェルを準備できます。
これが完了したら、エクスプロイトをテストする準備が整います。次のコマンドを実行できます:
make exploit
エクスプロイトを実行しますが、RCEは行わず、代わりにGitLabのrails secretを出力します。
make exploit-rce
上記のRCEペイロードとこのCVEを組み合わせて、リバースシェルを取得します。
ハッピーハッキング!