Présentation d’un write-up de résolution du challenge « Inforensic – Invest » des qualifications du CTF de la Nuit du Hack 2016.
Le weekend du 01/04/2016 se déroulait les pré-qualifications pour la Nuit du Hack 2016 sous forme d’un CTF Jeopardy. Ayant eu l’occasion et le temps d’y participer avec quelques collègues et amis, voici un write-up de résolution d’un des challenges auquel nous avons pu participer.
- Catégorie : Inforensic
- Nom : Invest
- Description : A paranoid guy seems to have secured his file very well. But I am convinced he made a mistake somewhere…
- URL : http://static.quals.nuitduhack.com/invest.pcapng
- Points : 50
Le fichier pcapng récupéré, on l’ouvre avec Wireshark afin d’observer les différentes trames. Ce fichier est bien fourni, jetons un oeil aux éventuels objets rattachés aux requêtes HTTP en les exportant (Fichier > Exports Objets > HTTP…).
En consultant les fichiers qui ont pu être exportés, plusieurs sont d’intérêt :
- key.txt
- Contient une chaîne de caractère uniquement composée de « 0 » et « 1 », soit une chaîne binaire. Le nom du fichier est parlant…
010001110101111001100011011011100100100100111001010111100100011101000111001110010100011100111001010001110011100101000111001110010101111001100011011011100100100101101110010010010011100100110101010111100110001100111001001101010110111001001001011011100100100101000111010111100011100100110101011011100100100101011110011000110100011101011110001110010011010101011110011000110101111001100011010111100110001101000111010111100101111001100011011011100100100101000111010111100011100100110101010001110101111001101110010010010101111001100011010111100110001101101110010010010101111001100011010111100110001100111001001101010100011101011110010111100110001101011110011000110101111001100011010001110101111001000111010111100101111001100011011011100100100101101110010010010101111001100011
- encrypt*
- De nombreux fichiers dont le contenu semble en base64 sont présents, de « encryptaa » à « encryptdc » soit 81 fichiers chiffrés.
- 12767348_10208095326368148_1014857467_n.jpeg
- Cette image représente un schéma logique de traitement binaire, composé de port NOT, AND, OR et XOR. 8 bits en entrée pour en donner un unique en sortie.
A ce stade, nous pouvons partir des hypothèses que :
- Le message qui nous révélera le flag se trouve chiffré puis encodé en base64 avant d’avoir été découpé en 81 fichiers ordonnés « encrypt* ».
- L’image jpeg du schéma logique nous présente un algorithme à implémenter pour traiter du binaire. 8 bits en entrée pour 1 en sortie.
- Le fichier « key.txt » contient une chaîne binaire relativement importante. Cette chaîne est la clé de déchiffrement du message chiffré, mais celle-ci est encodée et nous devont la décoder via l’algorithme présenté sur l’image du schéma logique.
Commençons par implémenter l’algorithme du schéma logique en Python :
#!/usr/bin/python # Quick'n'dirty logical scheme implementation keyFile = open("key.txt", "r"); resFile = open("keyresult.txt", "w"); def AND(a, b): if a=="1" and b =="1": return "1" else: return "0"; def NOT(a): if a=="1": return "0" else: return "1"; def OR(a, b): if a=="1" or b == "1": return "1" else: return "0"; def XOR(a, b): if (a=="1" or b == "1") and a!=b: return "1" else: return "0"; key = keyFile.read(); i = 0; while i < len(key): a1 = key[i]; a2 = key[i+1]; a3 = key[i+2]; a4 = key[i+3]; a5 = key[i+4]; a6 = key[i+5]; a7 = key[i+6]; a8 = key[i+7]; u13 = NOT(a3) u16 = NOT(a4) u15 = NOT(a5) u14 = NOT(a2) u17 = NOT(a6) u20 = NOT(a8) u1 = AND(a1, u13) u2 = AND(u14, u13); u3 = AND(a1, a2); u18 = XOR(a6, a7); u19 = XOR(u14, u20); u4 = AND(u1, u16); u5 = AND(u16, u2); u6 = AND(u16, u3); u7 = AND(u17, a3); u8 = AND(a3, u19); u9 = AND(u4, u15); u10 = AND(u5, u15); u11 = AND(u15, u6); u12 = AND(u7, u18); u21 = OR(u9, u10); u22 = OR(u11, u12); u23 = OR(u22, u8); u24 = OR(u21, u23); resFile.write(u24); i = i+8
On lance le script pour produire le fichier « keyresult.txt » à partir de la chaîne binaire de « key.txt » :
001101000101010101101011011110100011100100110101010001100011001001011001011100010101000001101001
Une conversion en ASCII de cette nouvelle chaîne binaire nous donne la clé suivante :
4Ukz95F2YqPi
A présent, régénérons un chiffré d’un seul bloc :
cat encrypt* > encrypt-bundle.txt
Ayant la clé et le chiffré, procédons au déchiffrement… Oui, mais de quel algorithme? C’est vrai ça, et bien testons-en plusieurs (DES, 3DES, XOR, AES128, AES256…). Il s’avère que c’est l’AES256 qui nous donne un résultat convenable :
openssl enc -aes-256-cbc -d -a -in encrypt-bundle.txt -out decrypt.txt -k 4Ukz95F2YqPi
Nous avons donc un fichier « decrypt.txt », dont des portions de son contenu semblent en clair. Une commande « strings decrypt.txt » nous affichera tout le texte affichable de celui-ci, et on remarquera que les dernière chaîne sont :
[...] word/theme/theme1.xmlPK word/styles.xmlPK word/document.xmlPK docProps/custom.xmlPK docProps/app.xmlPK docProps/core.xmlPK
Ça semblerait bien être un fichier RTF à ouvrir avec Word ! Renommons « decrypt.txt » en « decrypt.rtf » et…
Il suffit de « supprimer » ou décaler l’image (qui est au premier plan), pour voir le flag apparaître derrière :
Le flag : NDH[59rRS57bd5WH8RxgPbRS27q89a5bWrjL]
Salutations à nj8, St0rn, Emiya, Mido, downg(r)ade, Ryuk@n et rikelm, on remet ça quand vous voulez ? // Gr3etZ
Sources & ressources :