Grehack ctf 2015 – grehack.fr (forensic) – Write-Up

grehack.fr (forensic 200)

Category: forensic Points: 200 Solves: 4
Author : iggy
Description : grehack.fr was really dumped ?
Attachment : grehack.fr.dump.pcap

On a un pcap avec du trafic IRC et du trafic DNS.

Traffic IRC :

grehack forensic 200 irc

On observe rapidement dans le trafic DNS des queries anormales qui ressemblent à du base64. On récupère dans la 1ère trame DNS la 1ère query donc le base64 et on le decode pour voir à quel type de donnée on a à faire en regardant le header :
1ère trame :

1ere-trame

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % echo UEsDBBQACQAIAAZzY0flegRWdQoAAOMYAAAIABwAY2 | base64 -d | xxd
base64: entrée incorrecte
0000000: 504b 0304 1400 0900 0800 0673 6347 e57a  PK.........scG.z
0000010: 0456 750a 0000 e318 0000 0800 1c00 63    .Vu...........c

Ok, on a un fichier zip dans les trames DNS, va falloir recupérer toutes les queries pour reconstituer le zip.

Voilà la commande finale pour dumper l’ensemble des trames dans un zip :

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % tshark -r forensic/grehack.fr.dump.pcap -Y '(ip.src == 94.239.41.142)' -Tfields -edns.qry.name | sed -e 's/-.//g'| sed -e 's/grehack.fr.dump//' | sed -e 's/*/+/g' | tr -d '\n' | base64 -d > out.zip

Quelques explications :

