NDH 2k10 Public WarGame level2
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 :
Laisser un commentaire