Wenger M PDF
Wenger M PDF
Wenger M PDF
1. PREFACE 1
1.1. ENONCE 1
1.1.1. DESCRIPTIF 1
1.1.2. TRAVAIL DEMANDE 1
2.1. PREAMBULE 2
2.1.1. INTRODUCTION 2
2.1.2. COMPLEXITE VS SECURITE 2
2.1.3. CADRE DE L'ETUDE 3
2.2. PREMIERE APPROCHE 3
2.2.1. SYSTEME D'EXPLOITATION 3
2.2.2. L'API WINDOWS 5
2.2.3. CONCEPTS FONDAMENTAUX 5
2.3. FORMAT PE, OCCUPATION MEMOIRE ET DLLS 7
2.3.1. FORMAT PE 7
2.3.2. IMPORT ADDRESS TABLE 12
2.3.3. OCCUPATION MEMOIRE : THEORIE 16
2.3.4. OCCUPATION MEMOIRE : PRATIQUE 19
2.3.5. DEPENDANCES 23
2.4. PROCESSUS, THREADS ET HANDLES 25
2.4.1. PROCESSUS 25
2.4.2. THREADS 28
2.4.3. HANDLES 30
2.4.4. FICHIERS MAPPES ET MEMOIRE PARTAGEE 32
2.5. MODELE DE SECURITE 33
2.5.1. UTILISATEUR ET JETON D'ACCES 33
2.5.2. DROITS, HANDLES ET ACLS 35
2.5.3. PRIVILEGES 36
2.5.4. AUTRES MECANISMES : SRP, DEP 39
2.5.5. SOURCES 42
2.6. CONCLUSION 42
I
3.2. GENERALITES 44
3.2.1. MOTIVATION 44
3.2.2. EVOLUTION DE LA TECHNIQUE 45
3.2.3. METHODE STATIQUE OU DYNAMIQUE? 45
3.2.4. PIRATAGE DE L'API 46
3.3. TECHNIQUES FONDAMENTALES 47
3.3.1. LOCALISATION DES PROCESSUS 47
3.3.2. VUE D'ENSEMBLE DES HOOKS 48
3.4. TECHNIQUES D'INJECTION 50
3.4.1. PROBLEMATIQUE DU MAPPING 50
3.4.2. INJECTION DE DLL VIA LA BASE DE REGISTRE 52
3.4.3. INJECTION DE DLL GRACE AUX HOOKS 53
3.4.4. INJECTION DE DLL AVEC CREATEREMOTETHREAD & LOADLIBRARY 53
3.4.5. INJECTION DE CODE AVEC WRITEPROCESSMEMORY 56
3.5. TECHNIQUES D'INTERCEPTION 56
3.5.1. A QUEL NIVEAU? 56
3.5.2. MODIFICATION DE L'IAT 58
3.5.3. INLINE PATCHING 61
3.5.4. EXPERIENCE AVEC DETOURS ET WINDBG 63
3.5.5. REDIRECTION DE DLL 67
3.6. TECHNIQUES ADDITIONNELLES 68
3.6.1. MODULE FANTOME 68
3.6.2. CONTRE LE REVERSING 69
3.6.3. MESURES ET CONTRE-MESURES 70
3.7. ET SOUS WINDOWS VISTA? 70
3.7.1. 1ER TEST : TERMINAISON DES PROCESSUS 71
3.7.2. 2EME TEST : MODIFICATION DE L'IAT 71
3.7.3. 3EME TEST : INLINE PATCHING AVEC DETOURS 71
3.7.4. 4EME TEST : INTERCEPTION DE MOTS DE PASSE 72
3.7.5. BILAN 74
4. POSTFACE 75
4.1. CONCLUSION 75
4.2. REMERCIEMENTS 76
4.3. REFERENCES 76
II
Préface Enoncé
1. Préface
1.1. Enoncé
1.1.1. Descriptif
La compréhension des techniques d'attaque sur Windows peut être un
moyen de mieux lutter contre certains malwares.
Dans un but didactique et en complément au labo Windows Forensics
proposé par le laboratoire, l'étudiant va analyser diverses techniques
(hook, injection dll, …) utilisées par les rootkits en mode user.
Il doit identifier les outils (debugger, …) à utiliser afin de construire des
scénarios pédagogiques basés sur des exemples (code machine) précis
complètement documentés.
Il comparera les résultats obtenus sous Windows XP SP2 et sous
Windows Vista.
Version 1.0 1
Familiarisation avec Windows Préambule
2.1. Préambule
2.1.1. Introduction
La 1ère partie de ce travail a pour but de se familiariser avec les
concepts et les mécanismes fondamentaux du fonctionnement interne
de Windows. Rédigée dans une perspective didactique, elle devrait
permettre à un étudiant en fin d'études HES en filière informatique de
s'initier aux fondements de ce système d'exploitation.
Le point de départ incontournable à ce sujet est le livre Windows
Internals, écrit par Mark Russinovitch, en parallèle avec la
documentation officielle MSDN. Dans tous les cas, les références
données indiqueront nos documents source pour vérification ou
approfondissement.
Nous accompagneront notre propos par des expériences avec divers
utilitaires existants, afin de montrer ce qui se passe vraiment dans le
cœur de Windows. Nous inclurons également des fragments de code
C++ ou assembleur qui pourront servir de base à un développement
ultérieur à l'aide, par exemple, de Microsoft Visual Studio 2005.
Caractéristique Signification
Multitâche Plusieurs processus peuvent s'exécuter
concurremment sur un même processeur
Multiprocesseur Windows XP Pro prend en charge 1 ou 2
processeurs, (d'autres versions jusqu'à 64)
Multiutilisateur Plusieurs sessions utilisateur peuvent être
ouvertes simultanément
Version 1.0 2
Familiarisation avec Windows Première approche
Version 1.0 3
Familiarisation avec Windows Première approche
Version 1.0 4
Familiarisation avec Windows Première approche
1
Cf. [WI] p. 6
Version 1.0 5
Familiarisation avec Windows Première approche
2
Cf. [WI] p. 12
Version 1.0 6
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
2.3.1. Format PE
Il faut d'abord étudier l'image au format PE, c'est-à-dire le fichier tel
qu'il est stocké sur le disque. C'est instructif car, comme le montre la
Figure 2, on retrouve la structure du fichier PE (en vert) dans la
mémoire (en violet). Les mêmes sections y sont présentes dans le
même ordre, elles sont simplement alignées (espacées) différemment.
3
Pour les sous-systèmes, voir [WI] p. 53ss. Nous considérons uniquement le sous-
système Windows.
Version 1.0 7
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Outils
• PE Browse Professional, de SmidegonSoft (fait aussi office de
désassembleur) :
http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html
• LordPE4 écrit par y0da : http://y0da.cjb.net/
• Une liste d'outils (dont PESam) pour manipuler les fichiers PE :
http://programmerstools.org/taxonomy/term/56
4
Installation : extraire LordPE Deluxe (http://scifi.pages.at/yoda9k/LordPE/LPE-
DLX.ZIP) puis remplacer le fichier LordPE.exe par celui contenu dans la micro-update
depuis http://scifi.pages.at/yoda9k/LordPE/LPE-DLXb_UPD.zip
Version 1.0 8
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Version 1.0 9
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
5
Les spécifications ne mentionnent pas l'algorithme employé. Les fonctions de calcul
de checksum sont incorporées à la DLL imaghelp.dll, documentée ici :
http://msdn2.microsoft.com/en-us/library/ms680181.aspx
Version 1.0 10
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
6
[WI] p. 384 : la mémoire virtuelle d’un processus est divisée en pages qui peuvent
être libres (free), réservées (reserved) ou engagées (committed). Réserver une page
revient seulement à réserver une plage d’adresses consécutives ; on ne peut pas
encore y accéder. Une fois que la mémoire est committed, on peut y accéder, i.e. il y
a une traduction possible entre mémoire virtuelle et mémoire physique.
Version 1.0 11
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
7
Il y encore une autre forme d'import appelé "forward" dans le cas où une DLL met
à disposition une fonction d'une DLL tierce.
Version 1.0 12
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Ce qu'il est important de comprendre, c'est que dans tous les cas à
l'exception du 1, l'adresse de la fonction importée est stockée8 dans une
table appelée IAT (import address table).
En fait, la variante 4 utilise une autre table similaire : la DIAT. Mais
dans les cas 2, 3 et 4, tous les appels à une fonction importée passent
par un pointeur de fonction stocké dans une table. Voyons comment à
la Figure 7 ci-dessous.
8
Attention! Il faut distinguer l'IAT sur le disque de l'IAT en mémoire. Selon le type
d'import, ses pointeurs de fonctions sont soit chargés depuis le fichier image, soit
initialisés dynamiquement.
Version 1.0 13
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Version 1.0 14
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Version 1.0 15
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Version 1.0 16
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
9
Cf. Virtual Address Space dans MSDN :
http://msdn.microsoft.com/library/en-us/memory/base/virtual_address_space.asp
Version 1.0 17
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
__asm {
mov eax, 0x80010000 // EAX <- adresse de base de HAL.DLL
mov ebx, dword ptr [eax] // Violation d'accès en lecture
call dword ptr [eax] // Idem lors de la tentative d'appel
mov dword ptr [eax], ecx // Violation d'accès en écriture
}
Insérons ce code dans Visual Studio 2005 au sein du fichier source d'un
nouveau projet C++ "Win32 Console Application", exécutons-le puis
déboguons-le pour avoir les détails de l'exception. Voici le résultat:
Nous avons dit que l'espace d'adresses virtuelles (EAV) s'étend sur 4
Go. Mais la quantité de mémoire physiquement présente sur la machine
peut varier : par exemple, mon PC de test comporte seulement 1 Go de
RAM.
Pour y remédier, le gestionnaire de mémoire transfère ou pagine (pages
out) des portions de la mémoire (appelée pages) sur le disque pour
10
Cf. "Process Security and Access Rights" dans MSDN :
http://msdn.microsoft.com/(...)/dllproc/base/process_security_and_access_rights.asp
Version 1.0 18
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
SYSTEM_INFO sSysInfo;
GetSystemInfo( &sSysInfo ); // Initialise la structure.
DWORD dwPageSize = sSysInfo.dwPageSize;
DWORD dwAllocGran = sSysInfo.dwAllocationGranularity;
11
Cf. [WI] p. 15
12
Il existe aussi des grandes pages de 4 Mo (large page memory) pour des
questions de performances. Rechercher "large page support" dans MSDN pour aller
plus loin.
13
OllyDbg (Olly pour les intimes) est écrit par Oleh Yuschuk et téléchargeable sur :
http://www.ollydbg.de/
Version 1.0 19
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Intéressons-nous de plus près aux modules (EXE et DLLs) cités ici. Pour
ce faire, affichons la vue Executable modules en pressant Alt+E (voir
Figure 14).
Le chargeur de programme (Windows loader) charge d'abord en
mémoire l'exécutable à son adresse de départ favorite (ADF). Puis les
DLLs nécessaires sont chargées à leur tour, si possible à leur ADF, sinon
le chargeur procède à un relogement (relocation).
Nous pouvons vérifier, à l'aide de l'un des éditeurs de fichier PE
présentés ci-dessus, qu'aucun des modules n'a été relogé. En effet,
toutes ces DLLs font partie de Windows et leurs concepteurs ont choisi
leur ADF de sorte que ces dernières ne se collisionnent pas dans l'EAV,
évitant un relogement coûteux en temps.
Version 1.0 20
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
14
Ce bug est mentionné dans le forum d'OllyDbg à l'adresse suivante :
http://www.woodmann.com/forum/showthread.php?t=8698
Version 1.0 21
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
15
Pour plus d'informations, voir l'encart "Side-by-side Assemblies" dans [WI] p. 311.
Version 1.0 22
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
2.3.5. Dépendances
Nous avons déjà parlé au § 2.3.2 des différents types d'imports. On dit
que l'exécutable dépend des DLLs qu'il importe. Mais ces dernières
dépendent aussi peut-être d'autres DLLs. Ainsi le chargeur de
programmes doit-il vérifier ces dépendances récursivement afin de
charger toutes les DLLs nécessaires.
L'utilitaire Dependency Walker16 trace les dépendances d'une image
(EXE ou DLL). Pour mieux comprendre ce qu'il affiche, consulter l'aide
de l'application, en particulier la rubrique "Types of Dependencies
Handled…". En ouvrant wordpad.exe avec depends, nous pouvons faire
les observations suivantes sur la Figure 17 :
16
L'exécutable depends.exe est fourni avec les Windows XP Service Pack 2 Support
Tools, téléchargeable sur http://www.microsoft.com.
Version 1.0 23
Familiarisation avec Windows Format PE, occupation mémoire et DLLs
Version 1.0 24
Familiarisation avec Windows Processus, threads et handles
2.4.1. Processus
Nous allons nous pencher maintenant sur l'exécution de wordpad.exe.
Un processus est un objet vivant, qui naît, évolue puis meurt. Il ne
suffit pas de disposer des bons outils pour l'observer, il faut encore
regarder au bon moment. Pour cette partie, la référence est le chapitre
6 de [WI], intitulé "Processes, Threads and Jobs". Nous ne parlerons
pas des jobs.
17
Il s'agit de DLLs qui sont chargées juste avant le premier appel à l'une de leurs
fonctions, comme nous l'avons évoqué à la section sur l'IAT. Il s'agit d'un mécanisme
paresseux (lazy binding), qui ne fait le travail que lorsqu'il est vraiment nécessaire.
Le fait de retarder le chargement de DLLs permet à l'application de démarrer plus
vite.
Version 1.0 25
Familiarisation avec Windows Processus, threads et handles
18
Cet utilitaire, ainsi que d'autres, sont produits par SysInternals qui vient d'être
racheté par Microsoft. ProcExp est téléchargeable depuis :
Version 1.0 26
Familiarisation avec Windows Processus, threads et handles
http://www.sysinternals.com/Utilities/ProcessExplorer.html
19
Cf. [WI] p. 272. Remarquons qu'il aurait pu y avoir plusieurs intermédiaires entre
winlogon.exe et explorer.exe.
20
Téléchargeable depuis http://www.sysinternals.com/utilities/livekd.html
Version 1.0 27
Familiarisation avec Windows Processus, threads et handles
2.4.2. Threads
De nouveau, il y a énormément d'informations disponibles concernant
les threads : statistiques d'utilisation de la mémoire et du temps CPU,
priorités et changements de contexte, etc. Ce qui nous importe surtout
est de savoir combien de threads s'exécutent et ce qu'ils font.
Lançons ProcExp, et affichons l'onglet Threads des propriétés du
processus wordpad.exe. Nous apprenons que ce processus possède
actuellement trois threads. Si nous ouvrons un fichier dans Wordpad,
nous constatons que quatre threads supplémentaires sont créés.
Comme pour les processus, ProcExp signale les créations de threads en
vert et les destructions en rouge.
Avant de savoir ce que font les threads, il faut configurer correctement
les symboles. Vaut-il mieux constater que le thread n° 1640 est en
train d'exécuter la fonction à l'adresse 0x0101'9B4D? Ou bien savoir
que ce thread exécute la fonction wWinMainStartup du module
wordpad.exe?
Les symboles permettent à ProcExp et aux débogueurs de retrouver la
correspondance entre les adresses particulières du module et les noms
de fonctions, de variables ou de classes. Leur but est de donner du sens
à ces adresses aux êtres humains que nous sommes.
Version 1.0 28
Familiarisation avec Windows Processus, threads et handles
21
"Windows XP with Service Pack 2 x86 retail symbols, all languages" :
http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx
Version 1.0 29
Familiarisation avec Windows Processus, threads et handles
2.4.3. Handles
Les handles sont utilisés lorsqu’une application référence des blocs de
mémoire ou des objets gérés par un autre système (le système
d’exploitation dans notre cas). Contrairement au pointeur qui contient
littéralement l’adresse de l’élément qu’il référence, un handle est une
référence abstraite.
Ainsi, l’application ne peut pas accéder directement aux données d’un
objet, mais elle doit toujours passer par le système d’exploitation, ce
qui permet d’accroître le contrôle des ressources et la sécurité.
Supposons que nous voulions lire un fichier. Voici la marche à suivre :
1. Ouvrir un handle sur le fichier existant via CreateFile. A cette étape
ont lieu les contrôles d'accès que nous aborderons plus loin.
2. Utiliser l'objet en passant son handle à d'autres fonctions, telles
ReadFile ou ReadFileEx.
3. Fermer le handle via CloseHandle une fois son utilisation terminée.
Une application peut obtenir un handle sur toutes sortes d'objets du
système. La plupart des handles ont une portée limitée au processus.
Cela veut dire par exemple que si un processus X a reçu un handle sur
un fichier valant 4, et que le processus Y cherche à fermer ce même
fichier en passant une valeur de handle de 4, cela ne fonctionnera pas.
Version 1.0 30
Familiarisation avec Windows Processus, threads et handles
22
Disponible sur http://www.sysinternals.com/utilities/handle.html
Version 1.0 31
Familiarisation avec Windows Processus, threads et handles
23
MMF : http://msdn2.microsoft.com/en-us/library/ms810613.aspx
24
On peut se demander à juste titre ce qu'il se passe si on supprime le fichier image
d'une application en exécution. La réponse est que c'est tout simplement
impossible : les fichiers EXE et DLL sont verrouillés, donc impossible à effacer, tant
qu'ils sont chargés par un processus.
Version 1.0 32
Familiarisation avec Windows Modèle de sécurité
25
http://msdn.microsoft.com/library/en-us/memory/base/sharing_files_and_memory.asp
26
Creating Named Shared Memory :
http://msdn.microsoft.com/(...)/memory/base/creating_named_shared_memory.asp
Version 1.0 33
Familiarisation avec Windows Modèle de sécurité
C:\>psgetsid Administrator
Les sujets qui manipulent les objets sont les threads. Par défaut, un
thread hérite de l'identité de son processus, mais il peut aussi usurper
temporairement une autre identité30. Pour simplifier, nous ferons
l'hypothèse que tous les threads d'un processus possèdent le même
contexte de sécurité, à savoir celui de leur processus. Nous parlerons
donc uniquement des jetons primaires (primary tokens), par opposition
aux impersonation tokens.
27
Une description de la structure du SID ainsi que les valeurs particulières des SID
standards (well-known) peuvent être consultées dans [WI] pp. 495-497.
28
Téléchargeable sur http://www.sysinternals.com/utilities/psgetsid.html
29
Cf. la structure de données dans [WI] p. 498.
30
Ce mécanisme, appelé impersonation en anglais, est décrit dans [WI] pp. 502ss. Il
permet à un thread d'une application serveur d'endosser l'identité d'un de ses
clients.
Version 1.0 34
Familiarisation avec Windows Modèle de sécurité
Nous avons dit plus haut que la généalogie d'un processus est
importante. En voici la raison : le processus explorer.exe, qui est
l'ancêtre commun de tous les processus appartenant à l'utilisateur,
reçoit le jeton d'accès créé par lsass.exe, et le propage à ses
descendants.
Nous pouvons observer dans ProcExp que Worpad détient un handle sur
la clé de la base de registre HKCU. En ouvrant les propriétés du handle
(double-clic) puis en allant dans l'onglet Security, nous voyons la DACL
de cet objet. Nous ignorons quel accès a été accordé pour le handle en
question, mais nous trouvons ici l'accès maximal à cet objet qui peut
être accordé à tel compte (le groupe Administrators sur la capture
d'écran).
31
Cf. [WI] au bas de la p. 494.
32
The Windows Access Control Model :
http://www.codeproject.com/win32/accessctrl1.asp
Version 1.0 35
Familiarisation avec Windows Modèle de sécurité
2.5.3. Privilèges
Certaines opérations du système, comme la sauvegarde des fichiers,
serait trop compliquées à implémenter avec les droits. Par exemple, il
faudrait ajouter une entrée à la DACL de tous les fichiers pour que
l'opérateur de sauvegarde puisse y accéder pour les sauvegarder. Il
existe donc des privilèges33 qui autorisent à outrepasser les
mécanismes de sécurité usuels. Ces privilèges ne concernent pas des
objets en particulier. Ils se rapportent à un utilisateur et font partie de
son jeton.
Les privilèges suivants sont particulièrement puissants.
Nom du privilège Effet pour l'utilisateur
SeCreateTokenPrivilege Autorise à créer un jeton primaire
SeDebugPrivilege Autorise à déboguer n'importe quel processus
SeLoadDriverPrivilege Autorise à charger ou décharger un pilote
(mode kernel)
SeRestorePrivilege Autorise à restaurer (ajouter, supprimer) des
fichiers et dossiers et à manipuler leurs
autorisations NTFS
33
Cf. [WI] pp. 516-523. Voiri aussi la liste des "privilege constants" dans MSDN :
http://msdn.microsoft.com/library/en-us/secauthz/security/authorization_constants.asp
Version 1.0 36
Familiarisation avec Windows Modèle de sécurité
Version 1.0 37
Familiarisation avec Windows Modèle de sécurité
34
http://msdn.microsoft.com/library/en-us/secauthz/security/restricted_tokens.asp
35
Cf. expérience dans [WI] p. 518s
Version 1.0 38
Familiarisation avec Windows Modèle de sécurité
HANDLE hToken;
DWORD dwTokenAccess = TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY;
TOKEN_PRIVILEGES tkp;
36
http://www.codeguru.com/cpp/w-p/win32/tutorials/article.php/c8647__1
37
SRP : [WI] p. 533ss, http://support.microsoft.com/kb/310791
Version 1.0 39
Familiarisation avec Windows Modèle de sécurité
38
DEP : http://support.microsoft.com/kb/875352
Version 1.0 40
Familiarisation avec Windows Modèle de sécurité
Son application matérielle39 est réalisée par un bit qui permet ou non
l'exécution de code à l'intérieur d'une page. Cette technologie est
appelée NX (No Execute page-protection) par AMD et XD (Execute
Disable bit) par Intel. Tous les processeurs actuels n'implémentent pas
cette technologie. Par exemple, c'est le cas pour le Pentium M 750
Dothan de mon portable, mais pas pour le Pentium 4 moins récent de
ma machine de test.
39
Cf. l'article Bypassing Windows Hardware-enforced DEP :
http://uninformed.org/?v=2&a=4&t=sumry
Version 1.0 41
Familiarisation avec Windows Conclusion
2.5.5. Sources
• "Windows NT Security" (article de fond) :
http://msdn.microsoft.com/library/en-us/dnsecure/html/msdn_ntprog.asp
• "Windows NT Security Theory and Practice" (autre article essentiel) :
http://msdn.microsoft.com/library/en-us/dnsecure/html/msdn_seccpp.asp
• "Access Control" (page d'accueil MSDN) :
http://msdn.microsoft.com/library/en-us/secauthz/security/access_control.asp
2.6. Conclusion
Pour conclure cette première partie, disons que Windows recèle encore
bien d'autres fonctionnalités. Le meilleur moyen de continuer son étude
est de poursuivre la lecture de [WI] tout en multipliant les expériences
pratiques. Mais nous devons nous arrêter ici pour passer à la deuxième
partie, quitte à approfondir ultérieurement certains points selon nos
besoins.
Version 1.0 42
Techniques utilisées par les rootkits Qu'est-ce qu'un rootkit?
3.1.1. Définition
D'une manière générale, un rootkit est un programme conçu pour
contrôler le comportement d'une machine donnée. Voici une définition
plus complète tirée de l'encyclopédie Wikipédia40 :
« On nomme rootkit un programme ou ensemble de programmes
permettant à un pirate de maintenir - dans le temps - un accès
frauduleux à un système informatique. Le pré-requis du rootkit est une
machine déjà compromise.
La fonction principale du rootkit est de camoufler la mise en place d’une
ou plusieurs portes dérobées. Ces portes dérobées (utilisables en local
ou à distance) permettent au pirate de s’introduire à nouveau au cœur
de la machine sans pour autant exploiter une nouvelle fois la faille avec
laquelle il a pu obtenir l’accès frauduleux initial, qui serait tôt ou tard
comblée. (…)
A la différence d'un virus informatique ou un ver de nouvelle génération,
un rootkit ne se réplique pas. (…)
Un rootkit ne permet pas en tant que tel de s’introduire de manière
frauduleuse sur une machine saine. En revanche, certains rootkits
permettent la collecte des mots de passe qui transitent par la machine
corrompue. Ainsi, un rootkit peut indirectement donner l’accès à
d’autres machines. (…)
Un rootkit a pour but principal la furtivité, il permet par exemple de
cacher des processus, fichiers et autres clefs de la base de registres...
Le rootkit est souvent couplé à d'autres programmes tels qu'un sniffeur
de frappe (keylogger) ou de paquets (packet sniffer). »
40
http://fr.wikipedia.org/wiki/Rootkit
Voir aussi sur les articles suivants :
Rootkits: The "r00t" of Digital Evil :http://www.omninerd.com/2005/11/22/articles/43
Les rootkits : http://3psilon.info/Les-rootkits.html
41
http://en.wikipedia.org/wiki/Rootkit
Version 1.0 43
Techniques utilisées par les rootkits Généralités
3.2. Généralités
3.2.1. Motivation
On peut mettre en doute la valeur éthique de notre démarche. Est-ce
mal de dévoiler des techniques utilisées par des malwares? Cela ne va-
t-il pas faciliter la création de nouveaux rootkits et constituer une
menace pour la sécurité informatique?
42
http://www.phrack.org/archives/62/p62-0x0c_Win32_Portable_Userland_Rootkit.txt
43
https://www.rootkit.com/vault/kdm/NTIllusion.rar
(Il faut être enregistré sur le site Rootkit pour le télécharger).
44
Lancée via l'item "Exécuter en tant que" dans le menu contextuel d'un raccourci ou
d'un exécutable, ou via la commande runas dans l'invite de commandes.
Version 1.0 44
Techniques utilisées par les rootkits Généralités
45
Je ne crois pas que l'ignorance favorise la sécurité. Mais bien sûr, je
n'approuverais pas la publication d'un rootkit fonctionnel à 100% que tous les scripts
kiddies du monde pourraient déployer à leur guise…
46
Rappelons-nous que notre étude se limite à Windows XP Pro SP2. Nous parlerons
plus loin des différences avec Windows Vista.
47
Selon le principe : « Share Your Old Stuff, Keep Your Good Stuff ».
48
Cependant, pour des raisons de compatibilité, Windows ne peut pas renier tout
son héritage d'un coup et doit donc conserver certaines fonctionnalités critiques en
termes de sécurité.
Version 1.0 45
Techniques utilisées par les rootkits Généralités
API de
Application
Windows
49
Voir les 2 présentations de BlackHat suivantes :
• "Hide'n'Seek : Anatomy of Stealth Malware" par Gergely Erdélyi de F-Secure
http://www.blackhat.com/(...)/bh-eu-04-erdelyi/bh-eu-04-erdelyi.pdf
• "Rootkits vs. Stealth, by Design Malware" par Joanna Rutkowska
www.blackhat.com/presentations/bh-europe-06/bh-eu-06-Rutkowska.pdf
Version 1.0 46
Techniques utilisées par les rootkits Techniques fondamentales
Hook
1. Appeler l'API d'origine API de
Application
2. Filtrer les données Windows
3. Retourner le résultat
Figure 34 : Flux détourné des données de l'API
Version 1.0 47
Techniques utilisées par les rootkits Techniques fondamentales
CloseHandle( processSnap );
return TRUE;
}
50
La signature d'une fonction spécifie ses arguments (leur nombre, leur type et leur
ordre) et son résultat.
51
cf. "Process Security and Access Rights" :
http://msdn2.microsoft.com/en-us/library/ms684880.aspx
52
Voir l'API SetWindowsHookEx dans MSDN et l'article "Win32 Hooks" :
http://msdn2.microsoft.com/en-us/library/ms997537.aspx
53
Pour chaque type de message, une application peut choisir de conserver le
comportement par défaut en transmettant le message à l'API DefWindowProc, ou
Version 1.0 48
Techniques utilisées par les rootkits Techniques fondamentales
'B'
Application
Evénement Fonction
de filtre
'A'
Queue de
'A' ? messages
X
Figure 35 : Hook et fonction filtre
Version 1.0 49
Techniques utilisées par les rootkits Techniques d'injection
55
Voir l'article de MSDN "Managing Memory-mapped files in Win32" :
http://msdn2.microsoft.com/en-us/library/ms810613.aspx
Et aussi "Memory Protection" :
http://msdn2.microsoft.com/en-us/library/aa366785.aspx
56
Remarque : certaines DLLs de Windows ne peuvent être relogées en aucun cas.
Selon Robert Kuster, il s'agit de kernel32.dll, user32.dll et ntdll.dll :
http://www.codeproject.com/threads/winspy.asp#appendixes
Version 1.0 50
Techniques utilisées par les rootkits Techniques d'injection
EAV du
processus 2
Mémoire
physique
EAV du
processus 1 Ma page
Page partagée
EAV du
Ma page processus 3
Ma page
57
cf. [WI] pp. "Shared memory & mapped files" 386-388 & "Copy-On-Write" 392-
394.
Version 1.0 51
Techniques utilisées par les rootkits Techniques d'injection
EAV du
processus 2
Mémoire
physique
EAV du
processus 1 Ma page
Page partagée
EAV du
Ma page processus 3
Page privée
Ma page
58
Un tel accès a d'ailleurs été supprimé à partir de Windows 2003 Server SP1 :
http://technet2.microsoft.com/WindowsServer/en/Library/(...)
59
A noter qu'il n'est pas nécessaire de redémarrer pour que le changement soit
effectif. En effet, Windows lit le contenu de cette clé à chaque création de processus.
Version 1.0 52
Techniques utilisées par les rootkits Techniques d'injection
60
NtIllusion utilise le type de crochet WH_CBT (Computer Based Training).
Voir "CBTProc Function" : http://msdn2.microsoft.com/en-us/library/ms644977.aspx
Version 1.0 53
Techniques utilisées par les rootkits Techniques d'injection
61
Comme pour de nombreuses fonctions de Windows, il existe 2 versions de l'API
LoadLibrary : une version ANSI (caractères sur 1 octet) LoadLibraryA et une version
Unicode (caractères sur 2 octets) LoadLibraryW.
62
Il est aussi possible de parasiter un thread existant du processus. Le thread peut
être suspendu (SuspendThread) et repris (ResumeThread). Son contexte (ensemble
des registres dont le pointeur d'instruction EIP) peut être manipulé en lecture
(GetThreadContext) et en écriture (SetThreadContext). Je n'ai pas mis en œuvre
cette technique intrusive qui nécessite probablement le privilège Debug.
Version 1.0 54
Techniques utilisées par les rootkits Techniques d'injection
Voilà, notre DLL est injectée. Si elle dépend d'autres DLLs, ces dernières
seront également chargées par Windows le cas échéant.
Version 1.0 55
Techniques utilisées par les rootkits Techniques d'interception
63
Téléchargeable ici (KD vient de Kernel Debugger) :
http://www.microsoft.com/technet/sysinternals/Utilities/LiveKd.mspx
64
Pour les amateurs de reversing : l'API kernel32!CreateFileW appelle la fonction
native ntdll!NtCreateFile (qui pour une raison que j'ignore possède un alias nommé
ntdll!ZwCreateFile), qui à son tour fait appel au service 0x25 du système. Le passage
en mode kernel s'effectue par l'instruction machine SYSENTER, à la suite de quoi le
Version 1.0 56
Techniques utilisées par les rootkits Techniques d'interception
Kernel32.dll!CreateFileW
Ntdll.dll!NtCreateFile
User mode
Kernel mode
Ntoskrnl.exe!NtCreateFile
flux de contrôle saute à l'adresse stockée dans une entrée de la SSDT (System
Service Descriptor Table). Cette entrée se situe à l'emplacement nt!KiServiceTable +
0x25*4 (une entrée fait 4 octets et nous allons à l'offset 0x25). Nous arrivons à la
fonction nt!NtCreateFile, qui elle-même appelle nt!IoCreateFile et… nous nous
arrêtons-là (nt est un raccourci pour ntoskrnl.exe). Curieusement, la fonction en
mode kernel nt!ZwCreateFile permet aussi d'appeler nt!NtCreateFile via la SSDT.
65
Visiter http://undocumented.ntinternals.net/
Version 1.0 57
Techniques utilisées par les rootkits Techniques d'interception
A part une seule fonction native dont le nom débute par "Nt" (en bleu),
toutes les fonctions interceptées par NtIllusion font partie de l'API de
Windows. C'est un choix que son concepteur a fait pour atteindre une
portabilité maximale.
66
Cf. la fonction HijackApi du fichier kHijackEng.c à modifier comme suit : accorder
les droits en écriture dans l'IAT (VirtualProtect).
Version 1.0 58
Techniques utilisées par les rootkits Techniques d'interception
module cible
fonction
IAT
X
entrée
DLL pirate
fonction
Quant au delay load import, il emploie une autre table appelée "Delay
Import Address Table" (DIAT) définie par le format PE. J'ai déduit de
mes observations que l'adresse de chaque fonction est écrite dans
l'entrée correspondante juste avant le premier appel.
67
Pour rappel : nombre, ordre, type des arguments et du résultat.
68
La convention d'appel détermine la façon dont les arguments sont passés (dans
tels registres ou sur la pile, dans tel ordre), et qui de l'appelant ou de l'appelé
sauvegarde les registres ou nettoie la pile.
Cf. "Calling conventions" http://msdn2.microsoft.com/en-us/library/k2b2ssfy.aspx
Version 1.0 59
Techniques utilisées par les rootkits Techniques d'interception
N'ayant pas trouvé d'exécutable de Windows qui possède une DIAT, j'ai
choisi un freeware : HDD Free Hex Software69. En étudiant son fichier
PE à l'aide de PEBrowse Pro, nous trouvons l'adresse relative de la DIAT
(0x6C8B0), ainsi qu'une fonction à chargement retardé
GetOpenFileNameA, importée depuis ComDlg32.dll (voir Figure 44).
Sachant que l'adresse de base de l'exécutable vaut 0x0040'0000, nous
obtenons par simple addition l'adresse virtuelle de la DIAT :
0x0046'C8B0.
69
http://www.hhdsoftware.com/Download/hex-editor.exe
Version 1.0 60
Techniques utilisées par les rootkits Techniques d'interception
70
En effet, 0x7C81'CDDA est l'adresse de l'API kernel32!ExitProcess sous Windows
XP SP2.
Version 1.0 61
Techniques utilisées par les rootkits Techniques d'interception
71
Voir la fonction ForgeHook du fichier source kEPhook.c. NTIllusion se sert de la
fonction GetInstLenght, déclarée dans ZDisasm.c, pour déterminer la longueur d'une
instruction.
72
Téléchargeable gratuitement sur http://research.microsoft.com/sn/detours/ (voir
les publications).
73
Autrement, il risque d'y avoir un décalage d'interprétation si le débogueur
considère l'octet immédiatement après le JMP comme le commencement de la
prochaine instruction. L'instruction NOP, qui tient sur un octet, fait ici office de
bourrage jusqu'au début de l'instruction suivante d'origine.
Version 1.0 62
Techniques utilisées par les rootkits Techniques d'interception
74
Pour décompresser les archives ZIP des sources, utiliser WinZip v9+ ou 7-zip.
Version 1.0 63
Techniques utilisées par les rootkits Techniques d'interception
Prenons pour acquis que c'est le processus cmd.exe qui vérifie la valeur
de la clé DisableCMD, en appelant l'API RegQueryValueExW, exportée
par la DLL advapi32.dll.75 Ce qui nous intéresse maintenant, c'est
d'observer le code machine de cette fonction. En gardant le Command
Prompt ouvert (i.e. sans appuyer sur une touche), lançons WinDbg76 et
attachons le processus cmd.exe (F6). Cela à pour effet de déboguer le
processus et de l'interrompre.
Entrons la commande suivante (en bleu), qui recherche parmi les
symboles exportés par advapi32.dll, ceux qui commencent par
RegQueryValue. Nous trouvons 4 versions de la fonction, dont celle qui
nous intéresse à l'adresse 0x77DD'6FC8.
0:001> x advapi32!RegQueryValue*
77dd6fc8 ADVAPI32!RegQueryValueExW = <no type information>
77dd7883 ADVAPI32!RegQueryValueExA = <no type information>
77ddd8e2 ADVAPI32!RegQueryValueW = <no type information>
77dfcc10 ADVAPI32!RegQueryValueA = <no type information>
75
Nous l'avons déterminé avec le puissant outil Process Monitor de SysInternals, qui
permet entre autres de surveiller les activités sur la BDR :
http://www.microsoft.com/technet/sysinternals/processesandthreads/processmonitor.mspx
76
L'article suivant explique comment installer WinDbg et les symboles de Windows :
"Introduction to Reverse Engineering…" http://uninformed.org/?v=1&a=7&t=pdf
Version 1.0 64
Techniques utilisées par les rootkits Techniques d'interception
0:001> u 77dd6fc8
ADVAPI32!RegQueryValueExW:
77dd6fc8 8bff mov edi,edi
77dd6fca 55 push ebp
77dd6fcb 8bec mov ebp,esp
77dd6fcd 83ec0c sub esp,0Ch
(sortie tronquée)
0:001> u advapi32!RegQueryValueExW
ADVAPI32!RegQueryValueExW:
*** WARNING: Unable to verify checksum for
C:\Detours\DetGPCircumvent.dll
*** ERROR: Module load completed but symbols could not be loaded for
C:\Detours\DetGPCircumvent.dll
77dd6fc8 e963a02298 jmp DetGPCircumvent+0x1030 (10001030)
77dd6fcd 83ec0c sub esp,0Ch
(sortie tronquée)
Version 1.0 65
Techniques utilisées par les rootkits Techniques d'interception
0:001> u DetGPCircumvent+0x1000
DetGPCircumvent+0x1000:
10001000 8bff mov edi,edi
10001002 55 push ebp
10001003 8bec mov ebp,esp
10001005 e9c35fdd67 jmp ADVAPI32!RegQueryValueExW+0x5
(77dd6fcd)
1000100a 90 nop
(sortie tronquée)
Version 1.0 66
Techniques utilisées par les rootkits Techniques d'interception
77
Explorer Suite, créée par Daniel Pistelli : http://www.ntcore.com/exsuite.php
Version 1.0 67
Techniques utilisées par les rootkits Techniques additionnelles
78
Il est aussi possible d'injecter un manifeste dans une image qui en est dépourvue :
http://www.codeproject.com/dotnet/ManifestInjection.asp
Version 1.0 68
Techniques utilisées par les rootkits Techniques additionnelles
0:002> !peb
PEB at 7ffdf000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: Yes
ImageBaseAddress: 01000000
Ldr 00191e90
Ldr.Initialized: Yes
// Pointeurs sur l'élément de la liste: Précédent. Suivant
Ldr.InInitializationOrderModuleList: 00191f28 . 00193228
Ldr.InLoadOrderModuleList: 00191ec0 . 00193218
Ldr.InMemoryOrderModuleList: 00191ec8 . 00193220
Base TimeStamp Module
01000000 41107cde Aug 04 08:06:22 2004 C:\Program F(…)\wordpad.exe
7c900000 411096b4 Aug 04 09:56:36 2004 C:\(…)\system32\ntdll.dll
(sortie tronquée)
L'API de Windows offre d'énumérer les modules d'un processus avec les
fonctions EnumProcessModules ou CreateToolhelp32Snapshot79. Pour y
parer, le rootkit NtIllusion parvient à extraire sa DLL de ces 3 listes
après son chargement (cf. le fichier source kDllHideEng.c), comme
l'explique Kodmaker au § 4.7 de son article. Le résultat est un module
fantôme, indétectable même par les fonctions de l'API inchangées.
79
cf. "Module walking" : http://msdn2.microsoft.com/en-us/library/ms684236.aspx
Version 1.0 69
Techniques utilisées par les rootkits Et sous Windows Vista?
Version 1.0 70
Techniques utilisées par les rootkits Et sous Windows Vista?
Version 1.0 71
Techniques utilisées par les rootkits Et sous Windows Vista?
80
Voici la marche à suivre : la session d'Eve étant ouverte, lancer l'éditeur du
registre en tant qu'administrateur (appuyer sur Win+R, entrer "regedit" et valider
avec Ctrl+Alt+Entrée pour demander l'élévation des privilèges) et créer la clé
comme indiqué au § 3.5.4.
Remarque : la clé HKCU d'un utilisateur est en fait un lien vers la clé
HKEY_USERS\{SID_de_l'utilisateur}, qui peut donc être modifiée aussi depuis la
session d'un administrateur.
81
La commande "color f0" sert juste à économiser l'encre noire de l'imprimante…
82
Contrairement à un shell de type UNIX où on peut temporairement élever les
privilèges grâce aux commandes "su" ou "sudo".
Version 1.0 72
Techniques utilisées par les rootkits Et sous Windows Vista?
83
WinSpy est développé par Robert Kuster et est disponible à l'URL suivante :
http://www.codeproject.com/threads/winspy/winspy_app.zip
Version 1.0 73
Techniques utilisées par les rootkits Et sous Windows Vista?
3.7.5. Bilan
La sécurité de Windows Vista a été accrue selon les principes de
défense en profondeur et du moindre privilège. En bref, Microsoft a
implémenté des contrôles d'intégrité sur les fichiers (binaires et
données) et a réduit les droits accordés aux comptes administrateur
(notion de Protected Administrator), aux services (répartis sous divers
comptes restreints) et aux pilotes (User Mode Drivers). De plus, Vista
introduit les concepts de niveau d'intégrité et de protection de l'interface
utilisateur, dans le but d'isoler les processus entre eux. Toutes ces
améliorations vont certainement compliquer la tâche des malwares.
Sources :
"Vista Security for Developpers" :
http://download.microsoft.com/download/(...)/VistaSecurityForDevelopers.ppt
"Developer Best Practices and Guidelines…" :
http://msdn.microsoft.com/library/en-us/dnlong/html/AccProtVista.asp
Version 1.0 74
Postface Conclusion
4. Postface
4.1. Conclusion
Ce travail de diplôme m'a permis de découvrir le fonctionnement interne
du système d'exploitation le plus utilisé au monde, et de m'initier à la
programmation système Win32. Face à la taille et la complexité de
Windows, personne n'a le temps de tout comprendre dans les détails,
mais doit se concentrer sur ce qu'il a besoin et faire abstraction du
reste.
J'estime avoir donné un aperçu des mécanismes fondamentaux de
Windows et de son modèle de sécurité, et donné des références
suffisantes pour approfondir tel ou tel aspect de l'OS. Je me suis aussi
efforcé de présenter une série d'outils qui permettent d'expérimenter ce
qu'il se passe dans le PC.
Version 1.0 75
Postface Remerciements
4.2. Remerciements
Je tiens à remercier particulièrement les personnes suivantes :
• M. Litzistorf pour m'avoir proposé ce sujet et m'avoir suivi
• Laurent Guinnard et Mario Pasquali pour leur accueil chez Ellisys et
pour leur collaboration
• Nicolas Sadeg et Sébastien Contreras pour leur appui technique
• Vincent Zumbo pour la mise en page et la relecture du mémoire
• Thomas Perez pour ses recherches sur Windows Vista
• Yann Souchon pour m'avoir indiqué l'article "DLL redirection"
• Ma famille pour son soutien logistique et psychologique sans faille
4.3. Références
[WI] "Microsoft Windows Internals, Fourth Edition",
Mark E. Russinovich & David Solomon, Microsoft Press, 2005"
[WSP] "Windows System Programming, Third Edition"
Johnson M. Hart, Addison-Wesley, 2005
[REV] "Reversing (Secrets of Reverse Engineering)"
Eldad Eilam, Wiley, 2005
Version 1.0 76