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

lundi 11 mars 2013

Prequals NDH 2k13 – Fappers Gonna Fap – Crypto 200 pts

Voici le write-up d'une des épreuves de crypto des prequals de la NDH 2k13. Au menu, du XOR, du format BMP et du Python ! 

Description

On nous fournit le fichier dafuq.bmp et un script python encrypt.py.
L'épreuve va consister à décoder l'image Bitmap qui a apparemment été chiffrée en utilisant le script python.

Analyse du script

On va regarder d'un peu plus près encrypt.py histoire de voir si on peut le reverse pour récupérer l'image d'origine.
Une classe BitmapFile est définie dans laquelle on trouve une fonction très intéressante :


On remarque que les données binaires de l'image sont xorées avec une clé de longueur 337 dont les valeurs des octets sont pris aléatoirement entre 0 et 255. L'algorithme n'est donc pas réversible mais il doit être possible de récupérer la clé en utilisant les caractéristiques du format BMP.

Récupération de la clé

La structure d'une image Bitmap est composée de plusieurs en-têtes et options en plus des données de l'image. On trouve notamment le Bitmap File Header et le DIB Header qui vont permettre de stocker des informations sur l'image.

On va alors pouvoir recomposer le File Header de l'image d'origine en utilisant notamment le fait que plusieurs champs sont communs à toutes les images BMP. Ensuite comme il s'agit d'un simple XOR il suffira de xorer les octets trouvés avec ceux de dafuq.bmp pour avoir le début de la clé (le File Header fait 14 octets).

Par exemple, on sait déjà que l'en-tête va commencer par les octets 42 4D qui sont en fait les caractères B et M. Le champ suivant qui occupe 4 octets contient la taille du fichier qui sera donc la même que dafuq.bmp c'est-à-dire 2993058 octets soit 2DABA2 en héxadécimal. Par ailleurs les données étant stockées en Little Endian on obtient A2AB2D00 pour ces 4 octets du File Header.
Les 4 octets suivants sont réservés et généralement à 0 et les 4 d'après représentent l'adresse de départ des données de l'image qui commencent habituellement après le File Header (14 octets) et le DIB Header (40 octets). On obtient donc la valeur 54 soit 36 en héxadécimal stockées sous la forme 36000000.

On arrive ensuite sur le premier champ du DIB Header qui est en fait invariable puisqu'il s'agit de la taille du Header soit 40 octets. On a donc la valeur héxadécimale 28 stockées sur 4 octets : 28000000.

Pour le moment, nous avons reconstruit les 18 premiers octets de l'image :
424DA2AB2D00000000003600000028000000

Nous pouvons donc d'ores et déjà les xorer avec les 18 premiers octets de l'image chiffrée pour obtenir le début de la clé.

Après avoir xoré tout ça, on obtient le début de clé suivant :
C31AD80D5C84E09149D9E19A79164A18338B
A ce stade, on sait que ça ne sert à rien de continuer à reconstruire les en-têtes car la clé est censé faire 337 octets ce qui est largement supérieur à la taille des en-têtes (54 octets).

Il va donc falloir utiliser le début de la clé pour en déduire le reste.

On peut légitimement supposer que les données de l'image d'origine contiennent par endroit des séquences de 0 qui une fois xorées avec la clé donneront des parties de la clé dans l'image chiffrée.

On va donc rechercher dans les données de l'image chiffrée toutes les occurrences de la séquence C31AD80D5C84E09149D9E19A79164A18338B.

On trouve de nombreuses occurrences de cette séquence dont 2 sont montrées au-dessus.
On constate qu'à chaque fois ces séquences sont séparées de 319 octets identiques ce qui nous donne des blocks de 337 octets soit la longueur de la clé utilisé lors du XOR.

On dirait bien qu'on vient juste de récupérer notre fameux « keystream ».

Décodage

On a tout ce qu'il faut pour décoder le fichier dafuq.bmp et obtenir l'image de départ.
On fait un petit script python qui va xorer les données binaires de dafuq.bmp avec la clé de 337 octets ci-dessous :

