# Wripteup "*Le polyglotte*", Stégano, Opération Brigitte Friang, DGSE, 2020 --- ## **Présentation du challenge** --- **Énoncé** *Nous avons intercepté un fichier top secret émanant d'Evil Country, il est très certainement en rapport avec leur programme nucléaire. Personne n'arrive à lire son contenu. Pouvez-vous le faire pour nous ? Une archive était dans le même dossier, elle peut vous servir.* ## **Avant de commencer** --- On nous donne donc deux ressources téléchargeables. Un fichier PDF : `message.pdf` et une archive ZIP: `secrets.zip` (pas très discret...) Commencons donc par les analyser brievement. ## **Le PDF** --- Voici la belle tête de notre PDF une fois ouvert. A premiere vue, il n'y a de visible que `Top secret`, ainsi que des lignes verticales accentuées vers le bas du document. ![](https://i.imgur.com/467muUa.png) J'ai alors pensé à du texte "compressé", lisible par extension du document. Mais apres un petit coup de souris, on se rend vite compte que ces lignes.... sont en réalité des lettres! ### Texte dissimulé --- Apres quelques tentatives de `CTRL+A`, nous arrivons à copier le texte suivant: ``` Ce document concerne l operation soleil atomique. Cette operation est strictement confidentielle et ne doit en aucun cas Œtre devoilee. Les informations sur l operation sont disseminØes dans ce fichier. Chaque partie de l information est identifiee par un nombre par ex : [0]ae7bca8e correspond a la premiŁre partie de l information qu il faut concatener au reste. Top Secret ``` Nous avons donc les informations suivantes : - Nous devons trouver des morceaux de hash, sous la forme `[n]<hash>` - Les informations sont **toutes** cachées dans le pdf Essayons donc de pousser l'analyse du PDF. ### Binwalk --- Appelons donc notre meilleur ami le haricot marcheur (ou la poubelle pour les puristes) : **[Binwalk](https://https://github.com/ReFirmLabs/binwalk)** Nous allons ici utiliser **Binwalk** pour nous afficher d'éventuels éléments autres dans notre **PDF** ![](https://i.imgur.com/zOmgX6R.png) Et.... Bingo ! Nous avons donc du `Html` dans notre document. Ouvrons donc notre document avec l'éditeur de texte de l'élite, VIM. `> vim message.pdf` ![](https://i.imgur.com/h7KkKT1.png) > 5..4..3..0 et après paf ! pastèque.. Des l'ouverture, nous remarquons bien notre code HTML, contenant du javascript ! Ne nous réjouissons pas trop tôt, continuons notre analyse. Un peu plus bas, nous avons affaire à une petite chaine de valeurs Héxadécimales. Celle ci se trouve encadrée de balises `Stream`, permettant d'afficher des éléments sur le pdf. Cependant je n'ai pas le souvenir d'avoir extrait du texte de cette taille ! ![](https://i.imgur.com/gUw8iPC.png) Ni une ni deux, je la passe dans un convertisseur, ce qui nous donne : `[1]4d862d5a` Nous avons notre second bout de hash ! Binwalk m'a indiqué 2 headers html, mais je n'en ai trouvé qu'un. Trouvons le 2e. ![](https://i.imgur.com/KswV7by.png) > Il s'agit de la suite du script trouvé plus haut, car on y retrouve sa variable *flag* Premiere idée qui me vient en tête : reproduire à l'identique le script :clown_face: ![](https://i.imgur.com/c776dJp.png) Mhhh.. étrange. Cela ne ressemble pas aux genre de flags que je recherche. Et si je retirait la boucle `for()` de mon script ? après tout je ne sais pas ce qu'elle a à faire ici ! ![](https://i.imgur.com/1g6uBox.png) Bachibouzouk ! Ca marche ! `[0]aa938a16` est donc notre premier bout de hash, le vrai cette fois ci ! Apres de mutliples décorticages du pdf, je n'ai rien trouvé de croustillant à utiliser. Je décide donc de m'attaquer au... ### Fichier zip --- Nous avons en notre possession un fichier zip protégé par un mot de passe *(eh oui, ce serait trop simple sinon...)* Pour le coup, on ne m'a donné aucune indication et c'est un chall offline donc... **DICTIONNARY ATTACK** ### frackzip Je vais utiliser [fcrackzip](https://github.com/hyc/fcrackzip/) pour tenter de retrouver le mot de passe. Par question d'habitude, [rockou.txt](https://www.scrapmaker.com/download/data/wordlists/dictionaries/rockyou.txt) est le meilleur des compromis `fcrackzip -u -D -p /home/kali/Desktop/Tools/rockyou.txt secrets.zip` Et en 2'5 chrono, mon mot de passe est trouve : `finenuke` ![](https://i.imgur.com/Fp5kcTy.png) > Etonnant pour un dossier contenant des informations sur un programme nucléaire... --- J'ai donc après extraction de mon archive `zip` deux nouveaux éléments : - Un fichier .txt nommé `info.txt` - Une image nommée `hint.png` Observons d'abord notre fichier texte. > Ange Albertini > > Ange Alnertini est un ingénieur réputé pour ses présentations sur la cryptographie. > key='\xce]`^+5w#\x96\xbbsa\x14\xa7\x0ei' > iv='\xc4\xa7\x1e\xa6\xc7\xe0\xfc\x82' >> Nous avons ici une clé, en héxadécimale avec des petits caractères ascii dedans :thinking_face: >>Aincis qu'une iv, initiales d'*Initialization vector*. [En savoir + sur les iv](https://cryptography.fandom.com/wiki/Initialization_vector) > **[3]4037402d4** > >Bingo : Notre quatrieme bout de hash ! Il ne nous en reste qu'un à trouver. Accrochons nous. ![](https://i.imgur.com/tYxGfnp.gif) ### La photo --- Notre photo est claire et nette : ![](https://i.imgur.com/jKToPo9.png) **Un blowfish !** Evidemment, nous ne sommes pas là pour parler d'animaux marins ! Nous avons eu une clé et un iv, la prochaine étape a forcément un lien avec la cryptographie (Ça commencait à manquer...) Nous pouvons donc imaginer qu'il va falloir utiliser [blowfish](https://en.wikipedia.org/wiki/Blowfish_(cipher)) ! ### Encryption Time ! --- Faisons un rapide point : nous possedons un **PDF** que l'on nous décrit comme contenant tous nos bouts de hash, une **clé** et un **iv** Apres quelques recherches, il m'a l'air compliqué (voir impossible) de décrypter le `pdf` Je vais donc aller à contre-sens et l'encrypter ! > J'appelle mon meilleur ami le serpent pour encrypter la sardine à l'huile Avant cela, je dois remettre en ordre ma `key` ! **On passe donc de cela :** *\xce]`^+5w#\x96\xbbsa\x14\xa7\x0ei* **à cela :** *\xce\x5d\x60\x5e\x2b\x35\x77\x23\x96\xbb\x73\x61\x14\xa7\x0e\x69* ```python=1 from Crypto.Cipher import Blowfish from struct import pack pedefe = "" key = b'\xce\x5d\x60\x5e\x2b\x35\x77\x23\x96\xbb\x73\x61\x14\xa7\x0e\x69' iv = b'\xc4\xa7\x1e\xa6\xc7\xe0\xfc\x82' bs = Blowfish.block_size cipher = Blowfish.new(key, Blowfish.MODE_CBC,iv) plaintext = open('message.pdf', "rb") pedefe = plaintext.read() msg = cipher.encrypt(pedefe) outputtext = open('cuisson','wb') outputtext.write(msg) ``` Une fois executé, **BOOM** ! On dirait bien que la cuisson s'est mal passée... ![](https://i.imgur.com/xB29aZV.png) Bon, à part un joli champignon on nous donne rien d'autre. Rappelons donc notre ami fidèle... J'ai bien cité ### Binwalk --- Encore une fois nous n'avons pas d'information complémentaire, nous allons donc les trouver nous même ! `binwalk cuisson` ![](https://i.imgur.com/bLwL1VE.png) > Yeahhh, du **ELF** ! Je me disais bien que ce ctf manquait de reverse... Je n'ai pas envie de me prendre la tête à tout analyser, je vais utiliser `binwalk` afin d'extraire le *main* de mon fichier `binwalk --dd=".*" cuisson` ![](https://i.imgur.com/jKVJy8a.png) Et voilà ! Nous avons notre magnifique *main* extrait et prête à etre décortiqué. Je vais utiliser [Cutter](https://cutter.re), un outil bien pratique pour analyser les fonctions Celle-ci m'a tapé à l'œuil ![](https://i.imgur.com/N4SBFvV.png) > Réduisons à la partie à ce que nous devons analyser ![](https://i.imgur.com/c8L53Ro.png) **Ce qui nous intéresse est le fameux `arg1`** Nous pouvons voir qu'une vérification caractère par caractère est effectuée Mais un élément saute également aux yeux : `arg[9] == 0x34` A chaque étape, une vérification du type [**XOR**](https://fr.wikipedia.org/wiki/Fonction_OU_exclusif) est effectuée entre les caracteres seuls. Nous n'avons plus qu'à mettre la pain à la patte et remonter toutes ces conditions une par une ! `Notre arg[n] trouvé est ici en gras` > 0x34 *xor* **0x32** = 6 > 0x32 *xor* **0x64** = 0x56 > 0x64 *xor* **0x34** = 0x50 > 0x34 *xor* **0x63** = 0x57 > 0x63 *xor* **0x33** = 0x50 > 0x33 *xor* **0x65** = 0x56 > 0x65 *xor* **0x5d** = 0x38 > 0x5d *xor* **0x32** = 0x6f > 0x32 *xor* **0x5b** = 0x69 Nous avons désormais toutes nos valeurs, les voici remises à l'endroit: > 5b 32 5d 65 33 63 34 64 32 34 Passons les au [convertisseur ASCII](https://www.binaryhexconverter.com/hex-to-ascii-text-converter) et voyons ce que ca donne... ![](https://i.imgur.com/RQcAG99.png) Remettons désormais notre hash dans l'ordre. Je les rapelle : > [0]aa938a16 > [1]4d862d5a > [2]e3c4d24 > [3]4037402d4 Notre précieux hash est donc **aa938a164d862d5ae3c4d244037402d4** ![](https://i.imgur.com/CtPNDsl.png) Un grand merci à **MrR0bot**, le spécialiste des Poissons --- ###### J'y crois moyen