[CTF NDH 2016 Quals] Write-Up – Inforensic : Invest

03
avril
2016
  • Google Plus
  • LinkedIn
  • Viadeo
Posted by: Yann C.  /   Category: Cryptanalyse / Cryptographie / Cryptologie / CTF / Events / NDH / NDH2k16 / Vulnérabilités, exploits et PoC   /   Pas de commentaire

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…).

Export des objets HTTP depuis le pcap

Export des objets HTTP depuis le pcap

En consultant les fichiers qui ont pu être exportés, plusieurs sont d’intérêt :

Fichiers exportés du pcapng

Fichiers exportés du pcapng

  • 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.
Schéma logique

Schéma logique

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…

Fichier RTF déchiffré

Fichier RTF déchiffré

Il suffit de « supprimer » ou décaler l’image (qui est au premier plan), pour voir le flag apparaître derrière :

Flag !

Flag !

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 :

  • Google Plus
  • LinkedIn
  • Viadeo
Yann C.

About the Author : Yann C.

Consultant en sécurité informatique et s’exerçant dans ce domaine depuis le début des années 2000 en autodidacte par passion, plaisir et perspectives, il maintient le portail ASafety pour présenter des articles, des projets personnels, des recherches et développements, ainsi que des « advisory » de vulnérabilités décelées notamment au cours de pentest.