Merry X-Mas =) / Implementing SEHOP
Tout d’abord joyeux noël à tous =)
je ne poste pas beaucoup en ce moment alors je me suis vu obligé de vous faire un petit cadeau de noël.
Vous avez surement entendu parlé de la protection SEHOP (Structured Exception Handling Overwrites Prevention) qui consiste à empêcher l’exploitation de Buffer Overflows par réécriture de SEH. J’ai étudié cette protection en rédigeant un article pour le mag hzv #3 qui je l’espère sortira prochainement. Mon but a alors été d’implémenter cette technique un peu à la manière de EMET et Wehntrust. L’idée m’est en effet venue après avoir lu un article de Ivanlef0u (EMET failed) dans lequel il analyse une des protections de EMET.
La protection SEHOP est par défaut implémenté dans les systèmes Windows Vista, Seven et Server 2008. De plus, une fois couplée à l’ASLR il devient très difficile de bypasser cette protection. Récemment Heurs et Virtualabs on publié un paper (Bypassing SEHOP) où ils tentent de trouver une technique pour outrepasser SEHOP. Le problème auxquels il se heurtent est celui de l’ASLR cependant d’après leur tests on se ramène à 1 chance sur 512 de parvenir à exploiter un stack overflow par SEH Overwriting. Ce n’est pas encore gagné, mais c’est un bon début =).
Moi je n’ai pas tenté de bypasser cette protection bien au contraire j’ai décidé d’essayer de l’implémenter pour par exemple protéger un système tel Windows XP qui par défaut n’a pas SEHOP. Bien que sur les récents systèmes Windows, SEHOP reste assez “basique”. J’entends par là qu’aucune vérification autre que celle de la validité de la liste chainée des SEH n’est faite ce qui permet alors plus facilement d’établir des stratégies pour la bypasser.
Mon projet n’est en fait qu’une Dll qu’il faut injecter dans le processus à protéger où tout simplement la charger avec LoadLiraryA() pour l’un de vos programmes. Je n’ai pas encore fait de programme pour automatiser le chargement de la Dll dans les processus voulus ou carrément tout le système comme Wehntrust car elle n’est pas tout à fait stable encore et quelque peu incomplète.
En quelques mots je défini un handler SEH de validation en fin de la liste de chaque thread et en détournant la fonction RtlDispatchException() de ntdll.dll je détecte les exceptions qui ont lieu. Ensuite je parcourt la liste des SEH jusqu’à trouver mon handler de validation. Au passage j’en profite pour vérifier l’état du registre EBP ( est-ce qu’il pointe bien sur la pile ?), je regarde également que le handler ne pointe pas vers une séquence d’instruction de type POP POP RET (pour l’instant je ne prend pas tous les cas possibles en compte) et que le champ prev (previous handler ou handler précédent) ne contient pas un JMP SHORT typiquement utilisé lors d’une exploitation par réécriture d’un SEH.
Je l’ai testé surtout sous windows Seven mais aux dernières nouvelles cela fonctionnait aussi sous Windows XP.
Si il est accepté vous aurez de plus ample informations dans l’article que j’ai écrit pour le hzv mag #3.
Sans plus tarder voici les sources et binaires : Lilxam’s SEHOP
J’ai inclus un programme de test compilé sous Windows 7 donc il se peut qu’il y est des changements au niveau de la pile (plus courte/longue) par rapport à XP.
En ce qui concerne la technique de la réécriture de SEH voyez plutôt le mag #1 de hzv.
Pour améliorer mon tool je propose des dumps et désassemblages que j’ai réalisés grâce à la librairie de Beatrix que je remercie très fortement : Bea Engine
PS : N’essayez de jouer avec la clé AppInitDlls pour charger la Dll dans chaque processus car il risque d’y avoir des bugs…
Bien entendu je prévois de publier prochainement une autre version de cette Dll plus complète et plus stable.
Joyeuses fêtes à tous ! =)
No comments yet.