Traçage et Journalisation des scripts

  • 06/12/2017
  • 2 minutes à lire
    • j
    • l

Bien que PowerShell dispose déjà du paramètre de stratégie de groupe LogPipelineExecutionDetails pour consigner l’invocation des applets de commande, le langage de script de PowerShell comporte plusieurs fonctionnalités que vous pourriez souhaiter enregistrer et auditer. La nouvelle fonctionnalité de suivi détaillé des scripts fournit un suivi et une analyse détaillés de l’activité des scripts PowerShell sur un système. Après avoir activé le suivi détaillé des scripts, PowerShell enregistre les blocs allscript dans le journal des événements ETW, Microsoft-Windows-PowerShell/Operational. Si un bloc de script crée un autre bloc de script, par exemple en appelant Invoke-Expression, le bloc de script invoqué est également enregistré.

La journalisation est activée via le paramètre de stratégie de groupe de journalisation de bloc de script PowerShell Activé Modèles administratifs – > Composants Windows – > Windows PowerShell.

Les événements sont:

Canal Opérationnel
Niveau Verbeux
Opcode Create
Tâche CommandStart
Mot-clé Espace d’exécution
EventId Engine_scriptblockcompilé (0x1008 = 4104)
Message Création de texte Scriptblock (%1 de%2) : Identifiant %3 ScriptBlock: %4

Le texte intégré dans le message correspond à l’étendue du bloc de script compilé. L’ID est un GUID quiest conservé pour la durée de vie du bloc de script.

Lorsque vous activez la journalisation détaillée, la fonctionnalité écrit des marqueurs de début et de fin:

Canal Opérationnel
Niveau Verbeux
Opcode Ouvrir/Fermer
Tâche CommandStart/CommandStop
Mot-clé Espace d’exécution
EventId ScriptBlock_Invoke_Start_Detail(0x1009=4105) / ScriptBlock_Invoke_Complete_Detail(0x100A = 4106)
Message Appel démarré/terminé de l’ID ScriptBlock : %1 ID Runspace: %2

L’ID est le GUID représentant le bloc de script (qui peut être corrélé avec l’ID d’événement 0x1008), et l’ID d’espace d’exécution représente l’espace d’exécution dans lequel ce bloc de script a été exécuté.

Les signes de pourcentage dans le message d’appel représentent des propriétés ETW structurées. Bien qu’ils soient remplacés par les valeurs réelles dans le texte du message, un moyen plus robuste d’y accéder consiste à récupérer themessage avec l’applet de commande Get-WinEvent, puis à utiliser le tableau de propriétés du message.

Voici un exemple de la façon dont cette fonctionnalité peut aider à déballer une tentative malveillante de chiffrer et de masquer un script:

## Malwarefunction SuperDecrypt{ param($script) $bytes = ::FromBase64String($script) ## XOR "encryption" $xorKey = 0x42 for($counter = 0; $counter -lt $bytes.Length; $counter++) { $bytes = $bytes -bxor $xorKey } ::Unicode.GetString($bytes)}$decrypted = SuperDecrypt "FUIwQitCNkInQm9CCkItQjFCNkJiQmVCEkI1QixCJkJlQg=="Invoke-Expression $decrypted

L’exécution de cette opération génère les entrées de journal suivantes:

Compiling Scriptblock text (1 of 1):function SuperDecrypt{ param($script) $bytes = ::FromBase64String($script) ## XOR "encryption" $xorKey = 0x42 for($counter = 0; $counter -lt $bytes.Length; $counter++) { $bytes = $bytes -bxor $xorKey } ::Unicode.GetString($bytes)}ScriptBlock ID: ad8ae740-1f33-42aa-8dfc-1314411877e3Compiling Scriptblock text (1 of 1):$decrypted = SuperDecrypt "FUIwQitCNkInQm9CCkItQjFCNkJiQmVCEkI1QixCJkJlQg=="ScriptBlock ID: ba11c155-d34c-4004-88e3-6502ecb50f52Compiling Scriptblock text (1 of 1):Invoke-Expression $decryptedScriptBlock ID: 856c01ca-85d7-4989-b47f-e6a09ee4eeb3Compiling Scriptblock text (1 of 1):Write-Host 'Pwnd'ScriptBlock ID: 5e618414-4e77-48e3-8f65-9a863f54b4c8

Si la longueur du bloc de script dépasse la capacité d’un seul événement, PowerShell décompose le script en plusieurs parties. Voici un exemple de code pour recombiner un script à partir de ses messages de journal:

$created = Get-WinEvent -FilterHashtable @{ ProviderName="Microsoft-Windows-PowerShell"; Id = 4104 } | Where-Object { $_.<...> }$sortedScripts = $created | sort { $_.Properties.Value }$mergedScript = -join ($sortedScripts | % { $_.Properties.Value })

Comme pour tous les systèmes de journalisation dotés d’un tampon de rétention limité, une façon d’attaquer cette infrastructure consiste à inonder le journal d’événements faux pour masquer des preuves antérieures. Pour vous protéger de cette attaque, assurez-vous d’avoir une forme de collecte de journaux d’événements configurée pour le transfert de WindowsEvent. Pour plus d’informations, Voirenregistrer l’Adversaire avec la surveillance du journal des événements Windows.



+