Invoke-Obfuscation v1.8

介绍
Invoke-Obfuscation 是一个兼容 PowerShell v2.0+ 的 PowerShell 命令和脚本混淆器。
背景
2015 年秋季,我决定开始研究 PowerShell 语言的灵活性,并开始系统性地整理攻击者日常常用的几种技术所对应的各种实现方式。
最初专注于编码命令和远程下载负载语法,我发现一些不阻碍命令执行的转义字符会保留在命令行参数中,无论是运行中的进程还是安全事件日志 (Security EID 4688) 和 Sysmon EID 1 事件日志中记录的内容。这促使我系统地探索了混淆任何 PowerShell 命令或脚本中每种“标记(token)”的方法。
随后我研究了更晦涩的字符串级混淆技术、多种编码/加密技术(如 ASCII/十六进制/八进制/二进制甚至 SecureString),以及最后用于抽象 powershell.exe 命令行参数并将其推回父进程甚至祖父进程的 PowerShell 启动技术。
目的
攻击者和商品恶意软件已开始使用极其基础的混淆技术来隐藏 powershell.exe 命令行参数中的大部分命令。我开发此工具旨在帮助蓝队模拟我已知在 PowerShell 2.0-5.0 中语法上可行的混淆命令,以便他们测试对这些技术的检测能力。
该工具的唯一目的是打破我们作为防御者关于 PowerShell 命令在命令行中可能出现方式的任何假设。我希望它能鼓励蓝队不仅在命令行上寻找混淆指标,还要更新 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 (日本东京): 添加了类型 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-Object/% 的随机化语法选项添加了别名 ForEach。
- 在 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 函数中添加了额外的 Invoke-Expression/IEX 语法,使用 PowerShell 自动变量和环境变量值拼接,并复制到所有启动器、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 选项: 特殊字符和空格