UfoCTF 2013 | Broken Brokoli [Write Up]

Cette épreuve était constituée d’une archive ZIP à télécharger. Dans cette dernière, il y avait une deuxième archive, mais cette fois-ci de type RAR. Cette archive contenait un fichier on ne peut plus intéressant, intitulé flag.bmp.
Problème : elle était protégée par un mot de passe. L’idée de bruteforcer n’était pas à envisager puisque dans la présentation de l’épreuve, il était clairement dit : « It will take several millions of years to bruteforce the aliens’ password, whatever the capacity of your computer is. »

La décompression de la première archive (brokenarchive.zip) s’est passée sans problème, alors que celle de la deuxième (flag.rar), nous avions une erreur.

┌ Not@Found[~/CTF/UFOCTF/BROKENBROKOLI]
└ $ unrar e -p- flag.rar

UNRAR 3.93 freeware Copyright (c) 1993-2010 Alexander Roshal
Extracting from flag.rar
thisisnotbruteforce
Extracting flag.bmp 98%
Encrypted file: CRC failed in flag.bmp (password incorrect ?)
Total errors: 1

De plus, le titre faisant référence à une archive corrompue, nous nous sommes concentrés sur l’archive flag.rar.

Nous avons donc essayé de nombreuses choses (modification du FileCRC, des headers, du MHD_PASSWORD, j’en passe et des meilleures), le tout en s’appuyant sur le format RAR ( https://kthoom.googlecode.com/hg-history/3692beb6984b410fb38a94f79e059e894a022f1b/docs/unrar.html ).

Ou encore de tenter de dump la mémoire puisque 98% de l’archive était tout de même extraite. Enfin, nous avons également tenté de réparer l’archive brokenarchive.zip ou flag.rar, ou encore d’extraire malgrè les erreurs :


┌ Not@Found[~/CTF/UFOCTF/BROKENBROKOLI]
└ $ rar e -kb -p- flag.rar
#Extraction malgré la corruption (-kb)
#Le fichier BMP extrait reste corrompu et illisible

┌ Not@Found[~/CTF/UFOCTF/BROKENBROKOLI]
└ $ rar r flag.rar

RAR 3.93 Copyright (c) 1993-2010 Alexander Roshal 15 Mar 2010
Shareware version Type RAR -? for help

Building fixed.flag.rar
Scanning...
Data recovery record not found
Reconstructing flag.rar
Building rebuilt.flag.rar
Found flag.bmp
Done

# Tentative de réparer l'archive RAR.
# Ça ne servait à rien, elle reste corrompue de la même façon

┌ Not@Found[~/CTF/UFOCTF/BROKENBROKOLI]
└ $ zip -FF brokenarchive.zip --out repair

 Fix archive (-FF) - salvage what can
 Found end record (EOCDR) - says expect single disk archive
 Scanning for entries...
 copying: flag.rar (3407 bytes)
 copying: (3455 bytes)
 Central Directory found...
 EOCDR found ( 1 7095)...

#Ici, on essaye de réparer l'archive ZIP, en vain

Voyant que cela ne donnait rien de concluant, nous avons pris du recule et envisagé un nouvel angle d’attaque.
En effet, lors de la décompression de bronkenarchive.zip, nous obtenions flag.rar qui, à l’aide d’un hexdump, se finissait par O{#*D.={.@... Cette chaîne représente la fin de l’archive RAR, et donc le fichier ZIP aurait du se finir de la même façon, suivi du footer du format ZIP.
Une recherche de cette chaîne dans brokenarchive.zip et nous l’avons retrouvé. Cependant, elle n’était pas située à la fin, mais quasi au milieu, suivie d’une suite d’octet commençant par PK\x03\x04. BINGO, c’est un nouvel header d’un fichier ZIP. Une deuxième archive ZIP était cachée là.

Cette étape porte sur le fait d’extraire cette 2e archive, et de la décompresser en même temps. L’archive RAR contenant une image, nous avons donc privilégié la recherche d’une image BMP dans cette archive cachée.

Ce petit script php permets d’extraire l’archive .zip cachée, tout en extrayant de façon non chalante son contenu :


<?php
 $s = file_get_contents('brokenarchive.zip');
 // Récupération de la deuxième archive .zip
 $s = explode("PK\x03\x04", $s);
 $s = $s[2];
 // On n'affiche pas les erreurs que chie gzinflate au long du "brute-force"
 error_reporting(0);
 // Test de toutes les possibilites de gzinflate... tres sale
 $u = 'BM';
 for($i = 0; $i < strlen($s); $i++)
     $u .= gzinflate(substr($s, $i));
 // On match l'header d'un .bmp
 $u = explode('BM', $u);
 $u = $u[1];
 echo $u;
 // Enregistrement dans un fichier
 file_put_contents('pwnd.bmp', $u);
 ?>

Nous obtenons alors une image pwnd.bmp, que voici :


La police est du wingdings. Pour faire la correspondance, on peut utiliser WORD (lol) ou http://speakingppt.com/wp-content/uploads/2011/10/wingdings-webdings-character-map-speakingppt.pdf

Ce qui donne #Ed&3m@cd0c!
Ce password sert à décompresser l’archive flag.rar.


┌ Not@Found[~/CTF/UFOCTF/BROKENBROKOLI]
└ $ unrar e flag.rar

UNRAR 3.93 freeware Copyright (c) 1993-2010 Alexander Roshal
Extracting from flag.rar
thisisnotbruteforce
Enter password (will not be echoed) for flag.bmp: #Ed&3m@cd0c!
Extracting flag.bmp OK
All OK

Finalement, nous obtenons bien le flag.bmp.

C’est a nouveau du wingdings, nous réitérons donc l’étape de transcription.

Enfin, nous obtenons le flag :

flag is helloearthlings!!!!!!!!!

Have fun bande de terriens.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s