

Revoke-Obfuscation 是一个 PowerShell v3.0+ 兼容的 PowerShell 混淆检测框架。
Daniel Bohannon (@danielhbohannon) Lee Holmes (@Lee_Homes)
博客文章:https://www.fireeye.com/blog/threat-research/2017/07/revoke-obfuscation-powershell.html
白皮书:https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf
2016 年秋季和 2017 年春季,Daniel Bohannon (@danielhbohannon) 发布了 Invoke-Obfuscation 和 Invoke-CradleCrafter,这两个开源的 PowerShell 混淆框架。这些研究及框架的目标是凸显纯粹基于签名的方法在检测攻击者使用 PowerShell 时的局限性。传递给防御者的核心信息是:除了已知的可疑语法外,还应着重检测混淆指标。
然而,Invoke-Obfuscation 和 Invoke-CradleCrafter 中极端的随机化程度,加上 PowerShell 脚本块日志中未被反混淆的令牌层混淆选项,使得防御者寻求一种新的、可扩展的方法来通用检测已知和未知的混淆技术。
在 Invoke-Obfuscation 发布几周后,Lee Holmes (@Lee_Homes) 撰写了一篇博客文章,标题为 更多检测混淆 PowerShell,其中他重点介绍了统计分析技术,用于检测高度混淆脚本中的异常特征,尤其是 Invoke-Obfuscation 生成的脚本。
自那次交流后,Daniel 和 Lee 成了好朋友,并分享了许多共同的兴趣 / 痴迷——即,对优质咖啡的热爱,以及追求创建彻底检测混淆 PowerShell 的新方法。
两位蓝队成员在研究及概念验证代码上花费的时间,粗略估算相当于几千杯 Chemex 手冲咖啡,假设以 4 分钟为目标冲泡时间(至少另一位咖啡爱好者会领会这个“手冲”双关语)。
Revoke-Obfuscation 是这些努力的最终手工成果。
Revoke-Obfuscation 是一个开源的 PowerShell v3.0+ 框架,用于大规模检测混淆的 PowerShell 命令和脚本。它依赖 PowerShell 的 AST(抽象语法树)快速提取任意输入 PowerShell 脚本中的数千个特征,并将该特征向量与若干预定义的加权特征向量之一进行比较,这些加权特征向量是通过对 40.8 万多个 PowerShell 脚本的语料库进行自动学习计算得出的。完整语料库可从 https://aka.ms/PowerShellCorpus 下载。您可以在仓库的“DataScience”子目录中找到这项工作中数据科学方面的详细信息。
由于 Revoke-Obfuscation 依赖特征提取和比较,而非纯粹的 IOC 或正则表达式匹配,因此它在识别未知混淆技术时更为稳健,即使攻击者试图通过在混淆内容中填充未混淆的脚本内容来压制其混淆,以推翻像字符频率分析这样的基本检查。
Revoke-Obfuscation 可以轻松在 100-300 毫秒内测量大多数输入的 PowerShell 脚本。这种性能水平允许一个组织每小时至少测量 1.2 万个 PowerShell 脚本的混淆情况,而无需在 SIEM 中索引详细的 PowerShell 脚本块日志。
最后,Revoke-Obfuscation 支持便捷的白名单功能,并能摄取 PowerShell 操作事件日志记录,重新组装分布在多个脚本块 EID 4104 记录中的脚本块。它可以轻松成为摄取环境 PowerShell 操作事件日志、重新组装并去重这些日志中所有脚本、然后识别出值得手动检查的混淆 PowerShell 脚本的一站式工具。
Revoke-Obfuscation 的源代码托管在 Github,您可以从此仓库(https://github.com/danielbohannon/Revoke-Obfuscation)下载、分叉和审查。请通过与此项目关联的 Github bug 跟踪器报告问题或功能请求。
安装(从 Github):
Import-Module .\Revoke-Obfuscation.psd1
也可以直接从 PowerShell Gallery 安装源代码,通过以下命令:
安装(从 PowerShell Gallery):
Install-Module Revoke-Obfuscation
Import-Module Revoke-Obfuscation
Revoke-Obfuscation 将提供一个详细教程,以及一些其他有趣的小惊喜。但如果您不喜欢这些玩笑,可以直接运行 Get-Help Measure-RvoObfuscation 查看用法语法,或者继续阅读。
本框架中有两个主要函数:
如果您需要从 PowerShell 操作日志中重新组装并提取脚本块日志,那么 Get-RvoScriptBlock 是首选函数。它会自动仅返回唯一的脚本块,并排除某些被认为非恶意的默认脚本块值。可以通过 -Deep 开关覆盖此行为。
Get-RvoScriptBlock -Path 'C:\Windows\System32\Winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx' -VerboseGet-ChildItem .\Demo\demo.evtx | Get-RvoScriptBlock -VerboseGet-WinEvent -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlock -VerboseGet-RvoScriptBlock 还支持 MIR/HX 审计结果,以及通过 Matt Graeber (@mattifestation) 的 CimSweep 项目(https://github.com/PowerShellMafia/CimSweep)获取的 PowerShell 操作日志。对于 CimSweep,需要做一个小型的注册表调整,以欺骗 WMI 查询非经典事件日志。详细信息可在 Get-RvoScriptBlock 的 NOTES 部分找到。
Get-ChildItem C:\MirOrHxAuditFiles\*_w32eventlogs.xml | Get-RvoScriptBlock -VerboseGet-CSEventLogEntry -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlock针对 demo.evtx 中测试数据的完整示例如下:
$obfResults = Get-WinEvent -Path .\Demo\demo.evtx | Get-RvoScriptBlock | Measure-RvoObfuscation -OutputToDisk -Verbose
针对本地和远程托管的测试脚本的完整示例如下:
Measure-RvoObfuscation -Url 'http://bit.ly/DBOdemo1' -Verbose -OutputToDiskGet-Content .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskGet-ChildItem .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDisk-OutputToDisk 开关会自动将所有混淆脚本输出到 .\Results\Obfuscated\。无论如何,所有结果都将以 PSCustomObjects 形式返回,包含脚本内容以及元数据,如混淆得分、测量时间、白名单结果、所有提取的脚本特征等。
Revoke-Obfuscation 中有两种位置提供了三种白名单选项:
-WhitelistFile .\files\*.ps1,.\more_files\*.ps1,.\one_more_file.ps1-WhitelistContent 'string 1 to whitelist','string 2 to whitelist'-WhitelistRegex 'regex 1 to whitelist','regex 2 to whitelist'如果您有兴趣创建自己的训练数据集并为 Measure-Vector 函数生成加权向量,则可以针对标记数据集运行 ModelTrainer.cs/ModelTrainer.exe。以下命令将从所有输入脚本中提取特征向量,并聚合到一个 CSV 文件中,用于此训练阶段:
Get-ChildItem .\*.ps1 | ForEach-Object { [PSCustomObject](Get-RvoFeatureVector -Path $_.FullName) | Export-Csv .\all_features.csv -Append }
最后,如果您在寻找一个利用 PowerShell AST(抽象语法树)创建 IOC 的平台——我们强烈推荐用于识别未混淆的恶意 PowerShell 活动——那么 PS Script Analyzer 是一个专为此类任务设计的优秀框架。
Revoke-Obfuscation 根据 Apache 2.0 许可发布。
v1.0 - 2017-07-27 Black Hat USA 及 2017-07-30 DEF CON:Revoke-Obfuscation 公开发布。