C31AD80D5C84E09149D9E19A79164A18338B1E78446DB8B8D25431071C320DE6231EBB0E882351217666AAB9209DD00AD142B10F45DE0AA522B3459A14523A5F01DC5ECC67F62584FB7064B7832AC9FC43CA8A299189F5818B8BE7970034600C3317A44883F7CB77060460FFE8048DF4CBF6AA60DCB73229BD0444504715614F43CE360B852B846D43B606B69F257672E02DAF7BC40554B5121A8A6D9AB933F28F8A9D95858CA7AFE947D63C979445B645DE920E9A7EE5F6F065AB7529E6DE1EDE9DFFA50F32632E4C9EE30E088238C106E385EA6C8B2296D7F485A171E7A8EE163B24E6BDCEF979490BF1839EA5773275D83D8583AFF2E6A5279A7DB36CBD1914B91389820E6576B84E832FFEC4184846E59980096FEBE28ED66FB08637D40530DCBE3AC481F38EEB04E00FB4F60F13B047343BC230F200C2419F4271E2584508BE3B56164F522060DA23D0DDCD97055C

On obtient alors l'image suivante :


On valide l'épreuve avec le flag : ecb_mode_is_weak_mofo

Liens

http://en.wikipedia.org/wiki/BMP_file_format

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

jeudi 29 septembre 2011

CTF Quals CSAW 2011 - Crypto (1 à 10)

Salut à tous !

On continue avec les writeups du CSAW CTF. Voici les 10 épreuves de crypto, 1900 pts en tout.

Crypto1

Texte chiffré :

87 101 108 99 111 109 101 32 116 111 32 116 104 101 32 50 48 49 49 32 78 89 85 32 80 111 108 121 32 67 83 65 87 32 67 84 70 32 101 118 101 110 116 46 32 87 101 32 104 97 118 101 32 112 108 97 110 110 101 100 32 109 97 110 121 32 99 104 97 108 108 101 110 103 101 115 32 102 111 114 32 121 111 117 32 97 110 100 32 119 101 32 104 111 112 101 32 121 111 117 32 104 97 118 101 32 102 117 110 32 115 111 108 118 105 110 103 32 116 104 101 109 32 97 108 108 46 32 84 104 101 32 107 101 121 32 102 111 114 32 116 104 105 115 32 99 104 97 108 108 101 110 103 101 32 105 115 32 99 114 121 112 116 111 103 114 97 112 104 121 46

On reconnaît rapidement qu’il s’agit de code ascii mais plutôt que de se lancer dans un décodage à la main, on préférera utiliser le site de Paul Schou (http://home2.paulschou.net/tools/xlate/
) qui va nous permettre de décoder tout ça rapidement. Voilà ce qu’on obtient après décodage :

Welcome to the 2011 NYU Poly CSAW CTF event. We have planned many challenges for you and we hope you have fun solving them all. The key for this challenge is cryptography.

On rentre donc le flag
cryptography et on valide l’épreuve.

Crypto2

Texte Chiffré :

54:68:69:73:20:69:73:20:74:68:65:20:66:69:72:73:74:20:6d:65:73:73:61:67:65:20:62:65:69:6e:67:20:73:65:6e:74:20:74:6f:20:79:6f:75:20:62:79:20:74:68:65:20:6c:65:61:64:65:72:73:68:69:70:20:6f:66:20:74:68:65:20:55:6e:64:65:72:67:72:6f:75:6e:64:20:55:70:72:69:73:69:6e:67:2e:20:49:66:20:79:6f:75:20:68:61:76:65:20:64:65:63:6f:64:65:64:20:74:68:69:73:20:6d:65:73:73:61:67:65:20:63:6f:72:72:65:63:74:6c:79:20:79:6f:75:20:77:69:6c:6c:20:6e:6f:77:20:6b:6e:6f:77:20:6f:75:72:20:6e:65:78:74:20:6d:65:65:74:69:6e:67:20:77:69:6c:6c:20:62:65:20:68:65:6c:64:20:6f:6e:20:57:65:64:6e:65:73:64:61:79:20:40:20:37:70:6d:2e:20:57:65:20:77:69:6c:6c:20:61:6c:73:6f:20:72:65:71:75:69:72:65:20:61:20:6b:65:79:20:74:6f:20:62:65:20:6c:65:74:20:69:6e:74:6f:20:74:68:65:20:6d:65:65:74:69:6e:67:73:3b:20:74:68:69:73:20:77:65:65:6b:1f:73:20:6b:65:79:20:77:69:6c:6c:20:62:65:20:6f:76:65:72:74:68:72:6f:77:2e

