Introdução Link to heading
Dando continuidade à série de postagens sobre desafios realizados, trago a documentação da máquina SunsetDecoy (nível Fácil/Easy), disponível gratuitamente no Proving Grounds Play.
Para quem não está familiarizado, os desafios do tipo Capture The Flag (CTF) envolvem máquinas vulneráveis que têm como objetivo testar as habilidades dos participantes em identificar e explorar essas falhas. Os competidores devem encontrar flags (bandeiras), que são provas de que conseguiram comprometer com sucesso os alvos designados.
Enumeração Link to heading
Para iniciar o processo de enumeração, realizei uma varredura de portas via nmap junto ao IP disponibilizado.
Comando: nmap -sV -p- --min-rate 10000 192.168.177.85
Parâmetros:
- -sV permite a identificação dos serviços/versões que estão rodando nas portas que forem identificadas como abertas (open);
- -p- permite o scan de todas as 65.535 portas TCP;
- --min-rate 10000 informa ao nmap para tentar enviar no mínimo 10000 pacotes por segundo, como uma tentativa de acelerar a análise (pode impactar a precisão dos resultados).
A varredura com nmap retornou um servidor web na porta 80 e um servidor SSH na porta 22. Ao acessar o servidor web via navegador, foi possível identificar que não existe um arquivo index.php ou index.html, visto que a página mostrou seu índice (Index of):
Também foi possível identificar a existência do arquivo save.zip. Ao clicar nele, o mesmo é baixado:
Ao analisar seu tipo através do comando file, foi possível confirmar como sendo um zip. Ao tentar descompactar o arquivo, uma senha é solicitada, e também é possível ver que os arquivos compactados aparentemente se referem a um sistema linux:
Exploração e acesso inicial Link to heading
Para tentar quebrar esta senha, será utilizada a ferramenta zip2john, que faz parte da ferramenta John the Ripper.
Comando: zip2john save.zip > hash
Como resultado, a seguinte hash é gerada:
Na sequência, rodei a ferramenta john utilizando a wordlist rockyou.txt através do parâmetro --wordlist, juntamente com o arquivo de hash gerado anteriormente:
Em posse da senha, foi possível fazer a descompactação do arquivo:
Ao analisar o arquivo passwd, foi possível identificar o usuário 296640a3b825115a47b68fc44501c828:
Ao analisar o arquivo shadow, foi possível identificar tanto a hash do usuário 296640a3b825115a47b68fc44501c828, quanto do usuário root:
Em posse da entrada de passwd e shadow do usuário, utilizei a ferramenta unshadow (também presente ao instalar o John) para concatenar ambas:
Após um processo de sanitização no arquivo, deixando as entradas para os usuários 296640a3b825115a47b68fc44501c828 e root, rodei a ferramenta hashcat.
Comando: hashcat -m 1800 unshadow /usr/share/wordlists/rockyou.txt --show
Parâmetros:
- -m modo da hash, utilizado para definir o tipo de hash que que será ingerida, nesse caso, sha512crypt (unix);
- –show usado para mostrar as hashes que foram quebradas.
Como resultado do processo de cracking, foi possível identificar a senha para o usuário 296640a3b825115a47b68fc44501c828.
Como existe um serviço SSH rodando, efetuei a conexão à máquina através deste serviço:
Como o usuário 296640a3b825115a47b68fc44501c828 recebeu uma shell limitada do tipo rbash, efetuei o processo de “breakeout” dessa shell através da definição de um terminal junto à conexão SSH. Passando o parâmetro -t e o binário bash foi possível realizar o bypass:
Ao tentar ler um arquivo, foi notado que o comando cat não estava disponível, justificado pela falta do caminho (path) do binário na variável de ambiente PATH:
Para corrigir, executei o comando abaixo, que adiciona os caminhos de binários mais comuns à variavel PATH:
Comando: export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Uma vez com acesso à máquina e com uma shell que fornece acesso aos principais binários, iniciei o processo de análise manual do sistema de arquivos em busca de artefatos que possam contribuir com a minha exploração.
Dentro do diretório /home/296640a3b825115a47b68fc44501c828 foi possível localizar o arquivo user.txt, contendo a flag de usuário:
Escalonamento de Privilégios Link to heading
Ainda dentro da pasta do usuário, foi possível notar um binário chamado honeypot.decoy, ao rodar o mesmo, a opção 5 chamou a atenção pelo seu comportamento, que indica que um scan de Antivirus será iniciado m um minuto ou menos:
Após executá-lo, aparentemente nada aconteceu, porém, ao analisar os processos da máquina através da ferramenta pspy, que possibilita o usuário ‘bisbilhotar’ os processos sem a necessidade de root, foi possível notar a execução de um programa chamado chkrootkit:
Ao pesquisar na internet sobre o Chkrootkit na versão 0.49, foi possível identificar a possibilidade de executar um escalonamento de privilégios local, conforme indicado nessa documentação.
Conforme indicado no link, se um atacante sabe da execução constante do chkrootkit, seja por meio de um cronjob, seja por meio de outro script, e o atacante tem acesso à pasta temporária /tmp, ele pode utilizar da falha existente para executar um arquivo denominado update como root:
Para explorar, criei um arquivo com o nome update contendo uma shell reversa e um listener de netcat:
Após esperar um minuto, recebi uma conexão como usuário root:
Dentro do diretório /root foi ppossível localizar o arquivo proof.txt, contendo a flag de root:
Conclusão Link to heading
O desafio SunsetDecoy foi relativamente simples, mas destaco alguns pontos de atenção:
- A parte de exportar um novo valor para a variável de ambiente PATH foi algo novo para mim, sendo uma técnica muito interessante de se ter em seu arsenal de “guerra”;
- Na parte de escalonamento de privilégios, ficou evidenciada a importância de sempre testar/validar as descobertas, pois somente através da execução da opção 5 do binário honeypot.decoy é que foi possível identificar a execução do chkrootkit.