mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
181 lines
11 KiB
Markdown
181 lines
11 KiB
Markdown
# 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}}
|