Cette fois, il s’agit de code héxadécimal. Chaque paire de chiffre permet de coder un nombre entre 0 et 255 qui pourra représenter le code ascii d’un caractère.
On fait encore appel à Paul Schou pour un décodage rapide et voici le texte déchiffré :
This is the first message being sent to you by the leadership of the Underground Uprising. If you have decoded this message correctly you will now know our next meeting will be held on Wednesday @ 7pm. We will also require a key to be let into the meetings; this week¬s key will be overthrow.

On récupère le flag
overthrow qui valide l’épreuve.

Crypto3

Texte chiffré :

0100110001100001011100110111010000100000011101110110010101100101011010110111001100100000011011010110010101100101011101000110100101101110011001110010000001110111011000010111001100100000011000010010000001100111011100100110010101100001011101000010000001110011011101010110001101100011011001010111001101110011001011100010000001010111011001010010000001110011011001010110010101101101001000000111010001101111001000000110001001100101001000000110011101100101011011100110010101110010011000010111010001101001011011100110011100100000011000010010000001101100011011110111010000100000011011110110011000100000011000100111010101111010011110100010000001100001011000100110111101110101011101000010000001110100011010000110010100100000011011010110111101110110011001010110110101100101011011100111010000101110001000000101010001101000011001010010000001101011011001010111100100100000011001100110111101110010001000000110111001100101011110000111010000100000011101110110010101100101011010110111001100100000011011010110010101100101011101000110100101101110011001110010000001101001011100110010000001110010011001010111001101101001011100110111010001100001011011100110001101100101001011100010000001001001011001100010000001110100011010000110010101110010011001010010000001101001011100110010000001100001011011100111100101101111011011100110010100100000011001010110110001110011011001010010000001111001011011110111010100100000011010110110111001101111011101110010000001101111011001100010000001110100011010000110000101110100001000000110110101100001011110010010000001100010011001010010000001101001011011100111010001100101011100100110010101110011011101000110010101100100001000000110100101101110001000000110101001101111011010010110111001101001011011100110011100100000011000100111001001101001011011100110011100100000011101000110100001100101011011010010000001110100011011110010000001110100011010000110010100100000011011010110010101100101011101000110100101101110011001110010000001110100011010000110100101110011001000000111011101100101011001010110101100101110001000000100100101110100001000000111011101101001011011000110110000100000011000100110010100100000011010000110010101101100011001000010000001110011011000010110110101100101001000000111010001101001011011010110010100101100001000000111001101100001011011010110010100100000011100000110110001100001011000110110010100101110

On a du code binaire : chaque octet (8 bits) va représenter le code ascii d’un caractère. Une fois n’est pas coutume, on va chez Paul Schou pour un décodage rapide et dans les règles :
Last weeks meeting was a great success. We seem to be generating a lot of buzz about the movement. The key for next weeks meeting is resistance. If there is anyone else you know of that may be interested in joining bring them to the meeting this week. It will be held same time, same place.

Le flag
resistance valide l’épreuve.

Crypto4

Texte chiffré :

VGhhdCBtZWV0aW5nIHdhcyBhIGxpdHRsZSBjcmF6eS4gV2UgaGF2ZSBubyBpZGVhIHdoZXJlIHRob3NlIGd1eXMgaW4gdGhlIGJsYWNrIHN1aXRzIGNhbWUgZnJvbSwgYnV0IHdlIGFyZSBsb29raW5nIGludG8gaXQuIFVzZSB0aGUga2V5IGluZmlsdHJhdGlvbiBmb3IgbmV4dCB3ZWVrknMgbWVldGluZy4gU3RheSB3aXRoIHRoZSBjYXVzZSBhbmQgd2Ugd2lsbCBzdWNjZWVkLg==

