---
# System prepended metadata

title: 'Wripteup "*Le polyglotte*", Stégano, Opération Brigitte Friang, DGSE, 2020'

---

# 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