- 06/12/2017
- 2 minutter at læse
-
- j
- s
mens Invoke-Expression
, logges den påkaldte scriptblokogså.
logning er aktiveret via indstillingen Tænd for Strømshell Script Bloklogning Gruppepolitik iadministrative skabeloner- > vinduer komponenter- > vinduer Strømshell.
begivenhederne er:
kanal | operationel |
---|---|
niveau | Verbose |
Opcode | Opret |
opgave | Kommandostart |
nøgleord | Runspace |
EventId | Motor_scriptblokkompileret (0h1008 = 4104) |
besked | oprettelse Scriptblock tekst (%1 af %2): %3 ScriptBlock ID: %4 |
teksten indlejret i meddelelsen er omfanget af scriptblokken kompileret. ID ‘ et er en GUID derbevares for livet af scriptblokken.
når du aktiverer verbose logning, skriver funktionen Start-og slutmarkører:
kanal | operationel |
---|---|
niveau | Verbose |
Opcode | Åbn / Luk |
opgave | CommandStart / CommandStop |
nøgleord | Runspace |
begivenhed | ScriptBlock_Invoke_Start_Detail (0h1009 = 4105) / ScriptBlock_Invoke_Complete_Detail (0h100a = 4106) |
besked | startet / afsluttet påkaldelse af ScriptBlock ID: %1 Runspace ID: %2 |
ID ‘et er GUID’ et, der repræsenterer scriptblokken (som kan korreleres med event ID 0h1008), og Runspace ID repræsenterer det runspace, hvor denne scriptblok blev kørt.
procenttegn i påkaldelsesmeddelelsen repræsenterer strukturerede egenskaber. Mens de erstattes med de faktiske værdier i meddelelsesteksten, er en mere robust måde at få adgang til dem på at hente themessage med cmdlet ‘ en og derefter bruge meddelelsens egenskabsarray.
her er et eksempel på, hvordan denne funktionalitet kan hjælpe med at pakke et ondsindet forsøg på at kryptere andobfuscate et 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
kører dette genererer følgende logposter:
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
hvis scriptbloklængden overstiger kapaciteten af en enkelt begivenhed, bryder scriptet iflere dele. Her er eksempelkode for at rekombinere et script fra dets logmeddelelser:
$created = Get-WinEvent -FilterHashtable @{ ProviderName="Microsoft-Windows-PowerShell"; Id = 4104 } | Where-Object { $_.<...> }$sortedScripts = $created | sort { $_.Properties.Value }$mergedScript = -join ($sortedScripts | % { $_.Properties.Value })
som med alle logsystemer, der har en begrænset tilbageholdelsesbuffer, er en måde at angribe denne infrastruktur på at oversvømme loggen med falske begivenheder for at skjule tidligere beviser. For at beskytte dig selv mod dette angreb skal du sikre dig, at du har en eller anden form for indsamling af hændelseslog oprettet. For mere information, sespotting modstanderen med vinduer hændelseslog overvågning.