Ablaufverfolgung und Protokollierung von Skripten

  • 06/12/2017
  • 2 minuten zum Lesen
    • j
    • s

Während PowerShell bereits über die Gruppenrichtlinieneinstellung LogPipelineExecutionDetails verfügt, um den Aufruf von Cmdlets zu protokollieren, verfügt die Skriptsprache von PowerShell über mehrere Funktionen, die Sie möglicherweise protokollieren und überwachen möchten. Die neue detaillierte Skriptverfolgungsfunktion bietet eine detaillierte Verfolgung und Analyse der PowerShell-Skriptaktivität auf einem System. Nach dem Aktivieren der detaillierten Skriptverfolgung protokolliert PowerShell Alleskriptblöcke im ETW-Ereignisprotokoll Microsoft-Windows-PowerShell / Operational. Wenn ein Skriptblock einen anderen Skriptblock erstellt, z. B. durch Aufruf von Invoke-Expression, wird auch der aufgerufene Skriptblock protokolliert.

Die Protokollierung wird über die Gruppenrichtlinieneinstellung PowerShell-Skriptblockprotokollierung aktivieren inAdministrative Vorlagen -> Windows-Komponenten -> Windows PowerShell aktiviert.

Die Ereignisse sind:

Kanal Betriebsbereit
Stufe Ausführlich
Opcode Erstellen
Aufgabe Befehlstart
Schlagwort Runspace
EventID Engine_ScriptBlockCompiled (0x1008 = 4104)
Nachricht Skriptblocktext erstellen (%1 von %2): %3 SkriptBlock-ID: %4

Der in die Nachricht eingebettete Text ist der Umfang des kompilierten Skriptblocks. Die ID ist eine GUID, die für die Lebensdauer des Skriptblocks beibehalten wird.

Wenn Sie die ausführliche Protokollierung aktivieren, schreibt die Funktion Anfangs- und Endmarkierungen:

Kanal Betriebsbereit
Stufe Ausführlich
Opcode Öffnen / Schließen
Aufgabe CommandStart / CommandStop
Schlagwort Runspace
EventID ScriptBlock_Invoke_Start_Detail (0x1009 = 4105) / ScriptBlock_Invoke_Complete_Detail (0x100A = 4106)
Meldung Gestarteter / abgeschlossener Aufruf der SkriptBlock-ID: %1 Runspace-ID: %2

Die ID ist die GUID, die den Skriptblock darstellt (der mit der Ereignis-ID 0x1008 korreliert werden kann), und die Runspace-ID repräsentiert den Runspace, in dem dieser Skriptblock ausgeführt wurde.

Prozentzeichen in der Aufrufnachricht repräsentieren strukturierte ETW-Eigenschaften. Während sie durch die tatsächlichen Werte im Nachrichtentext ersetzt werden, besteht eine robustere Möglichkeit, auf sie zuzugreifen, darin, themessage mit dem Cmdlet Get-WinEvent abzurufen und dann das Eigenschaftsarray der Nachricht zu verwenden.

Hier ist ein Beispiel, wie diese Funktionalität helfen kann, einen böswilligen Versuch, ein Skript zu verschlüsseln und zu verschleiern, zu entpacken:

## 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

Wenn Sie dies ausführen, werden die folgenden Protokolleinträge generiert:

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

Wenn die Skriptblocklänge die Kapazität eines einzelnen Ereignisses überschreitet, teilt PowerShell das Skript in mehrere Teile. Hier ist ein Beispielcode zum Rekombinieren eines Skripts aus seinen Protokollnachrichten:

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

Wie bei allen Protokollierungssystemen, die über einen begrenzten Speicherpuffer verfügen, besteht eine Möglichkeit, diese Infrastruktur anzugreifen, darin, das Protokoll mit falschen Ereignissen zu überfluten, um frühere Beweise zu verbergen. Um sich vor diesem Angriff zu schützen, stellen Sie sicher, dass Sie eine Form der Ereignisprotokollsammlung eingerichtet haben WindowsEvent Forwarding. Weitere Informationen finden Sie unterspotten des Gegners mit Windows-Ereignisprotokollüberwachung.



+