On utilise tshark qui est l’équivalent de wireshark en ligne de commande (plus pratique pour dumper et pour pourvoir manipuler/traiter des données).
On positionne un filtre avec l’option : -Y ‘(ip.src == 94.239.41.142)’. Cela permet dans ce cas précis d’éviter d’avoir des doublons (query/réponse).
On indique à tshark quelle donnée on veut récupérer avec l’option en indiquant le champ présent dans la trame: -Tfields -edns.qry.name
Ensuite on fait le traitement qui permet de nettoyer les données en supprimant ce qui est en trop : sed -e ‘s/-.//g’| sed -e ‘s/grehack.fr.dump//’
On remplace les * par des + : sed -e ‘s/*/+/g’
On supprime les retours à la ligne avec tr
On decode le base64 et on met le tout dans un fichier out.zip

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % zipinfo out.zip
Archive: out.zip
Zip file size: 55940 bytes, number of entries: 10
-rw-r--r-- 3.0 unx 6371 TX defN 15-Nov-03 14:24 cfp.html
-rw-r--r-- 3.0 unx 4268 TX defN 15-Nov-03 14:24 ctf.html
-rw-r--r-- 3.0 unx 6068 TX defN 15-Nov-03 14:22 index.hmtl
-rw-r--r-- 3.0 unx 8565 TX defN 15-Nov-03 14:24 info.hmtl
-rw-r--r-- 3.0 unx 6521 BX stor 14-Sep-12 21:40 logosite_securimag_org_e8e26934a20d203c920990fed475fb20.png
-rw-r--r-- 3.0 unx 29588 BX defN 15-Nov-03 15:01 logo_transp_1a39e30c8fbad86255d6708763d18446.png
-rw-r--r-- 3.0 unx 10569 TX defN 15-Nov-03 14:24 program.hmtl
-rw-r--r-- 3.0 unx 4096 BX defN 15-Nov-03 14:56 registration.db
-rw-r--r-- 3.0 unx 5076 TX defN 15-Nov-03 14:24 registration.hmtl
-rw-r--r-- 3.0 unx 9763 TX defN 15-Nov-03 14:24 workshops.hmtl
10 files, 90885 bytes uncompressed, 53958 bytes compressed: 40.6%

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % unzip out.zip
Archive: out.zip
[out.zip] cfp.html password:

Erf, grosse déception faut un mot de passe pour dezipper.
Après avoir tenté une attaque par brute force avec john the ripper. Je me suis rendu à l’évidence, ce n’est pas la bonne méthode.
Un truc m’interpelle dans le zip, les images avec les md5, c’est sûrement une attaque par clair connu.
Suffit de retrouver les images, de faire un md5sum, si c’est la même somme qui est indiqué dans le zip on pourra utiliser cette attaque avec pkcrack.
Comme indiqué dans le zip, la 1ère image est sur le site de securimag.org.

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % wget https://securimag.org/wp/wp-content/uploads/2014/09/logosite.png
<sam@sam-ecl:~/grehack>
zsh 7496 [1] % md5sum logosite.png
e8e26934a20d203c920990fed475fb20 logosite.png

Bim on a la même somme.

On zip l’image que l’on vient de télécharger. On a maintenant tous les éléments pour utiliser pkcrack.
Commande finale :

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % /home/sam/pkcrack-1.2.2/src/pkcrack -C /home/sam/grehack/out.zip -c logosite_securimag_org_e8e26934a20d203c920990fed475fb20.png -P /home/sam/grehack/logosite.zip -p logosite.png -d decrypt.zip -a
Files read. Starting stage 1 on Sun Nov 21 00:32:30 2015
Generating 1st generation of possible key2_6532 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Done. Left with 2782 possible Values. bestOffset is 24.
Stage 1 completed. Starting stage 2 on Sun Nov 22 16:32:38 2015
Ta-daaaaa! key0=dde57a91, key1=efeda095, key2=b30202ce
Probabilistic test succeeded for 6513 bytes.
Strange... had a false hit.
Strange... had a false hit.
Strange... had a false hit.
Stage 2 completed. Starting zipdecrypt on Sun Nov 22 16:32:52 2015
Decrypting cfp.html (d89a7e8ccb5169da3a8d0673)... OK!
Decrypting ctf.html (fd6d9d643322245d276b0673)... OK!
Decrypting index.hmtl (51412eecd58cc5d0bea0d972)... OK!
Decrypting info.hmtl (89044e09cb45c6b6c6560673)... OK!
Decrypting logosite_securimag_org_e8e26934a20d203c920990fed475fb20.png (73aa640416a951e9b61d04ad)... OK!
Decrypting logo_transp_1a39e30c8fbad86255d6708763d18446.png (52110965ce44bcb73b2d2b78)... OK!
Decrypting program.hmtl (0e4be2d0f25c8a3d2ea30673)... OK!
Decrypting registration.db (5dff1b8296207d9740f31577)... OK!
Decrypting registration.hmtl (79a07ebc48e42e3b3d460673)... OK!
Decrypting workshops.hmtl (761ec065dc621073ed5c0673)... OK!
Finished on Sun Nov 21 00:32:52 2015

Détails de la commande :
Zip chiffré : -C /home/sam/grehack/out.zip
Fichier chiffré dans le zip : -c logosite_securimag_org_e8e26934a20d203c920990fed475fb20.png
Zip non-chiffré : -P /home/sam/grehack/logosite.zip
Fichier non-chiffré dans le zip : -p logosite.png
Zip dechiffré en sorti : -d decrypt.zip

<sam@sam-ecl:~/grehack>
zsh 7496 [1] % mkdir -p for200
<sam@sam-ecl:~/grehack>
zsh 7496 [1] % cd !$
<sam@sam-ecl:~/grehack>
zsh 7496 [1] % unzip ../decrypt.zip

Comme indiqué dans la conversation sur IRC dans la capture, a priori la db doit avoir quelque chose d’interessant.

<sam@sam-ecl:~/grehack/for200>
zsh 7496 [1] % file registration.db 
registration.db: SQLite 3.x database
<sam@sam-ecl:~/grehack/for200>
zsh 7496 [1] % sqlite3 registration.db
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select name from sqlite_master;
tickets
register
sqlite> select sql from sqlite_master where name='register';
CREATE TABLE register(id smallint, firstname varchar(20), lastname varchar(30), CreditCard varchar(20))
sqlite> select * from register;
0|Luc|Parlamon|VISA5100064800102541
1|Martoni|Plusdegenoux|VISA5105680000100002
2|Agent|Smith|MC5100870000105642
3|<script>|alert(xss)</script>|AAAAAAAAAAAA
4|Jean|Dupont|VISA5100000000100002
5|%22or 1=1|--|VISA5100005600101254
6|HereYourFlag|InZipWeTrust11!!|XXX0000
sqlite> 

Flag : InZipWeTrust11!!

Merci iggy pour ce challenge.

Write-Up by sambecks

Leave a Comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *