BfbTester audit la sécurité des binairesLes vulnérabilités de type buffer overflow sont sûrement les plus répandues dans les systèmes Unix et Win32.
De nombreux binaires comme par exemple "su", "sudo" ou "linuxconf" sous linux ont un jour étés touchés par ce type de vulnérabilité. Comment détecter cette faiblesse sans avoir le code source sous la main ? BFBtester est la réponse. BFBTester est un outil qui permet d'auditer la sécurité de binaires quand vous n'avez pas le code source. Pour ce faire, BFBtester par tenter de découvrir pour vous si ce binaire est vulnérable à un faille de type "buffer overflow" (dépassement de mémoire tampon) en exécutant le binaire avec des arguments de grand longueur combinés avec des switch variés et test aussi les variables d'environnement. Un exemple valant mieux qu'un long discours, nous avons testé pour vous BFBtester. Configuration de notre machine: [root@crazy acz]# uname -aPour cet exemple, nous allons utiliser un programme très simple dont nous savons qu'il est vulnérable à un buffer overflow. Cependant, une fois compilé il faudra en oublier le code source. /* foo.c */On le compile. [acz@crazy acz]$ gcc -o foo foo.cOn utilise bfbtester pour le tester et essayer de découvrir un problème de buffer overflow. [acz@crazy acz]$ bfbtester -at fooBFBtester vient de mettre en évidence le problème, essayons de le reproduire manuellement. [acz@crazy acz]$ ./foo `perl -e 'print "A"x51200'`Excellent, le problème est bien là, BFBtester ne s'est pas trompé. Maintenant essayons de trouver manuellement la limite du segfault. [acz@crazy acz]$ ./foo `perl -e 'print "A"x203'`Notre programme segfault quand on lui soumet argument d'une longueur supérieure à 204 caractères. Que se passe t'il au niveau de la pile ? gdb est notre ami. [acz@crazy acz]$ gdb fooParfait ! On peut écrasé l'EIP, on remarque que dans notre cas l'EIP a été écrasée par 0x41414141qui vaut "A". Notre programme est donc exploitable, on pourrait l'utiliser si il était suid pour obtenir un shell root. Maintenant, nous allons écrire l'exploit qui va permettre d'utiliser cette vulnérabilité. Désolé pour les puristes, mais nous allons l'écrire en perl ;-) #!/usr/bin/perl Testons notre exploit. [acz@crazy acz]$ perl x.plRien ne se passe, il va falloir trouver le bon offset pour notre système. [acz@crazy acz]$ ./x.pl 20Bingo, le shell code est passé, /bin/sh a été exécuté, notre exploit a fonctionné. Cependant nous n'avons pas un shell root car notre binaire n'était pas suid. Essayons pour voir... [root@crazy acz]# chmod 4755 foo && chown root.root foo && ls -al fooNotre binaire est maintenant suid, si l'exploit fonctionne nous obtiendrons un shell root. [acz@crazy acz]$ idGot r00t ! Nous avons un shell root. Comment se protéger ? Personnellement je combine un patch grsec et la libsafe. Je ne vais pas détailler ces deux solutions ici, cela fera l'objet d'un prochain article. Essayons la même opération avec ces protections. bash-2.05$ ./foo `perl -e 'print "A"x208'`La libsafe nous avertit de la tentative de débordement de mémoire tampon. Essayons quand même de l'exploiter. bash-2.05$ ./x.pl 80L'exploitation de la vulnérabilité est impossible, avec grsec & libsafe, notre machine semble protégée de ce type d'attaque. Voyons les traces dans /var/log/secure Apr 20 13:05:08 crazy libsafe.so[15544]: Libsafe version 2.0.16Les traces dans /var/log/messages Apr 20 13:07:17 crazy kernel: grsec: exec of [03:02:2191674] (./x.pl 80 ) by (bash:2371) UID(509) EUID(509), parent (bash:12822) UID(509) EUID(509)
Mots clés : bfbtester, bufferoverflow CommentsVous devez vous enregistrer afin de pouvoir commenter cet article. Cliquez ici pour créer un compte gratuitement! |
Derniers Articles
Commentaires récents![]() |