# 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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656177986749/dd3qJItQv.png align="left")

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178497480/orV2panfO.png align="left")

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178540202/XH_Yq90aq.png align="left")

Neste arquivo temos: 

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178561547/AzVDLBQd8.png align="left")

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178626748/jyq4Fr5Qd.png align="left")

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178673020/Y6Wd75FI6.png align="left")

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178724386/mHOdTnRYR.png align="left")

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178758963/Iwi4E5bDU.png align="left")

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

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1656178782590/7LZMwRTLL.png align="left")

