# 2049 - Pentesting NFS Service {{#include ../banners/hacktricks-training.md}} ## **Osnovne informacije** **NFS** je sistem dizajniran za **klijent/server** koji omogućava korisnicima da besprekorno pristupaju datotekama preko mreže kao da se te datoteke nalaze unutar lokalnog direktorijuma. **Podrazumevani port**: 2049/TCP/UDP (osim verzije 4, potrebna je samo TCP ili UDP). ``` 2049/tcp open nfs 2-3 (RPC #100003 ``` ### Authentication Značajan aspekt ovog protokola je obično nedostatak ugrađenih **mehanizama autentifikacije** ili **autorizacije**. Umesto toga, autorizacija se oslanja na **informacije o fajl sistemu**, pri čemu je server zadužen za tačno prevođenje **informacija o korisniku koje pruža klijent** u potrebni **format autorizacije** fajl sistema, prvenstveno prateći **UNIX sintaksu**. Autentifikacija se obično oslanja na **UNIX `UID`/`GID` identifikatore i članstva u grupama**. Međutim, izazov nastaje zbog potencijalnog nesklada u **`UID`/`GID` mapiranjima** između klijenata i servera, ostavljajući bez prostora za dodatnu verifikaciju od strane servera. Štaviše, ovi detalji se šalju od strane klijenta i poveravaju serveru, tako da bi zlonameran klijent mogao potencijalno **pretvarati se da je drugi korisnik šaljući privilegovanije `uid` i `gid`. **Međutim, imajte na umu da po defaultu nije moguće pretvarati se u `UID` 0 (root) koristeći NFS. Više o ovome u sekciji o squashing-u.** #### Hosts Za bolju (ili neku) autorizaciju, možete odrediti **hostove** koji mogu pristupiti NFS deljenju. To se može uraditi u Linux `/etc/exports` fajlu. Na primer: ``` /PATH/TO/EXPORT      CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ... /media/disk/share   192.168.2.123(rw,sec=krb5p:krb5i) ``` Kao što možete videti, omogućava konfiguraciju specifične **IP** adrese ili **hostname** za pristup deljenju. Samo ta adresa će moći da pristupi deljenju. ### Verzije - **NFSv2**: Ova verzija je prepoznata po širokoj kompatibilnosti sa raznim sistemima, označavajući njen značaj sa početnim operacijama pretežno preko UDP-a. Kao **najstarija** u seriji, postavila je temelje za budući razvoj. - **NFSv3**: Uvedena sa nizom poboljšanja, NFSv3 je proširila svog prethodnika podržavajući promenljive veličine datoteka i nudeći poboljšane mehanizme izveštavanja o greškama. I pored svojih napredaka, suočila se sa ograničenjima u punoj unazadnoj kompatibilnosti sa NFSv2 klijentima. - **NFSv4**: Prelomna verzija u NFS seriji, NFSv4 je donela niz funkcija dizajniranih da modernizuju deljenje datoteka preko mreža. Značajna poboljšanja uključuju integraciju Kerberos-a za **visoku sigurnost**, mogućnost prolaska kroz vatrozidove i rad preko Interneta bez potrebe za portmape-ima, podršku za Liste Kontrole Pristupa (ACL), i uvođenje operacija zasnovanih na stanju. Njegova poboljšanja u performansama i usvajanje protokola zasnovanog na stanju izdvajaju NFSv4 kao ključni napredak u tehnologijama deljenja mrežnih datoteka. - Imajte na umu da je veoma čudno pronaći Linux host NFS koji podržava kerberos autentifikaciju. Svaka verzija NFS-a je razvijena sa namerom da odgovori na evoluirajuće potrebe mrežnih okruženja, postepeno poboljšavajući sigurnost, kompatibilnost i performanse. ### Squashing Kao što je ranije pomenuto, NFS obično veruje `uid` i `gid` klijenta za pristup datotekama (ako se ne koristi kerberos). Međutim, postoje neka podešavanja koja se mogu postaviti na serveru da **promene ovo ponašanje**: - **all_squash**: Smanjuje sve pristupe mapirajući svakog korisnika i grupu na **`nobody`** (65534 unsigned / -2 signed). Stoga, svako je `nobody` i nijedan korisnik se ne koristi. - **root_squash/no_all_squash**: Ovo je podrazumevano na Linux-u i **smanjuje pristup samo sa uid 0 (root)**. Stoga, svaki `UID` i `GID` su povereni, ali `0` se smanjuje na `nobody` (tako da nije moguća root impersonacija). - **no_root_squash**: Ova konfiguracija, ako je omogućena, čak ne smanjuje ni root korisnika. To znači da ako montirate direktorijum sa ovom konfiguracijom, možete mu pristupiti kao root. ### Subtree check Dostupno samo na Linux-u. man(5) exports kaže: "Ako je poddirektorijum datotečnog sistema izvezen, ali ceo datotečni sistem nije, onda svaki put kada NFS zahtev stigne, server mora da proveri ne samo da li je pristupna datoteka u odgovarajućem datotečnom sistemu (što je lako) već i da li je u izvezenom stablu (što je teže). Ova provera se naziva provera podstabla." Na Linux-u je **`subtree_check` funkcija onemogućena** po defaultu. ## Enumeracija ### Showmount Ovo se može koristiti za **dobijanje informacija sa NFSv3 servera**, kao što su lista **izvozâ**, ko ima **dozvolu za pristup** tim izvozima, i koji klijenti su povezani (što može biti netačno ako se klijent isključi bez obaveštavanja servera). U **NFSv4 klijenti direktno pristupaju / export** i pokušavaju da pristupe izvozima odatle, neuspešno ako je nevažeće ili neautorizovano iz bilo kog razloga. Ako alati poput `showmount` ili Metasploit modula ne prikazuju informacije sa NFS porta, to je potencijalno NFSv4 server koji ne podržava verziju 3. ```bash showmount -e ``` ### Korisni nmap skripti ```bash nfs-ls #List NFS exports and check permissions nfs-showmount #Like showmount -e nfs-statfs #Disk statistics and info from NFS share ``` ### Korisni metasploit moduli ```bash scanner/nfs/nfsmount #Scan NFS mounts and list permissions ``` ### nfs_analyze Ovaj alat sa [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) može se koristiti za dobijanje mnogo podataka sa NFS servera kao što su **mounts**, podržane NFS verzije, povezane IP adrese, i čak da li je moguće **pobeći iz exports** u druge foldere u FS ili **da li je `no_root_squash` omogućen**. ## Mounting Da biste saznali **koji folder** server ima **dostupan** za montiranje, možete ga pitati koristeći: ```bash showmount -e ``` Zatim ga montirajte koristeći: ```bash mount -t nfs [-o vers=2] : -o nolock ``` Trebalo bi da navedete da **koristite verziju 2** jer nema **nikakvu** **autentifikaciju** ili **autorizaciju**. **Primer:** ```bash mkdir /mnt/new_back mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock ``` ## Napadi ### Verovanje UID i GID Naravno, jedini problem ovde je što po defaultu nije moguće imitirati root (`UID` 0). Međutim, moguće je imitirati bilo kog drugog korisnika ili ako je `no_root_squash` omogućen, možete takođe imitirati root. - Ako montirate folder koji sadrži **fajlove ili foldere koji su dostupni samo nekim korisnicima** (preko **UID**). Možete **napraviti** **lokalno** korisnika sa tim **UID** i koristeći tog **korisnika** moći ćete da **pristupite** fajlu/folderu. - Alat **`fuse_nfs`** sa [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) će u suštini uvek slati potrebne UID i GID za pristup fajlovima. ### SUID Eskalacija privilegija Proverite stranicu: {{#ref}} ../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md {{#endref}} ### Bekstvo iz eksportovanih foldera U ovom [sjajnom članku](https://www.hvs-consulting.de/en/nfs-security-identifying-and-exploiting-misconfigurations/) moguće je videti da je moguće **pobeći iz eksportovanih foldera da bi se pristupilo drugim folderima u FS**. Dakle, ako je eksportovan folder koji je **podfolder** **celog fajl sistema**, moguće je pristupiti fajlovima van eksportovanog foldera ako je **`subtree_check`** onemogućen. A on je **po defaultu onemogućen u Linuxu**. Na primer, ako NFS server eksportuje `/srv/` i `/var/` je u istom fajl sistemu, moguće je čitati logove iz `/var/log/` ili smestiti webshell u `/var/www/`. Štaviše, imajte na umu da je po defaultu samo root (0) korisnik zaštićen od imitacije (proverite odeljak Squash). Međutim, ako je fajl **u vlasništvu root-a, ali grupa nije 0, moguće je pristupiti mu**. Na primer, fajl `/etc/shadow` je u vlasništvu root-a, ali grupa je `shadow` (gid 42 na Debijanu). Dakle, moguće je pročitati ga po defaultu! Alat **`nfs_analyze`** sa [https://github.com/hvs-consulting/nfs-security-tooling](https://github.com/hvs-consulting/nfs-security-tooling) je napravljen da podrži ovaj napad protiv fajl sistema ext4, xfs, btrfs u verziji 3 (takođe bi trebalo da bude moguće u v4). ### NSFShell Da biste lako listali, montirali i menjali UID i GID kako biste imali pristup fajlovima, možete koristiti [nfsshell](https://github.com/NetDirect/nfsshell). [Nice NFSShell tutorial.](https://www.pentestpartners.com/security-blog/using-nfsshell-to-compromise-older-environments/) ## Konfiguracione datoteke ``` /etc/exports /etc/lib/nfs/etab ``` ## Opasne postavke - **Dozvole za čitanje i pisanje (`rw`):** Ova postavka omogućava i čitanje i pisanje u fajl sistem. Važno je razmotriti posledice davanja tako širokog pristupa. - **Korišćenje nesigurnih portova (`insecure`):** Kada je omogućeno, ovo omogućava sistemu da koristi portove iznad 1024. Bezbednost portova iznad ovog opsega može biti manje stroga, povećavajući rizik. - **Vidljivost ugnježdenih fajl sistema (`nohide`):** Ova konfiguracija čini direktorijume vidljivim čak i ako je drugi fajl sistem montiran ispod izvezenog direktorijuma. Svaki direktorijum zahteva svoj vlastiti izvozni unos za pravilno upravljanje. - **Vlasništvo fajlova od strane root korisnika (`no_root_squash`):** Sa ovom postavkom, fajlovi koje kreira root korisnik zadržavaju svoj originalni UID/GID od 0, zanemarujući princip minimalnih privilegija i potencijalno dodeljujući prekomerne dozvole. - **Nesmanjenje svih korisnika (`no_all_squash`):** Ova opcija osigurava da identiteti korisnika budu očuvani širom sistema, što može dovesti do problema sa dozvolama i kontrolom pristupa ako se ne upravlja pravilno. ## Eskalacija privilegija korišćenjem NFS pogrešnih konfiguracija [NFS no_root_squash i no_all_squash eskalacija privilegija](../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md) ## HackTricks Automatske Komande ``` 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} ``` {{#include ../banners/hacktricks-training.md}}