NFS
El Network File System
(NFS
) es un sistema de archivos en red desarrollado por Sun Microsystems y tiene el mismo propósito que SMB. Su objetivo es acceder a sistemas de archivos a través de una red como si fueran locales. Sin embargo, utiliza un protocolo completamente diferente. NFS
se utiliza 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 rige los procedimientos en un sistema de archivos distribuido. Mientras que la versión del protocolo NFS 3.0 (NFSv3
), que ha sido utilizada durante muchos años, autentica la computadora cliente, esto cambia con NFSv4
. Aquí, al igual que con el protocolo SMB de Windows, el usuario debe autenticarse.
Versión | Características |
---|---|
NFSv2 |
Es más antigua pero es compatible con muchos sistemas y fue operada inicialmente completamente sobre UDP. |
NFSv3 |
Tiene más características, incluyendo tamaño de archivo variable y mejor reporte de errores, pero no es completamente compatible con clientes NFSv2. |
NFSv4 |
Incluye Kerberos, funciona a través de firewalls y en Internet, ya no requiere mapeadores de puertos, soporta ACLs, aplica operaciones basadas en estado y proporciona mejoras en el rendimiento y alta seguridad. También es la primera versión en tener un protocolo con estado. |
La versión 4.1 de NFS (RFC 8881) tiene como objetivo proporcionar soporte de protocolo para aprovechar las implementaciones de servidores en clúster, incluida la capacidad de proporcionar acceso paralelo escalable a archivos distribuidos en varios servidores (extensión pNFS). Además, NFSv4.1 incluye un mecanismo de trunking de sesión, también conocido como multipathing de NFS. Una ventaja significativa de NFSv4 sobre sus predecesores es que solo se utiliza un puerto UDP o TCP 2049
para ejecutar el servicio, lo que simplifica el uso del protocolo a través de firewalls.
NFS se basa en el protocolo Open Network Computing Remote Procedure Call (ONC-RPC
/SUN-RPC
) expuesto en los puertos TCP
y UDP
111
, que utiliza External Data Representation (XDR
) para el intercambio de datos independiente del sistema. El protocolo NFS no tiene mecanismo de autenticación
o autorización
. En cambio, la autenticación se traslada completamente a las opciones del protocolo RPC. La autorización se deriva de la información disponible del 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 en la sintaxis UNIX requerida de la manera más precisa posible.
La autenticación más común es a través de UID
/GID
de UNIX y las membresías de grupo
, por lo que es probable que esta sintaxis se aplique al protocolo NFS. Un problema es que el cliente y el servidor no necesariamente tienen que 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. Es por eso que NFS solo debe usarse con este método de autenticación en redes de confianza.
Default Configuration
Configurar NFS no es difícil porque 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 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.
Exports File
cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
El archivo exports
predeterminado también contiene algunos ejemplos de cómo configurar recursos compartidos NFS. Primero, se especifica la carpeta y se pone a disposición de otros, y luego se conectan los derechos que tendrán en este recurso compartido NFS a un host o una subred. Finalmente, se pueden agregar opciones adicionales a los hosts o subredes.
Opción | Descripción |
---|---|
rw |
Permisos de lectura y escritura. |
ro |
Permisos de solo lectura. |
sync |
Transferencia de datos sincrónica. (Un poco más lenta) |
async |
Transferencia de datos asincrónica. (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 comprobación de subdirectorios. |
root_squash |
Asigna todos los permisos a los archivos del root UID/GID 0 al UID/GID de anónimo, lo que impide que root acceda a archivos en un montaje NFS. |
Creemos una entrada de este tipo con fines de prueba y juguemos con las configuraciones.
ExportFS
root@nfs:~# echo '/mnt/nfs 10.129.14.0/24(sync,no_subtree_check)' >> /etc/exports
root@nfs:~# systemctl restart nfs-kernel-server
root@nfs:~# exportfs
/mnt/nfs 10.129.14.0/24
Hemos compartido la carpeta /mnt/nfs
con la subred 10.129.14.0/24
con la configuración mostrada anteriormente. Esto significa que todos los hosts en la red podrán montar este recurso compartido NFS e inspeccionar el contenido de esta carpeta.
Dangerous Settings
Sin embargo, incluso con NFS, algunas configuraciones pueden ser peligrosas para la empresa y su infraestructura. Aquí se enumeran algunas de ellas:
Opción | Descripción |
---|---|
rw |
Permisos de lectura y escritura. |
insecure |
Se usarán puertos por encima de 1024. |
nohide |
Si otro sistema de archivos se montó debajo de un directorio exportado, este directorio se exporta mediante su propia entrada de exportaciones. |
no_root_squash |
Todos los archivos creados por root se mantienen con el UID/GID 0. |
Se recomienda encarecidamente crear una máquina virtual local y experimentar con las configuraciones. Descubriremos métodos que nos mostrarán cómo se configura el servidor NFS. Para esto, podemos crear varias carpetas y asignar diferentes opciones a cada una. Luego podemos inspeccionarlas y ver qué configuraciones pueden tener qué efecto en el recurso compartido NFS y sus permisos, así como en el proceso de enumeración.
Podemos echar un vistazo a la opción insecure
. Esto es peligroso porque los usuarios pueden usar puertos por encima de 1024. Los primeros 1024 puertos solo pueden ser utilizados por root. Esto evita que los usuarios puedan usar sockets por encima del puerto 1024 para el servicio NFS e interactuar con él.
Footprinting the Service
Al realizar el reconocimiento 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 ejemplo a continuación.
Nmap
sudo nmap 10.129.14.128 -p111,2049 -sV -sC
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-19 17:12 CEST
Nmap scan report for 10.129.14.128
Host is up (0.00018s latency).
PORT STATE SERVICE VERSION
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 3 2049/udp nfs
| 100003 3 2049/udp6 nfs
| 100003 3,4 2049/tcp nfs
| 100003 3,4 2049/tcp6 nfs
| 100005 1,2,3 41982/udp6 mountd
| 100005 1,2,3 45837/tcp mountd
| 100005 1,2,3 47217/tcp6 mountd
| 100005 1,2,3 58830/udp mountd
| 100021 1,3,4 39542/udp nlockmgr
| 100021 1,3,4 44629/tcp nlockmgr
| 100021 1,3,4 45273/tcp6 nlockmgr
| 100021 1,3,4 47524/udp6 nlockmgr
| 100227 3 2049/tcp nfs_acl
| 100227 3 2049/tcp6 nfs_acl
| 100227 3 2049/udp nfs_acl
|_ 100227 3 2049/udp6 nfs_acl
2049/tcp open nfs_acl 3 (RPC #100227)
MAC Address: 00:00:00:00:00:00 (VMware)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.58 seconds
El script NSE rpcinfo
recupera una lista de todos los servicios RPC que se están ejecutando actualmente, sus nombres y descripciones, y los puertos que utilizan. Esto nos permite verificar si el recurso compartido objetivo está conectado a la red en todos los puertos requeridos. Además, para NFS, Nmap tiene algunos scripts NSE que se pueden utilizar para los escaneos. Estos pueden mostrarnos, por ejemplo, el contenido del recurso compartido y sus estadísticas.
sudo nmap --script nfs* 10.129.14.128 -sV -p111,2049
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-19 17:37 CEST
Nmap scan report for 10.129.14.128
Host is up (0.00021s latency).
PORT STATE SERVICE VERSION
111/tcp open rpcbind 2-4 (RPC #100000)
| nfs-ls: Volume /mnt/nfs
| access: Read Lookup NoModify NoExtend NoDelete NoExecute
| PERMISSION UID GID SIZE TIME FILENAME
| rwxrwxrwx 65534 65534 4096 2021-09-19T15:28:17 .
| ?????????? ? ? ? ? ..
| rw-r--r-- 0 0 1872 2021-09-19T15:27:42 id_rsa
| rw-r--r-- 0 0 348 2021-09-19T15:28:17 id_rsa.pub
| rw-r--r-- 0 0 0 2021-09-19T15:22:30 nfs.share
|_
| nfs-showmount:
|_ /mnt/nfs 10.129.14.0/24
| nfs-statfs:
| Filesystem 1K-blocks Used Available Use% Maxfilesize Maxlink
|_ /mnt/nfs 30313412.0 8074868.0 20675664.0 29% 16.0T 32000
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 3 2049/udp nfs
| 100003 3 2049/udp6 nfs
| 100003 3,4 2049/tcp nfs
| 100003 3,4 2049/tcp6 nfs
| 100005 1,2,3 41982/udp6 mountd
| 100005 1,2,3 45837/tcp mountd
| 100005 1,2,3 47217/tcp6 mountd
| 100005 1,2,3 58830/udp mountd
| 100021 1,3,4 39542/udp nlockmgr
| 100021 1,3,4 44629/tcp nlockmgr
| 100021 1,3,4 45273/tcp6 nlockmgr
| 100021 1,3,4 47524/udp6 nlockmgr
| 100227 3 2049/tcp nfs_acl
| 100227 3 2049/tcp6 nfs_acl
| 100227 3 2049/udp nfs_acl
|_ 100227 3 2049/udp6 nfs_acl
2049/tcp open nfs_acl 3 (RPC #100227)
MAC Address: 00:00:00:00:00:00 (VMware)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.45 seconds
Una vez que hayamos descubierto un servicio NFS, podemos montarlo en nuestra máquina local. Para esto, podemos crear una nueva carpeta vacía en la que se montará el recurso compartido NFS. Una vez montado, podemos navegar por él y ver el contenido como si fuera nuestro sistema local.
Show Available NFS Shares
showmount -e 10.129.14.128
Export list for 10.129.14.128:
/mnt/nfs 10.129.14.0/24
Mounting NFS Share
mkdir target-NFS
sudo mount -t nfs 10.129.14.128:/ ./target-NFS/ -o nolock
cd target-NFS
tree .
.
└── mnt
└── nfs
├── id_rsa
├── id_rsa.pub
└── nfs.share
2 directories, 3 files
There we will have the opportunity to access the rights and the usernames and groups to whom the shown and viewable files belong. Because once we have the usernames, group names, UIDs, and GUIDs, we can create them on our system and adapt them to the NFS share to view and modify the files.
List Contents with Usernames & Group Names
ls -l mnt/nfs/
total 16
-rw-r--r-- 1 cry0l1t3 cry0l1t3 1872 Sep 25 00:55 cry0l1t3.priv
-rw-r--r-- 1 cry0l1t3 cry0l1t3 348 Sep 25 00:55 cry0l1t3.pub
-rw-r--r-- 1 root root 1872 Sep 19 17:27 id_rsa
-rw-r--r-- 1 root root 348 Sep 19 17:28 id_rsa.pub
-rw-r--r-- 1 root root 0 Sep 19 17:22 nfs.share
List Contents with UIDs & GUIDs
ls -n mnt/nfs/
total 16
-rw-r--r-- 1 1000 1000 1872 Sep 25 00:55 cry0l1t3.priv
-rw-r--r-- 1 1000 1000 348 Sep 25 00:55 cry0l1t3.pub
-rw-r--r-- 1 0 1000 1221 Sep 19 18:21 backup.sh
-rw-r--r-- 1 0 0 1872 Sep 19 17:27 id_rsa
-rw-r--r-- 1 0 0 348 Sep 19 17:28 id_rsa.pub
-rw-r--r-- 1 0 0 0 Sep 19 17:22 nfs.share
Es importante tener en cuenta que si se establece la opción root_squash
, no podremos editar el archivo backup.sh
incluso como root
.
También podemos usar NFS para una escalada adicional. Por ejemplo, si tenemos acceso al sistema a través de SSH y queremos leer archivos de otra carpeta que un usuario específico puede leer, necesitaríamos subir una shell al recurso compartido NFS que tenga el SUID
de ese usuario y luego ejecutar la shell a través del usuario SSH.
Después de haber realizado todos los pasos necesarios y obtenido la información que necesitamos, podemos desmontar el recurso compartido NFS.
Unmounting
cd ..
sudo umount ./target-NFS