Introdução
Em sistemas Linux, o comando sudo permite que usuários comuns executem programas com os privilégios de segurança de outro usuário, geralmente o administrador root. Administradores de sistema frequentemente configuram o arquivo /etc/sudoers para permitir que usuários específicos executem certos comandos como root sem a necessidade de senha. Isso é feito geralmente por conveniência, como permitir que um desenvolvedor reinicie um servidor web ou pesquise arquivos em todo o sistema.
A lição de segurança aqui é que as regras do sudo são, na verdade, uma delegação de confiança. Se o binário delegado for mais poderoso do que o administrador imagina, a regra pode efetivamente conceder um shell em vez de apenas uma ação segura.
No entanto, esses atalhos administrativos bem-intencionados podem introduzir vulnerabilidades de segurança graves. Se um usuário tem permissão para executar um binário que possui a capacidade de executar outros comandos ou gerar um shell (como find, vim ou awk), um atacante pode abusar dessa permissão para escapar do comando restrito e obter um shell root completo. Essa técnica é comumente chamada de "shell escape" ou exploração "GTFOBins".
Neste laboratório, você assumirá o papel de um auditor de segurança. Você enumerará as permissões sudo do seu usuário atual, identificará um binário autorizado configurado incorretamente e o explorará para escalar seus privilégios para root.
Verificar Permissões Sudo (sudo -l)
Nesta etapa, você aprenderá como enumerar os privilégios sudo atribuídos à sua conta de usuário atual.
Ao avaliar um sistema Linux em busca de oportunidades de escalada de privilégios, uma das primeiras verificações é ver quais comandos o usuário atual pode executar como root. O comando sudo fornece uma flag integrada, -l (list), que exibe os comandos permitidos e proibidos para o usuário que o invoca.
Esta é uma verificação de alta prioridade, pois configurações incorretas do sudo podem fornecer uma escalada direta e de baixo atrito, com pouquíssima necessidade de suposições.
Para manter um registro de nossas descobertas, redirecionaremos a saída deste comando para um arquivo de texto dentro do nosso diretório de projeto.
Execute o seguinte comando para listar seus privilégios sudo e salvar a saída em um arquivo chamado sudo_privs.txt:
sudo -l > /home/labex/project/sudo_privs.txt
Agora, vamos visualizar o conteúdo do arquivo que você acabou de criar para analisar as permissões:
cat /home/labex/project/sudo_privs.txt
Você deve ver uma saída semelhante à seguinte:
Matching Defaults entries for labex on this host:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User labex may run the following commands on this host:
(root) NOPASSWD: /usr/bin/find
Alguns ambientes podem mostrar entradas sudo extras além da regra do find. Para este laboratório, concentre-se na linha que permite explicitamente que o labex execute /usr/bin/find como root sem fornecer uma senha (NOPASSWD). Essa configuração específica é o que visaremos nas próximas etapas.
Analisar Binários Permitidos para Escapes de Shell
Nesta etapa, você analisará o binário /usr/bin/find para entender como ele pode ser abusado para executar comandos arbitrários.
O comando find é um utilitário poderoso usado para pesquisar arquivos e diretórios em uma hierarquia de diretórios. No entanto, ele inclui um parâmetro altamente flexível chamado -exec. A flag -exec permite que o usuário execute um comando especificado em cada arquivo que o find localizar.
O problema não é que o find seja malicioso. O problema é que ele é expressivo. Qualquer binário capaz de rodar como root e que seja expressivo é um candidato para escape de shell se não for rigorosamente restringido.
A falha de segurança crítica surge quando o find é executado com sudo. Se o find estiver rodando como root, qualquer comando passado para o parâmetro -exec também será executado como root.
Vamos testar essa teoria usando o parâmetro -exec para rodar o comando whoami. O comando whoami simplesmente imprime o nome de usuário efetivo do usuário atual. Redirecionaremos a saída para um arquivo para verificar nosso contexto de execução.
Execute o seguinte comando:
sudo find . -exec whoami \; -quit > /home/labex/project/whoami.txt
Vamos analisar este comando. A parte sudo find . executa o comando find como root, iniciando a pesquisa no diretório atual (.). O segmento -exec whoami \; diz ao find para executar o comando whoami, onde o \; é necessário para encerrar a instrução -exec. Finalmente, a flag -quit instrui o find a sair imediatamente após processar a primeira correspondência, o que evita que ele execute whoami várias vezes para cada arquivo no diretório.
Agora, verifique o conteúdo do arquivo de saída:
cat /home/labex/project/whoami.txt
Você deve ver a seguinte saída:
root
Isso confirma que o comando passado para -exec foi executado com sucesso com privilégios de root.
Executar Binário com Sudo
Nesta etapa, você aproveitará a vulnerabilidade do -exec para acessar arquivos confidenciais do sistema que normalmente são restritos ao usuário root.
Um dos arquivos mais sensíveis em um sistema Linux é o /etc/shadow. Este arquivo contém os hashes de senha criptografados de todas as contas de usuário no sistema. Usuários comuns não têm permissões de leitura para este arquivo. Se um atacante puder ler este arquivo, ele poderá tentar quebrar os hashes de senha offline.
Como provamos que podemos executar comandos arbitrários como root usando sudo find, podemos usar essa técnica para ler o conteúdo de /etc/shadow.
Usaremos o comando head dentro da nossa instrução -exec para ler apenas a primeira linha do arquivo shadow (que normalmente contém o hash do usuário root) e salvá-la em nosso diretório de projeto.
Execute o seguinte comando:
sudo find /etc/shadow -exec head -n 1 {} \; -quit > /home/labex/project/shadow_head.txt
Neste comando, o {} atua como um espaço reservado que o find substitui pelo nome do arquivo que está processando no momento (neste caso, /etc/shadow).
Verifique se você extraiu com sucesso as informações confidenciais lendo o arquivo de saída:
cat /home/labex/project/shadow_head.txt
Você deve ver uma saída semelhante a esta, exibindo a entrada do usuário root do arquivo shadow:
root:*:19711:0:99999:7:::
Você contornou com sucesso as permissões do sistema de arquivos abusando da entrada sudo configurada incorretamente.
Gerar um Shell Root
Nesta etapa, você tomará a ação final para obter o comprometimento total do sistema gerando um shell root.
Embora a leitura de arquivos confidenciais seja perigosa, o objetivo final da escalada de privilégios é obter um shell interativo rodando como root. Isso concede ao atacante acesso irrestrito a todo o sistema.
Para conseguir isso, em vez de passar um comando simples como whoami ou head para o parâmetro -exec, podemos passar o caminho para um executável de shell, como /bin/bash.
Em um cenário real, um atacante executaria sudo find . -exec /bin/bash \; -quit para cair diretamente em um terminal root interativo. No entanto, para fins deste ambiente de laboratório automatizado, cair em um shell interativo pausaria a execução do laboratório.
Em vez disso, geraremos um shell bash root no modo não interativo usando a flag -c. Isso nos permite passar um comando diretamente para o novo shell root, executá-lo e salvar a prova do nosso comprometimento total do sistema. Usaremos o comando id, que fornece informações detalhadas sobre a identidade do usuário atual e as associações de grupo.
Execute o seguinte comando para gerar um shell root e registrar sua identidade:
sudo find . -exec /bin/bash -c "id > /home/labex/project/pwned.txt" \; -quit
Finalmente, leia o arquivo pwned.txt para verificar sua escalada de privilégios definitiva:
cat /home/labex/project/pwned.txt
A saída deve mostrar claramente que o shell estava rodando com IDs de usuário e grupo root:
uid=0(root) gid=0(root) groups=0(root)
Parabéns! Você explorou com sucesso um arquivo sudoers configurado incorretamente para escalar seus privilégios de um usuário comum para root.
Resumo
Neste laboratório, você explorou os riscos de segurança associados a arquivos sudoers configurados incorretamente em ambientes Linux. Você começou enumerando os privilégios sudo da sua conta de usuário e identificou que o binário find poderia ser executado como root sem senha. Ao entender a funcionalidade do parâmetro -exec do comando find, você conseguiu executar comandos arbitrários com privilégios de root. Você demonstrou o impacto dessa vulnerabilidade lendo arquivos restritos do sistema e, finalmente, gerando um shell root para obter o comprometimento total do sistema. Este exercício destaca a importância de aderir ao princípio do privilégio mínimo e auditar cuidadosamente as configurações do sudo para evitar a escalada de privilégios não autorizada.



