Introdução Link to heading
Dando continuidade à série de postagens sobre desafios/CTFs realizados, trago a documentação da máquina Shakabrah (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 um scan de portas via nmap junto ao IP disponibilizado.
Comando: nmap -sV -p- --min-rate 10000 192.168.245.86
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).
O scan com nmap retornou um servidor web na porta 80 e um servidor SSH na porta 22. Visando facilitar o processo de análise e exploração, adicionei o IP 192.168.245.86 no arquivo /etc/hosts da máquina do atacante, atribuindo o nome shakabrah.pg ao IP.
Na sequência, enumerei o servidor web através da ferramenta dirsearch, utilizando a wordlist padrão da ferramenta dirb big.txt.
Comando: dirsearch -w /usr/share/wordlists/dirb/big.txt -x 404 -u http://shakabrah.pg
Parâmetros:
- -w permite informar uma wordlist a ser utilizada para o processo de ataque de dicionário;
- -x 404 exclui o status code 404, o que facilita a análise do output do comando;
- -u permite a informação da URL a ser analisada.
Como o resultado do dirsearch não trouxe arquivos/diretórios a serem verificados, acessei a página através do navegador:
De acordo com o título, trata-se de uma ferramenta para testar a conexão a partir do comando Ping. Ao informar o IP 127.0.0.1 (localhost) e clicar no botão Go, o usuário visualiza o resultado do comando em tela. Também é possível observar que a resposta (response) adiciona o parâmetro host na URL do site, indicando que a requisição foi feita através do método GET:
Ao analisar este comportamento, interpretei que os dados informados no input são repassados a uma função que realiza um ping junto à máquina, o que se não for sanitizado corretamente, pode servir como vetor para execução remota de código (Remote Code Execution - RCE).
Para confirmar essa hipótese, adicionei a string ;ls ao final do IP 127.0.0.1, listando o conteúdo do diretório em que a página se encontra:
Em seguida, li o arquivo /etc/passwd, passando a string ;cat /etc/passwd como parâmetro:
Também testei a possibilidade de utilizar o comando pipe para mostrar apenas o output do segundo comando, tendo sucesso na verificação da existência do binário nc no alvo, passando a string |whereis nc.
Exploração e acesso inicial Link to heading
Para preparar a máquina para uma conexão reversa, criei um listener com netcat através da ferramenta online Reverse Shell Generator, selecionando uma shell reversa do tipo nc mkfifo codificada como URL encode.
Por fim, passei a shell como parâmetro da URL via navegador, obtendo uma conexão reversa na máquina do atacante:
Parâmetros:
- rlwrap Ferramenta utilizada em conjunto ao netcat para fornecer uma shell mais estável, dando suporte a edição de linha e histórico de comandos;
- -lnvp (l) modo de escuta para conexões de entrada, (n) desabilita a resolução de DNS, (v) adiciona mais verbosidade ao comando, (p) permite a indicação da porta de escuta da ferramenta.
Uma vez com acesso à máquina, 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/dylan foi possível localizar o arquivo local.txt, contendo a flag de usuário:
Escalonamento de Privilégios Link to heading
Iniciando a análise de vetores de escalonamento de privilégios, analisei os binários que possuem o SUID bit setado.
Comando: find / -type f -perm -04000 -ls 2>/dev/null
Parâmetros:
- / indica a pesquisa a partir da raiz do sistema;
- -type f permite a pesquisa considerando apenas arquivos normais;
- -perm -04000 utilizado para filtrar arquivos com a permissão 04000, ou seja, que possuem o bit SUID setado;
- -ls permite a listagem detalhada das informações obtidas do comando find;
- 2>/dev/null permite o redirecionamento das mensagens de erro para /dev/null, removendo possíveis erros da tela.
Como resultado foi possível identificar o binário /usr/bin/vim.basic como sendo divergente do padrão de SUID que normalmente encontramos no Linux:
Ao pesquisar sobre o VIM junto ao GTFOBins, um repositório interessante de binários que possuem vetores para escalonamento de privilégios, foi possível identificar um vetor a partir da exploração do binário com SUID setado.
Comando: /usr/bin/vim.basic -c ':py3 import os; os.execl("/bin/sh", "sh", "-pc", "reset; exec sh -p")'
Parâmetros:
- -c permite a execução de um comando no Vim assim que o mesmo for iniciado;
- :py3 informa ao Vim para executar um comando Python 3;
- import os importa o módulo os do Python;
- os.execl() função usada para executar um novo programa a partir da substituição do processo atual por um novo;
- /bin/sh caminho para o programa a ser executado pelo Python;
- sh nome que será dado ao processo gerado;
- -pc (p) parâmetro utilizado para iniciar uma shell protegida/privilegiada, (c) parâmetro que permite que o shell execute o comando passado na sequência;
- reset efetua a limpeza e restauração da tela do terminal;
- exec sh -p o comando exec altera o processo atual para o shell (sh), complementado pelo parâmetro -p que mantém os privilégios do ambiente.
Como resultado, comando acessa o VIM e disponibiliza uma shell com privilégios de root. Dentro do diretório /root foi possível localizar o arquivo proof.txt, contendo a flag de root.
Conclusão Link to heading
O desafio shakabrah foi relativamente simples, onde destaco dois pontos de atenção:
- É importante gerar o comando de shell reversa codificado para garantir a interpretação de caracteres especiais;
- Como boa prática, sempre que realizo o acesso inicial a uma máquina, valido os binários com SUID bit setado pois isso pode garantir o famoso “ganho rápido” (quick win). Esse tutorial do Juggernaut Pentesting Academy traz várias formas de abusar de SUID.