Skip to content

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

c
❯ 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 que async).

Footprinting del servicio

c
❯ 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 ellos rpcinfo), ú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:

c
❯ 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 comando showmount -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

c
❯ 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

c
❯ 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 servicio rpc.statd/nlockmgr correctamente 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

c
❯ sudo umount ./target-NFS

Comandos adicionales útiles

Enumerar los mismos servicios RPC directamente con rpcinfo (sin pasar por nmap):

c
❯ rpcinfo -p 172.16.57.10

Ver los permisos de un archivo específico dentro del export antes de montar (para saber si se puede escribir):

c
❯ 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):

c
❯ 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 0 para root), y NFS no aplica root_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.