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
.
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 ocookie
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.
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.
Neste arquivo temos:
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.
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.
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.
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!
E agora é só substituir o novo valor do PHPSESSID e pontuar!!!
Subscribe to my newsletter
Read articles from Allan Diego directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Allan Diego
Allan Diego
I'm a full stack developer and cyber security entushiast with over 2 years of experience, and a student who spends most all of his free time playing capture the flags.