2049 - Pentesting NFS Service
Reading time: 10 minutes
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.
Informaci贸n B谩sica
NFS es un sistema dise帽ado para cliente/servidor que permite a los usuarios acceder a archivos a trav茅s de una red como si estos archivos estuvieran ubicados dentro de un directorio local.
Puerto por defecto: 2049/TCP/UDP (excepto la versi贸n 4, solo necesita TCP o UDP).
2049/tcp open nfs 2-3 (RPC #100003
Autenticaci贸n
Un aspecto notable de este protocolo es su habitual falta de mecanismos de autenticaci贸n o autorizaci贸n integrados. En su lugar, la autorizaci贸n se basa en la informaci贸n del sistema de archivos, con el servidor encargado de traducir con precisi贸n la informaci贸n del usuario proporcionada por el cliente al formato de autorizaci贸n requerido por el sistema de archivos, siguiendo principalmente la sintaxis de UNIX.
La autenticaci贸n com煤nmente se basa en identificadores UID
/GID
de UNIX y membres铆as de grupo. Sin embargo, surge un desaf铆o debido a la posible discrepancia en los mapeos de UID
/GID
entre clientes y servidores, dejando sin espacio para una verificaci贸n adicional por parte del servidor. Adem谩s, estos detalles son enviados por el cliente y son confiables por el servidor, por lo que un cliente malintencionado podr铆a potencialmente suplantar a otro usuario enviando uid
y gid
m谩s privilegiados.
Sin embargo, tenga en cuenta que por defecto no es posible suplantar el UID
0 (root) usando NFS. M谩s sobre esto en la secci贸n de squashing.
Hosts
Para una mejor (o alguna) autorizaci贸n, puede especificar los hosts que pueden acceder al recurso compartido de NFS. Esto se puede hacer en el archivo /etc/exports
de Linux. Por ejemplo:
/PATH/TO/EXPORT聽聽聽聽聽 CLIENT1(OPTIONS1) CLIENT2(OPTIONS2) ...
/media/disk/share聽聽 192.168.2.123(rw,sec=krb5p:krb5i)
Como puedes ver, permite configurar una IP o nombre de host espec铆fico para acceder al recurso compartido. Solo esa direcci贸n podr谩 acceder al recurso compartido.
Versiones
-
NFSv2: Esta versi贸n es reconocida por su amplia compatibilidad con varios sistemas, marcando su importancia con operaciones iniciales predominantemente sobre UDP. Siendo la m谩s antigua de la serie, sent贸 las bases para desarrollos futuros.
-
NFSv3: Introducida con una serie de mejoras, NFSv3 se expandi贸 sobre su predecesora al soportar tama帽os de archivo variables y ofrecer mecanismos de reporte de errores mejorados. A pesar de sus avances, enfrent贸 limitaciones en la compatibilidad total hacia atr谩s con clientes NFSv2.
-
NFSv4: Una versi贸n hist贸rica en la serie NFS, NFSv4 trajo consigo un conjunto de caracter铆sticas dise帽adas para modernizar el intercambio de archivos a trav茅s de redes. Las mejoras notables incluyen la integraci贸n de Kerberos para alta seguridad, la capacidad de atravesar firewalls y operar a trav茅s de Internet sin necesidad de portmappers, soporte para Listas de Control de Acceso (ACLs) y la introducci贸n de operaciones basadas en estado. Sus mejoras de rendimiento y la adopci贸n de un protocolo con estado distinguen a NFSv4 como un avance fundamental en las tecnolog铆as de intercambio de archivos en red.
-
Ten en cuenta que es muy raro encontrar un host Linux NFS que soporte autenticaci贸n kerberos.
Cada versi贸n de NFS ha sido desarrollada con la intenci贸n de abordar las necesidades en evoluci贸n de los entornos de red, mejorando progresivamente la seguridad, compatibilidad y rendimiento.
Squashing
Como se mencion贸 anteriormente, NFS generalmente confiar谩 en el uid
y gid
del cliente para acceder a los archivos (si no se utiliza kerberos). Sin embargo, hay algunas configuraciones que se pueden establecer en el servidor para cambiar este comportamiento:
- all_squash: Aplana todos los accesos mapeando a cada usuario y grupo a
nobody
(65534 sin signo / -2 con signo). Por lo tanto, todos sonnobody
y no se utilizan usuarios. - root_squash/no_all_squash: Esto es predeterminado en Linux y solo aplana el acceso con uid 0 (root). Por lo tanto, cualquier
UID
yGID
son confiables, pero0
se aplana anobody
(por lo que no es posible la suplantaci贸n de root). - no_root_squash: Esta configuraci贸n, si se habilita, ni siquiera aplana al usuario root. Esto significa que si montas un directorio con esta configuraci贸n, puedes acceder a 茅l como root.
Subtree check
Solo disponible en Linux. man(5) exports dice: "Si un subdirectorio de un sistema de archivos se exporta, pero el sistema de archivos completo no, entonces cada vez que llega una solicitud NFS, el servidor debe verificar no solo que el archivo accedido est茅 en el sistema de archivos apropiado (lo cual es f谩cil), sino tambi茅n que est茅 en el 谩rbol exportado (lo cual es m谩s dif铆cil). Esta verificaci贸n se llama la verificaci贸n de sub谩rbol."
En Linux, la funci贸n subtree_check
est谩 deshabilitada por defecto.
Enumeraci贸n
Showmount
Esto se puede usar para obtener informaci贸n de un servidor NFSv3, como la lista de exportaciones, qui茅n est谩 autorizado a acceder a estas exportaciones y qu茅 clientes est谩n conectados (lo cual puede ser inexacto si un cliente se desconecta sin informar al servidor). En NFSv4, los clientes acceden directamente al聽/聽export y tratan de acceder a las exportaciones desde all铆, fallando si es inv谩lido o no autorizado por cualquier motivo.
Si herramientas como showmount
o m贸dulos de Metasploit no muestran informaci贸n de un puerto NFS, es potencialmente un servidor NFSv4 que no soporta la versi贸n 3.
showmount -e <IP>
Scripts de nmap 煤tiles
nfs-ls #List NFS exports and check permissions
nfs-showmount #Like showmount -e
nfs-statfs #Disk statistics and info from NFS share
M贸dulos 煤tiles de metasploit
scanner/nfs/nfsmount #Scan NFS mounts and list permissions
nfs_analyze
Esta herramienta de https://github.com/hvs-consulting/nfs-security-tooling se puede utilizar para obtener muchos datos de un servidor NFS como montajes, versiones de NFS soportadas, IPs conectadas, e incluso si es posible escapar de las exportaciones a otras carpetas en el FS o si no_root_squash
est谩 habilitado.
Montaje
Para saber qu茅 carpeta tiene el servidor disponible para montarte, puedes preguntarle usando:
showmount -e <IP>
Luego m贸ntalo usando:
mount -t nfs [-o vers=2] <ip>:<remote_folder> <local_folder> -o nolock
Deber铆as especificar usar la versi贸n 2 porque no tiene ninguna autenticaci贸n o autorizaci贸n.
Ejemplo:
mkdir /mnt/new_back
mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
Ataques
Confianza en UID y GID
Por supuesto, el 煤nico problema aqu铆 es que por defecto no es posible suplantar a root (UID
0). Sin embargo, es posible suplantar a cualquier otro usuario o si no_root_squash
est谩 habilitado, tambi茅n puedes suplantar a root.
- Si montas una carpeta que contiene archivos o carpetas solo accesibles por alg煤n usuario (por UID). Puedes crear localmente un usuario con ese UID y usando ese usuario podr谩s acceder al archivo/carpeta.
- La herramienta
fuse_nfs
de https://github.com/hvs-consulting/nfs-security-tooling enviar谩 b谩sicamente siempre el UID y GID necesarios para acceder a los archivos.
Escalaci贸n de privilegios SUID
Consulta la p谩gina:
NFS no_root_squash/no_all_squash misconfiguration PE
Escapando de las exportaciones
En este gran art铆culo es posible ver que es posible escapar de las exportaciones para acceder a otras carpetas en el FS.
Por lo tanto, si una exportaci贸n est谩 exportando una carpeta que es una subcarpeta del sistema de archivos completo, es posible acceder a archivos fuera de la exportaci贸n si subtree_check
est谩 deshabilitado. Y est谩 deshabilitado por defecto en Linux.
Por ejemplo, si un servidor NFS est谩 exportando /srv/
y /var/
est谩 en el mismo sistema de archivos, es posible leer registros de /var/log/
o almacenar un webshell en /var/www/
.
Adem谩s, ten en cuenta que por defecto solo el usuario root (0) est谩 protegido de ser suplantado (consulta la secci贸n Squash). Sin embargo, si un archivo es propiedad de root pero el grupo no es 0, es posible acceder a 茅l. Por ejemplo, el archivo /etc/shadow
es propiedad de root pero el grupo es shadow
(gid 42 en Debian). 隆Por lo tanto, es posible leerlo por defecto!
La herramienta nfs_analyze
de https://github.com/hvs-consulting/nfs-security-tooling est谩 dise帽ada para soportar este ataque contra los sistemas de archivos ext4, xfs, btrfs en la versi贸n 3 (tambi茅n deber铆a ser posible en v4).
NSFShell
Para listar, montar y cambiar f谩cilmente UID y GID para tener acceso a archivos, puedes usar nfsshell.
Archivos de configuraci贸n
/etc/exports
/etc/lib/nfs/etab
Configuraciones peligrosas
-
Permisos de lectura y escritura (
rw
): Esta configuraci贸n permite tanto la lectura como la escritura en el sistema de archivos. Es esencial considerar las implicaciones de otorgar un acceso tan amplio. -
Uso de puertos inseguros (
insecure
): Cuando est谩 habilitado, esto permite que el sistema utilice puertos por encima de 1024. La seguridad de los puertos por encima de este rango puede ser menos estricta, aumentando el riesgo. -
Visibilidad de sistemas de archivos anidados (
nohide
): Esta configuraci贸n hace que los directorios sean visibles incluso si otro sistema de archivos est谩 montado debajo de un directorio exportado. Cada directorio requiere su propia entrada de exportaci贸n para una gesti贸n adecuada. -
Propiedad de archivos de root (
no_root_squash
): Con esta configuraci贸n, los archivos creados por el usuario root mantienen su UID/GID original de 0, ignorando el principio de menor privilegio y potencialmente otorgando permisos excesivos. -
No aplastamiento de todos los usuarios (
no_all_squash
): Esta opci贸n asegura que las identidades de los usuarios se conserven en todo el sistema, lo que podr铆a llevar a problemas de permisos y control de acceso si no se maneja correctamente.
Escalaci贸n de privilegios utilizando configuraciones incorrectas de NFS
NFS no_root_squash y no_all_squash escalaci贸n de privilegios
Comandos autom谩ticos de HackTricks
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}
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.