Script tracering en logboekregistratieScript Tracing and Logging

Terwijl Windows PowerShell al heeft het LogPipelineExecutionDetails Groepsbeleid van PowerShell-scripttaal instellen voor het aanroepen van cmdlets melden, heeft veel functies die u kunt zich aanmelden en controleren.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 stelt u gedetailleerde bijhouden en analyseren van Windows PowerShell scripts gebruiken op een systeem.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 registreert in het gebeurtenislogboek ETW Microsoft-Windows-PowerShell/operationeel.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 ander scriptblok (bijvoorbeeld een script waarmee de cmdlet Invoke-Expression op een tekenreeks aangeroepen), 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.

Registreren van deze gebeurtenissen kan worden ingeschakeld via de schakelt logboekregistratie van PowerShell-Script blok instelling voor Groepsbeleid (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 OperationeleOperational
NiveauLevel VerboseVerbose
OpcodeOpcode MakenCreate
TaakTask CommandStartCommandStart
SleutelwoordKeyword RunspaceRunspace
Gebeurtenis-idEventId Engine_ScriptBlockCompiled (0x1008 = 4104)Engine_ScriptBlockCompiled (0x1008 = 4104)
BerichtMessage Het maken van Scriptblock tekst (%1 van %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 de levensduur van het scriptblok wordt bewaard.The ID is a GUID that is retained for the life of the script block.

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

KanaalChannel OperationeleOperational
NiveauLevel VerboseVerbose
OpcodeOpcode Open (/ sluiten)Open (/ Close)
TaakTask CommandStart (/ CommandStop)CommandStart (/ CommandStop)
SleutelwoordKeyword RunspaceRunspace
Gebeurtenis-idEventId ScriptBlock_aanroepen_Start_Detail (0x1009 = 4105) /ScriptBlock_Invoke_Start_Detail (0x1009 = 4105) /
ScriptBlock_aanroepen_voltooid_Detail (0x100A = 4106)ScriptBlock_Invoke_Complete_Detail (0x100A = 4106)
BerichtMessage Gestarte (/ voltooide)-aanroep van ScriptBlock-ID: %1Started (/ Completed) invocation of ScriptBlock ID: %1
Runspace-ID: %2Runspace ID: %2

De ID is de GUID die vertegenwoordigt het scriptblok (die kan worden gecorreleerd met gebeurtenis-ID 0x1008) en de Runspace-ID vertegenwoordigt de runspace op waarin dit 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 het aanroepen van 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 krachtigere manier toegang tot deze worden opgehaald van het bericht met de cmdlet Get-WinEvent 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 uitpakken een schadelijke poging kunt voor het versleutelen en verbergen, een script weergeven: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

Dit uitgevoerd, wordt de volgende logboekvermeldingen gegenereerd: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 voorbeeldcode voor een script van de berichten in het logboek elke: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 buffer beperkt bewaren (dat wil zeggen ETW-Logboeken) is een aanval op deze infrastructuur voor het logboek met onnodig gebeurtenissen voor het verbergen van eerdere 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. Om u te beschermen tegen deze aanval, zorg ervoor dat er een vorm van gebeurtenislogboek verzameling instellen (dat wil zeggen, Windows Event Forwarding, ontdekken van de Adversary met bewaking van Windows-gebeurtenislogboek) gebeurtenislogboeken af bij de computer als verplaatsen 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.