Resolução da maquina Check do laboratório da Crowsec. Explorando Deserialização do php.
A máquina Check é disponibilizada no laboratório da Crowsec, para poder ter acesso a essa máquina é preciso ser aluno do Webhacking-na-pratica 2.0. | ||
A máquina está classificada como nível Médio e seu sistema operacional é Linux. | ||
Reconhecimento | ||
Primeira etapa é fazer o reconhecimento inicial de portas e serviços disponíveis no alvo. Para essa função escolhi utilizar a ferramenta Nmap. | ||
nmap -sS -sV -v <IP> | ||
Resultado: | ||
Agora, iniciaremos o reconhecimento do serviço web na porta 80. | ||
Iniciaremos uma varredura de arquivos que possam estar disponíveis no servidor web, utilizando a ferramenta gobuster. | ||
gobuster dir -w raft-large-files.txt -e -u http://<IP-Maquina>/ -t 100 | ||
Resultado: | ||
Encontramos um arquivo zip denominado backup.zip, fazemos o download do arquivo para nossa máquina. | ||
unzip backup.zip | ||
foi extraído um arquivo php denominado contact.php, vamos analisar seu conteúdo. | ||
Um formulário web do servidor. | ||
Acessamos a pagina via browser para verificar se ela está disponível no servidor. | ||
A página está disponível, vamos fazer o code review do contact.php para tentar encontrar alguma vulnerabilidade. | ||
Nessa parte do código mostra uma classe chamada Send, dentro da classe tem duas propriedades “send_file” e “message” e no final do código tem a função __destruct que quando for chamada salvará no diretório atual um arquivo com nome do conteúdo de “send_file” e dentro desse arquivo salvará o conteúdo de “message”. | ||
A função __destruct será chamada automaticamente quando todo o script da classe Send terminar seu processamento. | ||
Vamos continua analisando o script. | ||
No final do arquivo, o script php aceita receber dados do usuário através do parâmetro ‘check’ via método GET, porem a vulnerabilidade ocorre quando o usuário pode definir o objeto serializado na função ‘unserialize’ sem nenhum tipo de tratamento. | ||
Vamos utilizar essa vulnerabilidade para manipular os valores das propriedades “send_file” e “message”. | ||
Criei esse script que contém a classe Send com as propriedades “send_file” e “message” e no final vai retornar à serialização dessa classe. | ||
Temos nosso objeto serializado, vamos enviar para o servidor. | ||
Enviamos para o servidor. | ||
Vamos tentar acessar o arquivo poc.php que criamos no servidor e confirmar que realmente está vulnerável. | ||
Conseguimos execução de código no servidor. | ||
| ||
Exploração | ||
Alterei o script para obtermos uma web shell. | ||
Através do parâmetro “estudo” podemos executar qualquer comando no servidor. | ||
Vamos obter a nossa shell. | ||
Encodamos em base64 e enviamos para o servidor via parâmetro “estudo”. | ||
echo -n <Seu-Base64> | base64 -d | sh | ||
Resultado: | ||
Temos nossa shell no servidor. :D | ||
No diretório /opt/ encontramos nossa primeira flag. | ||
Escalação de Privilégios | ||
Excutamos o comando find / -perm -u=s -type f 2>/dev/null para encontrar por binários com SUID ativado. | ||
Encontramos o binário checker, vamos executa-lo para ver o que acontece. | ||
Retornou somente a frase “você não é root,desculpe” | ||
Vamos usar o ghidra para tentar entender como esse binário funciona. | ||
Depois de analisar todo o código, encontrei na função main, o seguinte código. | ||
Quando o binário é executado ele ler o valor da variável de ambiente chamada “i_am_root”, se for nula então ele retorna a mensagem, se não ele inicia uma shell como root. | ||
Configuramos a variável de ambiente com o valor de 1. OBS: pode ser qualquer valor. | ||
E executamos o binário. | ||
ROOT!! | ||
| ||
Segunda flag encontrada. | ||
|