SRUM¶
Qu'est-ce que SRUM ?¶
Le moniteur d'utilisation des ressources système (System Resource Usage Monitor, SRUM) stocke une base de données ESE de l'utilisation des ressources par les applications et les
services. Selon la version de Windows, il enregistre les octets réseau, les identifiants d'interface/de profil,
les connexions, le temps CPU, l'activité au premier plan/en arrière-plan, l'activité disque, la consommation d'énergie, les notifications
push et les données de chronologie des applications. Les entrées sont associées à des identifiants d'application et à des SID d'utilisateur
au moyen de SruDbIdMapTable.
SRUM est particulièrement utile lorsqu'un exécutable a été supprimé : son identifiant d'application, son utilisateur et ses lignes d'utilisation des ressources peuvent survivre au fichier. Les totaux réseau peuvent étayer une hypothèse d'exfiltration, mais SRUM n'est pas une capture de paquets et n'identifie généralement pas chaque point de terminaison distant ni chaque fichier transféré.
Meilleure conclusion : Windows a attribué l'utilisation des ressources enregistrée à l'application/au compte pendant la période de mesure de la table.
Emplacement et collecte¶
C:\Windows\System32\sru\SRUDB.dat
C:\Windows\System32\config\SOFTWARE (context for account and Wi-Fi names)
SRUM existe sous Windows 8 et versions ultérieures. Copiez SRUDB.dat de manière cohérente, idéalement à partir d'un instantané ou avec
un collecteur forensique. Collectez également SOFTWARE ainsi que les fichiers de transactions/journaux ESE du répertoire
sru.
La ruche SOFTWARE correspondante est distincte de la base ESE : lorsqu’elle est non synchronisée, Juntei rejoue automatiquement en mémoire ses journaux de transactions du Registre voisins SOFTWARE.LOG, .LOG1 et .LOG2. Collectez-les également. Les détails de récupération et avertissements sont affichés ; sans ces journaux, les noms de comptes ou Wi-Fi peuvent être incomplets ou anciens. Cela ne rejoue pas les journaux de la base SRUM.
Bases de données « dirty »
Juntei lit un SRUDB.dat dans un état « dirty » tel qu'il a été collecté et le signale. Il ne rejoue pas actuellement
SRU*.log ; les modifications présentes uniquement dans ces journaux sont donc absentes. Ne décrivez pas implicitement une
base de données « dirty » comme complète.
Précautions d'analyse¶
- De nombreuses lignes représentent une agrégation périodique, généralement autour de limites horaires, et non l'heure exacte d'une action.
- Les totaux d'octets n'identifient pas à eux seuls le contenu, l'intention, le protocole ou la destination.
- Une identité d'application peut être un chemin, un service, une application empaquetée ou un objet ; examinez
AppType. - Les noms d'utilisateur et de réseaux Wi-Fi sont un enrichissement provenant de la ruche
SOFTWAREcorrespondante. L'absence de noms ne signifie pas que l'identifiant sous-jacent est absent. null, zéro, les colonnes absentes, les types non pris en charge et les valeurs endommagées sont des états différents.- Les schémas des fournisseurs varient selon la version de Windows. Conservez les tables inconnues et les noms de colonnes d'origine.
- Les services Windows en arrière-plan génèrent de manière légitime des totaux de ressources importants.
Analyser avec Juntei¶
Usage: juntei parse-ese srum <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SRUDB.dat
-f, --file <FILE> Parse one SRUDB.dat
-r, --software <FILE> Matching SOFTWARE hive for names
Output:
-o, --output <PATH> Directory of CSV tables, or JSON/JSONL file
-t, --output-type <TYPE> csv, json, or jsonl
--include-value-state Add per-value read state and raw bytes to JSON/JSONL
juntei parse-ese srum -f SRUDB.dat -r SOFTWARE -o srum-csv
juntei parse-ese srum -f SRUDB.dat -t jsonl \
| jq 'select(.Provider == "NetworkUsages" and (.BytesSent // 0) > 100000000)'
juntei parse-ese srum -f SRUDB.dat -t jsonl --include-value-state \
| jq '{Provider, Timestamp, ValueState, Raw}'
Tables de sortie¶
Le format CSV crée SRUM-IdentityMap.csv pour SruDbIdMapTable et une table par fournisseur. Les noms de sortie connus sont notamment :
| Fournisseur/table | Intérêt pour l'investigation |
|---|---|
NetworkUsages |
Octets envoyés/reçus par application, utilisateur, interface et profil. |
NetworkConnections |
Activité de type nombre/durée de connexions et heures de début de connexion. |
AppResourceUseInfo |
Utilisation du CPU, du disque, du réseau au premier plan/en arrière-plan et utilisation associée des applications. |
AppTimelineProvider |
Activité de chronologie des applications avec des champs d'heure de fin et d'état d'utilisation. |
EnergyUsage |
Mesures d'énergie/des fournisseurs à court et à long terme ; IsLt les distingue. |
PushNotifications |
Activité des notifications push. |
VfuProvider |
Le fournisseur vfuprov ; son rôle détaillé est mal documenté, interprétez donc ses champs avec prudence. |
EnergyEstimation, TaggedEnergy |
Fournisseurs d'énergie et d'utilisation propres à certaines versions. |
ProcessorTime, SizeInBytes, TotalUsed, NetworkBytes |
Tables de fournisseurs de Windows Server. |
| Nom de table inconnu | Juntei conserve les fournisseurs inconnus sous leur GUID/nom de table et émet chaque colonne du catalogue. |
Comme SRUM est piloté par son catalogue et que Windows ajoute des colonnes aux fournisseurs, il n'existe volontairement pas de liste finie et fixe de champs propres à chaque fournisseur. Juntei émet chaque colonne présente dans la base de données avec les libellés de champs en PascalCase de Juntei. Les champs suivants constituent le contrat de sortie stable/commun.
Sortie catégorisée de auto-parse¶
auto-parse place chaque table SRUM directement dans sa catégorie d'investigation. Les formats CSV, JSON et JSONL
utilisent le même préfixe de nom de fichier SRUM- ; il n'y a pas de répertoire SRUM/ englobant.
| Catégorie | Fichiers CSV |
|---|---|
NetworkActivity |
SRUM-NetworkConnections.csv, SRUM-NetworkUsages.csv, SRUM-NetworkBytes.csv, SRUM-PushNotifications.csv |
ProcessExecution |
SRUM-AppResourceUseInfo.csv, SRUM-AppTimelineProvider.csv, SRUM-ProcessorTime.csv |
SystemInformation |
SRUM-EnergyUsage.csv, SRUM-EnergyEstimation.csv, SRUM-TaggedEnergy.csv, SRUM-SizeInBytes.csv, SRUM-TotalUsed.csv, SRUM-IdentityMap.csv, SRUM-VfuProvider.csv et les tables des fournisseurs inconnus |
Seules les tables présentes dans la capture sont exportées. Les compteurs réseau et les enregistrements de notifications sont
placés selon leur usage principal en investigation ; cela ne signifie pas que chaque ligne décrit une connexion
distante. La table de correspondance des identités sert à plusieurs catégories. VFU et les fournisseurs inconnus restent dans
SystemInformation, car leur présence seule n'établit pas une exécution.
SystemInformation/SRUM-logs.txt contient les diagnostics du parseur et la correspondance entre la sortie d'origine et la sortie
finale. Les deux manifestes répertorient les chemins réels des tables dans OutputFiles ; l'Output de la tâche SRUM
est le répertoire de l'ordinateur et Category identifie l'emplacement partagé de son journal/de ses métadonnées.
Avec plusieurs bases de données, les noms de fichiers reçoivent -Source1, -Source2, etc., avant l'extension.
Le journal conserve les alias de capture d'origine, et les lignes JSON/JSONL conservent leur provenance SourceFile,
Table, Provider, Comp et Artifact. Aucune table n'est copiée dans plusieurs
catégories. La chronologie SIEM combinée -j inclut chaque enregistrement SRUM conservé une seule fois.
La commande autonome parse-ese srum conserve l'emplacement de sortie demandé. Ses fichiers de tables CSV portent également
le préfixe SRUM- ; les noms de fichiers de sortie JSON/JSONL explicites restent choisis par l'analyste.
Champs de sortie communs¶
| Champ | Interprétation |
|---|---|
SourceFile |
Base de données d'entrée ; présente en JSON/JSONL et utile pour plusieurs hôtes. |
Table |
Nom/GUID d'origine de la table ESE. À conserver pour comparer des versions ou des fournisseurs inconnus. |
Provider |
Nom convivial du fournisseur/de la sortie, ou nom d'origine de la table s'il est inconnu. |
ID |
AutoIncId de la ligne ; un identifiant de ligne de la base de données, et non un identifiant de processus. |
Timestamp |
Moment où SRUM a enregistré/agrégé les valeurs, arrondi à la milliseconde. Généralement pas l'heure exacte de l'événement. |
EXE-Info |
Identité de l'application/du service/du package résolue à partir de AppID. Pivot principal pour le programme. |
EXE-InfoDescription |
Description extraite des noms d'application SRUM composites. Contexte uniquement. |
EXE-Timestamp |
Heure intégrée dans une identité d'application composite, le cas échéant ; pas l'heure d'utilisation de la ligne. |
AppType |
NormalApp, Service, ModernApp ou Object ; détermine la manière d'interpréter EXE-Info. |
SID |
SID du compte résolu à partir de UserID. Pivot solide pour l'identité de l'utilisateur/du service. |
User |
Nom de profil convivial enrichi à partir de SOFTWARE ; peut être null alors que SID reste valide. |
UserID, AppID |
Références numériques brutes vers SruDbIdMapTable ; à conserver pour les noms non résolus ou en double. |
IsLt |
true pour la table EnergyUsage à long terme, false pour celle à court terme. |
InterfaceLUID |
LUID brut de l'interface réseau provenant des lignes du fournisseur. |
InterfaceType |
Classe d'interface décodée (par exemple IF_TYPE_IEEE80211) ; une classe, et non un adaptateur unique. |
L2ProfileID |
Référence numérique du profil réseau. |
ProfileName |
Nom du réseau Wi-Fi/du profil enrichi à partir de SOFTWARE ; potentiellement sensible, et ne prouve pas une connexion en cours. |
ConnectStartTime, EventTimestamp, EndTime, StartTime |
Colonnes FILETIME connues des fournisseurs, décodées en UTC. Leur signification exacte dépend du fournisseur ; il ne s'agit pas d'une heure d'exécution universelle. |
| Colonnes propres aux fournisseurs | Colonnes de fournisseurs exportées telles que BytesSent, BytesReceived (la colonne de base de données BytesRecvd), les compteurs CPU/disque, les durées, les nombres, les indicateurs ou les estimations. Interprétez les unités selon le fournisseur et comparez les lignes au sein d'un même schéma. |
Champs de diagnostic (--include-value-state)¶
| Champ | Interprétation |
|---|---|
ValueState |
Correspondance entre chaque champ de la base de données et parsed, null, absent, unsupported ou damaged. Permet de distinguer l'absence de preuve d'un échec du parseur. |
Raw |
Octets d'origine en hexadécimal pour les valeurs qui comportent des octets. À utiliser pour la validation et un décodage ultérieur. |
SRUM-IdentityMap.csv (issu de SruDbIdMapTable) contient IdIndex, IdType et IdBlob : l'index brut, la catégorie d'identité
et le texte décodé du programme/SID/objet utilisé par les lignes des fournisseurs.
Stratégie d'investigation¶
- Identifiez le programme avec
EXE-Info,AppTypeetAppID; ne confondez pasIdavec le PID. - Regroupez les lignes réseau par programme, utilisateur, profil, interface et intervalle de temps.
- Comparez les octets envoyés/reçus avec les références habituelles et avec d'autres hôtes.
- Corrélez les intervalles suspects avec Prefetch, les journaux d'événements, les données DNS/proxy/pare-feu et les accès aux fichiers.
- Signalez l'état « dirty » de la base de données et l'absence de relecture des journaux de transactions comme une limitation de la collecte.