2049 - Pentesting NFS Service

Reading time: 10 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

NFS è un sistema progettato per client/server che consente agli utenti di accedere senza soluzione di continuità ai file su una rete come se questi file fossero situati all'interno di una directory locale.

Porta predefinita: 2049/TCP/UDP (eccetto la versione 4, richiede solo TCP o UDP).

2049/tcp open  nfs     2-3 (RPC #100003

Autenticazione

Un aspetto notevole di questo protocollo è la sua abituale mancanza di meccanismi di autenticazione o autorizzazione integrati. Invece, l'autorizzazione si basa su informazioni del file system, con il server incaricato di tradurre accuratamente le informazioni utente fornite dal client nel formato di autorizzazione richiesto dal file system, seguendo principalmente la sintassi UNIX.

L'autenticazione si basa comunemente su identificatori UID/GID UNIX e appartenenze ai gruppi. Tuttavia, sorge una sfida a causa del potenziale disallineamento nelle mappature UID/GID tra client e server, lasciando poco spazio per ulteriori verifiche da parte del server. Inoltre, questi dettagli vengono inviati dal client e sono fidati dal server, quindi un client malintenzionato potrebbe potenzialmente impersonare un altro utente inviando uid e gid più privilegiati.

Tuttavia, nota che per impostazione predefinita non è possibile impersonare il UID 0 (root) utilizzando NFS. Maggiori informazioni su questo nella sezione di squashing.

Host

Per una migliore (o qualche) autorizzazione, puoi specificare gli host che possono accedere alla condivisione NFS. Questo può essere fatto nel file Linux /etc/exports. Ad esempio:

/PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i)

As you can see, it allows to configure a specific IP or hostname to access the share. Only that address will be able to access the share.

Versioni

  • NFSv2: Questa versione è riconosciuta per la sua ampia compatibilità con vari sistemi, segnando la sua importanza con operazioni iniziali prevalentemente su UDP. Essendo la più vecchia della serie, ha gettato le basi per sviluppi futuri.

  • NFSv3: Introdotto con una serie di miglioramenti, NFSv3 si è ampliato rispetto al suo predecessore supportando dimensioni di file variabili e offrendo meccanismi di reporting degli errori migliorati. Nonostante i suoi progressi, ha affrontato limitazioni nella piena compatibilità retroattiva con i client NFSv2.

  • NFSv4: Una versione fondamentale nella serie NFS, NFSv4 ha portato una suite di funzionalità progettate per modernizzare la condivisione di file attraverso le reti. I miglioramenti notevoli includono l'integrazione di Kerberos per alta sicurezza, la capacità di attraversare i firewall e operare su Internet senza la necessità di portmappers, supporto per le Liste di Controllo degli Accessi (ACL) e l'introduzione di operazioni basate su stato. I suoi miglioramenti delle prestazioni e l'adozione di un protocollo stateful distinguono NFSv4 come un avanzamento fondamentale nelle tecnologie di condivisione di file in rete.

  • Nota che è molto strano trovare un host Linux NFS che supporta l'autenticazione kerberos.

Ogni versione di NFS è stata sviluppata con l'intento di affrontare le esigenze in evoluzione degli ambienti di rete, migliorando progressivamente sicurezza, compatibilità e prestazioni.

Squashing

Come accennato in precedenza, NFS di solito si fida del uid e gid del client per accedere ai file (se non viene utilizzato kerberos). Tuttavia, ci sono alcune configurazioni che possono essere impostate nel server per cambiare questo comportamento:

  • all_squash: Riduce tutti gli accessi mappando ogni utente e gruppo a nobody (65534 unsigned / -2 signed). Pertanto, tutti sono nobody e non vengono utilizzati utenti.
  • root_squash/no_all_squash: Questo è predefinito su Linux e riduce solo l'accesso con uid 0 (root). Pertanto, qualsiasi UID e GID è fidato ma 0 è ridotto a nobody (quindi non è possibile impersonare root).
  • no_root_squash: Questa configurazione, se abilitata, non riduce nemmeno l'utente root. Ciò significa che se monti una directory con questa configurazione puoi accedervi come root.

Controllo del sottoalbero

Disponibile solo su Linux. man(5) exports dice: "Se una sottodirectory di un filesystem è esportata, ma l'intero filesystem non lo è, allora ogni volta che arriva una richiesta NFS, il server deve controllare non solo che il file accessibile sia nel filesystem appropriato (che è facile) ma anche che sia nell'albero esportato (che è più difficile). Questo controllo è chiamato controllo del sottoalbero."

In Linux la funzionalità subtree_check è disabilitata per impostazione predefinita.

Enumerazione

Showmount

Questo può essere utilizzato per ottenere informazioni da un server NFSv3, come l'elenco delle esportazioni, chi è autorizzato ad accedere a queste esportazioni e quali client sono connessi (che potrebbe essere impreciso se un client si disconnette senza avvisare il server). Nei client NFSv4 accedono direttamente all' / export e cercano di accedere alle esportazioni da lì, fallendo se è non valido o non autorizzato per qualsiasi motivo.

Se strumenti come showmount o moduli Metasploit non mostrano informazioni da una porta NFS, è potenzialmente un server NFSv4 che non supporta la versione 3.

bash
showmount -e <IP>

