Zeecka zeecka

Step by Step

Quals Sogeti Cyber E-scape 2019 - Steg (495 pts)

Détails du challenge

EventChallengeCategoryPointsSolves
Quals Sogeti Cyber E-scape 2019Step by StepStéganographie49517

Téléchargement : Step1.wav - md5: 217f7288cf4027740dc41761e3bad9fd

Description (original)

Des fichiers sensibles de la Shadow League ont été récupérés lors du hack d’un de leurs serveurs mais le contenu est protégé par un mot de passe. D’après nos renseignements, ce mot de passe serait caché quelque part à l’intérieur d’un film de 1981 que les membres de la League avait téléchargé. Mon contact à Washington me dit que nos experts sont parvenus à isoler une séquence suspecte dans la musique du film. Cependant, malgré leurs efforts, ils n’ont rien pu en extraire. Ta mission, si tu l’acceptes, est de plonger au coeur de ce fichier audio pour en extraire le précieux sésame.

Bonne chance !

NB: Lors de l’analyse du film, nos troupes d’élite ont remarqué qu’une suite de chiffres apparaissaient à plusieurs reprises dans un coin l’image: 733051743. Ce sera peut être utile à un moment.

Le format de flag n’est pas SCE{flag}

Description [EN]

Shadow League sensitive files have been recovered during the hack of one of their servers but the content is protected by a password. According to our information, this password is hidden somewhere inside a 1981 movie that members of the League had downloaded. My contact in Washington tells me that our experts have managed to isolate a suspicious sequence in the music of the film. However, despite their efforts, they could not extract anything. Your mission, if you accept it, is to dive into the heart of this audio file to extract the precious sesame.

Good luck !

NB: During the analysis of the film, our elite troops noticed that a series of numbers appeared repeatedly in a corner of the image: 733051743. It may be useful at one point.

Flag format is not SCE{flag}.

TL;DR

Il s’agissait d’un challenge de Steganography / cryptographie « dcode ». Certaines parties étaient difficiles car il fallait trouver le bon outil.

Ante Scriptum

La première fois que j’ai résolu ce challenge, je me suis dit : une partie de ce challenge ne relevait pas vraiment de la Steganography et reposait davantage sur le fait de trouver le bon outil que sur la compréhension du procédé de dissimulation (c.-à-d. l’Étape 1). De plus, la fin du challenge n’était qu’un challenge de « dcode crypto » avec une part de guessing. Des indices étaient cachés tout au long du challenge et étaient censés nous aider. Enfin, je ne décrirai pas ici toute la partie recherche. Mes amis et moi avons beaucoup cherché/énuméré pour obtenir chaque étape. Aujourd’hui, en relisant mon propre W.U., je trouve que ce challenge était sympa grâce au nombre d’étapes, mais peut-être pas vraiment testé ?

Résolution

Étape 1

Nous avions un fichier wav nommé Step1.wav.
Lors de notre analyse de steganography, j’ai utilisé exiftool pour vérifier s’il y avait un commentaire audio, et le voici :

$exiftool Step1.wav

ExifTool Version Number         : 11.08
File Name                       : Step1.wav
Directory                       : .
File Size                       : 16 MB
File Modification Date/Time     : 2019:02:18 14:19:54+01:00
File Access Date/Time           : 2019:02:25 11:38:47+01:00
File Inode Change Date/Time     : 2019:02:25 11:36:16+01:00
File Permissions                : rw-r--r--
File Type                       : WAV
File Type Extension             : wav
MIME Type                       : audio/x-wav
Encoding                        : Microsoft PCM
Num Channels                    : 2
Sample Rate                     : 44100
Avg Bytes Per Sec               : 176400
Bits Per Sample                 : 16
Comment                         : STEP1: Buckethead, Fevrier 2002, 14
Duration                        : 0:01:35

Nous avons obtenu l’indice STEP1 :

  • STEP1: Buckethead, Fevrier 2002, 14

Cet indice mène à l’album de Buckethead Funnel Weaver sorti en février. La 14ème musique de cet album s’intitule Channel of Secrets. Après avoir essayé plusieurs techniques de steganography audio, j’ai cherché un outil de steganography wav plus spécifique sur Google. Après de nombreux repos sur Github, nous avons utilisé celui-ci : “GotchaPython - StegWav”. Fait amusant, dans le code source de StegWav, on remarque que même le développeur ne sait pas ce qu’il fait :

// Merge files / do some magic
for(int i=44,o=i-44;i<s1;i+=2,o=i-44)
    f1[i]&=254,f1[i]|=o/16<s2?(f2[o/16]>>(7-o%16/2))&1:0;

Avec cet outil, nous avons finalement obtenu un fichier contenant des données (voir Étape 2).

gcc extract.c -o extract
./extract Step1.wav Step1

Étape 2