Ça ressemble comme deux gouttes d’eau à de la base 64, je vous laisse deviner chez qui on va décoder ça rapidement. Voici le texte déchiffré :
That meeting was a little crazy. We have no idea where those guys in the black suits came from, but we are looking into it. Use the key infiltration for next week?s meeting. Stay with the cause and we will succeed.

On valide avec le flag
infiltration.

Crypto5

Texte chiffré :

JR UNIR QVFPBIRERQ GUNG BHE YNFG GUERR GENAFZVFFVBAF JR'ER RNFVYL QRPVCURERQ. JR UNIR GNXRA PNER BS GUR CNEGL ERFCBAFVOYR SBE GURVE RAPBQVAT NAQ NER ABJ HFVAT N ARJ ZRGUBQ. HFR GUR VASBEZNGVBA CEBIVQRQ NG YNFG JRRX.F ZRRGVAT GB QRPVCURE NYY ARJ ZRFFNTRF. NAQ ERZRZORE, GUVF JRRX.F XRL VF BOSHFPNGRQ.

Le texte chiffré fait penser à un chiffrement par décalage (chiffre de César) ou un chiffrement par substitution.

On va regarder ce que ça donne si on considère qu’il s’agit d’un chiffrement par décalage.
L’un des plus célèbres chiffrements de ce type est le Rot13 qui consiste à remplacer chaque lettre de l’alphabet par celle qui se trouve 13 lettres plus loin dans ce même alphabet (on revient à A quand on dépasse Z). On décale les lettres du texte chiffré de 13 et voilà le résultat :
WE HAVE DISCOVERED THAT OUR LAST THREE TRANSMISSIONS WE'RE EASILY DECIPHERED. WE HAVE TAKEN CARE OF THE PARTY RESPONSIBLE FOR THEIR ENCODING AND ARE NOW USING A NEW METHOD. USE THE INFORMATION PROVIDED AT LAST WEEK.S MEETING TO DECIPHER ALL NEW MESSAGES. AND REMEMBER, THIS WEEK.S KEY IS OBFUSCATED.

On obtient le flag
obfuscated.

Crypto6

Texte chiffré :

PYB DRO XOHD WOODSXQ LO CEBO DY ECO UOI WKXUSXN. DROBO RKFO LOOX CYWO QBOKD SNOKC PVISXQ KBYEXN YEB WOODSXQC KC YP VKDO. DRO KEDRYBSDI GSVV QY YFOB CYWO YP DROW DY COO SP DROI PSD SXDY YEB KQOXNK.

