162

hzv-ezine_#02

Embed Size (px)

Citation preview

HZV Mag

#2

retour au sommaire

Dans un monde en constante volution, la dernire des vrits est celle de l'enseignement par la pratique.

Et de deux ! Bien qu'aucun calendrier n'avait t officiellement annonc, pardon tout ceux qui l'attendait plus tt, nous aurions aimer tre productif plus rapidement. Quoi qu'il en soit, nouveau numro, nouvelle formule, on espre que celle ci vous plaira d'autant plus qu'elle devrait devenir le format quasi-dfinitif. Notez la publicit qui, en priode de crise, pourrait tre vu d'un mauvais oeil ;) sachez nanmoins que nous tiendrons un compte publique afin de tuer dans l'oeuf les ventuelles critiques, tant donn que cette argent nous permet de vous distribuer des lots. Pour ce second numro comme vous avez pu le remarquer, de nombreux thmes introduise la manipulation plus ou moins furtive du systme. Base de la premire dfense, lorsqu'une machine peine reconnatre une attaque, celle ci devient facile pirater et offre alors les pleins pouvoir l'attaquant. Nous esprons que ce nouveau numro vous donnera autant qu' nous satisfaction et que vous continuerez prendre part son laboration. Bonne lecture tous :) Alias

Ont Particip ce numro

Alias, Bruno Cordioli, Charles FOL, D. Sharon Pruitt, Enila, FluxBit, Hack SpideR, Mikael Hvidtfeldt Christensen, IOT-Record, JoE, kimdokhac, L33ckma, Luis Argerich, Mattew, NiklosKoda, NoSP, Pieuvre, policarpo, Sanguinarius, Stormy, timetrax23, Virtualabs et Yakko.

2

SOMMaire.CoreWarLa Guerre des programmes par JoE

3 14 24 39 51 70 86 96 104 116 149154 156 158 160

.Technique

Fonctionnement des virus informatiques par Hack SpideR

.Le format Portable executable par Yakko .Smashing The Filesystemfor fun and profit par L33ckma

.rootKit

injection avanc de code dans un excutable par Stormy

.Future exposed : La BD par IOT-Record .Hadopi, Hadopt !(ou pas...?) par Enila

.Dev PHP

automatisation du Fuzzing par NoSP

.rooter HZV par Charles FOL .Tour d'horizon de la SQL injection par NiklosKoda .Faiblesse Bluetooth LiveBox par VirtualabsCyberNews Petit conseils entre amis a L'Honneur How To Contrib

3

HZV Mag

#2

retour au sommaireq

article suivant

Imaginez la mmoire dun ordinateur o chaque bloc peut contenir une instruction excutable par un programme informatique Imaginez maintenant que plusieurs programmes soient placs dans cette mmoire et que leur excution commence Pour finir imaginez que chacun dentre eux puisse crire par dessus le code des autres et quil existe une instruction particulire qui tue celui qui lexcute Quel serait le dernier programme en vie dans la mmoire ? Quelle est la meilleure stratgie adopter pour liminer les autres ? Pour viter de se faire liminer ? Bienvenue dans le monde de CoreWar ! Comme expliqu dans cette introduction digne dun Bernard Werber sous amphtamines, il sagit dun jeu qui fait sopposer des programmes informatiques. Il a t cr en 1984 par A.K. Dewdney(1) et il est toujours actif ainsi que trs intressant pour quiconque aime se toucher les parties gnitales sur des problmes informatiques. Je vous propose ici den dcouvrir les bases. simule la mmoire et lexcution des combattants est appel MARS pour Memory Array Redcode Simulator (il y a des implmentations pour toutes les plateformes). Quelques points importants retenir avant de tremper les mains dans le bousin : La mmoire est circulaire , c'est--dire quau dessus de la dernire adresse on retombe sur la premire. Ladressage est relatif : tout est adress par rapport linstruction en train dtre excut par le programme, donc ladresse 0 correspond ladresse de linstruction elle-mme, ladresse 1 linstruction suivante, etc. Une instruction en Redcode est constitue de trois parties : lopcode qui dsigne lopration effectuer, ladresse source (appe4

