Writeup – CODEGATE 2011

Du 04 mars 13h au 06 mars 13h a eu lieu le CTF CODEGATE 2011.

Ayant un petit répit entre deux biberons, je me suis lancé avec la Team Zenk sur la résolution des divers challenges proposés.

Voici donc un petit récapitulatif des épreuves réussies.

CRYPTO

1/ CRYPTO100

L’épreuve consistait à analyser l’image suivante :

Après un bon moment de réflexion, et en ayant analysé le nombre d’occurrence maximum pour chaque nombre, on s’est aperçu que notre téléphone portable allait nous servir.

Lorsque l’on envoie un SMS, on appuie X fois sur la touche jusqu’à tomber sur la lettre souhaitée (ex : 3 fois sur la touche 4 pour avoir la lettre « i »).

C’est exactement ce que l’épreuve proposait. Il était donc nécessaire de transformer ces nombres en texte au moyen des touches du téléphone portable. Voilà donc le texte déchiffré :

« IN CRYPTOGRAPHY A SUBSTITUTION CIPHER IS A METHOD OF ENCRYPTION BY WHICH UNITR OF PLAINTEXT ARE REPLACED WITH CIPHERTEXT ACCORDING TO A REGULAR SYSTEM THE UNITS MAYBE SINGLE LETTERS PAIRS OF LETTER STRIPLETS OF LETTERS MIXTURES OF THE ABOVE THIS CIPHERTEXT IS ENCRYPTED BY TELEPHONE KEY PAD SO WE CALL THIS KEY PAD CIPHER »

Indice donné par les organisateurs : the key is in decoded text

On a donc testé plusieurs possibilité pour avoir la bonne clé à savoir : keypad cypher

2/CRYPTO200

Ici nous avions le chiffré suivant :

SCMPKBOUPDPHYTIAVIVRBTMVORUDNBDFNETDOIVTXROUNDKOBFWBPVOEQLTGKKARACYCGDNAECBXIZIKPTLEERZTYCYKIVXCPKPTPOVCAQRHRVKJUWMTWCMSXKADYHRVNAHCBRVSVSSCQCZQYDJXGSNRVSWCESTTBHIFCIASXRTAHKRRTUMVOKWITZPFZDISXZVVLGETPPLKSELDPGKELSHCBJBWXBIFCPEZYNBWXCDYMGAOVWNDKAKKKWBBQKPTIODKMGGHRVVNHINFCQESDYMLACVVBWBBQROPBBDFOXOSKDIGZWXFNTKFYIICWHRVVNHIYILTKHRVXPISB

Résolution : Analyse fréquentielle !

Tool utilisé : http://smurfoncrack.com/pygenere/pygenere.php

On test avec une longueur de clé à 1 puis 2 puis 3, et on s’aperçoit qu’à 6, le texte déchiffré ressemble à quelque chose :

« I LEARNED HOW TO CALCULATE THE AMOUNT OF PAPER NEEDED FOR A ROOM WHEN I WAS AT SCHOOL YOU MULTIPLY THE SQUARE FOOTAGE OF THE WALLS BY THE CUBIC CONTENTS OF THE FLOOR AND CEILING COMBINED AND DOUBLE IT YOU THEN ALLOW HALF THE TOTAL FOR OPENINGS SUCH AS WINDOWS AND DOORS THEN YOU ALLOW THE OTHER HALF FOR MATCHING THE PATTERN THEN YOU DOUBLE THE WHOLE THING AGAIN TO GIVE A MARGIN OF ERROR AND THEN YOU ORDER THE PAPER »

Ok, nous avons le chiffré, le clair et il nous manque plus qu’à trouver la clé. Prenons l’outil en ligne suivant :

http://cs.colgate.edu/faculty/nevison/Core139Web/tools/vigenere-cracker.html

On insère notre chiffré, notre clair et la taille de la clé (6) et hop, il nous ressort la key :

NETWORK

1/ NETWORK100

Ici nous avions un fichier pcap à télécharger avec pour seul indice : la réponse sera sous la forme du hash MD5 d’un fichier.

On ouvre donc notre capture pcap avec Wireshark, on utilise l’option File>Export>Objects> HTTP et nous pouvons télécharger les différents fichiers inclus dans la capture (merci à kr0ch0u pour l’information). Une fois cela fait, on peut observer plusieurs fichiers dont un seul .exe.

 

On clic sur « enregistrer sous », puis on calcule son hash MD5 :

Well done !

2/ NETWORK300

