|
Site under construction
Warning: a technical problem (MySQL server) prevents access to this part of the site. Thank you for your understanding. |
slogan
Vous êtes ici : Accueil » Articles » Système
>>Les Rootkits - Hooks InlineBonjour ;), Suite aux topics concernant RkU sur Open-File, je vais tenter expliquer plus en détails ses techniques de détection (et principalement les hooks inline), afin de comprendre les rapports qu’il remonte. Le terme ’hook’ revient souvent et est très bien expliqué dans le lexique Sécurité. "Crochetage" ou "accrochage" - ("Hook" - "Hooking") : technique utilisant des "crochets" pour provoquer une séquence de traitement différente de l'originale. Après un crochetage, la séquence se déroule dans un ordre particulier. Le nouveau crochet enregistre sa propre adresse pour effectuer son traitement et revient à l'original à un moment donné, généralement à la fin. « Unregistering » (ou « restore ») signifie remettre en place le procédé original. L'accrochage ou crochetage peut être employé pour beaucoup de raisons y compris la correction ou l'extension des fonctionnalités originales. Il peut aussi être utilisé pour injecter un code potentiellement malveillant dans le traitement. Nous connaissions les rootkits user-mode. Avec des techniques comme l’API Hooking ou encore le BHO. La dernière génération de rootkits s’attaquent directement au noyau de Windows. On en parle beaucoup sur Open-Files et ailleurs. Les méthodes employés sont complexes et les détecter l’est encore plus. Mais comment interpréter les résultats fournit par les IDS du moment. Je pense principalement à RkU. Je pense qu’il n’ai plus nécessaire d’expliquer les hooks de la SSDT, néanmoins, les différents hooks inline nécessite une petite explication. Le "Inline hooking" est une variante des techniques vues précédemment. Cette fois, plutôt que de modifier une entrée dans une table d’indirection (IAT ou SSDT), cette technique consiste à écraser les premiers octets de la fonction pointée par la table d’indirection. (src). Tentative d’explication : Le but étant d’altérer la fonction, il convient de la modifier dans le coeur de Windows. Les fonctions de plus bas niveau sont fournit généralement par ntoskrnl.exe. C’est le premier pilote chargé par Windows. Les techniques de hooking consistent à modifier cet élément en mémoire noyau. Par exemple, prenons la fonction ’sensible’ ZwOpenProcess. Son desassemblement nous donne ceci : Disassembly of ZwOpenProcess (0x00406044) ; Section: .text ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ; EXP: ZwOpenProcess (1327) ; SYM:ZwOpenProcess 0x406044: B87A000000 MOV EAX,0x7A 0x406049: 8D542404 LEA EDX,[ESP+0x4] 0x40604D: 9C PUSHFD 0x40604E: 6A08 PUSH 0x8 0x406050: E8DC150000 CALL 0x407631 0x406055: C21000 RET 0x10 Il suffirait de modifier les premiers BYTES de la fonction pour réaliser une redirection vers un autre driver : Disassembly of ZwOpenProcess (0x00406044) ; Section: .text ;= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ; EXP: ZwOpenProcess (1327) ; SYM:ZwOpenProcess 0x406044: B87A000000 JMP 0xXXXXXXXXX <-- REDIRECTION 0x406049: 8D542404 LEA EDX,[ESP+0x4] 0x40604D: 9C PUSHFD 0x40604E: 6A08 PUSH 0x8 0x406050: E8DC150000 CALL 0x407631 0x406055: C21000 RET 0x10 Sans rentrer dans le détail des éléments ci-dessus, On constate que la première instruction est modifiée et réalise un tout autre traitement. A savoir que les premieres instructions d’une fonction bas niveau ne peuvent en aucun cas contenir un JUMP. C’est logique, nous sommes au plus bas, impossible de descendre plus. Donc, ici nous pouvons trouver des redirections sous forme de JUMP, de CALL, de PUSH ou d’autres instructions assembleur. Nous retrouvons ces éléments dans les posiblités de détection de RkU.
La première détection est de vérifier si la redirection fait appel à une zone mémoire extérieur à ntoskrn.exe, nous voila avec les DirectCAll / DirectJump. Une méthode plus ’élégante’ : faire une redirection vers une autre zone mémoire de ’ntoskrnl.exe’ qui aura été préalablement altérée, nous voila dans le cas des RelativeJump / RelativeCall. Le Push Ret. L’instruction RET permet de revenir à l’instruction qui suit le CALL. Ainsi, cette technique permet de ’remonter le temps’ pour prendre le contrôle de l’exécution. Ici, je ne décris que les hook inlines des fonctions du noyau. Je ne parle pas des redirections faites sur les TDI, NDIS ou IRP ... Ainsi beaucoup de chose sont à vérifier. Cette démonstration montre tout le mérite de RkU qui est aujourd’hui le meilleur IDS ;) Mais attendez !! Ce n’est pas fini. Nous avons évoqués les rootkits user-mode, les rootkits kernel-mode ... mais une autre variante existe ... les rootkits boot-mode ou rookits matériels :o Ces ’cochonneries’ (pas au niveau technique :)) modifient le noyau Window avant son chargement. Imaginons que le fichier ntoskrnl.exe soit modifié, comment restaurer la mémoire du noyau avec un composant fixe déjà altéré ?! ... Ces rootkits peuvent ce cacher des les eeproms des cartes graphiques ou PCI par exemple. Des preuves-de-concept ont déjà été réalisés. Exemple avec VideoCardKit ou MTD Kit. L’équipe d’eEyes a développé un rootkit qui affiche un logo bleu lors du chargement de windows. Ils utilisent une disquette ou cdrom pour le boot (après le bios), puis chargent eux-mêmes windows en hookant la couche NDIS (Network Driver Interface Specification). Le travail de EP_X0FF est loin d’être terminé :) J’ai pu commettre des erreurs sur ce post, alors n’hésitez à me reprendre ;) Attention : Si vous faites des tests avec des outils trouvés sur les liens de ce post, c’est à vos risques et périls ... Liens Utiles : Open-Files RkU |