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 事件。因此你可能会发现 一些 事件。只是不要将它们误认为是完整的情况。
开启它 从现在起有帮助,对已经发生的事情则不适用。使用组策略设置 管理模板 → Windows 组件 → Windows PowerShell → 启用 PowerShell 脚本块日志记录,或直接设置注册表值:
reg add "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
PowerShell 7 从 HKLMSOFTWAREPoliciesMicrosoftPowerShellCore 下读取其自身的策略键。如果它是从 zip 安装的而不是 MSI,它的事件通道可能在运行 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 记录每个引擎启动,包括引擎版本。在现代系统上,2.0 的 EngineVersion 通常意味着某人故意降级以规避脚本块日志记录。
上传并在 LogTotal 中查看
LogTotal 原生读取 EVTX。首先要知道一点: LogTotal 目前不会清理 EVTX 文件。 对于 PowerShell 日志,这比以往更重要,因为上面提到的机密。对于测试机器请自由上传 EVTX。对于生产主机,请先获得数据处理负责人的许可。
- 上传。 打开 logtotal.com 并拖入文件。
- 查看。
当出现问题时
| 症状 | 可能原因 | Fix |
|---|---|---|
| 根本没有 4104 事件 | 脚本块日志记录关闭,没有可疑的东西 | 为未来启用它;检查能仍然获取的 Windows PowerShell 日志 |
| 只有少数 4104 事件,全部为警告 | 日志记录已关闭;你看到的是自动的可疑块日志 | 与上述相同 |
| 找不到 PowerShellCore/Operational | 未安装 PowerShell 7,或其清单未注册 | 从 $PSHOME 运行 RegisterManifest.ps1 |
| 4104 文本是无法读取的密文 | 保护的事件日志记录已开启 | 你需要解密证书 |
| 日志仅覆盖几个小时 | 默认大小,高流量 | 提高通道的最大大小 |
FAQ
脚本块日志记录能捕获混淆代码吗?
大体上是的。它记录编译时的脚本块。当混淆代码构建并运行下一阶段时,该阶段将作为单独的块进行记录,通常是可读形式。
这与转录有什么区别?
转录将会话输入和输出的文本文件写入文件夹中。脚本块日志记录把代码本身记录在事件日志中。它们相互补充,而且都值得拥有。