Scriptsporing og logning

  • 06/12/2017
  • 2 minutter at læse
    • j
    • s

mens allerede har indstillingen Logpipelineekscutiondetails Group Policy for at logge påinvokation af cmdlet ‘ er, har scriptsprog flere funktioner, som du måske vil have tillog og revision. Den nye detaljerede Scriptsporingsfunktion giver detaljeret sporing og analyse af magtskalscriptaktivitet på et system. Når du har aktiveret detaljeret scriptsporing, logger allscript-blokke til hændelsesloggen. Hvis en scriptblokopretter en anden scriptblok, f.eks. ved at ringe til 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.



+