2049 - Pentesting NFS Service
Tip
Aprende y practica Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
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 los HackTricks y HackTricks Cloud repositorios 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 cambio, 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 posibilidad de verificación adicional por parte del servidor. Además, estos detalles son enviados por el cliente y son confiables para el servidor, por lo que un cliente malintencionado podría potencialmente **suplantar a otro usuario enviando uid y gid más privilegiados.
Sin embargo, ten 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, puedes 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 sonnobodyy no se utilizan usuarios. - root_squash/no_all_squash: Este es el valor predeterminado en Linux y solo aplana el acceso con uid 0 (root). Por lo tanto, cualquier
UIDyGIDson confiables, pero0se 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 característica 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 ni 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_nfsde 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 de 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 Hacking en AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Hacking en Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
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 los HackTricks y HackTricks Cloud repositorios de github.
HackTricks

