SSTIC 2013 - Résultats du challenge

70 jours de durée de vie, 3500 visiteurs, sur 62 pays.

Le gros des visiteurs français étaient sur paris,  avec un petit pâté à coté de rennes. et un visiteur avec un lookup elle.fait.30cm.fr. Au final 15 solutions ont été soumises. Ceux qui ont résolu le challenge ont eu droit à un T-shirt « ça ne se voit peut-être pas, mais j’ai résolu le challenge SSTIC ».

Emilien Girault nous présente sa solution au challenge:

L’analyse de la capture réseau donnait accès à une architecture FPGA.

Le challenge était au format .pcap avec un échange de messages entre A et B avec l’IV et le checksum du fichier, la clef étant transmise par canal caché ICMP. Paquets présents dans la suite du pcap. S’en suit un échange FTP. Les délais sur les paquets sont soit de 1 ou 2s et donc codent pour un bit d’information à chaque fois. En examinant plus en détail les paquets ICMP, le ip.tos et le ip.ttl ceux-ci fournissent d’autres bits d’information. Au total on à 4 bits par paquets, avec 64 paquets. Il reste donc à bruteforcer la clef à partir de ces informations.

On obtient en suite une archive déchiffrée format gzip qui contient un binaire data, un decrypt.py qui fait appel à un module dev, un fichier smp.py contenant une liste d’octets et s.ngr un fichier au format pas très connu mais qu’on retrouve sur un forum dédié au FPGA Xilinx. Le fichier est visible sur ISE Design Suite, 8go de dl pour pouvoir ouvrir le fichier !!!

Le decrypt.py interragit avec le FPGA, il faut donc comprendre le .ngr pour comprendre comment fonctionne decrypt.py. En regardant de plus près le FPGA, on se rend compte qu’il y à des composants qui interagissent entre eux. Reverser chaque composant peut vite vous perdre, il faut donc rapidement simplifier le fonctionnement de chaque éléments. Certains sont des mémoires, d’autres des registres, une unité logique et un registre incrémenté. Bref, un mini-CPU Harvard avec données et code séparé. Il « suffit » de déduire le jeux d’instruction du CPU pour comprendre le programme qu’il exécute. Il faut donc le désassembler, et là, soit on connait metasm, soit on connait quelqu’un qui connait metasm, soit on le fait soit-même.

In fine il s’agit d’une simple boucle qui fait un xor. Il suffit en suite de bruteforcer le tout pour obtenir un base64 valide.  Après déchiffrement du base64 on obtiens un blob étrange qui s’avère être un fichier postscript. C’est un vrai langage de programmation (hélas) en notation polonaise inversée, sans debugguer disponible. Bref c’est la galère… et pour débugger on ajoute des instructions à la main (printf like debug).

Le fichier postcript prend donc une clef en argument et déchiffre d’autres données. On se retrouve avec du postscript dans du postscript (inception). Et on tombe sur un algo maison qui s’avère être une grosse galère. L’orateur à choisit de re-implémenter l’algo en python et de bruteforcer chaque paire de caractères. heureusement que le calcule se parallelise bien…

Après déchiffrement, on obtiens une VCard qui contiens des mails et des noms d’appels systèmes. Si on substitue chaque appel système par son n° en hexa on obtiens l’@ mail permettant la validation du challenge.

Bravo !!!