raisep0wn

Geek Stuff & IT Security

Archive for the ‘IT Security’ Category

Advanced Persistent Threat

leave a comment »

Enfin un vrai discours sur les APT, merci Nicolas Ruff.

Source

Written by Ralph

07/09/2011 at 08:56

Publié dans IT Security

Fighting viruses, defending the net

leave a comment »

La vidéo d’une conférence grand publique et néanmoins très intéressante de Mikko Hypponen au sujet de la cyber-criminalité. C’est en anglais, mais toutefois d’une grande clarté, et plein d’humour.

L’interview de Mikko sur CNN.

Written by Ralph

20/07/2011 at 19:53

Publié dans IT Security

Hackers : ni dieu, ni maître

leave a comment »

Un reportage d’une demie heure présentant au grand public la communauté des hackers européens. Merci à Fabien Benoit / ARTE.

Written by Ralph

09/06/2011 at 21:18

Publié dans IT Security

NDH 2K10 public wargame level1

with 2 comments

Maintenant que la NDH 2k10 commence à dater, et que la NDH 2011 arrive à grand pas, je pense qu’il est temps de publier les quelques exploits qui nous permettent d’arriver à nos fins. Plusieurs articles ont été publiés peu de temps après la publication du WarGame, Infond, m_101 pour ne citer qu’eux. Pour changer des write-up j’ai décidé de réaliser des vidéos pour les 10 niveaux du WarGame. J’ai choisi le WarGame de la NDH pour sa relative simplicité (pas d’ASLR), mais aussi parce qu’il permet de se familiariser avec les grands principes du hacking applicatif, du simple buffer overflow au rop, et passant par race conditions, stack canary, brute force, format string, et  ret2libc. C’est donc un bon WarGame pour débutant, qui vous donnera une vision générale de l’exploitation de failles applicatives, à vous d’approfondir les domaines qui vous tiennent à cœur…

Code source de l’épreuve :

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

void dummy()
{
setresuid(geteuid(),geteuid(),geteuid());
system("sleep 1; cat /home/level2/passwd;");
exit(0);
}

int *p;
void func(char *arg)
{
char buf[16];
p = (int *)&buf[sizeof(buf)];

printf("dummy() is at: 0x%08x\n", dummy);
printf("before:   SEBP=%p\n\t  SEIP=0x%08x\n", *p, *(p+1));
strcpy(buf, arg);
printf("after:    SEBP=%p\n\t  SEIP=0x%08x\n", *p, *(p+1));

}
int main(int argc, char *argv[])
{
if(!argv[1]) {
printf("No command found...\n");
return;
}
func(argv[1]);
}

Le level1 est une introduction aux buffers overflow. Le premier argument passé au programme est copié sans ménagement ni vérification dans un buffer de 16 octets. Si la zone mémoire réservée (16 octets) n’est pas suffisante, strcpy continuera en écrasant les données situées après la fin du buffer. Le buffer étant alloué sur la pile, nous risquons d’écraser ce qui a été précédemment empilé. Ici, les valeurs sauvegardées de EIP, puis EBP ont été empilés juste avant la création du buffer. A la fin de la fonction func(), l’instruction leave réinitialisera la stack frame, et l’instruction ret mettra SEIP dans EIP (POP->EIP). L’exploitation consistera a écraser SEIP par l’adresse de la fonction dummy, afin de rediriger le flow d’exécution et afficher le mot de passe du prochain niveau.

Références :

Written by Ralph

28/05/2011 at 08:09

Publié dans IT Security

Tagged with , ,

NDH 2k10 Public WarGame level2

leave a comment »


Code source de l’épreuve :

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

int main(int argc, char *argv[])
{
char *buffer = malloc(sizeof(char)*(strlen("man ")+strlen(argv[1])+1));

if(argc<2 || strlen(argv[1])>50) {
printf("Manpage <argument>\n");
exit(0);
}

strcpy(buffer, "man ");
strcat(buffer, argv[1]);

system(buffer);
return 0;
}

Le level2 montre une utilisation dangereuse de la fonction system(). D’ailleurs, la documentation précise que cette fonction ne doit jamais être utilisée avec un programme ayant un SUID. Cette fonction permet de lancer une commande shell (ici, man, affichant le manuel), et l’argument passé au programme est inclus dans la commande. Or la syntaxe du shell permet de séparer les commandes via le caractère point-virgule, ainsi il nous est très facile de lancer une deuxième commande après man. De plus, la commande system() utilise certaines variables d’environnement qui sont contrôlées par l’utilisateur. La fonction system() va rechercher un exécutable du nom de man dans les dossiers définies dans la variable d’environnement PATH. Vous pouvez alors parfaitement contrôler quel binaire cette fonction va exécuter.

Références :

Written by Ralph

28/05/2011 at 08:08

Publié dans IT Security

Tagged with , ,

NDH 2k10 Public WarGame level3

leave a comment »


Le level3 ne contient pas de code source. Il s’agit d’un programme qui nous demande de casser un algorithme de chiffrement. Après quelques tests, on peut supposer qu’il s’agisse d’un chiffrement par substitution linéaire. Il ne nous reste plus qu’à l’attaquer par force brute. Nous allons essayer toutes les possibilités caractère par caractère. Je vous propose ci-dessous un code source python qui se chargera de ce travail pour nous.

#!/usr/bin/python
import os

target = '/home/level3/crackme'
wanted = '2:8vytm&*9|)].l(ol;a'
arg = 'a'*20
solution_string = ''
size = 1024

print "-->Brute force cracking"
for char in range(20): # bf one by one
 for ascii in range(1, 256): # for all but \0 (ascii)
  arg = solution_string + chr(ascii) + 'a'*(19-char)
  # beware of bad char :
  if arg.find("'") == -1:
   # /home/level3/crackme 'all but single quote'
   cmd = "%s '%s'"%(target, arg)
  else:
   # /home/level3/crackme "all but double quote"
   cmd = '%s "%s"'%(target, arg)
  # reading the output
  res = os.popen(cmd).read(size)
  # searching for ciphered
  pos = res.find('Ciphered:')
  # ciphered is 20 bytes length
  ciphered = res[pos+10:pos+30]
  # check current ciphered char matching with wanted
  if ciphered[char] == wanted[char]:
   solution_string = ''.join([solution_string, chr(ascii)])
   break
 print '>%d%%'%(char*5)

# print solution string
print "\nSolution string: %s"%solution_string
# print string as a list to get unprintable ascii
print "Solution ascii: %s"%[solution_string]

Références :

Written by Ralph

28/05/2011 at 08:07

Publié dans IT Security

Tagged with , , ,

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