PowerShellスクリプトブロックログは、 アプリケーションとサービスのログ → Microsoft → Windows → PowerShell → 操作にイベント4104として存在しています。スクリプトブロックのロギングが有効であれば完全です。これをエクスポートするには:
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:logspowershell.evtx
PowerShell 7は、PowerShellCore/Operationalという別製品であり、独自のポリシー設定を持っています。
攻撃者がWindowsボックスに接触した場合、高確率でPowerShellが関与しています。スクリプトブロックのログには、実際に実行されたコードが記録されており、多くの場合、難読化の層が剥がれた後に得られます。Prime CoreはPowerShellログ用に663の検出ルールを持ち、417のMITRE ATT&CK技術にマッピングされています。これには、悪意のあるPowerShellの使用(T1059.001)、難読化(T1027)、ツールを引き込むダウンロードクレードル(T1105)が含まれます。
始める前に
スクリプトブロックのロギングはオンになっていますか?
reg query "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging"
EnableScriptBlockLogging が0x1に設定されていれば、オンです。このキーが存在しない場合、オフです。それでもWindows PowerShell 5.1は、危険なスクリプトブロックを警告レベルで4104イベントとして記録します。したがって、 いくつかの イベントが見つかるかもしれません。ただし、これを全体像と誤解しないでください。
これをオンにすることで、これからのデータが助かりますが、既に発生したことには影響しません。グループポリシー設定を使用して、 helps from now on, not for what already happened. Use the Group Policy setting 管理用テンプレート → Windowsコンポーネント → Windows PowerShell → PowerShellスクリプトブロックのロギングをオンにする、またはレジストリ値を直接設定します:
reg add "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
PowerShell 7はHKLMSOFTWAREPoliciesMicrosoftPowerShellCoreの下に独自のポリシーキーを読み込みます。MSIではなくzipからインストールされた場合、そのイベントチャンネルはRegisterManifest.ps1を$PSHOMEから実行するまで登録されないかもしれません。
ボリュームに期待してください。 実行されるスクリプトやモジュールはすべてログに記録されます。チャンネルの最大サイズを増やさないと、数時間分しか保持されません。
秘密に注意してください。 管理スクリプトは時にパスワードやAPIキーを平文で含んでいることがあり、スクリプトブロックのロギングがそれを忠実に記録します。このファイルがどこかに行く前にそれを心に留めておき、以下のLogTotalセクションを読んでください。
ログをエクスポートする
イベントビューアで右クリック 操作 PowerShellの下で、 「すべてのイベントを名前を付けて保存…」を選択します コマンドラインから:
:: スクリプトブロックのみ
wevtutil epl "Microsoft-Windows-PowerShell/Operational" C:logsps_4104.evtx /q:"*[System[(EventID=4104)]]"
:: PowerShell 7
wevtutil epl "PowerShellCore/Operational" C:logspwsh.evtx
:: クラシックな「Windows PowerShell」ログ:ホストのコマンドラインでのエンジン開始イベント
wevtutil epl "Windows PowerShell" C:logswindows_powershell.evtx
最後のものは忘れやすいですが、取得する価値があります。イベント400は各エンジンの開始を記録しており、エンジンバージョンも含まれます。現代のシステムでEngineVersionが2.0の場合、誰かが意図的にダウングレードしてスクリプトブロックのロギングを回避した可能性があります。
LogTotalにアップロードしてレビュー
LogTotalはEVTXをネイティブに読み込みます。知っておくべきことの1つ: LogTotalはまだEVTXファイルを消毒しません。 PowerShellログの消毒が通常以上に重要なのは、上記の秘密保持のためです。テストマシンでは自由にEVTXをアップロードしてください。プロダクションホストでは、データ取り扱いを担当する人からの承認をまず得てください。
- アップロード。 開く logtotal.com してファイルをドロップします。
- レビュー。
問題が発生したとき
| 症状 | 考えられる原因 | Fix |
|---|---|---|
| 4104イベントが全くない | スクリプトブロックのロギングがオフで、何も疑わしく思われませんでした | 今後のために有効化して、Windows PowerShellログで得られるものを確認 |
| 少数の注意イベントとしての4104イベント | ロギングはオフで、自動の疑わしいブロックロギングを見ています | 上記と同じ |
| PowerShellCore/Operationalが見つからない | PowerShell 7がインストールされていないか、そのマニフェストが登録されていない | $PSHOMEからRegisterManifest.ps1を実行してください |
| 4104のテキストが読めない暗号文書 | Protected Event Logging がオン | 復号化証明書が必要 |
| ログは数時間しか続かない | デフォルトサイズ、ボリューム多 | チャンネルの最大サイズを増やします |
FAQ
スクリプトブロックのロギングは難読化されたコードをキャッチしますか?
主に、はい。スクリプトブロックはコンパイルされた状態で記録されます。難読化されたコードが次のステージを構築して実行すると、そのステージが独自のブロックとしてログに記録され、しばしば読みやすい形で表示されます。
トランスクリプションとの違いは何ですか?
トランスクリプションはセッション入力と出力のテキストファイルをフォルダに書き出します。スクリプトブロックのロギングはコード自体をイベントログに記録します。これらは補完し合い、どちらも価値があります。