raisep0wn

Geek Stuff & IT Security

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 à 08:08

Publié dans IT Security

Tagged with , ,

Laisser un commentaire