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.
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.
|
|
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.
|
|
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.
|
|