Nous avons continué avec l’Étape 2. Le fichier était reconnu comme des données mais binwalk a identifié une image BMP dans le contenu. J’ai décidé de l’extraire avec foremost.

foremost Step1
cd output
cd bmp
mv 00000000.bmp Step2.bmp
![Step2.bmp](/files/sogeti_qual_2019/stepbystep/Step2.bmp)

La commande strings sur Step2.bmp nous a donné un autre indice (oui, encore pour STEP1 … ? Peut-être pensaient-ils à l’Étape 2 ?) :

  • STEP1: Split Enz, Novembre 1978. Bonus track: Gentle Giant, 1976, 7

La première partie correspond à la musique I see Red de Split Enz en 1978.
La seconde partie fait référence au morceau I Lost My Head de Gentle Giant, dans leur album « Interview » (1976) (7 pour la 7ème piste de l’album).

Étape 3

J’ai décidé de passer l’image dans mon outil “Aperi’Solve” qui effectue une analyse de bits. J’ai trouvé des données cachées dans le LSB rouge :

![redlsb.bmp](/files/sogeti_qual_2019/stepbystep/redlsb.bmp)

Zsteg avec l’option « all » disponible sur Aperi’Solve nous montre plusieurs données. J’ai décidé de le lancer sur mon ordinateur :

zsteg Step2.bmp --all
... [SNIP] ...
b1,r,lsb,xy         .. text: "STEP3: King Crimson, 1969, 2\r\nklesh than-zie dzeh ne-zhoni ca-yeilth shi-da wol-la-chee a-woh ah-losz dzeh\r\ndzeh besh-do-tliz be-tkah ah-jad a-chi ah-jah ah-losz a-chin tlo-chin tse-nill be-tkah n"
... [SNIP] ...
... [SNIP] ...

J’ai extrait la chaîne entière avec :

zsteg Step2.bmp -E 'b1,r,lsb,xy' > Step3
strings Step3 | head -n 3 > Step3.txt
cat Step3.txt
STEP3: King Crimson, 1969, 2
klesh than-zie dzeh ne-zhoni ca-yeilth shi-da wol-la-chee a-woh ah-losz dzeh
dzeh besh-do-tliz be-tkah ah-jad a-chi ah-jah ah-losz a-chin tlo-chin tse-nill be-tkah ne-ahs-jah be-tkah tsah tkin no-da-ih dzeh nash-doie-tso yeh-hes naki-alh-deh-da-al ah-jah a-chi ah-ya-tsinne moasi ne-zhoni toish-jeh tsah ne-zhoni shi-da be-tkah ne-ahs-jah ne-ahs-jah a-chi yeh-hes tkin yeh-hes moasi no-da-ih tkin tsa-na-dahl tse-nill lin a-woh astsanh ah-jah dibeh tse-nill tsin-tliti be-tkah cla-gi-aih ah-nah wol-la-chee a-kha klizzie tsa-na-dahl gah than-zie be-tkah tla-gin besh-do-tliz tsah tse-nill a-chi ah-losz tsin-tliti than-zie cla-gi-aih tlo-chin us-dzoh ca-yeilth ah-ya-tsinne a-keh-di-glini al-na-as-dzoh be-tkah a-woh be-tkah ah-nah yeh-hes be-tkah tsah tlo-chin tse-nill a-chi a-chin tsa-na-dahl moasi be-tas-tni yeh-hes be-tkah yeh-hes besh-do-tliz wol-la-chee be-tkah be-tkah be-tkah shi-da ba-ah-ne-di-tinin ah-tad a-chin klesh naki-alh-deh-da-al gah a-woh ah-nah be-la-sana besh-do-tliz be-tkah tsah jeha tlo-chin dah-nes-tsa no-da-ih than-zie tsin-tliti lha-cha-eh be-tkah be-tkah be-la-sana tse-nill da-ahl-zin be wol-la-chee yeh-hes klizzie#####FIN DE TRANSMISSION#####

Nous avons obtenu le 3ème indice :

  • STEP3: King Crimson, 1969, 2

Quelques recherches Google nous ont donné le titre I Talk to the Wind qui fait référence au peuple Navajo.

Nous pouvons maintenant retirer l’indice de la première ligne de Step3.txt.

Étape 4

En regardant l’indice et le texte chiffré dans Step3.txt, on peut identifier l’algorithme : le Navajo Code.

Pour le décoder, j’ai décidé de passer le texte entièrement en majuscules sans aucun saut de ligne :