La Guerre DeS PrOGraMMeS par JoE

COreWar

Le terrain de jeu est donc la mmoire dun ordinateur virtuel dont lunit nest pas un octet mais une instruction. Les programmes sont crits dans un langage appel Redcode qui est un pseudo assembleur (pas dinquitude, aucunes comptences requises dans le domaine, seule une cafetire est ncessaire). Le programme qui

HZV Mag #2CoreWar - par Joele champ A) et ladresse destination (appele champ B). Pour ordonnancer lexcution des programmes, MARS fait du simple time-sharing : si il y a deux programmes X et Y qui saffrontent, la premire instruction de X est excute puis la premire de Y, puis la deuxime de X, et ainsi de suite Lexcution de chaque instruction prend un temps gal. Avant de voir des premiers exemples de combattants, intressons nous au jeu dinstruction Redcode (qui deviendra plus clair une fois quon aura vu les exemples concrets). Leur nom est souvent explicite mais pour les anglophobes je me permets des explications : DAT : linstruction magique, quiconque lexcute meurt dans datroces souffrances (non jen fais pas trop). MOV : copier de la source vers la destination. ADD | SUB | MUL | DIV : comme leur noms lindiquent, il sagit des oprations arithmtiques classiques (addition, soustraction, multiplication et division). MOD : opration modulo. JMP : continuer lexcution une autre adresse. JMZ, JMN (jump if zero, jump if not zero): tester la nullit dune instruction et, suivant le rsultat, poursuivre lexcution ou sauter une autre adresse. DJN (decrement and jump if not zero) : decrmenter, tester la nullit et sauter une autre adresse si a nest pas nul. SPL (split) : dmarrer un deuxime thread une autre adresse. Nous allons revenir sur cette instruction plus loin. SEQ, SNE, SLT (skip if egal, skip if not egal, skip if lower than) : comparer deux valeurs et, suivant le rsultat, excuter ou non linstruction suivante. CMP (compare) : exactement pareil que SEQ. LDP, STP (load from p-space, save to pspace) : sauvegarde ou lit une valeur dans un espace mmoire priv chaque processus qui se nomme le P-Space. Cest assez peu utilis en pratique. NOP (no operation): ne rien faire. Comme promis, observons maintenant des exemples de programmes. Le premier est lexemple historique de CoreWar, il a t propos par son crateur dans larticle fondateur du jeu(1), il se prnomme le Imp et son code est le suivant :MOV 0, 1

retour au sommaire

Donc le programme excute linstruction MOV 0,1 qui consiste copier linstruction qui se trouve ladresse 0 (cest dire elle-mme) pour la mettre ladresse 1. Ainsi on obtient :

: :

MOV 0, 1 MOV 0, 1

Les lignes importantes tant les suivantes, qui permettent respectivement de dterminer le nombre de caractres du fichier, et de tester la

valeur d'un caractre (ou plus prcisment de tester la valeur ASCII de ce caractre) :130

HZV Mag #2

retour au sommaire

Tour d'horizon sur les SQL injections - par NiklosKoda

:

$reponse = send("'+OR+LENGTH(LOAD_FILE('".$fichier."'))=".$longueur.'#'); $reponse = send("'+OR+ASCII(SUBSTR(LOAD_FILE('".$fichier."'),".$i.",1))=".$ c.'#');

Notre exploit fonctionne maintenant correctement, et nous sommes en mesure de rcuprer des fichiers sur le serveur partir d'une injection pour laquelle nous ne sommes pas en mesure d'afficher le rsultat. L'inconvnient de cette mthode est qu'elle est tout de mme longue et coteuse, puisqu'elle envoie une requte pour chaque test de caractres, ce qui peut s'avrer trs long si le fichier est volumineux (mais on pourrait diminuer un peu le nombre de requtes en ne testant que les caractres probables et pas toute la table ascii...). Dans cet exemple, nous avons bruteforc intelligemment le contenu d'un fichier grce la fonction LOAD_FILE, mais nous aurions bien entendu pu faire de mme avec toute chane de caractre et rcuprer n'importe quelle information de la mme manire.

