Toxic - Hack the box

E ai tudo Ok? Hoje será a resolução do challenge Toxic - Hack the Box.

Obs: Para começar o reconhecimento deste desafio é necessário fazer o download dos arquivos do web site dentro da plataforma do hack the box.

Reconhecimento

Depois de fazer o download dos arquivos comecei então a navegar pela página web do site para ver se encontrava algum campo que possibilitasse a exploração de alguma vulnerabilidade, entretanto foi sem sucesso e então comecei a analisar o código em PHP. Logo de cara me deparei que a página principal do site estava sendo serializada dentro do cookie que é gerado ao carregar a página index.

image.png

Analisando previamente esse código o que ele está fazendo é:

Ao carregar a página é invocado a função spl_autoload_register que armazena uma função anônima que inclui um arquivo PHP. Após essa inclusão é verificado se existe um cookie na sessão identificado por PHPSESSID, caso não tenha será registrado utilizando a função setcookie onde:

  • PHPSSEID: é a chave de acesso para o cookie;
  • base64_encode(serialize($page)): é o conteúdo do cookie;
  • time()+60\*60\*24: é o tempo que o cookie vai durar;
  • /: é o local em que o cookie ta indexado.

Mas o mais importante neste caso é o conteúdo do cookie que possui um objeto serializado:

 Utilizando a função serialize($page) para serializar um objeto você obterá a seguinte saída: 

O:9:"PageModel":1:{s:4:"file";s:15:"/www/index.html";}

Onde: 
   O:9:"PageModel": representa o objeto serializado; 
   s:4:"file"; Representa o atributo da classe que está sendo utilizado; 
   s:15:"/www/index.html"; Representa o conteúdo do atributo file e também o arquivo que será incluído na página ao ser carregada;

E por final temos a função base64_encode que codifica em base64 a string retornada pelo serialize(). 
Representando a seguinte saída: 

Tzo5OiJQYWdlTW9kZWwiOjE6e3M6NDoiZmlsZSI7czoxNToiL3d3dy9pbmRleC5odG1sIjt9

Agora que o código está explicado fica fácil de continuar a exploração, significa então que podemos alterar essa string codificada em base64 apontando o arquivo que queremos encontrar na raiz do sistema e incluí-lo na página. Então utilizando o burp suite Community utilizei o recurso de proxy para interceptar a requisição e mandar para o repeater para conseguir enviar payloads ao servidor de uma forma mais fácil.

image.png

Dentro do repeater podemos então modificar o cabeçalho da requisição, mas antes de começarmos a injetar payloads vamos dar uma analisada no arquivo de configuração do servidor que é o nginx.conf, esse arquivo é responsável por toda a configuração do servidor.

image.png

Neste arquivo temos:

image.png

O mais interessante deste arquivo é que temos o caminho completo do arquivo de log do servidor, com isso sabemos que todo o header da requisição é registrada neste arquivo. Sabendo disso podemos visualizar o arquivo de log seguindo a mesma lógica que é codificar o objeto serializable e colocar no PHPSESSID.

image.png

Depois de codificado em base64 é necessário colocar essa string no header da aplicação e enviá-lo para o servidor nos retornando assim o arquivo de logs.

image.png

Bom, agora que sabemos que todo o header é registrado neste arquivo de log e que podemos acessar este arquivo através do payload, vamos evoluir essa exploração para execução de código remoto enviando um código em PHP através do body.

image.png

Note que o payload foi executado com sucesso e que temos um arquivo de flag no diretório raiz do sistema, podemos então usar a mesma lógica que é usada para acessar o arquivo de log para acessar o arquivo de flag!

image.png

E agora é só substituir o novo valor do PHPSESSID e pontuar!!!

image.png