Ici nous avions une page Web affichant la lettre « M ». Après avoir rechargé la page plusieurs fois, nous avions un message d’erreur comme quoi nous tentions de brute forcer.

En passant par un proxy, une nouvelle lettre est apparu « s ».

On a donc testé de passer par plusieurs proxy pour toutes les requêtes émises sur le serveur.

Au final cela nous a donné : Msg:wFTeNtyMklGa et pour la fin un petit message nous indiquant que l’épreuve n’était pas complètement finie :

Congraturation! You have succeeded, hint:reverse me 🙂

Il ne restait plus que 10 minutes avant la fin du challenge. Après plusieurs tentatives en retournant wFTeNtyMklGa dans tous les sens, Debaser nous a suggéré le base64 :

— Decode en base 64 de aGlkMytNeTFw : hid3+My1p

Ouf il ne restait plus que 3 minutes ! GG !

BINARY

1/BINARY100

En éditant le fichier téléchargé, l’entête était assez incompréhensible. Xylitol a soumis la piste d’un javascript encodé.

En décodant le javascript nous tombions de nouveau sur un javascript encodé de la forme :

// **Start Encode**
_$_$$_$= »charAt »;$=~[];$={___:++$,$$$$:(![]+ » »)[_$_$$_$]($),__$:+ …

Edit : Pour plus de précisions, on avait vbscript.encode(jjencode(packer(jjencode(variable_en_octale)))).
Document utile : http://pferrie2.tripod.com/papers/jjencode.pdf

Solution de shp :

On reverse la variable p => on a codegate_javascriptencoded_key => on met un alert()
=> on a des chiffres et des lettres, les chiffres correspondent à l’octal dans la table ASCII. On remplace donc par le caractère correspondant et on obtient la clé.

VULNERAB

1/VULNERAB100

Cette épreuve se présentait sous la forme d’un site Web nous autorisant à uploader des fichiers mp3.

Après avoir tenté d’envoyer un autre format de fichier, par exemple un .php, on se fait jeter tel un poney pas coiffé.

Lors d’une de nos tentatives, nous avons renommé notre script php en mp3 et l’avons soumis à l’upload. Malheureusement, une erreur de TAG non présent nous a rappelé à l’ordre.

En jouant avec l’outil id3, nous avons pu ajouter le TAG manquant à notre faux fichier mp3. Well done, le fichier est bien envoyé.

Par la suite, on a tenté une injection SQL dans le TAG du mp3. En effet, lors de notre première tentative, le serveur nous a remonté une alerte comme quoi aucun TAG n’avait été trouvé dans le fichier mp3. C’est donc qu’il le vérifie 😉

Voici la commande de modification du tag :

Moon:/home/lestutosdenico/Desktop# id3 -c « ‘ or ‘1’=1– » test.mp3

Résultat :


Cela nous a au moins permis de savoir que nous étions sur la bonne direction.

Suite à cela, nous avons créé un fichier .php.mp3 contenant une fonction phpinfo(), inséré le TAG et uploadé le fichier.
En allant chercher notre fichier par un lien direct, nous avons remarqué que le code était bien exécuté :


Ok, passons aux choses sérieuses.

Upload de r57 shell :


Regardons ce qu’il peut y avoir d’intéressant là-dedans. Wow un fichier dbconn.php, voyons ce qu’il contient :

$con=mysql_connect(« localhost », »root« , »zhemrpdlxm##« );

On a le login et le mot de passe de la BDD. Exécutons nos commandes via le PHP Shell :


Voyons ce qu’il y a dans la database music :


Vul100pwd ?! Miam !


Pass: hello, sonic!

2/VULNERAB200

Cette épreuve se présentait sous la forme d’un site Web avec authentification. Une fois authentifié nous avions l’affichage de quelques messages avec des liens de la forme :

http://221.141.3.112/view.php?id=

Dans l’indice on nous indiquait que pour résoudre l’épreuve il fallait être connecté sur le compte Administrator:

Hint) Get Administrator account

Il suffisait simplement de tester le couple Administrator:Administrator, bien évidemment, cela passait.

Tout le monde avait bien entendu réussi à exploiter la base via une injection dans le champ get id :

http://221.141.3.112/view.php?id=

Néanmoins les informations intéressantes étaient celles-ci:

http://221.141.3.112/view.php?id=0%20UNION%20ALL%20SELECT%200,0,group_concat
%28database%28%29,0x3a,user%28%29%29–%20-

Réponse : codegate1_messages:codegate_msg@localhost

Par ailleurs si on faisait attention, dans la source nous avions une ligne : <– hint : 0 –>.

Après un temps de réflexion nico34 a remarqué qu’en plus de contenir la session, le cookie contenait aussi une variable lang (suspect).

Il a donc commencé par modifier la langue en mettant French. Le commentaire se modifiait en <– hint : 6 –>.

Aller c’est parti, on injecte puis on regarde s’il y a une différence dans nos résultats:

‘UNION ALL SELECT group_concat(database(),0x3a,user()),0– –

Réponse : codegate1:codegate1@localhost

Magnifique, la base de donnée et l’user n’est pas le meme, nous allons donc exploiter la base entière.

Table : usersChamps : uid uname passwd fname lname email
Table : langChamps : lang_id language
Table : raw_dataChamps : data_id data_value

Après avoir exploité la table lang et users, nous n’avions encore trouver aucun flag.

En scriptant un peu, nico34 a récupéré tout le contenu de la table raw_data avec une injection simple comme ceci :

‘UNION ALL SELECT group_concat(data_id,0x3a,data_value),0 from raw_data– –

Nous avions un peu plus de 70 enregistrements et tous correspondaient à du base64.

En les décodant un par un, on se rendait compte que ce n’était que des suites de 185 chiffres, inutiles pour nous. Par ailleurs, en regardant bien la sortie du script, nico34 a pu s’appercevoir qu’un des base64 n’avait pas la meme longueur.

La solution était belle et bien là:

nico@Zenk-Security:~/Bureau$ echo
« iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQAAAAClSfIQAAAACXBIWXMAAAsT
AAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAA
AXb5JfxUYAAAAaSURBVHjaYvzPwMTAwMTwkYnhLSOUjUCAAQBVVwPvEoyQEAAARk
xBRzozOTFjZTcwYWQzZGJhODIyNjExY2U1YTYxZWI3MTI1ZQAASUVORK5CYII= » | base64 -d > flag.png && hexdump -C flag.png

00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG……..IHDR|
00000010 00 00 00 0a 00 00 00 0a 01 00 00 00 00 a5 49 f2 |…………..I.|
00000020 10 00 00 00 09 70 48 59 73 00 00 0b 13 00 00 0b |…..pHYs…….|
00000030 13 01 00 9a 9c 18 00 00 00 20 63 48 52 4d 00 00 |……… cHRM..|
00000040 7a 25 00 00 80 83 00 00 f9 ff 00 00 80 e9 00 00 |z%…………..|
00000050 75 30 00 00 ea 60 00 00 3a 98 00 00 17 6f 92 5f |u0…`..:….o._|
00000060 c5 46 00 00 00 1a 49 44 41 54 78 da 62 fc cf c0 |.F….IDATx.b…|
00000070 c4 c0 c0 c4 f0 91 89 e1 2d 23 94 8d 40 80 01 00 |……..-#..@…|
00000080 55 57 03 ef 12 8c 90 10 00 00 46 4c 41 47 3a 33 |UW……..FLAG:3|
00000090 39 31 63 65 37 30 61 64 33 64 62 61 38 32 32 36 |91ce70ad3dba8226|
000000a0 31 31 63 65 35 61 36 31 65 62 37 31 32 35 65 00 |11ce5a61eb7125e.|
000000b0 00 49 45 4e 44 ae 42 60 82 |.IEND.B`.|
000000b9

FLAG:391ce70ad3dba822611ce5a61eb7125e

FORENSIC

1/FORENSIC100

Le fichier téléchargé était compressé et contenait un fichier « unknow ». Au moyen de l’outil foremost nous avons pu récupérer plusieurs fichiers dont des zip, des images, des fichiers html etc…

En farfouillant un peu nico34 a trouvé le fichier 00008888.zip contenant plusieurs autres fichiers dont un index.xml. Ce dernier contenait du code base64 un peu mal-formé. En effet plusieurs caractères &#10; étaient présents pour nous empêcher de reconstruire le fichier.

En supprimant ces caractères et en régénérant le file, nous pouvions voir dans l’entête �PNG.

On renomme le fichier, on ouvre l’image et TADA :

Bravo nico34 ! tu es pas un nico pour rien ! 🙂

2/FORENSIC300

Nous avons un fichier contenant une sauvegarde du registre Windows. Le but est de trouver la clé sous la forme : « Vendor name » + « volume name » + « serial number ».

Solution par kr0chou :

Utilisation du Logiciel Alien registery.

On transforme le fichier en .7z, on extrait le backup du registre et on monte les .dat afin de pouvoir faire nos recherches.

Voici les différentes clés qui ont permis de trouver la solution :

Ailien Registry\HKEY_LOCAL_MACHINE\software\Microsoft\WBEM\WDM
Ailien Registry\HKEY_USERS\NTUSER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{7fceaab2-39e6-11e0-9e0f-000c290f784e}
Ailien Registry\HKEY_USERS\NTUSER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{7fceaab8-39e6-11e0-9e0f-000c290f784e}
Ailien Registry\HKEY_USERS\NTUSER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{7fceab12-39e6-11e0-9e0f-000c290f784e}
Ailien Registry\HKEY_USERS\NTUSER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{7fceab16-39e6-11e0-9e0f-000c290f784e}
Ailien Registry\HKEY_LOCAL_MACHINE\system\ControlSet001\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
Ailien Registry\HKEY_LOCAL_MACHINE\system\MountedDevices

Clé :  CORSAIRPR0N33RDDF08FB7A86075

ISSUES

1/ISSUES100

Je n’ai pas trop suivi cette épreuve mais c’était apparemment une vidéo.

Solution par kioko :

Valide : San 15-3 Seongbuk-dong, Seongbuk-gu, Seoul
South Korea

Pour la resoudre, il fallait trouver le depart de la ligne de bus 1162 a Seoul, suivre le trajet jusqu’a la fin de la video sur gmap, quelques clics pour trouver des adresses et les tester.

Article : http://filedanstachambre.org/central/info/ctf-codegate-2011-179

CONCLUSION

Pour conclure, le CTF était vraiment intéressant et la difficulté était bien présente. La diversité des épreuves en fait un CTF vraiment complet. Merci donc aux organisateurs mais surtout merci à la team Zenk-Security qui a fait du très bon boulot (10 épreuves sur 27 réussies) en arrivant 46ème/178 462.

PS : Je vais essayer de mettre à jour cet article en incluant le lien vers des Writeups afin d’inclure la solution des épreuves manquantes.

Greatz : nico34, shp, kr0ch0u, caracole, joanelis, Xylitol, kioko, strepoetlo, Hydraze, saiketsu, ezano, Warr !

Edit :

Fichier des épreuves (merci j0rn): https://files.nibbles.fr/codegate-2011/
+ http://repo.shell-storm.org/CTF/CodeGate-2011/

WRITEUPS Hates Irony : https://hatesirony.com/codegate2011/
WRITEUPS PPP : http://ppp.cylab.cmu.edu/wordpress/wp-content/uploads/2011/03/Codegate2011PQ-Writeup-PPP.pdf
WRITEUPS Disekt : http://disekt.tk/
WRITEUPS Leetmore : http://leetmore.ctf.su/wp/codegate-ctf-2011-mini-writeups/
BINARY200 : http://leetmore.ctf.su/wp/codegate-ctf-2011-binary-200/
BINARY200 : http://www.corelan.be/index.php/2011/03/14/codegate-2011-ctf-binary200-anti-debugging-techniques/
ISSUES100 : http://filedanstachambre.org/central/info/ctf-codegate-2011-179
ISSUES500 : http://leetmore.ctf.su/wp/codegate-ctf-2011-issue-500-bootsector/
ISSUES500 : http://securityblackswan.blogspot.com/2011/03/codegate-yut-2011-issue-500-writeup.html
FORENSIC200 : http://pastebin.com/HLsqc38J
FORENSIC300 : http://www.sinfocol.org/2011/03/writeup-forensics300-codegate-2011/
FORENSIC300/ISSUES300: http://leetmore.ctf.su/wp/codegate-yut-2011-forensic-300issue-300/
CRYPTO300 : http://leetmore.ctf.su/wp/codegate-ctf-2011-crypto300-writeup/
CRYPTO400 : http://isc.sans.edu/diary.html?storyid=10501
CRYPTO400 : http://leetmore.ctf.su/wp/codegate-ctf-2011-crypto-400/
VULN100 : http://leopardan.kr/113
VULN200 : http://leopardan.kr/114
VULN300 : http://auntitled.blogspot.com/2011/03/codegate-ctf-2011-vuln300-writeup.html
VULN300 : http://passket.tistory.com/33
VULN400 : http://leopardan.kr/115
NETWORK200 : http://blog.seguesec.com/?p=70

9 Responses to "Writeup – CODEGATE 2011"

Laissez un commentaire