Script nmap utili

bash
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share

Moduli Metasploit Utili

bash
scanner/nfs/nfsmount #Scan NFS mounts and list permissions

nfs_analyze

Questo strumento da https://github.com/hvs-consulting/nfs-security-tooling può essere utilizzato per ottenere molti dati da un server NFS come mounts, versioni NFS supportate, IP connessi e persino se è possibile uscire dagli exports in altre cartelle nel FS o se no_root_squash è abilitato.

Mounting

Per sapere quale cartella ha il server disponibile per il montaggio, puoi chiederglielo usando:

bash
showmount -e <IP>

Quindi montalo usando:

bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock

Dovresti specificare di utilizzare la versione 2 perché non ha alcuna autenticazione o autorizzazione.

Esempio:

bash
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock

Attacchi

Fidarsi di UID e GID

Certo, l'unico problema qui è che per impostazione predefinita non è possibile impersonare root (UID 0). Tuttavia, è possibile impersonare qualsiasi altro utente o, se no_root_squash è abilitato, puoi anche impersonare root.

  • Se monti una cartella che contiene file o cartelle accessibili solo da un certo utente (per UID). Puoi creare localmente un utente con quel UID e utilizzando quel utente sarai in grado di accedere al file/cartella.
  • Lo strumento fuse_nfs da https://github.com/hvs-consulting/nfs-security-tooling invierà sempre il UID e GID necessari per accedere ai file.

Escalation dei privilegi SUID

Controlla la pagina:

NFS no_root_squash/no_all_squash misconfiguration PE

Uscire dagli export

In questo ottimo articolo è possibile vedere che è possibile uscire dagli export per accedere ad altre cartelle nel FS.

Pertanto, se un export sta esportando una cartella che è una sottocartella del filesystem completo, è possibile accedere a file al di fuori dell'export se subtree_check è disabilitato. Ed è disabilitato per impostazione predefinita in Linux.

Ad esempio, se un server NFS sta esportando /srv/ e /var/ si trova nello stesso filesystem, è possibile leggere i log da /var/log/ o memorizzare una webshell in /var/www/.

Inoltre, nota che per impostazione predefinita solo l'utente root (0) è protetto dall'essere impersonato (controlla la sezione Squash). Tuttavia, se un file è possesso di root ma il gruppo non è 0, è possibile accedervi. Ad esempio, il file /etc/shadow è di proprietà di root ma il gruppo è shadow (gid 42 su Debian). Pertanto, è possibile leggerlo per impostazione predefinita!

Lo strumento nfs_analyze da https://github.com/hvs-consulting/nfs-security-tooling è progettato per supportare questo attacco contro i file system ext4, xfs, btrfs nella versione 3 (dovrebbe essere possibile anche nella v4).

NSFShell

Per elencare, montare e cambiare facilmente UID e GID per avere accesso ai file puoi usare nfsshell.

Ottimo tutorial su NFSShell.

File di configurazione

/etc/exports
/etc/lib/nfs/etab

Impostazioni pericolose

  • Permessi di Lettura e Scrittura (rw): Questa impostazione consente sia la lettura che la scrittura nel file system. È essenziale considerare le implicazioni di concedere un accesso così ampio.

  • Utilizzo di Porte Insicure (insecure): Quando abilitato, questo consente al sistema di utilizzare porte superiori a 1024. La sicurezza delle porte al di sopra di questo intervallo può essere meno rigorosa, aumentando il rischio.

  • Visibilità dei File System Annidati (nohide): Questa configurazione rende le directory visibili anche se un altro file system è montato sotto una directory esportata. Ogni directory richiede la propria voce di esportazione per una gestione adeguata.

  • Proprietà dei File di Root (no_root_squash): Con questa impostazione, i file creati dall'utente root mantengono il loro UID/GID originale di 0, ignorando il principio del minimo privilegio e potenzialmente concedendo permessi eccessivi.

  • Non Squashing di Tutti gli Utenti (no_all_squash): Questa opzione garantisce che le identità degli utenti siano preservate in tutto il sistema, il che potrebbe portare a problemi di permessi e controllo degli accessi se non gestito correttamente.

Escalation dei Privilegi utilizzando le misconfigurazioni NFS

NFS no_root_squash e no_all_squash escalation dei privilegi

HackTricks Comandi Automatici

Protocol_Name: NFS    #Protocol Abbreviation if there is one.
Port_Number:  2049     #Comma separated if there is more than one.
Protocol_Description: Network File System         #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for NFS
Note: |
NFS is a system designed for client/server that enables users to seamlessly access files over a network as though these files were located within a local directory.

#apt install nfs-common
showmount 10.10.10.180      ~or~showmount -e 10.10.10.180
should show you available shares (example /home)

mount -t nfs -o ver=2 10.10.10.180:/home /mnt/
cd /mnt
nano into /etc/passwd and change the uid (probably 1000 or 1001) to match the owner of the files if you are not able to get in

https://book.hacktricks.wiki/en/network-services-pentesting/nfs-service-pentesting.html

Entry_2:
Name: Nmap
Description: Nmap with NFS Scripts
Command: nmap --script=nfs-ls.nse,nfs-showmount.nse,nfs-statfs.nse -p 2049 {IP}

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks