Script spårning och loggning

  • 06/12/2017
  • 2 minuter att läsa
    • j
    • s

medan PowerShell redan har LogPipelineExecutionDetails grupppolicyinställning för att logga in på cmdlets, har Powershells skriptspråk flera funktioner som du kanske vill logga in och granska. Den nya detaljerade Script Tracing funktionen ger detaljerad spårning och analys ofPowerShell script aktivitet på ett system. Efter att ha aktiverat detaljerad skriptspårning loggar PowerShell allscript-block till etw-händelseloggen, Microsoft-Windows-PowerShell / Operational. Om ett skriptblock skapar ett annat skriptblock, till exempel genom att ringa Invoke-Expression, loggas det anropade skriptblocket också.

loggning aktiveras genom att aktivera PowerShell-Skriptblockloggning grupppolicyinställning iadministrativa mallar -> Windows-komponenter – > Windows PowerShell.

händelserna är:

kanal Drift
nivå utförlig
Opcode skapa
uppgift Kommandostart
nyckelord Runspace
EventId Motor_scriptblocksammanställd (0x1008 = 4104)
meddelande skapa Scriptblock-text (%1 av %2): %3 ScriptBlock-ID: %4

texten inbäddad i meddelandet är omfattningen av skriptblocket som sammanställts. ID är en GUID sombehålls för livet av skriptblocket.

när du aktiverar verbose loggning skriver funktionen start-och slutmarkörer:

kanal Drift
nivå utförlig
Opcode Öppna / Stäng
uppgift CommandStart / CommandStop
nyckelord Runspace
EventId ScriptBlock_Invoke_Start_Detail (0x1009 = 4105) / ScriptBlock_Invoke_Complete_Detail (0x100A = 4106)
meddelande påbörjad / slutförd anrop av ScriptBlock ID: %1 Runspace ID: %2

ID är GUID som representerar skriptblocket (som kan korreleras med Händelse-ID 0x1008), och Runspace ID representerar runspace där detta skriptblock kördes.

procenttecken i anropsmeddelandet representerar strukturerade etw-egenskaper. Medan de ersätts med de faktiska värdena i meddelandetexten är ett mer robust sätt att komma åt dem att hämta meddelandet med Get-WinEvent cmdlet och sedan använda Egenskapsmatrisen för meddelandet.

här är ett exempel på hur denna funktion kan hjälpa packa upp en skadlig försök att kryptera andobfuscate ett skript:

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

att köra detta genererar följande loggposter:

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

om skriptblocklängden överstiger kapaciteten för en enda händelse, bryter PowerShell skriptet in iflera delar. Här är exempelkod för att rekombinera ett skript från dess loggmeddelanden:

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

som med alla loggningssystem som har en begränsad retentionsbuffert, är ett sätt att attackera thisinfrastructure att översvämma loggen med falska händelser för att dölja tidigare bevis. För att protectyourself från denna attack, se till att du har någon form av händelselogg samling ställa in Windowsevent Forwarding. För mer information, sespotting motståndaren med Windows händelseloggen övervakning.



+