KLESH THAN-ZIE DZEH NE-ZHONI CA-YEILTH SHI-DA WOL-LA-CHEE A-WOH AH-LOSZ DZEH DZEH BESH-DO-TLIZ BE-TKAH AH-JAD A-CHI AH-JAH AH-LOSZ A-CHIN TLO-CHIN TSE-NILL BE-TKAH NE-AHS-JAH BE-TKAH TSAH TKIN NO-DA-IH DZEH NASH-DOIE-TSO YEH-HES NAKI-ALH-DEH-DA-AL AH-JAH A-CHI AH-YA-TSINNE MOASI NE-ZHONI TOISH-JEH TSAH NE-ZHONI SHI-DA BE-TKAH NE-AHS-JAH NE-AHS-JAH A-CHI YEH-HES TKIN YEH-HES MOASI NO-DA-IH TKIN TSA-NA-DAHL TSE-NILL LIN A-WOH ASTSANH AH-JAH DIBEH TSE-NILL TSIN-TLITI BE-TKAH CLA-GI-AIH AH-NAH WOL-LA-CHEE A-KHA KLIZZIE TSA-NA-DAHL GAH THAN-ZIE BE-TKAH TLA-GIN BESH-DO-TLIZ TSAH TSE-NILL A-CHI AH-LOSZ TSIN-TLITI THAN-ZIE CLA-GI-AIH TLO-CHIN US-DZOH CA-YEILTH AH-YA-TSINNE A-KEH-DI-GLINI AL-NA-AS-DZOH BE-TKAH A-WOH BE-TKAH AH-NAH YEH-HES BE-TKAH TSAH TLO-CHIN TSE-NILL A-CHI A-CHIN TSA-NA-DAHL MOASI BE-TAS-TNI YEH-HES BE-TKAH YEH-HES BESH-DO-TLIZ WOL-LA-CHEE BE-TKAH BE-TKAH BE-TKAH SHI-DA BA-AH-NE-DI-TININ AH-TAD A-CHIN KLESH NAKI-ALH-DEH-DA-AL GAH A-WOH AH-NAH BE-LA-SANA BESH-DO-TLIZ BE-TKAH TSAH JEHA TLO-CHIN DAH-NES-TSA NO-DA-IH THAN-ZIE TSIN-TLITI LHA-CHA-EH BE-TKAH BE-TKAH BE-LA-SANA TSE-NILL DA-AHL-ZIN

Le Navajo code fonctionne comme une substitution monoalphabétique. J’ai écrit un petit script python pour décoder le texte chiffré. D’abord, j’ai pris l’alphabet depuis ce site mais ensuite, j’ai réussi à utiliser une partie de celui-ci qui inverse certains « E » et « ? » dans notre texte clair. De plus, j’ai eu un problème avec l’ordre des parenthèses. Voici mon script de décodage final pour l’étape 4 :

import string
    
dico = {
    "WOL-LA-CHEE":"A",
    "BE-LA-SANA":"A",
    "TSE-NILL":"A",
    "NA-HASH-CHID":"B",
    "SHUSH":"B",
    "TOISH-JEH":"B",
    "MOASI":"C",
    "TLA-GIN":"C",
    "BA-GOSHI":"C",
    "BE":"D",
    "CHINDI":"D",
    "LHA-CHA-EH":"D",
    "AH-JAH":"E",
    "DZEH":"E",
    "AH-NAH":"E",
    "CHUO":"F",
    "TSA-E-DONIN-EE":"F",
    "MA-E":"F",
    "AH-TAD":"G",
    "KLIZZIE":"G",
    "JEHA":"G",
    "TSE-GAH":"H",
    "CHA":"H", 
    "LIN":"H",
    "TKIN":"I",
    "YEH-HES":"I",
    "A-CHI":"I",
    "TKELE-CHO-G":"J", 
    "AH-YA-TSINNE":"J",
    "YIL-DOI":"J",
    "JAD-HO-LONI":"K",
    "BA-AH-NE-DI-TININ":"K",
    "KLIZZIE-YAZZIE":"K",
    "DIBEH-YAZZIE":"L", 
    "AH-JAD":"L",
    "NASH-DOIE-TSO":"L",
    "TSIN-TLITI":"M",
    "BE-TAS-TNI":"M", 
    "NA-AS-TSO-SI":"M",
    "TSAH":"N",
    "A-CHIN":"N",
    "A-KHA":"O",
    "TLO-CHIN":"O",
    "NE-AHS-JAH":"O",
    "CLA-GI-AIH":"P",
    "BI-SO-DIH":"P",
    "NE-ZHONI":"P",
    "CA-YEILTH":"Q",
    "GAH":"R",
    "DAH-NES-TSA":"R", 
    "AH-LOSZ":"R",
    "DIBEH":"S",
    "KLESH":"S",
    "D-AH":"T",
    "A-WOH":"T",
    "THAN-ZIE":"T",
    "SHI-DA":"U",
    "NO-DA-IH":"U",
    "A-KEH-DI-GLINI":"V",
    "GLOE-IH":"W",
    "AL-NA-AS-DZOH":"X",
    "TSAH-AS-ZIH":"Y",
    "BESH-DO-TLIZ":"Z",
    "NAKI-ALH-DEH-DA-AL":":",
    "TSA-NA-DAHL":",",
    "US-DZOH":"-",
    "ASTSANH":"(",
    "DA-AHL-ZIN":".",
    "DA-AHL-ZHIN":";",
    "BI-TSA":";",
    "NA-DAHL":";",
    "BE-TKAH":" "
}

