# 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.

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**

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`

> 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 !

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.

> 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:

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 !

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`

> 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.

### La photo
---
Notre photo est claire et nette : 
**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...

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`

> 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`

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

> Réduisons à la partie à ce que nous devons analyser

**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...

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**

Un grand merci à **MrR0bot**, le spécialiste des Poissons
---
###### J'y crois moyen