ment l'excution de notre requte, et que ce ralentissement traduise un tat de russite, alors on sera en mesure de connatre, comme pour une injection l'aveugle classique , si l'injection russi ou non, simplement en mesurant ce temps. Voyons tout de suite un exemple d'application. Le script mail.php suivant permet d'envoyer un mail un membre en prcisant le message envoyer et l'id du membre. Une requte SQL est utilise pour obtenir le mail du membre partir de son id.

nous permettre de raliser une injection malgr la prsence de mysql_real_escape_string, car elle n'est pas entoure de quotes. On pourra donc effectuer toutes les injections qui ne ncessitent pas de quotes. Mais avant cela il nous faut un moyen de ralentir le temps de la requte, pour cela nous avons deux fonctions trs utiles : BENCHMARK et SLEEP. BENCHMARK(X, ACT) permet d'excuter X fois l'opration ACT, et sert normalement effectuer des tests de rapidit. L o elle nous sera utile, c'est que rpter un grand nombre de fois une opration, mme simple, prend toujours du temps (par exemple SELECT BENCHMARK(1000000, MD5(0)) prend environ 3 secondes avec ma configuration). SLEEP(X)

:

Total Blind

Enfin, voyons le dernier type d'injection SQL : les requtes qui ne renvoient aucun lment d'information, ni sur les rsultats, ni sur l'tat de russite de la requte. Il nous faut alors trouver un nouveau facteur qui nous renseignera : le temps d'excution de la requte ! En effet, si on russi ralentir considrable-

Ici on remarque que la variable $_GET['id'] va

quant elle, est une fonction qui permet sim131

HZV Mag #2

retour au sommaire

Tour d'horizon sur les SQL injections - par NiklosKodaplement d'attendre X secondes, elle est donc plus simple que BENCHMARK et c'est celle que nous utiliserons ici. L'tape suivante consiste excuter la fonction SLEEP uniquement si notre injection retourne Vrai. MySQL nous propose pour cela la fonction IF, qui s'utilise comme ceci : SELECT IF(condition, valeur1, valeur2) elle retourne valeur1 si condition est vraie et valeur2 si elle est fausse. Maintenant, il ne nous reste plus qu' mesurer le temps d'excution de la requte. Rangez les chronomtres, nous allons coder un petit exploit, mais avant cela voyons un simple script qui nous permettra de visualiser concrtement ce que nous venons de voir : Et nous obtenons quelque chose du genre :

:

Temps de la 1re requte : 0.013152837753296 Temps de la 2me requte : 3.0038139820099

blind , qui nous permettra d'extraire la structure bases/tables. Nous savons que les noms des bases et des tables sont respectivement enregistrs dans les champs SCHEMATA.SCHEMA_NAME et TABLES.TABLE_NAME. Notre exploit va donc procder ainsi : - Compter le nombre de bases et de tables ; - Dterminer leur nom ; - Construire les liens d'appartenance base/ table. Et il faudra aussi : - Mesurer le temps d'une requte classique (sans injection) pour fixer correctement le temps de dtection d'une injection russie, qui sera la somme du temps classique et du temps d'attente ; - Ne pas dterminer la structure des bases information_schema et mysql dj connue. Voil la source complte, qui parle d'elle mme :

La diffrence de temps entre une expression fausse (1=2) et une expression vraie (1=1) est donc clairement visible. Passons maintenant une injection plus pousse : nous savons qu'il existe plusieurs bases et plusieurs tables, que nous aimerions bien dterminer. Et nous avons vu dans la premire partie que toutes ces informations sont regroupes dans une base appele information_schema. Construisons donc un exploit capable d'exploiter notre requte avec une injection total

:

132

HZV Mag #2

retour au sommaire

Tour d'horizon sur les SQL injections - par NiklosKoda

: