danielbohannon/Invoke-Obfuscation

GitHub: danielbohannon/Invoke-Obfuscation

一款功能强大的 PowerShell 命令与脚本混淆工具,旨在帮助红队绕过安全防御,同时协助蓝队测试和提升针对混淆攻击的检测能力。

Stars: 4210 | Forks: 812

# Invoke-Obfuscation v1.8 ![Invoke-Obfuscation 截图](https://github.com/danielbohannon/danielbohannon.github.io/blob/master/Invoke-Obfuscation%20Screenshot.png) ## 简介 Invoke-Obfuscation 是一个兼容 PowerShell v2.0+ 的 PowerShell 命令和脚本混淆器。 ## 背景 2015 年秋季,我决定开始研究 PowerShell 语言的灵活性,并开始对攻击者日常使用的大部分常见技术的各种实现方式进行分类编目。 最初关注的是编码命令和远程下载 Cradle 语法,我发现各种不影响命令执行的转义字符会保留在命令行参数中,无论是在运行中的进程里,还是在安全 EID 4688 和 Sysmon EID 1 事件日志中。这引导我系统地探索了混淆任何 PowerShell 命令或脚本中发现的各类“Token”的方法。 随后,我探索了更晦涩的字符串级混淆方法、各种编码/加密技术(如 ASCII/十六进制/八进制/二进制,甚至 SecureString),最后是 PowerShell 启动技术,旨在从 powershell.exe 抽象出命令行参数,并将其推回到父进程甚至祖父进程。 ## 目的 攻击者和商品化恶意软件已经开始使用极其基础的混淆技术,以隐藏 powershell.exe 命令行参数中的大部分命令。我开发这个工具是为了帮助蓝队基于我目前所知的在 PowerShell 2.0-5.0 中语法上可行的内容来模拟混淆命令,以便他们能够测试对这些技术的检测能力。 该工具的唯一目的是打破我们作为防御者对 PowerShell 命令在命令行中外观的任何假设。我希望它能鼓励蓝队除了更新 PowerShell 日志以包括模块、脚本块和转录日志之外,还能转而寻找命令行中的混淆指标,因为这些来源简化了此工具生成的混淆技术的大部分方面。 ## 用法 虽然所有的混淆层都已构建为单独的脚本,但大多数用户会发现 `Invoke-Obfuscation` 函数是探索和可视化此框架当前支持的混淆技术的最简单方法。 ## 安装 Invoke-Obfuscation 的源代码托管在 Github 上,您可以从此仓库下载、复刻和查看它。请通过 Github 上与此项目关联的 Bug 跟踪器报告问题或功能请求。 安装步骤: ``` 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 Summit(捷克共和国布拉格):向所有适用的 TOKEN 混淆函数添加了 -f 格式运算符重新排序功能。还为设置变量值添加了额外的语法选项。 v1.2 - 2016-10-20 CODE BLUE(日本东京):添加了 Type TOKEN 混淆(带有类型名称字符串混淆选项的直接类型转换)。 v1.3 - 2016-10-22 Hacktivity(匈牙利布达佩斯):添加了两个新的 LAUNCHER:CLIP+ 和 CLIP++。还为所有不需要 ForEach-Object/% 的 ENCODING 函数添加了额外的(且更简单的)数组字符转换语法。 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 中移除了 Whitespace(空格)混淆,以加速大型脚本的混淆。 - 为所有 Launcher 添加了 Process Argument Tree(进程参数树)输出,以帮助防御者。 - 添加了基础菜单自动检测功能,以避免需要使用 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 单命令功能。 - 如果输入的 SCRIPTBLOCK 值是 powershell -enc 语法,则添加了解码功能。 - 在所有 ENCODING 函数中,为 ForEach-Object/% 添加了别名 ForEach 的随机化语法选项。 - 为 Out-SecureStringCommand.ps1 添加了 -Key -Ke -K KEY 子字符串语法选项。 - 为所有 \Home\String 混淆函数添加了更彻底的大小写随机化。 - 为 CLIP+ 和 CLIP++ Launcher 函数添加了 -ST/-STA (Single-Threaded Apartment) 标志,因为如果在 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 语法: 1. 添加了 [String]::Join('',$string) JOIN 语法 2. 添加了 OFS-variable JOIN 语法(输出字段分隔符自动变量) - 为 Encoding\5 添加了两种额外的 SecureString 语法: 1. PtrToStringAnsi / SecureStringToGlobalAllocAnsi 2. PtrToStringBSTR / SecureStringToBSTR - 为几个 SecureString 成员添加了六种 GetMember 替代语法: 1. PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[3].Name).Invoke 2. PtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[5].Name).Invoke 3. PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[2].Name).Invoke 4. PtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[4].Name).Invoke 5. PtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[0].Name).Invoke 6. 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 选项:Special Characters 和 Whitespace v1.8.1 - 2017-12-19: - 添加了 COMPRESS 函数,用于更轻松地将多行脚本转换为单行命令,同时大幅减少命令长度,以应对 cmd.exe 命令行长度限制。 v1.8.2 - 2018-01-04: - 添加了 AST 混淆函数,通过操作抽象语法树的结构进行混淆,而不使用许多特殊字符。
标签:AI合规, Defense Evasion, DNS 反向解析, Invoke-Obfuscation, IPv6, Libemu, Libemu, OpenCanary, PowerShell, RFI远程文件包含, URL发现, Windows 安全, 代码混淆, 命令行混淆, 多人体追踪, 安全检测, 攻击模拟, 日志规避, 编码, 脚本安全, 驱动签名利用