##                       ##

########           ########

############   ############

 ###########   ########### 

   #########   #########   

"@_    #####   #####    _@"

#######             #######

############   ############

############   ############

############   ############

######    "#   #"    ######

 #####               ##### 

  #####             #####  

    ####           ####    

       '####   ####'       

D
O

N
O
T

F
E
E
D

T
H
E

B
U
G
S

Mess Of Hash

[Internetwache CTF, 2016]

category: web

by kree

  • Category: web
  • Points: 60
  • Description:

Students have developed a new admin login technique. I doubt that it's secure, but the hash isn't crackable. I don't know where the problem is...

  • Hint (README.txt):
<?php
$admin_user = "pr0_adm1n";
$admin_pw = clean_hash("0e408306536730731920197920342119");
function clean_hash($hash) {
    return preg_replace("/[^0-9a-f]/","",$hash);
}
function myhash($str) {
    return clean_hash(md5(md5($str) . "SALT"));
}

Writeup

The website shows a login form with a user and a password field. From the given hint in the README file we can assume that we need to find a value for the password field that gets us through the following check:

md5(md5($str) . "SALT")) == "0e408306536730731920197920342119"

In order to solve this challenge we could look for a md5 collision, but in this case there's an easier way: The == operator offers some exploitable magic in php. As described here 1, a string that starts with 0e will be interpreted as a float and converted to 0. So, one needs to find a $str such that md5(md5($str) . "SALT")) starts with 0e and thats it :)

The following script

<?php
$i = 0;
do{
    $i++;
} while(md5(md5(strval($i))."SALT") != "0e408306536730731920197920342119");
echo $i;
?>

yields 62778807 after a few seconds, which we can use as a password.

Flag: IW{T4K3_C4RE_AND_C0MP4R3}

1 https://news.ycombinator.com/item?id=9484757

/writeups/ $

$