Tracering en logboekregistratie voor scriptsScript Tracing and Logging

Het Windows PowerShell al is de LogPipelineExecutionDetails Groepsbeleid van de PowerShell-scripttaal instellen om aan te melden het aanroepen van cmdlets, heeft veel functies die u wilt aanmelden en/of gecontroleerd.While Windows PowerShell already has the LogPipelineExecutionDetails Group Policy setting to log the invocation of cmdlets, PowerShell’s scripting language has plenty of features that you might want to log and/or audit. De nieuwe functie voor gedetailleerde tracering van Script kunt u gedetailleerde bijhouden en analyseren van Windows PowerShell scripts gebruiken op een systeem inschakelen.The new Detailed Script Tracing feature lets you enable detailed tracking and analysis of Windows PowerShell scripting use on a system. Nadat u gedetailleerde script tracering ingeschakeld, Windows PowerShell-alle scriptblokken logboeken naar het gebeurtenislogboek ETW Microsoft-Windows-PowerShell/Operational.After you enable detailed script tracing, Windows PowerShell logs all script blocks to the ETW event log, Microsoft-Windows-PowerShell/Operational. Als een scriptblok maakt een andere scriptblok (bijvoorbeeld een script waarmee de cmdlet Invoke-Expression wordt aangeroepen op een tekenreeks), wordt die resulterende scriptblok wordt ook vastgelegd.If a script block creates another script block (for example, a script that calls the Invoke-Expression cmdlet on a string), that resulting script block is logged as well.

Logboekregistratie van deze gebeurtenissen kan worden ingeschakeld via de PowerShell-Script blok logboekregistratie kunnen inschakelen groepsbeleidsinstelling (in Beheersjablonen -> Windows-onderdelen -> Windows PowerShell).Logging of these events can be enabled through the Turn on PowerShell Script Block Logging Group Policy setting (in Administrative Templates -> Windows Components -> Windows PowerShell).

De gebeurtenissen zijn:The events are:

KanaalChannel OperationalOperational
NiveauLevel VerboseVerbose
OpcodeOpcode MakenCreate
TaakTask CommandStartCommandStart
TrefwoordKeyword runspaceRunspace
Gebeurtenis-idEventId Engine_ScriptBlockCompiled (0x1008 = 4104)Engine_ScriptBlockCompiled (0x1008 = 4104)
BerichtMessage Het maken van Scriptblock tekst (%1% 2):Creating Scriptblock text (%1 of %2):
%3%3
ScriptBlock-ID: %4ScriptBlock ID: %4

De tekst die is ingesloten in het bericht is de omvang van het scriptblok gecompileerd.The text embedded in the message is the extent of the script block compiled. De ID is een GUID die voor de levensduur van het scriptblok worden bewaard.The ID is a GUID that is retained for the life of the script block.

Wanneer u uitgebreide logboekregistratie inschakelt, wordt de functie schrijfbewerkingen beginnen en eindigen van markeringen:When you enable verbose logging, the feature writes begin and end markers:

KanaalChannel OperationalOperational
NiveauLevel VerboseVerbose
OpcodeOpcode Open (/ afsluiten)Open (/ Close)
TaakTask CommandStart (/ CommandStop)CommandStart (/ CommandStop)
TrefwoordKeyword runspaceRunspace
Gebeurtenis-idEventId ScriptBlock_aanroepen_Start_details (0x1009 = 4105) /ScriptBlock_Invoke_Start_Detail (0x1009 = 4105) /
ScriptBlock_aanroepen_voltooid_details (0x100A = 4106)ScriptBlock_Invoke_Complete_Detail (0x100A = 4106)
BerichtMessage Gestart (/ voltooide) aanroepen van ScriptBlock-ID: %1Started (/ Completed) invocation of ScriptBlock ID: %1
Runspace-ID: %2Runspace ID: %2

De ID is de GUID voor het scriptblok (die kan worden gecorreleerd met gebeurtenis-ID 0x1008) en de Runspace-ID vertegenwoordigt de runspace waarin deze scriptblok is uitgevoerd.The ID is the GUID representing the script block (that can be correlated with event ID 0x1008), and the Runspace ID represents the runspace in which this script block was run.

