Titre: Thread Local Storage : une arme redoutable Posté par: Lord357 le 04 Septembre 2011 à 18:13:12 0. Sommaire
1. Pré-requis 2. Qu'est qu'une TLS 2.1 Comment ça marche ? 3. L'intérêt 4. Exemple ! 4.1 Mise en Oeuvre 5. Connaître son ennemi 6. Quelques Liens 1. Pré-Requis Pour comprendre ce papier vous aurez besoin des éléments suivants :
2. Qu'est qu'une TLS TLS est une abréviation de Thread Local Storage. C'est une fonctionnalité système (quelque soit l'OS) permettant de
2.1 Comment ça marche ?
Voyons la composition de la structure IMAGE_TLS_DIRECTORY, ainsi qu'une brève explication sur l'utilité de chacune des entrées : Code: struct IMAGE_TLS_DIRECTORY Notre objectif, vous l'avez bien compris, est de créer un TLS artisanal, une IMAGE_TLS_DIRECTORY dont l'entrée AddressOfCallBacks pointera sur une (des) fonction(s) destinée(s) à servir notre sombre dessein. En modifiant les headers pour sa prise en charge, nous allons donc pouvoir exécuter du code d'initialisation de thread. Une question subsiste, pourquoi ? 3. L'intérêt Un fait, et une entrée de la structure IMAGE_TLS_DIRECTORY; A savoir que l'ensemble des fonctions pointées par l'entrée AddressOfCallBacks seront exécutées pour initialisation de CHAQUE thread, et qui dit chaque thread dit AUSSI la thread principale du programme. Qu'est ce que cela signifie ? Et bien que le code contenu sera exécuté AVANT que le programme en lui même ne soit lancé. Pour donner un exemple concret, imaginez un virus dont la charge de reproduction serait démarrée via une TLS ? Quelle serait les conséquences ? Un antivirus qui tenterait d'émuler le code commencerait par gerer le tout à partir de l'EntryPoint ... Et la c'est dramatique. L'entryPoint n'est pas modifé, le corps du virus s'est éxécuté avant, l'émulateur ne voit RIEN. Une autre conséquence, c'est le reverse engineering, et la vous y reflechirez deux fois avant d'ouvrir un crackme :-) le code sera exécuté AVANT le chargement du debugger. Vous verrez dans l'exemple que nous exécuterons du code avant que Ollydbg n'ai desassemblé le contenu. Si c'est un virus, vous êtes DEJA infecté. J'ajoute également une intéressante possibilité du point de vue anti-debug. Finalement rien ne nous empecherait de corrompre le code si on detecte un debugger (et pour ça il y a vraiment une multitude de techniques). J'insiste bien sur ce point, cette méthode est térrifiante puisque tout code présent dans une TLS et pointé par PIMAGE_TLS_CALLBACK sera exécuté AVANT même la toute première instruction du code du processus cible. 4. Exemple ! Notre POC est codé en ASM (FASM). C'est un simple Hello World dont le corps à été modifié par un vilain hacker via une TLS. J'ai sévèrement commenté le code pour que tout le monde puisse être à même de comprendre l'exemple. Code: format PE GUI 4.0 4.1 Mise en oeuvre Alors la c'est un peu spécial, en effet modifier les headers à la volée m'aurait obligé à coder un POC plus conséquent ou à carrément coder le PE dans le source, ça aurait été plus complexe à comprendre et beaucoup plus long à developper. L'impact ? vous allez mettre un peu les main dans le camboui. Pour cela vous devrez modifider les headers de l'exécutable pour spécifier la TLS dans le IMAGE_TLS_DIRECTORY. Pour la réalisation avec LordPE: a. Click sur "PE Editor" => aller chercher le code compilé) b. Click sur le bouton "Directory" c. Dans la fenêtre présentée, chercher l'entrée "TlsTable". d. Dans le champs "RVA" entrez : 00001024 (vous pouvez determinez vous même la RVA avec Ollydbg, c'est après le RET qui suit le POPAD :) - N' oubliez pas de soustraire l'image base.) e. Dans le chaps "Size" 00000018, c'est la taille de IMAGE_TLS_DIRECTORY Note : vous pouvez tester l'exécutable avant et après la modification pour bien vous rendre compte de la nature perverse de cette technologie ! Note, le retour : Propriété intéressante, vous constaterez si vous en avez la possibilité technique que le lancement d'un programme implémentant la technologie présentée n'exécutera PAS le code présent dans la TLS s'il est lancé à partir du réseau (d'un partage donc). Finalement vous vous retrouvez avec un exécutable dont le traitement est modifié selon le contexte (en tout cas sous Windows 7). L'exemple fourni est très simple, c'est vrai. Mais d'autres implémentation permette entre autre de carrément modifier les AddressOfCallBacks à la volée pour traiter des conditions ! Vous pouvez donc "choisir" ce que vous exécuterez, tout ça ... avant que le programme ne démarre lui même. C'est très violent. 5. Connaître son ennemi De nombreux worms et autres codes malveillants utilisent cette technologie (le début des implémentations massives démarre en 2004, elle est connue depuis les années 2000...). Ce qui donne, en 2011, une chance pour un antivirus de qualité de facilement detecter ce trick. Pour ce qui est du repérage manuel (en dehors de la "fécondation in-compilo"), il faut configurer son debugger. Les plus anciens ne feront pas l'affaire. Toutefois, pour le plus connu d'entre eux, Ollydbg il reste une oasis : il faut regarder du coté des options de debugging. Par défaut l'outil est configuré pour "breaker" sur l'entrypoint du programme, matérialisé par l'option "WinMain (if location is known)". Comme dit précédemment, c'est bien le loader de Windows (au travers d'NTDLL) qui gère l'exploitation de la TLS pour l'implémentation au travers des headers, ce n'est donc pas l'exécutable en lui même, mais votre système. Remplacer cette option par "System breakpoint" suffira donc faire en sorte de s'affranchir du risque tout de mêe conséquent de s'infecter en debuggant un programme, sans même s'en rendre compte ! 6. Quelques liens
Titre: Re : Thread Local Storage : une arme redoutable Posté par: Lord357 le 04 Septembre 2011 à 18:15:02 Si vous trouve intéressant, surtout n'hésitez pas à m'indiquer les points d'ombre si il y en a. C'est un peu plus compliqué que les deux précédents.
Je pense que c'est également l'objet d'un crackme intéressant. Je dis ça je dis rien :) Titre: Re : Thread Local Storage : une arme redoutable Posté par: the lsd le 04 Septembre 2011 à 22:56:02 Quelques fautes d'orthographe que j'ai remarqué (j'ai pas cherché partout non plus) :
programmation générale vraiment basique (à moins que ça soit un calembours avec le basic) où seront spécifiées Comme pour les autres, c'est bien présenté et bien écrit, ça passe bien comme il faut :). Par contre, seul point noir que je vois c'est qu'il n'y a pas d'explication sur le fonctionnement en dehors du code présent (bien commenté certes, mais, ça me chiffonne un peu quand même). En plus, je connaissais pas, j'ai appris un nouveau trick apparemment assez surpuissant. Ca me fait d'ailleurs pensé, ce qui serait génial, si tu as le temps/envie, ça serait de rajouter une partie qui expliquerait comment repérer l'infection du TLS. Ça peut aussi s'appliquer aux autres tutos que tu as écrit. Si tu ne veux pas, ca ne changera pas mon point de vue pour autant, ton tuto est validé sans souci pour moi :) Enjoy The lsd Edit : par contre, comme je connaissais pas le trick, je peux pas trop dire s'il y a des erreurs techniques Titre: Re : Thread Local Storage : une arme redoutable Posté par: Lord357 le 05 Septembre 2011 à 09:25:28 Je vais corriger les fautes, Je n'ai pas particulièrement fait attention sur les deux derniers, je vais refaire une passe.
Pour le fonctionnement, OK aussi je vais expliquer un peu plus. Et pour repérer les infections / tricks pareil je vais donner des éléments de réponse sur les 3 tutos. Ce qui est génant c'est que sauf erreur je ne vois nulle part ou placer des images, ça aurait été plus simple mais je m'arrangerais sans. Titre: Re : Thread Local Storage : une arme redoutable Posté par: the lsd le 05 Septembre 2011 à 10:48:12 Effectivement, niveau image, c'est assez restrictif. J'avoue que des images seraient les bienvenues, mais à moins d'une exception énorme, il faudra t'en passer.
J'attends d'autres avis. Enjoy The lsd Titre: Re : Thread Local Storage : une arme redoutable Posté par: Lord357 le 06 Septembre 2011 à 21:51:12 Bien, big time ... j'ai mis à jour en expliquant le mode de fonctionnement initial plus clairement.
the lsd n'hésite pas à faire un nouveau retour si t'as encore des points d'ombres. Comme dit précédemment c'est plus complexe que les deux autres doc, la il y a des structures PE, des structures mémoires, des API, des chaines de pointeurs à respecter, des options d'utilisation, et pour couronner le tout c'est pas un mécanisme très documenté (à l'instar de son utilisation) :D ça devient vite très casse tête. j'ai aussi mis plus de lien, si les gens veulent creuser le sujet, dont un doc d'un reverser très complet. En passant j'ai aussi mis les aspects repérages dont tu m'avais parlé :) EDIT : puis tout à l'heure j'ai voulu exécuter le POC d'un partage j'ai eu une super surprise, j'ai cru que mon POC était tout pourri mais non. le TLS a une autre propriété amusante, que j'ai mise en note ! Titre: Re : Thread Local Storage : une arme redoutable Posté par: Lord357 le 09 Septembre 2011 à 21:02:56 pas de news ? sur aucun des trois ?
Titre: Re : Thread Local Storage : une arme redoutable Posté par: the lsd le 09 Septembre 2011 à 21:30:58 Recrée un topic dans cette partie du forum en copiant collant ton tuto, on le déplacera dans la section Tutoriaux (ca nous permet de garder une trace ici de ce qu'on a dit). Fais ca pour les 3 :)
Enjoy The lsd Titre: Re : Thread Local Storage : une arme redoutable Posté par: the lsd le 10 Septembre 2011 à 15:13:23 Bon, je fais un dernier check avec les autres relecteurs, pour valider les tutos.
Tout le monde est OK pour mettre les 3 en ligne ? Enjoy The lsd Titre: Re : Thread Local Storage : une arme redoutable Posté par: Asteriksme le 10 Septembre 2011 à 19:29:28 Moi ca me va.
|