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