スクリプトのトレースとログ

  • 06/12/2017
  • 2 読むべき分
    • j
    • s

PowerShellには、コマンドレットのinvocationをログに記録するL O G Pipelineexecutiondetailsグループポリシー設定が既にありますが、PowerShellのスクリプト言語には、tologとauditが必要な機能がいくつかあります。 新しい詳細スクリプトトレース機能は、システム上のpowershellスクリプト活動の詳細な追跡と分析を提供します。 詳細なスクリプトトレースを有効にした後、PowerShellはすべてのスクリプトブロックをETWイベントログMicrosoft-Windows-PowerShell/Operationalに記録します。 スクリプトブロックがInvoke-Expressionを呼び出すなどして別のスクリプトブロックを作成すると、呼び出されたスクリプトblockalsoがログに記録されます。

ログは、管理テンプレート->Windowsコンポーネント->Windows PowerShellのPowerShellスクリプトブロックログのグループポリシー設定を有効にすることで有効になります。

イベントは:

チャンネル
レベル 冗長
オペコード 作成
タスク コマンドスタート
キーワード ランスペース
EventId Engine_Scriptblockcompiled(0x1008= 4104)
メッセージ Scriptblockテキストを作成しています(%1/%2):%3ScriptBlock ID: %4

メッセージに埋め込まれたテキストは、コンパイルされたスクリプトブロックの範囲です。 IDは、スクリプトブロックの存続期間中保持されます。

詳細ログを有効にすると、この機能は開始マーカーと終了マーカーを書き込みます:

チャンネル
レベル 冗長
オペコード オープン/クローズ
タスク CommandStart/CommandStop
キーワード ランスペース
EventId Scriptblock_Invoke_Start_Detail(0x1009=4105)/Scriptblock_Invoke_Complete_Detail(0x100a= 4106)
メッセージ ScriptBlock IDの呼び出しが開始/完了しました:%1ランスペースID: %2

IDはスクリプトブロックを表すGUID(イベントID0x1008と相関することができます)であり、Runspace IDはこのスクリプトブロックが実行されたrunspaceを表します。

呼び出しメッセージのパーセント記号は、構造化されたETWプロパティを表します。 メッセージテキスト内の実際の値で置き換えられますが、それらにアクセスするより堅牢な方法は、Get-WinEventコマンドレットを使用してメッセージを取得し、メ

この機能が、スクリプトを暗号化して暗号化しようとする悪意のある試みのラップを解除するのに役立つ例を次に示します:

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

これを実行すると、次のログエントリが生成されます:

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

スクリプトブロックの長さが単一のイベントの容量を超えると、PowerShellはスクリプトを複数の部分に分割します。 スクリプトをログメッセージから再結合するサンプルコードを次に示します:

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

限られた保持バッファを持つすべてのロギングシステムと同様に、thisinfrastructureを攻撃する一つの方法は、以前の証拠を隠すために偽のイベントでログをフラッ この攻撃から自分自身を保護するには、何らかの形式のイベントログ収集がWindowsEvent転送を設定していることを確認してください。 詳細については、Windowsイベントログの監視を使用して敵を確認してください。



+