Affichage des articles dont le libellé est stegano. Afficher tous les articles
Affichage des articles dont le libellé est stegano. Afficher tous les articles

lundi 2 juillet 2012

NDH 2k12 - SETIHZV Analysis (1500 pts)

Voici le writeup d'une épreuve de Stegano (avec un peu de crypto aussi) qui se distingue des autres de part son originalité.

Description

HZV antennas just caught an intergallactic troll.

On récupère le fichier trololo.txt qui contient la chaîne de caractères suivante :

 

 Analyse

On pourrait penser en premier lieu que les O représentent des 0 et les L des 1 et qu'on se trouve en présence de la représentation binaire d'un long texte. Néanmoins, on se rend vite compte que les premiers octets ne donne rien de probant en terme de code ascii.
On regarde alors plus en détails la description de l'épreuve, il est question de SETI et de message intergalactique.
SETI signifie Search for Extra-Terrestrial Intelligence. Il s'agit de détecter des signaux provenant de l'espace, on peut donc orienter nos recherches dans cette direction car il semblerait que le fichier trololo.txt contiennent un message de ce type.

On finit par tomber sur un article wikipedia au sujet du message d'Arecibo : il s'agit d'un message radio émit vers l'espace formé de 1679 nombres binaires et contenant des informations sur la Terre et l'humanité.

Ce message doit être mis sous la forme d'un rectangle de 23 sur 73 pour que les différentes parties qu'il contient soient visibles.
On peut donc faire une analogie avec notre message et essayer de faire apparaître des informations en modifiant la disposition des caractères.

Réorganisation du message

Le message contient 3360 caractères qui ne sont quasiment que des O ou des L : les autres caractères étant le T et le R en début de message. Ces derniers ne représentent d’ailleurs probablement pas d’information dans le message lui-même.

On constate en effet qu’en retirant ses deux caractères on obtient un total de 3358 caractères qui est divisible par 23 comme l’était le nombre de bits envoyés dans le message d’Arecibo.

Pour plus de clarté dans la distinction entre O et L, on peut remplacer ces derniers respectivement par . et M.

Voici ce qu’on peut voir en réorganisant le message sous la forme d’un rectangle de 23 sur 146 :


Cool ! On sait qu'on est sur la bonne voie. On trouve également les lettres HZV à la fin et entre les 2 on a 3 motifs différents qu'il va falloir décoder.


Décodage du premier motif


Si on revient à notre fameux message d'Arecibo, on voit que l'une des premières choses intégrée dans son contenu est une représentation des nombres de 1 à 10 :

1 2 3 4 5 6 7 8  9  10
----------------------
0 0 0 1 1 1 1 00 00 00
0 1 1 0 0 1 1 00 00 10
1 0 1 0 1 0 1 01 11 01
X X X X X X X X  X  X 

Chaque nombre est codé sur 3 bits sauf 8, 9 et 10 qui le sont sur 6 et des marqueurs sont présents au-dessous pour montrer la position de chaque nombre.

On retrouve bien cette disposition dans notre motif et on remarque que les nombres sont rangés par couple, on obtient la suite de nombres suivante en décodant chaque séquence de 3 bits : 41 45 53 32 35 36 43 42 43.

Il s'agit de la représentation hexadécimale des codes ascii de neuf caractères qui forment la chaîne : AES256CBC.

On connaît donc l'algorithme de chiffrement utilisé pour les données qu'on récupérera dans les autres motifs.

Décodage du deuxième motif


Le deuxième motif semble relativement proche du premier sauf qu'on peut remarquer la présence de certains bits à 1 collés à la représentation d'un nombre sur 3 bits (voir les encadrés rouges). Pas de panique ! Il s'agit simplement de la représentation d'un nombre sur 6 bits comme dans le message d'Arecibo pour les nombres 8, 9 et 10.

Dans ce motif, on peut donc distinguer 19 couples de nombres qui formeront 19 octets représentés en hexadécimal. On va coder les nombres de 0 à 7 sur 3 bits et les nombres de 8 à 15 (F) sur 6 bits.

On obtient la séquence suivante :
21 24 28 23 77 45 70 61 57 4F 69 4F 70 33 34 63 33 3D 2F

