hacktricks/src/network-services-pentesting/nfs-service-pentesting.md

181 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 <IP>
```
### 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 <IP>
```
Zatim ga montirajte koristeći:
```bash
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -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}}