NFS
Last updated
Last updated
NFS es un sistema de archivos de red desarrollado por Sun Microsystems con el mismo propósito que SMB: acceder a sistemas de archivos a través de una red como si fueran locales. Sin embargo, NFS utiliza un protocolo completamente diferente. NFS es utilizado entre sistemas Linux y Unix, lo que significa que los clientes NFS no pueden comunicarse directamente con servidores SMB. NFS es un estándar de Internet que regula los procedimientos en un sistema de archivos distribuido.
Si bien la versión 3.0 del protocolo NFS (NFSv3), que ha estado en uso durante muchos años, autentica la computadora cliente, esto cambia con NFSv4, donde, al igual que con el protocolo SMB de Windows, el usuario debe autenticarse.
Versión | Características |
---|---|
La versión 4.1 de NFS (RFC 8881) busca proporcionar soporte de protocolo para aprovechar implementaciones de servidores en clústeres, incluyendo la capacidad de ofrecer acceso paralelo escalable a archivos distribuidos en varios servidores (extensión pNFS). Además, NFSv4.1 incluye un mecanismo de session trunking, también conocido como NFS multipath. Una ventaja importante de NFSv4 sobre sus predecesores es que solo usa un puerto UDP o TCP, el 2049, para ejecutar el servicio, lo que simplifica el uso del protocolo a través de cortafuegos.
NFS se basa en el protocolo Open Network Computing Remote Procedure Call (ONC-RPC/SUN-RPC) expuesto en los puertos TCP y UDP 111, utilizando External Data Representation (XDR) para el intercambio de datos independiente del sistema. El protocolo NFS no tiene un mecanismo para autenticación o autorización. En su lugar, la autenticación se delega completamente a las opciones del protocolo RPC. La autorización se deriva de la información disponible en el sistema de archivos. En este proceso, el servidor es responsable de traducir la información del usuario del cliente al formato del sistema de archivos y convertir los detalles de autorización correspondientes al formato UNIX requerido lo más exactamente posible.
La autenticación más común es a través de UID/GID de UNIX y las membresías de grupo, que es el formato que más probablemente se aplique al protocolo NFS. Un problema es que el cliente y el servidor no necesariamente deben tener las mismas asignaciones de UID/GID para usuarios y grupos, y el servidor no necesita hacer nada más. No se pueden realizar más verificaciones por parte del servidor, por lo que este método de autenticación solo debe usarse en redes confiables.
NFS no es difícil de configurar, ya que no tiene tantas opciones como FTP o SMB. El archivo /etc/exports
contiene una tabla de sistemas de archivos físicos en un servidor NFS que son accesibles por los clientes. La tabla de exportaciones NFS muestra qué opciones acepta y, por lo tanto, indica qué opciones están disponibles para nosotros.
/etc/exports
El archivo de exportaciones predeterminado también contiene algunos ejemplos de configuración de NFS shares. Primero, se especifica la carpeta que se hará disponible a otros, y luego se conectan los derechos que tendrán en este NFS share a un host o una subred. Finalmente, se pueden agregar opciones adicionales a los hosts o subredes.
Vamos a crear una entrada de prueba y jugar con la configuración.
Hemos compartido la carpeta /mnt/nfs
con la subred 10.129.14.0/24
con la configuración que se muestra arriba. Esto significa que todos los hosts en la red podrán montar este NFS share e inspeccionar el contenido de esta carpeta.
Sin embargo, incluso con NFS, algunas configuraciones pueden ser peligrosas para la empresa y su infraestructura. Aquí se enumeran algunas de ellas:
Se recomienda encarecidamente crear una máquina virtual local y experimentar con las configuraciones. Descubriremos métodos que nos mostrarán cómo está configurado el servidor NFS. Para esto, podemos crear varias carpetas y asignar diferentes opciones a cada una. Luego, podemos inspeccionarlas y ver qué efectos tienen en el NFS share, sus permisos y el proceso de enumeración.
Podemos observar la opción insecure. Esta es peligrosa porque permite a los usuarios utilizar puertos por encima de 1024. Los primeros 1024 puertos solo pueden ser utilizados por root, lo que evita que usuarios normales usen sockets sobre el puerto 1024 para el servicio NFS e interactúen con él.
Al realizar footprinting de NFS, los puertos TCP 111 y 2049 son esenciales. También podemos obtener información sobre el servicio NFS y el host a través de RPC, como se muestra en el siguiente ejemplo.
El script rpcinfo
de Nmap muestra una lista de todos los servicios RPC actualmente en ejecución, sus nombres, descripciones y los puertos que utilizan. Esto nos permite verificar si el share objetivo está conectado a la red en todos los puertos necesarios.
Además, Nmap tiene algunos scripts NSE específicos para NFS que pueden utilizarse para los escaneos. Estos scripts pueden, por ejemplo, mostrar el contenido del share y sus estadísticas.
Una vez que hayamos descubierto un servicio NFS, podemos montarlo en nuestra máquina local. Para ello, creamos una carpeta vacía a la que se montará el share NFS. Una vez montado, podremos navegar por el share y ver el contenido como si fuera parte de nuestro sistema local.
Aquí tendremos la oportunidad de acceder a los permisos, nombres de usuarios y grupos a los que pertenecen los archivos mostrados. Una vez que tengamos los nombres de usuario, nombres de grupos, UIDs y GIDs, podemos crearlos en nuestro sistema y adaptarlos al share NFS para ver y modificar los archivos.
Es importante tener en cuenta que si la opción root_squash
está configurada, no podremos editar el archivo backup.sh
, incluso como root.
NFS puede usarse para una mayor escalada. Por ejemplo, si tenemos acceso al sistema a través de SSH y queremos leer archivos de otra carpeta a la que un usuario específico tiene acceso, podríamos subir una shell al share NFS con el SUID de ese usuario y luego ejecutar la shell a través del usuario de SSH.
Después de realizar todos los pasos necesarios y obtener la información deseada, podemos desmontar el share NFS.
Opción | Descripción |
---|---|
Opción | Descripción |
---|---|
NFSv2
Es más antigua pero es compatible con muchos sistemas, y al principio funcionaba completamente sobre UDP.
NFSv3
Ofrece más características, como tamaño de archivo variable y mejor reporte de errores, pero no es totalmente compatible con clientes NFSv2.
NFSv4
Incluye Kerberos, funciona a través de cortafuegos y en Internet, ya no requiere portmappers, soporta ACLs, aplica operaciones basadas en estado, y ofrece mejoras de rendimiento y alta seguridad. Es la primera versión con un protocolo basado en estado.
rw
Permisos de lectura y escritura.
ro
Permisos de solo lectura.
sync
Transferencia de datos síncrona. (Un poco más lenta)
async
Transferencia de datos asíncrona. (Un poco más rápida)
secure
No se usarán puertos por encima de 1024.
insecure
Se usarán puertos por encima de 1024.
no_subtree_check
Esta opción desactiva la verificación de subdirectorios.
root_squash
Asigna todos los permisos de archivos del UID/GID root (0) al UID/GID anónimo, lo que impide que root acceda a archivos en un montaje NFS.
rw
Permisos de lectura y escritura.
insecure
Se utilizarán puertos por encima de 1024.
nohide
Si otro sistema de archivos está montado debajo de un directorio exportado, este directorio se exporta por su propia entrada en /etc/exports
.
no_root_squash
Todos los archivos creados por root se mantienen con el UID/GID 0.