cipher = """klesh than-zie dzeh ne-zhoni ca-yeilth shi-da wol-la-chee a-woh ah-losz dzeh
dzeh besh-do-tliz be-tkah ah-jad a-chi ah-jah ah-losz a-chin tlo-chin tse-nill be-tkah ne-ahs-jah be-tkah tsah tkin no-da-ih dzeh nash-doie-tso yeh-hes naki-alh-deh-da-al ah-jah a-chi ah-ya-tsinne moasi ne-zhoni 5 toish-jeh tsah ne-zhoni shi-da be-tkah ne-ahs-jah ne-ahs-jah a-chi yeh-hes tkin yeh-hes moasi no-da-ih tkin tsa-na-dahl tse-nill lin a-woh astsanh ah-jah dibeh tse-nill tsin-tliti be-tkah cla-gi-aih ah-nah wol-la-chee a-kha klizzie tsa-na-dahl gah than-zie be-tkah tla-gin besh-do-tliz tsah tse-nill a-chi ah-losz tsin-tliti than-zie cla-gi-aih tlo-chin us-dzoh ca-yeilth ah-ya-tsinne a-keh-di-glini al-na-as-dzoh be-tkah a-woh be-tkah ah-nah yeh-hes be-tkah tsah tlo-chin tse-nill a-chi a-chin tsa-na-dahl moasi be-tas-tni yeh-hes be-tkah yeh-hes besh-do-tliz wol-la-chee be-tkah be-tkah be-tkah shi-da ba-ah-ne-di-tinin ah-tad a-chin klesh naki-alh-deh-da-al gah a-woh ah-nah be-la-sana besh-do-tliz be-tkah tsah jeha tlo-chin dah-nes-tsa no-da-ih than-zie tsin-tliti lha-cha-eh be-tkah be-tkah be-la-sana tse-nill da-ahl-zin be wol-la-chee yeh-hes klizzie"""
cipher = cipher.upper().split()

out = ""
for c in cipher:
    if c in dico:
        out += dico[c]
    else:
        out += c
print(out)

Nous avons obtenu le texte clair suivant :

STEPQUATRE
EZ LIERNOA O NIUELI:EIJCP5BNPU OOIIIICUI,AHT(ESAM PEAOG,RT CZNAIRMTPO-QJVX T EI NOAIN,CMI IZA   UKGNS:RTEAZ NGORUTMD  AA.DAIG

Nous avons retiré le mot-clé « STEPQUATRE » et l’avons enregistré sous « Step4.txt ».

Étape 5

Le nouveau texte chiffré nous laisse penser que le charset était déjà correct (on pourrait calculer l’index of coincidence mais ce n’est pas nécessaire). À ce stade, mon équipe a décidé de tester de nombreux outils dcode.fr et a finalement trouvé le Columnar transposition cipher. Voici les paramètres que nous avons utilisés :

![dcode.jpg](/files/sogeti_qual_2019/stepbystep/dcode.jpg)

Sortie :

STEP5: ZEBRE ANTILOPE IGUANE, ZORRO ANTONIO IGNACIO, ZIRCONIUM ACTINIUM IRIDIUM, ZETA ALPHA IOTA :-(. EQEDUIJSAKJVAIGCXMGNP 

Nous avons obtenu l’indice de l’Étape 5 :

  • STEP5: ZEBRE ANTILOPE IGUANE, ZORRO ANTONIO IGNACIO, ZIRCONIUM ACTINIUM IRIDIUM, ZETA ALPHA IOTA :-(

Et avons enregistré EQEDUIJSAKJVAIGCXMGNP dans le fichier « Step5.txt ».

L’indice de l’Étape 5 peut être décodé en ZAI ZAI ZAI ZAI :-( ce qui fait référence à Joe Dassin - Siffler sur la colline. Ce titre fait référence au « Hill cipher ».

Étape 6

Pour cette dernière étape, nous avons utilisé le hill cipher avec notre texte chiffré EQEDUIJSAKJVAIGCXMGNP et la clé donnée au début du challenge 733051743. Nous avons utilisé l’outil dcode pour cette tâche. À noter que la clé a été placée dans une matrice 3x3, verticalement :

![dcode2.jpg](/files/sogeti_qual_2019/stepbystep/dcode2.jpg)

Flag

UGOTDAFLAGNOWGETALIFE

Zeecka & coéquipiers <3