Introdução Link to heading

Iniciando a série de postagens sobre desafios/CTFs realizados por mim, trago o writeup da máquina Photographer (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 evidências 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.76

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/IP;
  • --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 comprometer a precisão dos resultados dependendo da rede).
Resultado da execução do nmap

Para facilitar o processo de análise e exploração, adicionei o IP 192.168.245.76 ao arquivo /etc/hosts da máquina de atacante, atribuindo o nome photographer.pg ao IP.

Como o nmap retornou várias portas abertas, iniciei a enumeração pelo serviço SMB (portas 139 e 445) através da ferramenta smbclient.

Comando: smbclient -L \\\\photographer.pg -N

Parâmetros:

  • -L permite a listagem de serviços disponíveis no servidor;
  • -N suprime a requisição de senha ao usuário.
Execução da enumeração do SMB

Na sequência efetuei a conexão no share sambashare utilizando credenciais nulas (null credentials):

Comando: smbclient \\\\photographer.pg\\sambashare -N

Processo de conexão ao share

Como resultado, foi possível identificar os arquivos mailsent.txt e wordpress.bkp.zip.

Após baixar o arquivo mailsent.txt e analisar seu conteúdo, foi possível identificar um usuário chamado Daisa e o e-mail daisa@photographer.com:

Visualização do arquivo mailsent.txt

O arquivo zipado wordpress.bkp.zip continha apenas uma instalação default de Wordpress que, apesar de não conter informações sensíveis, pode indicar a existência de uma instalação de Wordpress na estrutura.

Para a enumeração do servidor web (webserver) rodando na porta 80 utilizei a ferramenta dirsearch juntamente à wordlist padrão da ferramenta dirb big.txt.

Comando: dirsearch -w /usr/share/wordlists/dirb/big.txt -x 404 -u http://photographer.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.
Resultado do comando dirsearch na porta 80

O resultado do dirsearch indicou duas pastas no servidor, porém as mesmas não continham informações úteis.

Ao acessar o webserver na porta 80 foi possível identificar a seguinte tela:

Página inicial do webserver na porta 80

Dando continuidade ao processo de análise, realizei a enumeração do webserver rodando na porta 8000.

Comando: dirsearch -w /usr/share/wordlists/dirb/big.txt -x 404 -u http://photographer.pg:8000

Resultado do comando dirsearch na porta 8000

Com base no resultado do drsearch, acessei o diretório /admin via navegador para analisar seu conteúdo, onde o usuário é direcionado a um painel administrativo:

Painel administrativo do webserver na porta 8000

Exploração e acesso incial Link to heading

Inicialmente testei o processo de autenticação com dados aleatórios, monitorando as requisições através do Burp Suite, com o objetivo de identificar os parâmetros da requisição (request) e resposta (response):

Visualização da requisição via Burp Suite

Como resultado foi possível identificar que a requisição faz uma chamada ao endereço /api.php?/sessions, passando os parâmetros email e password. Caso o usuário não exista, o response retorna em formato json a mensagem User not found.. No caso da senha estar errada, o retorno de erro é: Incorrect. Try again or reset your password.

Como na fase de enumeração foi identificado o e-mail daisa@photographer.com, preparei um ataque de força bruta (brute force) através da ferramenta THC Hydra, passando como referência o e-mail, os parâmetros e o retorno de erro em caso de senha incorreta:

Comando: hydra -l daisa@photographer.com -P /usr/share/wordlists/rockyou.txt 192.168.245.76 -s 8000 http-post-form "/api.php?/sessions:email=^USER^&password=^PASS^:Incorrect. Try again or reset your password." -vv -I

Parâmetros:

  • -l permite a informação de um nome de usuário;
  • -P permite a informação de uma wordlist de senhas;
  • -s permite a informação da porta do alvo para o caso de serviços que não rodam em sua porta padrão;
  • http-post-form serviço a ser testado, nesse caso um formulário web utilizando o método POST;
  • -vv aumenta a verbosidade dos resultados apresentados em tela;
  • -I ignora a existência de um arquivo de restauração do hydra.
Resultado do ataque de força bruta

Como resultado, foi possível identificar um conjunto de credenciais válidas para o acesso administrativo à plataforma Kroken CMS. Na imagem abaixo é possível observar a tela inicial após autenticação:

Tela pós autenticação