Comme pour l’épreuve précédente, on a probablement affaire à un décalage ou une substitution. On commence par le décalage et après quelques essais, on trouve que le chiffrement utilisé est le Rot10 (On peut utiliser le site suivant pour tester les décalages : http://www.apprendre-en-ligne.net/crypto/cesar/).

Voici le texte déchiffré :
FOR THE NEXT MEETING BE SURE TO USE KEY MANKIND. THERE HAVE BEEN SOME GREAT IDEAS FLYING AROUND OUR MEETINGS AS OF LATE. THE AUTHORITY WILL GO OVER SOME OF THEM TO SEE IF THEY FIT INTO OUR AGENDA.

Le flag de cette épreuve est donc
mankind.

Crypto7

Texte chiffré :

VAOZM HPXC YZGDWZMVODJI OCZ VPOCJMDOT CVN YZXDYZY OCVO OCZMZ DN JIZ DYZV RCDXC RZ RDGG OVFZ PK VN KVMO JA JPM XVPNZ. OJ CZVM HJMZ VWJPO DO, WZ NPMZ OJ VOOZIY OCZ IZSO HZZODIB, PNZ OCZ FZT BZIZMVODJI OJ BZO DI. OCZMZ DN HPXC KGVIIDIB IZZYZY OJ WZ YJIZ, WPO DA RZ XVI ZSZXPOZ OCZ KGVI RZ RDGG WZ AMZZY.

Comme pour les deux épreuves précedentes, on commence par tester le chiffrement par décalage et cette fois-ci il s’agit d’un Rot21. On obtient ceci :
AFTER MUCH DELIBERATION THE AUTHORITY HAS DECIDED THAT THERE IS ONE IDEA WHICH WE WILL TAKE UP AS PART OF OUR CAUSE. TO HEAR MORE ABOUT IT, BE SURE TO ATTEND THE NEXT MEETING, USE THE KEY GENERATION TO GET IN. THERE IS MUCH PLANNING NEEDED TO BE DONE, BUT IF WE CAN EXECUTE THE PLAN WE WILL BE FREED.

On valide avec le flag
generation.

Crypto8

Texte chiffré :

EKEMQ XI LEWI CIESQIH ULEU BVS USEQTPMTTMBQT ESI FIMQK PBQMUBSIH. ET E SITVCU XI ESI GLEQKMQK ULI IQGSDAUMBQ PIULBH EKEMQ. ULI QIX OID JBS QIYU PIIUMQK XMCC FI ABCDKBQ. MU MT MPAISEUMWI ULEU DBV ECC EUUIQH ECC PIIUMQKT JSBP LISI BQ MQ.

Sur ce texte chiffré, les décalages ne donnent rien, il s’agit donc certainement d’un chiffrement par substitution : on va remplacer une lettre de l’alphabet par une autre lettre du même alphabet. On va établir un nouvel alphabet qui contiendra les mêmes lettres que l’alphabet classique mais qui sera organisé autrement.

Pour retrouver l’alphabet de substitution, on va faire une analyse de la fréquence des lettres. Dans la langue anglaise, la lettre la plus fréquente est le E. Si on applique cette hypothèse sur le texte chiffré on obtient que le I doit remplacer le E. Maintenant, on sait que le mot de trois lettres le plus fréquent en anglais est THE, on va donc regarder si un mot de trois lettres se terminant par I apparaît plusieurs fois. Bingo ! On a deux fois le mot ULI et en plus on récupère ULEU qui doit dans ce cas être THAT. On résume ce qu’on a trouvé : I=E, U=T, L=H et E=A.

Voyons ce que ça donne en remplaçant dans le texte chiffré (lettres trouvées en minuscule) :

aKaMQ Xe haWe CeaSQeH that BVS tSaQTPMTTMBQT aSe FeMQK PBQMtBSeH. aT a SeTVCt Xe aSe GhaQKMQK the eQGSDAtMBQ PethBH aKaMQ. the QeX OeD JBS QeYt PeetMQK XMCC Fe ABCDKBQ. Mt MT MPAeSatMWe that DBV aCC atteQH aCC PeetMQKT JSBP heSe BQ MQ.

On peut déjà deviner quelques mots : par exemple au début si on remplace le X et le W par W et V, on obtient we have. De plus, on voit qu’on a presque deux fois le même mot à une lettre près PeetMQK et PeetMQKT ce qui nous fait penser immédiatement au mot MEETING (avec et sans S à la fin) qui est d’ailleurs présent dans la plupart des textes déchiffrés des épreuves précédentes. On a donc X=W, W=V, P=M, M=I, Q=N, K=G et T=S. On remplace :

again we have CeaSneH that BVS
tSansmissiBns aSe Feing mBnitBSeH. as a SesVCt we aSe Ghanging the enGSDAtiBn methBH again. the new OeD JBS neYt meeting wiCC Fe ABCDgBn. it is imAeSative that DBV aCC attenH aCC meetings JSBm heSe Bn in.

A présent, on peut deviner des bouts de phrases à partir des mots représentés en rouge :

  • Transmissions are being
  • We are changing
  • Next meeting will be
  • Attend all meetings
  • Here on in

On récupère S=R, B=O, F=B, G=C, Y=X, C=L, H=D. De plus, here on in est la fin d’une expression bien connue : FROM here on in. Le mot de quatre lettres précédent est donc surement FROM. On a alors J=F.

Un alphabet de substitution est généralement construit en écrivant les lettres d’un mot clé que l’on fait suivre par les lettres restantes de l’alphabet classique mis dans l’ordre. Cette théorie semble être corroborée par le mot ABCDgBn qui contient le 4 premières lettres de l’alphabet consécutivement. En tenant compte des déductions précédentes, on peut transformer ce mot en AolDgon. On pense au mot polygon qui nous donnerait ABCD=POLY. On sait déjà que EFGH=ABCD. On est donc maintenant sûr que le mot clé utilisé pour former l’alphabet de substitution est POLY.
On obtient alors l’alphabet suivant :POLYABCDEFGHIJKMNQRSTUVWXZ. On peut déchiffrer entièrement le texte :
AGAIN WE HAVE LEARNED THAT OUR TRANSMISSIONS ARE BEING MONITORED AS A RESULT WE ARE CHANGING THE ENCRYPTION METHOD AGAIN THE NEW KEY FOR NEXT MEETING WILL BE POLYGON IT IS IMPERATIVE THAT YOU ALL ATTEND ALL MEETINGS FROM HERE ON IN

Le flag est
polygon.

Crypto9

Texte chiffré :




XI VQHISTUEQH ULEU ULMT XMCC FI QB IETD UETO UB IYIGVUI EQH ULEU XI ESI ETOMQK E CBU JSBP ECC BJ DBV. XI HB QBU JEVCU EQD PIPFIST JBS CIEWMQK, XI ESI FIUUIS BJJ XMULBVU ULBTI XIEO CMQOT. ULI ACEQQMQK TUEKI MT QBX BWIS. ULI OID JBS BVS JMQEC PIIUMQK MT JEXOIT. SIEHD DBVSTICWIT. ULI UMPI LET GBPI JBS VT UB FI JSIIH.

On remarque d’emblée que plusieurs mots du cryptogramme de l’épreuve précédente sont présents : XI, ULI, ULEU, JSBP, PIIUMQK et quelques autres. Est ce qu’ils auraient utilisé le même alphabet de substitution ? On regarde ce que ça donne :
WE UNDERSTAND THAT THIS WILL BE NO EASY TASK TO EXECUTE AND THAT WE ARE ASKING A LOT FROM ALL OF YOU. WE DO NOT FAULT ANY MEMBERS FOR LEAVING, WE ARE BETTER OFF WITHOUT THOSE WEAK LINKS. THE PLANNING STAGE IS NOW OVER. THE KEY FOR OUR FINAL MEETING IS FAWKES. READY YOURSELVES. THE TIME HAS COME FOR US TO BE FREED.

Le flag
fawkes valide.

Crypto10

Texte chiffré :

LQBN XBEE IG HWV EDNL LVDCNSBNNBHC. ZHW'MG DEE VGKGBMGO ZHWV DNNBPCSGCLN. BA ZHW DVG DIEG LH KHSTEGLG ZHWV LDNR VGTEZ IDKR LH WN WNBCP LQG RGZXHVO AVHS LQBN GCKVZTLBHC DEPHVBLQS DN ZHWV RGZ. JWNL VGSGSIGV LQDL LQBN BN DEE AHV LQG PVGDLGV PHHO.

On a probablement encore affaire à un chiffrement par substitution. En tout cas, les différents décalages (chiffre de César) possibles ne donne rien.
L’analyse des fréquences nous donne G=E et on remarque plusieurs occurrences de LQG et LQBN ainsi qu’un LQDL. On sait que G=E, on peut donc penser que LQG=THE, et on peut alors en déduire LQDL=THAT et LQBN=THIS. On obtient L=T, Q=H, G=E, D=A, B=I et N=S.
On remplace dans le texte chiffré :

this XiEE Ie HWV East tVaCsSissiHC. ZHW'Me aEE VeKeiMeO ZHWV assiPCSeCts. iA ZHW aVe aIEe tH KHSTEete ZHWV tasR VeTEZ IaKR tH Ws WsiCP the ReZXHVO AVHS this eCKVZTtiHC aEPHVithS as ZHWV ReZ. JWst VeSeSIeV that this is aEE AHV the PVeateV PHHO.

On Remarque quelques mots intéressants : East, tasR, aVe, aEE et tVaCsSissiHC.
Pour tasR, la seule possibilité semble être task, on a donc R=K. En revanche East pourrait donner past, fast, last ou cast mais on constate que le E est utilisé en double dans aEE. La seule solution est E=L.
Ensuite, le mot tVaCsSissiHC fait penser à un mot déjà présent dans certains cryptogrammes précédents : transmission. On aurait V=R, C=N, S=M et H=O. Cette hypothèse donnerait aussi aVe=are ce qui paraît être un bon choix. On remplace un fois de plus :
this Xill Ie oWr last transmission. ZoW'Me all reKeiMeO ZoWr assiPnments. iA ZoW are aIle to KomTlete ZoWr task reTlZ IaKk to Ws WsinP the keZXorO Arom this enKrZTtion alPorithm as ZoWr keZ. JWst rememIer that this is all Aor the Preater PooO.

On peut reconnaître plusieurs morceaux de phrases parmi ceux en rouge :


  • This will be our last transmission
  • Assignments
  • To complete your task
  • From this encryption algorithm
  • Just remember that this all for the greater good (corroboré par les précédents)

On récupère X=W, I=B, W=U, K=C, T=P, Z=Y, A=F, P=G, J=J et O=D. Il reste à trouver les lettres M, F, Y et U. On peut trouver le M facilement car en utilisant ZoW’Me qui donne you’Me, on déduit que M=V.
On peut d’ores et déjà déchiffrer tout le texte avec ce qu’on a :
THIS WILL BE OUR LAST TRANSMISSION. YOU'VE ALL RECEIVED YOUR ASSIGNMENTS. IF YOU ARE ABLE TO COMPLETE YOUR TASK REPLY BACK TO US USING THE KEYWORD FROM THIS ENCRYPTION ALGORITHM AS YOUR KEY. JUST REMEMBER THAT THIS IS ALL FOR THE GREATER GOOD.

Il va falloir déterminer l’alphabet de substitution en entier car c’est surement lui qui fera office de flag.
Pour le moment, il ressemble à ceci : FINAL
?EOBJCTVSDGHKMP?RUW?Y
On voit que l’ordre de l’alphabet classique reprend à partir du D, par conséquent il ne reste qu’une seule possibilité pour U et Y car les lettres doivent se suivre. On a donc U=Q et Y=X.
On en déduit alors que F=Z.

On trouve finalement l’alphabet de substitution :
FINALZEOBJCTVSDGHKMPQRUWXY
C’est le flag !!!

Liens Utiles

http://home2.paulschou.net/tools/xlate/
http://www.apprendre-en-ligne.net/crypto/cesar/




lundi 26 septembre 2011

CTF Quals CSAW 2011 - Networking Patch Management

Salut à tous !
On continue avec les writeups du CSAW CTF ! Un challenge "networking", patch management à 400 pt.

  1. What ?

    On nous fournit un fichier "capture.pcap" que vous pouvez retrouver sur shell-storm ici On go sur wireshark et on look :


    On voit les versions du client et du serveur. Si vous ne connaissez pas la fameuse vuln OpenSSL de 2008 que l'on peut retrouver en détails ici, en mettant la version du client sur Google, on arrive rapidement à cette vuln.
    Maintenant il faut exploiter cette vuln pour dechiffrer la conversation.

  2. Déchiffrement

    En premier, on va séparer le traffic client et serveur. Pour celà, on va utiliser tcpick que l'on peut télécharger ici puis cette commande :

    1. keysec@debian:/media/DATA/Devs/CSAW$ tcpick -wRC -wRS -r capture.pcap
    2. Starting tcpick 0.2.1 at 2011-09-26 20:34 CEST
    3. Timeout for connections is 600
    4. tcpick: reading from capture.pcap
    5. 1      SYN-SENT       192.168.0.119:58214 > 192.168.0.222:ssh
    6. 1      SYN-RECEIVED   192.168.0.119:58214 > 192.168.0.222:ssh
    7. 1      ESTABLISHED    192.168.0.119:58214 > 192.168.0.222:ssh
    8. 1      FIN-WAIT-1     192.168.0.119:58214 > 192.168.0.222:ssh
    9. 1      TIME-WAIT      192.168.0.119:58214 > 192.168.0.222:ssh
    10. 1      CLOSED         192.168.0.119:58214 > 192.168.0.222:ssh
    11. tcpick: done reading from capture.pcap
    12.  
    13. 74 packets captured
    14. 1 tcp sessions detected

    Maintenant on a besoin de 2 tools, ssh_kex_keygen disponible sur le site de l'auteur Raphael Rigo ici et ssh_decoder.rb ici.
    Copiez ssh_decoder.rb dans ssh_kex_keygen/, vous pourrez ensuite utiliser ssh_decoder.rb sans problèmes :

    1. keysec@debian:/media/DATA/Devs/CSAW/ssh_kex_keygen-1.1$ ssh_decoder -c -n2 ../tcpick_192.168.0.119_192.168.0.222_ssh.*
    2.  * read handshake
    3. cipher: aes128-cbc, mac: hmac-md5, kex_hash: sha1, compr: none
    4.  * bruteforce DH
    5. DH shared secret : 028b79a7ee617e11fe3cc5600b93b9423e75c494dcc5e12fed2d99864dd940838c09f77f62356d600c32a37c9e585b21fa0f9c11dc97f7bac6a9a8864fe55a210048c149ae9bf3c6399a8c162bb7cbf1cf7678b34ffe7c118ee34a1239fb4b9d960b6746e60a456a0284c0e2210b837c554c9ef857b6f25ea106422c881c08aa
    6.  * derive keys
    7.  * decipher streams
    8.  * successful authentication packet
    9. {:key=>
    10.   {:g=>
    11.     "l\232\203\271\265$'\003g\000\317\335\003\222\304\f\357h\f^\016\311\261\023\001JR\352\363\262\3556\251\227$FB\307\344\370\277u\362\017d\003\222\227v\305\034\363\220Sz<\"\232\003\235\025\210B\240%\3114\021Cu\017\340\317\306\221\306\241\217\025O\254\230\004\212\311\204\263\206\224\004\317\035{\271\262\027J\373\350\325P\201\226\364K{\242\2747\"\274\243\257\002D\2743\231`wc\b\312\276D\3614\022",
    12.   :type=>"ssh-dss",
    13.   :p=>
    14.    "\000\207\364\bvQR\300$U\371\317``\322\021\037X\235P\032\261\244\277\352\327\277\247O\020\253\b\250z#3\004\223\022\021\256\237\203\253*mh;\311\323\031\302\005\025\204o6\270\"*\256\244\027s\242Q\020j\nb\234\"\252\372\2415x\273?U1\bj\237\270J\a6\350\246n\027\322\"6\022\311\310\374F\346P<\261A\266*\320\333C\304\004X\300\217\241g\267\334}\005\026\345}\223aXD\255",
    15.    :q=>"\000\260~\350\024\215\231t\206>\233\324\212_\206\322Q\0066(\225",
    16.    :y=>
    17.     "\016\371O\332\bw\276\300\367\373\350\3223XX\205\340W\267r\246\f\265\0349}1Q>\245r\021\262\244\004\3437\"\377\247\257\344\304\344EP\250\021k'\261$N\346\230\321\273hTq?O\274\335\260)\266[<L \231\b%\367\262\353\307\002\b\026\20148\004\352\036\a]\025\204\300\210W{\035YML>\311\274\024I\307N:\375\264\340\000\346\331\023\301N\002\327\263\026\217p\233\300\230@\351\333"},
    18.  :testic=>1,
    19.  :username=>"mosdef",
    20.  :keytype=>"ssh-dss",
    21.  :nextservice=>"ssh-connection",
    22.  :auth_method=>"publickey"}
    23.  * deciphered streams saved to "sshdecrypt.client.dat" & "sshdecrypt.server.dat"
    24.  


    On aurait obtenu les 2 conversations en clair si les 2 versions d'OpenSSL utilisées étaient vulnérables, mais dans notre cas seul la version du client est vulnérable, on retrouve donc le plaintext dans le fichier sshdecrypt.0.server.dat

    On retrouve la clé dans le fichier : key{you_broke_ssh_im_calling_teh_cops}