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

12 KiB

2049 - Pentesting NFS Service

{{#include ../banners/hacktricks-training.md}}

Basiese Inligting

NFS is 'n stelsel wat ontwerp is vir kliënt/bediener wat gebruikers in staat stel om naatloos toegang tot lêers oor 'n netwerk te verkry asof hierdie lêers in 'n plaaslike gids geleë is.

Standaard poort: 2049/TCP/UDP (behalwe weergawe 4, dit benodig net TCP of UDP).

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

Authentisering

'n Opmerklike aspek van hierdie protokol is die gewone gebrek aan ingeboude authentisering of autorisasiemechanismes. In plaas daarvan, berus autorisasie op lêerstelselinligting, met die bediener wat verantwoordelik is om klant-gelewer gebruikersinligting akkuraat in die lêerstelsel se vereiste autorisasieformaat te vertaal, hoofsaaklik volgens UNIX-sintaksis.

Authentisering berus gewoonlik op UNIX UID/GID identifiseerders en groeplidmaatskappe. 'n Uitdaging ontstaan egter weens die potensiële wanpassing in UID/GID kaarte tussen kliënte en bedieners, wat geen ruimte laat vir addisionele verifikasie deur die bediener nie. Boonop word hierdie besonderhede deur die kliënt gestuur en deur die bediener vertrou, sodat 'n kwaadwillige kliënt potensieel kan verteenwoordig 'n ander gebruiker deur meer bevoorregte uid en gids te stuur.

Let egter daarop dat dit standaard nie moontlik is om die UID 0 (root) te verteenwoordig nie met NFS. Meer oor hierdie in die squashing-afdeling.

Gashere

Vir beter (of sommige) autorisasie, kan jy die gashere spesifiseer wat toegang tot die NFS-aandeel kan hê. Dit kan gedoen word in die Linux /etc/exports lêer. Byvoorbeeld:

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

As jy kan sien, dit laat toe om 'n spesifieke IP of hostname te konfigureer om toegang tot die deel te verkry. Slegs daardie adres sal in staat wees om toegang tot die deel te verkry.

Weergawes

  • NFSv2: Hierdie weergawe word erken vir sy breë kompatibiliteit met verskeie stelsels, wat sy belangrikheid merk met aanvanklike bedrywighede hoofsaaklik oor UDP. As die oudste in die reeks, het dit die grondslag gelê vir toekomstige ontwikkelinge.

  • NFSv3: Ingevoerd met 'n reeks verbeterings, het NFSv3 op sy voorganger uitgebrei deur veranderlike lêergrootte te ondersteun en verbeterde foutverslagmeganismes aan te bied. Ten spyte van sy vooruitgang, het dit beperkings in volle terugwaartse kompatibiliteit met NFSv2-kliënte ondervind.

  • NFSv4: 'n Mylpaalweergawe in die NFS-reeks, het NFSv4 'n stel funksies gebring wat ontwerp is om lêerdeling oor netwerke te moderniseer. Opmerklike verbeterings sluit die integrasie van Kerberos vir hoë sekuriteit, die vermoë om vuurmure te oorsteek en oor die Internet te werk sonder die behoefte aan portmappers, ondersteuning vir Toegang Beheer Lyste (ACL's), en die bekendstelling van staat-gebaseerde bedrywighede in. Sy prestasieverbeterings en die aanneming van 'n staatlike protokol onderskei NFSv4 as 'n belangrike vooruitgang in netwerk lêerdeling tegnologieë.

  • Let daarop dat dit baie vreemd is om 'n Linux-gasheer NFS te vind wat kerberos-verifikasie ondersteun.

Elke weergawe van NFS is ontwikkel met die doel om die ontwikkelende behoeftes van netwerkomgewings aan te spreek, wat progressief sekuriteit, kompatibiliteit en prestasie verbeter.

Squashing

Soos vroeër genoem, sal NFS gewoonlik die kliënt se uid en gid vertrou om toegang tot die lêers te verkry (as kerberos nie gebruik word nie). Daar is egter 'n paar konfigurasies wat in die bediener gestel kan word om hierdie gedrag te verander:

  • all_squash: Dit squash al die toegang deur elke gebruiker en groep na nobody (65534 unsigned / -2 signed) te map. Daarom is almal nobody en geen gebruikers word gebruik nie.
  • root_squash/no_all_squash: Dit is die standaard op Linux en squash slegs toegang met uid 0 (root). Daarom word enige UID en GID vertrou, maar 0 word gesquash na nobody (so geen root-imperonering is moontlik nie).
  • no_root_squash: Hierdie konfigurasie, indien geaktiveer, squash nie eens die root-gebruiker nie. Dit beteken dat as jy 'n gids met hierdie konfigurasie monteer, jy dit as root kan benader.

Subtree check

Slegs beskikbaar op Linux. man(5) exports sê: "As 'n subgids van 'n lêerstelsel ge-exporteer word, maar die hele lêerstelsel nie, dan moet die bediener wanneer 'n NFS-versoek aankom, nie net nagaan dat die toeganklike lêer in die toepaslike lêerstelsel is (wat maklik is) nie, maar ook dat dit in die ge-exporteerde boom is (wat moeiliker is). Hierdie kontrole word die subtree check genoem."

In Linux is die subtree_check funksie standaard gedeaktiveer.

Enumerasie

Showmount

Dit kan gebruik word om inligting van 'n NFSv3 bediener te verkry, soos die lys van exports, wie is toegelaat om toegang te verkry tot hierdie exports, en watter kliënte verbind is (wat dalk onakkuraat kan wees as 'n kliënt ontkoppel sonder om die bediener te vertel). In NFSv4 kliënte het net direkte toegang tot die / export en probeer om van daar af toegang tot exports te verkry, wat misluk as dit ongeldig of nie geautoriseer is nie.

As gereedskap soos showmount of Metasploit-modules nie inligting van 'n NFS-poort toon nie, is dit moontlik 'n NFSv4 bediener wat nie weergawe 3 ondersteun nie.

showmount -e <IP>

Nuttige nmap skripte

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

Nuttige metasploit modules

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

nfs_analyze

Hierdie hulpmiddel van https://github.com/hvs-consulting/nfs-security-tooling kan gebruik word om 'n groot hoeveelheid data van 'n NFS-bediener te verkry, soos mounts, ondersteunde NFS-weergawes, gekonnekteerde IP's, en selfs of dit moontlik is om te ontsnap van die exports na ander vouers in die FS of of no_root_squash geaktiveer is.

Mounting

Om te weet watter vouer die bediener beskikbaar het om te monteer, kan jy dit vra met:

showmount -e <IP>

Dan monteer dit met:

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

U moet spesifiseer om weergawe 2 te gebruik omdat dit geen verifikasie of outorisering het.

Voorbeeld:

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

Aanvalle

Vertroue UID en GID

Natuurlik is die enigste probleem hier dat dit standaard nie moontlik is om root (UID 0) na te boots nie. Dit is egter moontlik om enige ander gebruiker na te boots of as no_root_squash geaktiveer is, kan jy ook root na boots.

  • As jy 'n gids monteer wat lêers of gidse bevat wat slegs deur 'n sekere gebruiker toeganklik is (deur UID). Jy kan lokal 'n gebruiker met daardie UID skep en met daardie gebruiker sal jy in staat wees om die lêer/gids te benader.
  • Die hulpmiddel fuse_nfs van https://github.com/hvs-consulting/nfs-security-tooling sal basies altyd die nodige UID en GID stuur om toegang tot die lêers te verkry.

SUID Privilege Escalation

Kyk na die bladsy:

{{#ref}} ../linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md {{#endref}}

Ontsnapping van die exports

In hierdie geweldige artikel is dit moontlik om te sien dat dit moontlik is om te ontsnap van die exports om toegang tot ander gidse in die FS te verkry.

Daarom, as 'n export 'n gids exporteer wat 'n subgids van die hele lêerstelsel is, is dit moontlik om lêers buite die export te benader as subtree_check gedeaktiveer is. En dit is gedeaktiveer deur standaard in Linux.

Byvoorbeeld, as 'n NFS-bediener /srv/ exporteer en /var/ in dieselfde lêerstelsel is, is dit moontlik om logs van /var/log/ te lees of 'n webshell in /var/www/ te stoor.

Boonop, let daarop dat standaard slegs die root (0) gebruiker beskerm is teen na te boots (kyk na die Squash afdeling). As 'n lêer aan root behoort, maar die groep nie 0 is nie, is dit moontlik om toegang te verkry. Byvoorbeeld, die lêer /etc/shadow behoort aan root, maar die groep is shadow (gid 42 op Debian). Daarom is dit moontlik om dit standaard te lees!

Die hulpmiddel nfs_analyze van https://github.com/hvs-consulting/nfs-security-tooling is gebou om hierdie aanval teen die lêerstelsels ext4, xfs, btrfs in weergawe 3 te ondersteun (dit behoort ook moontlik te wees in v4).

NSFShell

Om maklik te lys, te monteer en UID en GID te verander om toegang tot lêers te hê, kan jy nfsshell gebruik.

Nice NFSShell tutoriaal.

Konfigurasie lêers

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

Gevaarlike instellings

  • Lees- en Skryfregte (rw): Hierdie instelling laat beide lees van en skryf na die lêerstelsel toe. Dit is noodsaaklik om die implikasies van die toekenning van so 'n breë toegang in ag te neem.

  • Gebruik van Onveilige Poorte (insecure): Wanneer geaktiveer, laat dit die stelsel toe om poorte bo 1024 te gebruik. Die sekuriteit van poorte bo hierdie reeks kan minder streng wees, wat die risiko verhoog.

  • Sigbaarheid van Geneste Lêerstelsels (nohide): Hierdie konfigurasie maak gidse sigbaar selfs as 'n ander lêerstelsel onder 'n geëksporteerde gids gemonteer is. Elke gids vereis sy eie uitvoerinskrywing vir behoorlike bestuur.

  • Eienaarskap van Wortellêers (no_root_squash): Met hierdie instelling behou lêers wat deur die wortelgebruiker geskep is, hul oorspronklike UID/GID van 0, wat die beginsel van die minste voorregte ignoreer en moontlik oortollige regte toeken.

  • Nie-Squashing van Alle Gebruikers (no_all_squash): Hierdie opsie verseker dat gebruikersidentiteite oor die stelsel behou word, wat kan lei tot toestemming en toegangbeheer probleme as dit nie korrek hanteer word nie.

Voorregverhoging deur NFS misconfigurasies

NFS no_root_squash en no_all_squash voorregverhoging

HackTricks Outomatiese Opdragte

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}}