Após explorar manualmente a plataforma, procurei por um exploit para o CMS, onde identifiquei falha que permite upload arbitrário de arquivos (autenticado): Exploit-DB - Arbitrary File Upload (Authenticated)

A referência indica que o CMS permite o upload irrestrito de arquivos a partir da manipulação da requisição. Através da identificação do diretório do webserver onde o arquivo foi inserido, o atacante pode localizar o caminho até o arquivo e executar sua webshell/reverse shell.

Na sequência criei uma backdoor em PHP e dei o nome de image.php.jpg:

Geração do backdoor em PHP

Efetuei o upload do arquivo através do botão Import content (canto inferior direito) do menu Library panel:

Detalhamento da área de upload de arquivos

Através da interceptação da requisição via Burp Suite, editei o conteúdo do parâmetro name (linha 18) e o conteúdo do parâmetro filename (linha 44), mudando ambos para image.php e dei encaminhamento (forward) a requisição:

Detalhamento da requisição sendo manipulada via Burp

Após essa alteração, selecionei o arquivo enviado ao servidor, e no menu Inspector (lateral direita), cliquei com o botão direito do mouse na opção Download File, copiando o link do arquivo:

Detalhamento de como pegar o link do arquivo

Ao colocar o endereço do arquivo no navegador e passar o comando whoami como valor do parâmetro cmd, foi possível confirmar a execução remota de código (Remote Code Execution - RCE) através de uma webshell:

Acesso a webshell via navegador

Para preparar a máquina para uma conexão reversa, gerei um listener de netcat através da ferramenta online Reverse Shell Generator, selecionando uma reverse shell do tipo nc mkfifo codificada como URL encode. Por fim, passei a shell como parâmetro da URL via navegador.

Processo de geração da reverse shell
força bruta

  • 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 a análise manual do sistema de arquivos em busca de artefatos que possam contribuir com a exploração.

Dentro do diretório /home/daisa foi possível localizar o arquivo local.txt, contendo a flag de usuário:

Diretório /home/daisa e flag de user

Escalonamento de Privilégios Link to heading

Iniciando a análise de vetores de escalonamento de privilégios (privilege escalation), listei os usuários que possuem terminal ativo:

Comando: cat /etc/passwd | grep "/bin/bash"

Visualização de usuários com shell

Na sequência fiz a análise de binários que possuem o SUID bit setado. Referência sobre escalonamento de privilégios com SUID.

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 a partir do find;
  • 2>/dev/null permite o redirecionamento das mensagens de erro para /dev/null, removendo possíveis erros da tela.
Visualização de binários com o SUID bit setado

No resultado acima, o binário do PHP em /usr/bin/php7.2 chamou a atenção por não ser um binário que comumente tem esse tipo de permissão. Através do site GTFOBins, um repositório muito interessante de binários que possuem vetores para escalonamento de privilégios, foi possível identificar como explorar a permissão de SUID para escalonar privilégios.

Comando: /usr/bin/php7.2 -r "pcntl_exec('/bin/sh',['-p']);"

Parâmetros:

  • -r permite a execução de código PHP através da linha de comando;
  • pcntl_exec() é uma função PHP que permite executar o programa especificado na função substituindo o processo que chamou a própria função;
  • /bin/sh programa que será executado para substituir o processo PHP;
  • -p parâmetro utilizado para iniciar uma shell protegida/privilegiada.
Processo de escalonamento de privilégios

Como resultado foi possível escalonar privilégios para o usuário root.

Dentro do diretório /root, foi possível localizar o arquivo proof.txt, contendo a flag final (root) do desafio:

Visualização da flag de root

Conclusão Link to heading

O desafio Photographer foi tranquilo de ser realizado, onde destaco alguns pontos de atenção:

  • Percebi que, após o ataque de força bruta com hydra, a senha da conta de e-mail também estava disponível no arquivo mailsent.txt de uma forma sutil, reforçando a importância de uma enumeração minuciosa e de “mente aberta”.
  • O processo de encoding da reverse shell é importante para garantir que os caracteres especiais sejam interpretados pelo webserver, a etapa de identificar essa necessidade me tomou um tempo a mais.
  • Ler por completo e tentar entender o que um determinado exploit faz é importante não somente para garantir uma exploração com sucesso, mas também ajuda a criarmos um “arsenal” de técnicas e procedimentos para esse tipo de desafio.