On peut supposer qu'il s'agit de la clé utilisée par l'AES pour crypter les données contenues dans le dernier motif.

Voici la clé obtenue après transposition en caractères ascii : !$(#wEpaWOiOp34c3=/

Décodage du troisième motif


La répartition des M et des . fait penser à la représentation binaire d'une chaîne de caractères. Voyons ce qu'on obtient en remplaçant les M par des 1 et les . par des 0 :


Ceci est la représentation binaire de la chaîne suivante:
U2FsdGVkX1+Xf+XkdKdwY/tXQaQ2FGzjl83fNPsmcM0DxgTdp0aDUEoMK81j9dlr

Il s'agit du codage en base64 des données chiffrées par l'AES, la chaîne de caractères  U2FsdGVkX1+ placée au début est caractéristique de l'utilisation d'un salt, son décodage donne : Salted__

On a maintenant tous les éléments pour récupérer le flag : l'algorithme de chiffrement utilisé, la clé et les données chiffrées.

Déchiffrement du flag

Un petit coup d'openssl sur tout ça devrait permettre d'avoir le flag.
On tape la commande suivante :

echo U2FsdGVkX1+Xf+XkdKdwY/tXQaQ2FGzjl83fNPsmcM0DxgTdp0aDUEoMK81j9dlr | openssl enc -a -d -salt aes-256-cbc -k !$(#wEpaWOiOp34c3=/

ça marche pas !!!!!!!!!!  On a pourtant tout bien récupéré et décodé, est-ce qu'on aurait oublié un caractère dans la clé ?
D'ailleurs elle est un peu étrange cette clé, on pourrait lire We pawn in peace (wEpaWNiNp34c3) si on remplaçait les O par des N. Ceci revient à remplacer 4F par 4E dans la représentation hexadécimale de la clé (peut être une erreur dans le challenge lors de la création du deuxième motif).

Finalement, on tente la commande :

echo U2FsdGVkX1+Xf+XkdKdwY/tXQaQ2FGzjl83fNPsmcM0DxgTdp0aDUEoMK81j9dlr | openssl enc -a -d -salt aes-256-cbc -k !$(#wEpaWNiNp34c3=/

Et on obtient : un_______gros_______flag

On peut valider avec grand plaisir cette belle épreuve du wargame NDH 2k12 avec le md5 du flag.
 

Liens

dimanche 1 juillet 2012

NDH 2k12 Wargame - Enigmes de S4nch0 #1


  
Salut à tous ! 

Voici un petit writeup pour une épreuve de Stegano du wargame public.

Description

On récupère l'image suivante :

  
Analyse de l'image

On remarque d'emblée le motif qui se répète dans le fond de l'image qui ressemble un peu à un QR-code.
 

On constate que ce motif est composé de carrés blancs et noirs : 8 en largeur et 6 en hauteur. Le nombre 8 nous invite à considérer que les carrés représentent des bits et que nous avons donc 6 octets. En attribuant la valeur 0 aux carrés blancs et 1 aux carrés noirs, on obtient les codes ascii de six caractères qui forment le mot : S4NCH0.

Le flag de l'épreuve est le md5 de S4NCH0 : 975186cff0a2bfd07862175d40fa36ff

mercredi 21 septembre 2011

CTF Hack.lu 2011 - Unknown Planet

Hello tout le monde !

un petit writeup sur un challenge de CTF Hack.lu 2011.

Description
We got this file. Can you find the name of this planet?
Voici l’image qu’on peut télécharger en cliquant sur le lien :



1. Analyse

Comme l’indique la description du challenge, un nom de planète se cache quelque part dans cette image Jpeg.
On commence par ouvrir l’image avec un éditeur héxadécimal (Hex Workshop ici) et on remarque très vite une chose troublante.
En effet, le code héxadécimal d’une image Jpeg commence toujours par FF D8 et se termine toujours par FF D9. Voici ce qu’on peut observer avec cette image :
Début du code hexadécimal


Fin du code hexadécimal



Le code débute bien par FF D8 mais par contre les deux octets FF D9 ne sont pas présents à la fin du code. En faisant, une recherche sur ces 2 octets, on parvient néanmoins à les trouver.


On vient de trouver la fin du code hexadécimal servant à la représentation de l’image. Tout ce qui suit pourrait être supprimé sans que cela n’ait d’impact sur l’image elle-même.
Ce code hexadécimal supplémentaire mérite donc qu’on se penche dessus pour y dénicher quelque info confidentielle comme le nom d’une planète par exemple.
On récupère donc ce code et on l’insère dans une nouvelle page de l’éditeur pour une analyse plus poussée. Voici un extrait du code :


On remarque deux choses :
  • - Des chaînes de 13 caractères se terminant toutes par UT (encadrées en bleu).
  • - La présence des caractères PK tout au long du code (entourés en rouge).
Les caractères PK sont caractéristiques des fichiers zip : Ce sont les initiales de Phil Katz, le créateur du format.
On peut donc enregistrer notre code hexadécimal en tant que fichier .zip pour voir ce qu’on obtient.

2. Travail sur l'archive Zip

L’archive nouvellement créée contient 9 fichiers dont les noms rappellent les chaînes de caractères mentionnées plus haut.



Si on ouvre le premier avec notepad voici ce qu’on peut voir :


L’entête nous indique qu’il s’agit d’un fichier wav. On l’enregistre alors en tant que tel et on le lance avec VLC par exemple.
On entend clairement le début d’un code Morse (un point et deux traits) et on se doute qu’il va falloir concaténer les 9 fichiers dans le bon ordre afin d’obtenir l’enregistrement complet en Morse censé nous révéler le nom de cette planète (du moins on l’espère).
On connaît déjà le premier fichier : celui qui contient l’entête, mais on sait aussi que le dernier est celui dont la taille est nettement inférieure à celle des autres (on a 8 fichiers de 20 000 octets et un seul de 1324 octets).
On remarque que cet ordre est respecté lorsqu’on classe les fichiers par ordre décroissant selon la valeur de la colonne « Compressé » dans Winrar (voir capture plus haut).
On peut alors penser qu’il faudra tester deux possibilités à cause des deux fichiers à 72.
Pourtant les enregistrements ne donnent rien de probant : ils comportent notamment des coupures brèves qui nous amènent à penser que cette façon d’ordonner les fichiers n’était pas la bonne.

3. Analyse des blocs de code hexadécimal récurrents

On va alors se placer à un niveau plus bas en ouvrant les 9 fichiers dans Hex Workshop pour analyser le code hexadécimal plus en détail.
On remarque que les 9 fichiers sont composés de deux types de blocs :
1er type de bloc (Bloc A)


2ème type de bloc (Bloc B)


Si compte le nombre d’octets qui composent chacun de ces blocs dans les 9 fichiers, on constate qu’on a deux tailles possibles pour chaque bloc. Le bloc A peut faire 5761 octets ou 1921 octets alors que le bloc B peut faire 5759 octets ou 1919 octets.
On va pouvoir reconstituer ce puzzle en regardant la taille des blocs A et B inachevés en début et fin de fichiers et en cherchant le bloc complémentaire à chacun qui donnera un bloc total correspondant à l’une des tailles possibles.
Cette séance de collage nous donnera l’ordre de fichiers suivants :
  1. uvlSlG3Tgow
  2. 5IIUED7GheR
  3. rySOWi4fZkA
  4. 87F1s5POUJc
  5. 6JXtwsTTh9k
  6. Uw105aD3qYh
  7. BPiIOASG_Z6
  8. Yui5oq58hlx
  9. nLPA8X0UJqf
On concatène alors ces 9 fichiers dans un seul qu’on enregistre en tant que fichier wav.
Maintenant place au décodage !!!!


4. Décodage

L’enregistrement est plutôt net et on obtient facilement le code Morse suivant :
.--. …. . .. -.- -.-- --- …
On décode alors le mot de 8 lettres : PHEIKYOS
On connaît enfin le nom de notre planète et on valide ce challenge en rentrant le flag : Pheikyos.

5. Tools

  • Hex Workshop
  • Winrar
  • Notepad
  • VLC

6. Référence