raisep0wn

Geek Stuff & IT Security

Posts Tagged ‘msfpayload

NDH 2k10 Public WarGame level4

leave a comment »


Code source de l’épreuve :

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

// gcc -o level4 level4.c -fno-stack-protector -z execstack -mpreferred-stack-boundary=2

int checkIdent(char *login, char *pwd)
{
	char buffer[8] = {'\0'};
	int i;

	strcpy(buffer, login);
	buffer[strlen("guest1")] = '\0';

	if(strcmp(buffer, "guest1"))
		return 0;

	strcpy(buffer, pwd);
	buffer[strlen("guest1")] = '\0';

	if(strcmp(buffer, "guest1"))
		return 0;

	return 1;
}

int main(int argc, char *argv[])
{
	if(argc != 3) {
		printf("%s <login> <pass>\n", argv[0]);
		exit(-1);
	}

	if(checkIdent(argv[1], argv[2])) {
		printf("Logged \n");
		exit(1);
	}

	printf("Oh noes\n");
	return 0;
}

Le level4 est un buffer overflow, tout comme le level1, seulement cette fois-ci, nous ne pouvons pas rediriger le flow d’exécution vers une fonction qui affiche le password, car cette fonction n’a pas été codée dans le binaire. Il va donc falloir la créer. Tout d’abord, il faut localiser SEIP, la zone mémoire sur la pile qui sera popée dans EIP au moment du ret de la fonction. Pour ce faire, nous allons utiliser un pattern cyclique, c’est à dire, une chaine de caractère spécialement conçue qui nous permettra de savoir la position de SEIP en nombre d’octet depuis le début de la chaine. Pour ce faire, nous utiliserons les scripts pattern_create.rb et pattern_offset.rb fournie avec Metasploit, lui-même disponible dans la distribution linux backtrack. Une fois le pattern injecté, nous déclenchons une erreur de segmentation (segfault). Nous pouvons récupérer la valeur de EIP au moment de l’erreur via la commande dmesg. Nous connaissons alors la position de EIP. Mais encore faut il savoir vers où rediriger EIP… Par exemple, nous aimerions bien appeler /bin/sh. L’astuce consiste à ajouter directement sur la pile, des instructions assembleurs correspondant à un appel a /bin/sh. En fait, rien ne nous empêche de convertir les instructions assembleurs d’un petit programme, en chaine de caractère, et de les copier sur la pile. C’est ce que l’on appelle communément un shellcode, un code permettant de lancer un shell. Petite remarque au passage, un shellcode ne peut pas contenir d’octet null (\x00) car cela signifierait la fin de la chaine de caractère… Quoi qu’il en soit, beaucoup de shellcode trainent sur la toile, et  Metasploit à même un outil permettant de générer ce genre de chose (msfpayload / msfencode). Bref, il ne nous reste plus qu’à faire pointer EIP sur notre shellcode pour obtenir un shell.

Références :

Written by Ralph

28/05/2011 at 08:06

Publié dans IT Security

Tagged with