NFS (Network File System)
Network File System (NFS) es un sistema de archivos de red desarrollado por Sun Microsystems y tiene la misma finalidad que SMB: acceder a sistemas de archivos a través de una red como si fueran locales. Sin embargo, utiliza un protocolo totalmente diferente. NFS se utiliza entre sistemas Linux y Unix, lo que significa que los clientes NFS no pueden comunicarse directamente con los servidores SMB. NFS es un estándar de Internet que rige los procedimientos de un sistema de archivos distribuido. Mientras que el protocolo NFS versión 3.0 (NFSv3), en uso desde hace muchos años, autentica el ordenador cliente, esto cambia con NFSv4, donde, al igual que con el protocolo SMB de Windows, el usuario debe autenticarse.
Configuración por defecto
❯ 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)rw/ro: acceso de lectura/escritura o solo lectura para el host o rango indicado.no_subtree_check: desactiva la verificación de subárbol (mejora rendimiento, pero puede reducir algo de seguridad).sync: escribe los cambios en disco antes de confirmar la operación al cliente (más seguro queasync).
Footprinting del servicio
❯ sudo nmap 172.16.57.10 -p111,2049 -sV -sC
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-19 17:12 CEST
Nmap scan report for 172.16.57.10
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-sV: detección de versión del servicio.-sC: ejecuta los scripts NSE por defecto (entre ellosrpcinfo), útil para ver de una vez qué programas RPC están registrados (mountd,nlockmgr,nfs, etc.) y en qué puertos.
Usando los scripts NSE específicos de NFS para obtener más detalle:
❯ sudo nmap --script nfs* 172.16.57.10 -sV -p111,2049
Starting Nmap 7.80 ( https://nmap.org ) at 2021-09-19 17:37 CEST
Nmap scan report for 172.16.57.10
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 172.16.57.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)nfs-ls: lista directamente el contenido del export sin necesidad de montarlo, incluyendo permisos, UID/GID y tamaños. Aquí ya se revelan archivos sensibles (id_rsa,id_rsa.pub) directamente desde el escaneo.nfs-showmount: equivalente al comandoshowmount -e, muestra qué exports existen y a qué rango de red están permitidos.nfs-statfs: información de espacio usado/disponible en el volumen exportado.
Mostrar los recursos NFS disponibles
❯ showmount -e 172.16.57.10
Export list for 172.16.57.10:
/mnt/nfs 172.16.57.0/24-e: muestra la lista de exports (recursos compartidos) disponibles en el servidor NFS indicado.
Montar un recurso NFS
❯ mkdir target-NFS
❯ sudo mount -t nfs 172.16.57.10:/ ./target-NFS/ -o nolock
❯ cd target-NFS
❯ tree .
.
└── mnt
└── nfs
├── id_rsa
├── id_rsa.pub
└── nfs.share
2 directories, 3 files-o nolock: desactiva el bloqueo de archivos (NLM), útil cuando el servidor no tiene el serviciorpc.statd/nlockmgrcorrectamente configurado y el montaje normal fallaría o se quedaría colgado.- En este ejemplo, el export raíz (
/) queda montado como si fuera una carpeta local, exponiendo directamente una clave privada (id_rsa) — un hallazgo crítico que permitiría autenticarse por SSH si se identifica a qué usuario/host pertenece.
Desmontar
❯ sudo umount ./target-NFSComandos adicionales útiles
Enumerar los mismos servicios RPC directamente con rpcinfo (sin pasar por nmap):
❯ rpcinfo -p 172.16.57.10Ver los permisos de un archivo específico dentro del export antes de montar (para saber si se puede escribir):
❯ showmount -a 172.16.57.10-a: muestra qué clientes tienen montado actualmente cada export (todos los pares host:directorio).
Copiar directamente un archivo sin montar el share (usando nfs-cat si está disponible, o simplemente montando y usando cp):
❯ cp ./target-NFS/mnt/nfs/id_rsa ./id_rsa_copiado
❯ chmod 600 id_rsa_copiado- Cuando el UID del archivo remoto coincide con un usuario válido en el servidor (por ejemplo
0para root), y NFS no aplicaroot_squash, se puede llegar a leer/escribir archivos con privilegios de root sin autenticación real — una de las configuraciones más peligrosas en NFS.