Procenttekens in het bericht aanroep vertegenwoordigen gestructureerde ETW-eigenschappen.Percent signs in the invocation message represent structured ETW properties. Terwijl ze worden vervangen door de werkelijke waarden in de berichttekst, een robuustere manier toegang tot deze wordt het bericht met de cmdlet Get-WinEvent ophalen en gebruik vervolgens de eigenschappen matrix van het bericht.While they are replaced with the actual values in the message text, a more robust way to access them is to retrieve the message with the Get-WinEvent cmdlet, and then use the Properties array of the message.

Hier volgt een voorbeeld van hoe deze functie kunt uitpakken een schadelijke poging voor het versleutelen en een script, onleesbaar maakt:Here's an example of how this functionality can help unwrap a malicious attempt to encrypt and obfuscate a script:

## Malware
function SuperDecrypt
{
    param($script)
    $bytes = [Convert]::FromBase64String($script)

    ## XOR “encryption”
    $xorKey = 0x42
    for($counter = 0; $counter -lt $bytes.Length; $counter++)
    {
        $bytes[$counter] = $bytes[$counter] -bxor $xorKey
    }
    [System.Text.Encoding]::Unicode.GetString($bytes)
}

$decrypted = SuperDecrypt "FUIwQitCNkInQm9CCkItQjFCNkJiQmVCEkI1QixCJkJlQg=="
Invoke-Expression $decrypted

Uitvoeren van dit genereert de volgende vermeldingen:Running this generates the following log entries:

Compiling Scriptblock text (1 of 1):
function SuperDecrypt
{
    param($script)
    $bytes = [Convert]::FromBase64String($script)
    ## XOR "encryption"
    $xorKey = 0x42
    for($counter = 0; $counter -lt $bytes.Length; $counter++)
    {
        $bytes[$counter] = $bytes[$counter] -bxor $xorKey
    }
    [System.Text.Encoding]::Unicode.GetString($bytes)

}
ScriptBlock ID: ad8ae740-1f33-42aa-8dfc-1314411877e3

Compiling Scriptblock text (1 of 1):
$decrypted = SuperDecrypt "FUIwQitCNkInQm9CCkItQjFCNkJiQmVCEkI1QixCJkJlQg=="
ScriptBlock ID: ba11c155-d34c-4004-88e3-6502ecb50f52

Compiling Scriptblock text (1 of 1):
Invoke-Expression $decrypted
ScriptBlock ID: 856c01ca-85d7-4989-b47f-e6a09ee4eeb3

Compiling Scriptblock text (1 of 1):
Write-Host 'Pwnd'
ScriptBlock ID: 5e618414-4e77-48e3-8f65-9a863f54b4c8

Windows PowerShell verbroken als het script bloklengte groter is dan wat ETW is geschikt voor bedrijf in één gebeurtenis, het script in meerdere delen. Hier volgt een voorbeeldcode om een script uit de logboekberichten weer:Here is sample code to recombine a script from its log messages:

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

Net als bij alle logboekregistratie-systemen waarvoor een beperkte retentie buffer (dat wil zeggen ETW-Logboeken), is een aanval op deze infrastructuur aan het logboek met onnodig gebeurtenissen om te verbergen oudere bewijs overspoelen.As with all logging systems that have a limited retention buffer (i.e. ETW logs), one attack against this infrastructure is to flood the log with spurious events to hide earlier evidence. Zorg ervoor dat u een vorm van gebeurtenis logboekverzameling instellen hebt om uzelf te beschermen tegen deze aanvallen, (dat wil zeggen Windows Event Forwarding, ontdekken van de kwaadwillende persoon met bewaking van Windows-gebeurtenislogboek) te verplaatsen van gebeurtenislogboeken af bij de computer als snel mogelijk.To protect yourself from this attack, ensure that you have some form of event log collection set up (i.e., Windows Event Forwarding, Spotting the Adversary with Windows Event Log Monitoring) to move event logs off of the computer as soon as possible.