NTUSER.DAT vs SOFTWARE vs SYSTEM : quelle ruche répond à quelle question
8 min de lecture
L'erreur la plus courante en triage du registre est de prendre la mauvaise ruche. Pas l'échec à prendre une ruche. Prendre une ruche et supposer qu'elle répondra à une question qui vit dans un autre fichier. La carte ci-dessous est celle que j'aurais aimé qu'on m'épingle à côté de mon bureau lors de ma première année.
Les cinq ruches qui comptent
Il y a plus de cinq ruches sur un système Windows, mais cinq portent le poids d'une investigation réelle :
C:\Windows\System32\config\SYSTEM: services, drivers, ControlSet vivant, configuration matérielle, Shimcache, identifiants de service de liste de réseaux.C:\Windows\System32\config\SOFTWARE: applications installées, clés Run machine-wide, Winlogon, AppCompatFlags, la carte d'association de fichiers.C:\Windows\System32\config\SECURITY: politique de sécurité locale, configuration d'audit, identifiants de domaine en cache.C:\Windows\System32\config\SAM: comptes utilisateurs locaux, appartenances aux groupes, hashs de mots de passe (besoin de SYSTEM pour déchiffrer).C:\Users\<user>\NTUSER.DAT: paramètres par utilisateur, UserAssist, RecentDocs, clés Run par utilisateur, TypedPaths, RunMRU.
Plus une autre qui est souvent oubliée :
C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat: enregistrements de classes par utilisateur, y compris ShellBags sous Windows moderne.
Chacune a une paire de journaux de transactions (.LOG1, .LOG2).
Prenez-les. Si vous oubliez, vous choisissez d'ignorer les écritures
en cours.
SYSTEM : le système nerveux de la machine
SYSTEM est où vous allez quand la question implique services,
drivers, périphériques, configuration de démarrage, ou la
chronologie locale. Le ControlSet actif est référencé via
Select\Current (un DWORD pointant vers ControlSet001,
ControlSet002, ou rarement un numéro plus élevé).
Ce qui vit ici :
ControlSet001\Services\: chaque service et driver, avecImagePath,ServiceDll,Start, et le descripteur de sécurité. La persistance se cache souvent ici en tant que faux service.ControlSet001\Control\Session Manager\AppCompatCache\AppCompatCache: le Shimcache. Liste les exécutables qui ont été sur le système, avec leurs tailles dérivées du MFT et un drapeau "last update". Crucial pour trouver les binaires depuis supprimés.ControlSet001\Control\TimeZoneInformation: le fuseau horaire configuré pour l'hôte. Vous en aurez besoin pour interpréter chaque autre horodatage sur le système. Trompez-vous et vous lirez les preuves de travers de plusieurs heures.ControlSet001\Control\ComputerName\ComputerName\ComputerName: le nom d'hôte. Moins trivial qu'il n'y paraît quand vous travaillez depuis des ruches acquises et avez besoin de savoir quel hôte vous regardez.ControlSet001\Services\Tcpip\Parameters\Interfaces\<GUID>: configurations IP historiques.MountedDevices: attributions de lettres de lecteur et leurs identifiants de volume, utile pour corréler avec l'historique des périphériques USB.Setup\: métadonnées d'installation initiale, y compris la date d'installation d'origine et l'identifiant du média source.
Si vous n'aviez le temps que de prendre une ruche sur une affaire de persistance de service, c'est SYSTEM.
SOFTWARE : le monde des applications de la machine
SOFTWARE est la grosse pour la persistance de malware et les empreintes d'applications. C'est aussi la plus grande des ruches standard de loin, ce qui signifie que les outils sans bonne indexation prendront plus de temps ici que partout ailleurs.
Où chercher :
Microsoft\Windows\CurrentVersion\RunetRunOnce: autoruns machine-wide. Premier endroit où regarder sur tout hôte compromis.Microsoft\Windows NT\CurrentVersion\Winlogon: les valeursUserinit,Shell,Notify, etLegalNoticeCaption. Userinit modifié est une vieille technique qui marche encore.Microsoft\Windows NT\CurrentVersion\Image File Execution Options\: la clé débogueur IFEO, abusée pour les détournements de fonctionnalités d'accessibilité.Microsoft\Windows NT\CurrentVersion\ProfileList\<SID>: chaque profil qui s'est connecté à l'hôte, avec le SID, le chemin du nom d'utilisateur, et l'horodatage de dernier chargement. Le moyen le plus rapide d'énumérer les utilisateurs depuis des ruches hors ligne.Microsoft\Windows\CurrentVersion\Uninstall\: logiciels installés, avec noms d'affichage, dates d'installation, et (parfois) chemins d'installation. Utile pour distinguer applications légitimes des choses qui prétendent être des logiciels installés.Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\<GUID>: chaque réseau auquel l'hôte s'est connecté, avec le SSID, le MAC de la passerelle, et l'heure de dernière connexion. L'un des meilleurs artefacts de localisation d'hôte sur un endpoint itinérant.Microsoft\Windows\CurrentVersion\Explorer\FileExts\<.ext>: associations d'extensions de fichier configurées par l'utilisateur. Utile pour attraper les détournements d'extensions.
SOFTWARE est aussi où vit AmCache, dans une ruche séparée à
C:\Windows\AppCompat\Programs\Amcache.hve. Certains oublient que
AmCache est une ruche. Elle l'est. Traitez-la comme tout autre
fichier regf.
NTUSER.DAT : par utilisateur, par investigation
L'erreur la plus courante que je vois est de se tourner vers
HKLM\Software\Microsoft\Windows\CurrentVersion\Run (ruche SOFTWARE)
et de s'arrêter là. L'équivalent par utilisateur est à
HKCU\Software\Microsoft\Windows\CurrentVersion\Run, qui vit dans
NTUSER.DAT pour l'utilisateur en question. La persistance peut
être dans l'un, l'autre, ou les deux. Sur un malware en contexte
utilisateur, elle est presque toujours dans le NTUSER de
l'utilisateur.
Ce qui vit dans NTUSER :
Software\Microsoft\Windows\CurrentVersion\RunetRunOnce: autoruns par utilisateur.Software\Microsoft\Windows NT\CurrentVersion\Windows\LoadetRun: valeurs de chargement par utilisateur. Rares en usage légitime.Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\: l'historique de lancement de programmes encodé en ROT13. Meilleur artefact d'exécution par utilisateur du système.Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs: fichiers que l'utilisateur a ouverts, par extension.Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths: chaque chemin tapé dans Explorer.Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU: chaque commande Win+R. Mine d'or.Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU: historique du sélecteur de fichiers sur les apps natives.Software\Microsoft\Office\<version>\<app>\User MRU\: fichiers récents d'Office, par app. Les sous-clés de version gardent l'historique à travers les mises à niveau d'Office.Software\Microsoft\Terminal Server Client\Default: historique d'hôtes cibles RDP.
Si l'investigation est "qu'a fait cet utilisateur", vous vivez dans NTUSER. Si "qu'est-ce qui tournait sur cet hôte", SYSTEM et SOFTWARE.
Le piège : NTUSER est chargé dans le registre sous HKEY_USERS\<SID>
uniquement pendant que l'utilisateur est connecté. Si l'utilisateur
n'est pas connecté, la ruche est sur disque mais le noyau en cours
n'en a aucune vue. Les outils qui lisent depuis le registre vivant
plutôt que le fichier manqueront tout pour les utilisateurs non
connectés. C'est la raison la plus courante pour qu'une investigation
manque silencieusement la persistance.
UsrClass.dat : la seconde ruche par utilisateur
UsrClass.dat est la contrepartie par utilisateur de la ruche de
classe machine. Elle vit à côté de NTUSER mais vous devez savoir la
prendre séparément. La plupart des scripts d'acquisition qui disent
"prendre NTUSER" ne prennent pas UsrClass sans être explicitement
dirigés.
Ce qui vit ici :
Local Settings\Software\Microsoft\Windows\Shell\BagMRUetBags: ShellBags modernes. Sur Windows 7 et ultérieur, c'est ici que vivent les données Bag significatives, pas dans NTUSER. Les outils qui ne regardent que dans NTUSER vous donneront une vue fragmentaire.Local Settings\MuiCache: noms d'affichage en cache pour les exécutables avec lesquels l'utilisateur a interagi via Explorer.- Diverses inscriptions de classes spécifiques aux apps par utilisateur.
Si ShellBags compte pour votre affaire, vous avez besoin de UsrClass. L'investigation s'effondrera sans.
SAM et SECURITY : les ruches d'identifiants
SAM tient l'information de compte local. SECURITY tient la politique
locale et les identifiants de domaine en cache. Les deux sont
chiffrés avec des clés dérivées du sous-arbre LSA\ de SYSTEM, ce
qui signifie que le déchiffrement nécessite SYSTEM. Acquérez toujours
les trois ensemble. Les séparer est un piège de flux qui attrape les
nouveaux enquêteurs.
Clés utiles :
SAM\Domains\Account\Users\: comptes locaux, avec horodatages de dernière connexion, changement de mot de passe, et drapeaux de compte.SAM\Domains\Account\Aliases\Members\: appartenances aux groupes locaux.SECURITY\Cache\: identifiants de domaine en cache (MSCASH/DCC2).SECURITY\Policy\Secrets\: secrets LSA, y compris mots de passe de comptes de service stockés en clair.
Confusions courantes
Trois reviennent sur presque chaque affaire :
Les clés Run existent dans HKLM et HKCU. Quand vous triez Run, vous triez les deux. SOFTWARE a la valeur machine-wide ; les fichiers NTUSER.DAT par utilisateur ont les valeurs par utilisateur. La persistance peut vivre dans l'une, parfois les deux, parfois uniquement la seconde sur une infection en contexte utilisateur qui n'a jamais obtenu admin.
ShellBags a déménagé. Sur Windows 7+ les données bag significatives sont dans UsrClass.dat. Les outils écrits contre les ruches de l'ère XP regardent dans NTUSER et manquent tout.
ControlSet versus CurrentControlSet.
HKLM\SYSTEM\CurrentControlSet\ est un lien symbolique. Les vraies
données sont dans ControlSet001 (généralement). Quand vous
analysez la ruche SYSTEM hors ligne, vous devez lire Select\Current
pour savoir quel ControlSet est vivant, puis lire celui-là. Lire
CurrentControlSet directement échouera car le lien symbolique
n'existe pas sur disque.
Un ordre de triage qui marche
- Acquérir SYSTEM, SOFTWARE, SECURITY, SAM, chaque NTUSER.DAT,
chaque UsrClass.dat, plus tous leurs
.LOG1/.LOG2. - Résoudre le fuseau horaire (SYSTEM
Control\TimeZoneInformation) avant de lire le moindre horodatage. - Énumérer les utilisateurs (SOFTWARE
Microsoft\Windows NT\CurrentVersion\ProfileList) pour savoir quels fichiers NTUSER correspondent à quels comptes. - Trier la persistance machine-wide dans SOFTWARE et SYSTEM. Recouper avec Prefetch, AmCache, et Shimcache.
- Trier l'activité par utilisateur dans chaque NTUSER. Regardez UserAssist, RecentDocs, TypedPaths, RunMRU. Pivotez vers les fichiers LNK et jump lists pour l'accès aux fichiers.
- ShellBags depuis UsrClass pour l'historique de navigation.
Faire cela dans le mauvais ordre marche bien. Sauter l'un des six vous mord au troisième appel quand la question se pose et qu'il faut retourner à l'hôte.
Pour aller plus loin
- Microsoft, Registry Hives.
- Le catalogue de plugins RegRipper d'Harlan Carvey : trié par ruche, avec des commentaires sur ce que chacun extrait.
- SANS, Poster Windows Forensic Analysis.
- La documentation de Registry Explorer d'Eric Zimmerman : le modèle de chargement dans RE est une bonne façon de comprendre quelle ruche contribue à quel sous-arbre.
Savoir quelle ruche tient quelle question est la différence entre un triage de quinze minutes et un après-midi de grep sur le mauvais fichier.