(TAOMF) Les registres

L'ensemble des articles tagués TAOMF ont été écrit à partir d'un ensemble de notes prises suite à la lecture du livre "The Art Of Memory Forensic" écrit par Michael Hale Ligh, Andrew Case, Jamie Levy et Aaron Walters.

Tout les crédits de ces articles leur reviennent donc de droits. Par ailleurs je vous invite vraiment à lire ce livre qui est une mine colossale d'informations.


La base de registres Windows est une base de données contenant des données de configuration utilisées par le système d'exploitation Windows. Cette base de données nous pouvons la modifier à l'aide de l'outil regedit:

Il existe en tout sept clé racines:

  • HKEY_LOCAL_MACHINE (HKLM): contient les informations relatives à la configuration locale de la machine
  • HKEY_CURRENT_CONFIG (HKCC): contient les informations de configuration obtenues au cours de l'utilisation de la sessions
  • HKEY_CLASSES_ROOT (HKCR): contient des informations relatives aux applications en cours d'exécution sur la machine
  • HKEY_CURRENT_USER (HKCU): contient les informations de configuration spécifiques relatives  à l'utilisateur actuellement connecté sur la machine.
  • HKEY_USERS (HKU): contient les sous clés pour chaque utilisateurs.
  • HKEY_PERFORMANCE_DATA (seulement pour windows NT et invisible dans l'éditeur de registre): contient des informations relatives à l'état du système d’exploitation
  • HKEY_DYN_DATA (seulement pour Windows 9X et invisible dans l'éditeur de registre): contient des informations relatives aux matériels physiques.

Chaque clé peut contenir un ensemble de sous clés auxquelles ont associé une valeur:

Ici on peut voir la clé "wheel" est de type REG_DWORD et contient la valeur "0x00000001. Chaque clé est caractérisée par un type de données parmi lesquels on retrouve:

Type ID Symbolic type name Meaning and encoding of the data stored in the registry value
0 REG_NONE No type (the stored value, if any)
1 REG_SZ A string value, normally stored and exposed in UTF-16LE (when using the Unicode version of Win32 API functions), usually terminated by a NUL character
2 REG_EXPAND_SZ An "expandable" string value that can contain environment variables, normally stored and exposed in UTF-16LE, usually terminated by a NUL character
3 REG_BINARY Binary data (any arbitrary data)
4 REG_DWORD / REG_DWORD_LITTLE_ENDIAN A DWORD value, a 32-bit unsigned integer (numbers between 0 and 4,294,967,295 [232 – 1]) (little-endian)
5 REG_DWORD_BIG_ENDIAN A DWORD value, a 32-bit unsigned integer (numbers between 0 and 4,294,967,295 [232 – 1]) (big-endian)
6 REG_LINK A symbolic link (UNICODE) to another registry key, specifying a root key and the path to the target key
7 REG_MULTI_SZ A multi-string value, which is an ordered list of non-empty strings, normally stored and exposed in UTF-16LE, each one terminated by a NUL character, the list being normally terminated by a second NUL character.
8 REG_RESOURCE_LIST A resource list (used by the Plug-n-Play hardware enumeration and configuration)
9 REG_FULL_RESOURCE_DESCRIPTOR A resource descriptor (used by the Plug-n-Play hardware enumeration and configuration)
10 REG_RESOURCE_REQUIREMENTS_LIST A resource requirements list (used by the Plug-n-Play hardware enumeration and configuration)
11 REG_QWORD / REG_QWORD_LITTLE_ENDIAN A QWORD value, a 64-bit integer (either big- or little-endian, or unspecified) (introduced in Windows XP)

Eh merci wikipédia

Une clé de registre est représentée par une structure qui contient (entre autres):

  • Une signature unique permettant d'identifier que la structure concernée une clé de registre
  • Le chemin absolu menant vers le fichier qui stocke cette clé de registre
  • Le chemin de la clé de registre dans la base de registre

Alors comment récupérer ces clés de registre dans un dump mémoire? Eh bien déjà il faut savoir que les clés de registre qui ne sont pas utilisées fréquemment ne sont pas stockées dans la RAM mais en SWAP (ie: dans un fichier pagefile.sys).

La liste suivante contient un ensemble d'informations intéressantes que l'on pourra trouver dans les clés de registre:

  • La liste des programmes qui se lancent automatiquement au démarrage de l'OS:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • La liste des programmes qui se lancent lorsqu'un utilisateur se connecte à une session:
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows NT\CurrentVersion\Winlog
  • La liste des médias externes qui ont été connecté à une machine:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB
  • La liste des informations liées à un comte utilisateur
  • La liste des programmes qui ont récemment été lancé:
HKCU\software\microsoft\windows\currentversion\explorer\userassist

Comme chaque clé contient, dans sa structure, une signature unique la représentant il suffit de chercher cette valeur dans la mémoire pour détecter une clé. Avec volatility on pourra afficher le contenu d'une clé en particulière via le module printkey:

python voll.pty -f image.raw --profile=<whatever> printkey -K "Chemin\De\La\Clé"

D'autres informations intéressantes peuvent être trouvées dans ce qu'on appelle les shellbags. Les shellbags sont un ensemble de clés de registre qui permettent de tracker les préférences d'affichage des fichiers/dossiers et points de montage quand ils sont vus depuis Windows Explorer.

Si cela permet d'augmenter l'ergonomie de l'affichage pour un utilisateur lambda, ça permet aussi à un analyste d'accéder à un nombre colossale de données parmi lesquelles on retrouve:

  • le nom des fichiers les plus récemment utilisés
  • les nom des fichiers, répertoires et installeurs qui étaient présents sur le système même s'ils ont été supprimé entre temps
  • Le nom des partages réseaux qui ont été montés
  • Des informations sur les volumes TrueCrypt
  • Des metadatas relatives à chacun des éléments cités précédemment

Si les shellbags ne nous permettent pas d'accéder à ces fichiers sensibles, ils nous permettent au moins de savoir qu'à un moment ils étaient présents sur le système. Il est possible de dumper ces shellbags via le module shellbags de volatility.

Dans la foulée on pourra aussi dumper la base SAM directement depuis les clés de registre (il sera nécessaire de dumper les clés SYSTEM et SAM).

Enfin on pourra aussi dumper les LSAsecrets (module lsadump). Pour rappel les LSAsecrets sont un ensembe de clés de registre qui contiennent des informations sensibles chiffrées. Parmi ces informations on retrouve:

  • Des credentials (internet explorer, SQL,  mot de passe de comptes de service)
  • Le mot de passe par défaut à utiliser si l'auto login est activé
  • Le domain cache qui contient des identifiants de connexion utilisables pour intérargir avec un domain Active Directory
  • Clé privée utilisée pour les connexions RDP

Il peut vraiment y avoir tout un tas d'informations intéressantes.