Invoke-Obfuscation v1.8

简介
Invoke-Obfuscation 是一款兼容 PowerShell v2.0+ 的 PowerShell 命令和脚本混淆器。
背景
2015 年秋季,我开始研究 PowerShell 语言的灵活性,并系统记录了几种攻击者经常使用的常见技术的各种实现方式。
最初专注于编码命令和远程下载加载器(cradle)语法,我发现一些不会妨碍命令执行的转义字符会持续存在于命令行参数中,无论是运行中的进程还是记录在 Security EID 4688 和 Sysmon EID 1 事件日志中的内容。这促使我系统地探索混淆任何 PowerShell 命令或脚本中每种“标记”(token)的方法。
随后,我探索了更隐蔽的字符串级混淆方法、各种编码/加密技术(如 ASCII/十六进制/八进制/二进制甚至 SecureString),以及最终用于抽象 powershell.exe 命令行参数并将其推回父进程甚至祖父进程的 PowerShell 启动技术。
目的
攻击者和商业恶意软件已经开始使用极其基础的混淆技术来隐藏 powershell.exe 命令行参数中的大部分命令。我开发此工具是为了帮助蓝队模拟我所知道的在 PowerShell 2.0-5.0 中语法上可行的混淆命令,以便他们测试对这些技术的检测能力。
该工具的唯一目的是打破我们作为防御者对 PowerShell 命令在命令行上可能呈现形态的固有假设。我希望它能鼓励蓝队将目光转向在命令行上寻找混淆指标(Indicators of Obfuscation),同时更新 PowerShell 日志记录以包含模块、脚本块和转录日志,因为这些来源简化了此工具生成的大部分混淆技术的检测。
用法
虽然所有混淆层都已构建到单独的脚本中,但大多数用户会发现 Invoke-Obfuscation 函数是探索和可视化此框架当前支持的混淆技术的最简单方法。
安装
Invoke-Obfuscation 的源代码托管在 Github 上,您可以从这个仓库(https://github.com/danielbohannon/Invoke-Obfuscation)下载、派生和审查它。请通过与此项目关联的 Github 错误跟踪器报告问题或功能请求。
安装方法:
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
许可证
Invoke-Obfuscation 根据 Apache 2.0 许可证发布。
发布说明
v1.0 - 2016-09-25 DerbyCon 6.0(美国肯塔基州路易斯维尔):Invoke-Obfuscation 公开版。
v1.1 - 2016-10-09 SANS DFIR 峰会(捷克共和国布拉格):为所有适用的 TOKEN 混淆函数添加了 -f 格式运算符重新排序功能。还添加了用于设置变量值的附加语法选项。
v1.2 - 2016-10-20 CODE BLUE(日本东京):添加了 Type TOKEN 混淆(直接类型转换,带有类型名称的字符串混淆选项)。
v1.3 - 2016-10-22 Hacktivity(匈牙利布达佩斯):添加了两个新的 LAUNCHER:CLIP+ 和 CLIP++。还为所有 ENCODING 函数添加了额外的(且更简单的)数组字符转换语法,无需 For-EachObject/%。
v1.4 - 2016-10-28 BruCON(比利时根特):添加了新的 BXOR ENCODING 函数。还增强了所有 ENCODING 函数所有组件以及所有 LAUNCHER 的 PowerShell 执行标志的随机大小写。最后,为所有 LAUNCHER 添加了 -EP 作为 -ExecutionPolicy 的简写选项,以及 -WindowStyle PowerShell 执行标志的可选整数表示:Normal (0)、Hidden (1)、Minimized (2)、Maximized (3)。
v1.5 - 2016-11-04 Blue Hat(美国华盛顿州雷德蒙德):添加了 WMIC LAUNCHER,并带有 WMIC 命令行参数的随机化。
v1.6 - 2017-01-24 Blue Hat IL(以色列特拉维夫):
- 添加了 CLI 功能:
例如:Invoke-Obfuscation -ScriptBlock {Write-Host 'CLI FTW!'} -Command 'Token\All\1,Encoding\1,Launcher\Stdin++\234,Clip' -Quiet -NoExit
- 添加了 UNDO 功能,可一次移除一层混淆。
- 从 Token\All\1 中移除了空白混淆,以加快大型脚本混淆速度。
- 为所有启动器添加了进程参数树输出,以帮助防御者。
- 添加了基础菜单自动检测功能,避免需要使用 BACK 或 HOME:
例如:如果您运行了 TOKEN 然后 ALL 再 1,只需输入 LAUNCHER 即可进入 LAUNCHER 菜单,无需输入 HOME 或 BACK 返回主菜单。
- 添加了 CLI 和交互模式使用的多命令语法:
例如:Token\All\1,String\3,Encoding\5,Launcher\Ps\234,Clip
- 为所有菜单和混淆命令添加了正则表达式功能:
例如:Token**,String[13],Encoding(1|6),Launcher.*[+]{2}\234,Clip
- 添加了 OUT FILEPATH 单命令功能。
- 如果输入了
powershell -enc 语法作为 SCRIPTBLOCK 值,则添加了解码功能。
- 在所有 ENCODING 函数中添加了别名 ForEach 到 ForEach-Object/% 的随机语法选项。
- 在 Out-SecureStringCommand.ps1 中添加了
-Key、-Ke、-K KEY 子串语法选项。
- 为所有 \Home\String 混淆函数添加了更彻底的大小写随机化。
- 为 CLIP+ 和 CLIP++ 启动器函数添加了
-ST/-STA(单线程单元)标志,因为在 PowerShell 2.0 上运行时需要这些标志。
- 在所有使用 Get-ChildItem 获取变量值的地方添加了 Get-Item/GI/Item 语法。
- 为 TYPE 混淆函数添加了 Set-Item 变量实例化语法。
- 在 Out-ObfuscatedStringCommand.ps1 的 Out-EncapsulatedInvokeExpression 函数中添加了使用 PowerShell 自动变量和环境变量值连接的额外 Invoke-Expression/IEX 语法,并复制到所有 LAUNCHER、STRING 和 ENCODING 函数,以添加多种 IEX 命令行语法。
- 为 String\Reverse 和所有 ENCODING 混淆选项添加了两种新的 JOIN 语法:
- 添加了 [String]::Join('',$string) JOIN 语法
- 添加了 OFS 变量 JOIN 语法(输出字段分隔符自动变量)
- 为 Encoding\5 添加了另外两种 SecureString 语法:
- PtrToStringAnsi / SecureStringToGlobalAllocAnsi
- PtrToStringBSTR / SecureStringToBSTR
- 为多个 SecureString 成员添加了六种 GetMember 备选语法(具体列表略,保留为代码)
- PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[3].Name).Invoke
- PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[5].Name).Invoke
- PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[2].Name).Invoke
- PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[4].Name).Invoke
- PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[0].Name).Invoke
- PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[1].Name).Invoke
- 更新了 Out-ObfuscatedTokenCommand.ps1,使得 VARIABLE 混淆在变量已经被封装在 ${} 中时不会再次封装(以避免出现 ${${var}} 导致错误)。
- 用 Invoke-Obfuscation.psd1 替换了 Invoke-Obfuscation.psm1(感谢 @Carlos_Perez)。
- 修复了 @cobbr_io 和 @IISResetMe 报告的多个 TOKEN 级混淆错误。
v1.7 - 2017-03-03 nullcon(印度果阿):
- 添加了 3 个新的 LAUNCHER:RUNDLL、RUNDLL++ 和 MSHTA++
- 添加了额外的 ExecutionContext 通配符变量字符串
v1.8 - 2017-07-27 Black Hat(美国内华达州拉斯维加斯):
- 添加了 2 个新的 ENCODING 选项:特殊字符和空白
v1.8.1 - 2017-12-19:
- 添加了 COMPRESS 函数,用于更轻松地将多行脚本转换为单行命令,同时大幅缩短命令长度以适应 cmd.exe 命令行长度限制。
v1.8.2 - 2018-01-04:
- 添加了 AST 混淆函数,通过操作抽象语法树(AbstractSyntaxTree)的结构进行混淆,而不使用许多特殊字符。