[!IMPORTANT]
此仓库现已归档。虽然这是一段有趣的旅程,但我认为 PSArmoury 已不再有用。
PowerShell Armoury 专为渗透测试人员、红/蓝/紫队成员以及所有在参与行动时使用各种 PowerShell 工具的人设计。它允许您在一个经过混淆的文件中下载并存储您所有喜爱的 PowerShell 脚本。
您无需再手动更新 Rubeus、PowerView 等。只需创建一次配置文件,或使用工具附带的默认配置。从现在开始,在开始下一次行动前,您只需运行 "New-PSArmoury" 即可。 此外,PSArmoury 会对您的代码进行混淆,并包含一个内置的 AMSI 绕过。模块化设计使您可以轻松更改规避或混淆代码,以防检测。
当前版本的 PSArmoury 采用模块化设计。
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
代码分为一个主生成脚本 New-PSArmoury.ps1(您执行它)和存储在 modules 目录下独立 .ps1 文件中的规避、混淆与反混淆代码。这些独立文件由主脚本调用,应使您更容易更改特定功能(例如 AMSI 绕过)。
除了 modules 目录外,还有 utilities 目录。这里存放着在特定场景下可能有用的独立脚本。
modules 目录的默认路径是 .\modules,其中点代表您 shell 的当前工作目录。您可以通过 New-PSArmoury 的 -ModulesDirectory 参数更改模块目录的路径。
然而,脚本文件本身的名称在主脚本中是硬编码的,始终预期为:
我们来仔细看看这两个文件。
此脚本应包含您意图绕过的任何检测代码。默认情况下,它包含一个知名的 AMSI 绕过(感谢 amsi.fail)。 请注意:
此脚本应包含用于混淆和反混淆的代码。默认的 obfuscation.ps1 使用 RC2 加密。可用的示例:
请注意,TEMPLATE_obfuscation_empty.ps1 实际上什么也不做,只是作为您构建自己函数的模板。
如果您想使用其中任何一个,只需将其重命名为 "obfuscation.ps1" 并删除默认文件。
如果您想创建自定义版本,在混淆方面请注意以下几点:
在反混淆方面,务必记住以下几点:
utilities 目录包含有用的独立脚本。
配置文件必须是有效的 JSON,由一个包含一个或多个对象的数组组成,每个对象被解释为一个脚本源。每个对象具有以下属性:
Name(必填)
您选择的名称,用于标识此对象中包含的脚本。仅供您自己参考。
URL(必填)
获取脚本内容的位置。可以是 Web 资源的 URL(https://)、本地路径(C:\)或网络资源(\...)。URL 分别由 Net.Webclient 或 PowerShell 的 Get-Item 处理。因此,这两个默认能处理的任何格式通常都能工作。
Type(必填)
向 armoury 创建者提供脚本位置的提示。有三种有效类型:
FileInclusionFilter(可选)
仅对类型为 "GitHub" 的对象生效。将使用 PowerShell 的 "like" 比较运算符与完整文件名进行匹配,因此请记住您需要自己包含通配符。如果要匹配文件名的一部分,不要忘记包含星号(*)。"*.ps1" 表示所有以 ".ps1" 结尾的文件,但 ".ps1" 仅表示 ".ps1"。
您不必包含过滤器,但如果您包含,则必须使用它。空的 InclusionFilter 表示没有文件。
FileExclusionFilter(可选)
与 InclusionFilter 类似,但方向相反。排除优先级更高。
更多详情请参阅内联 PowerShell 帮助(man -full New-PSArmoury)。
-Path
新 armoury 文件的路径。默认为 ".\MyArmoury.ps1"
-FromFile
直接从本地文件夹或文件加载您的 PowerShell 脚本,无需提供配置文件。
-Config
JSON 配置文件的路径。请参阅本脚本附带的示例以获取灵感。
-ModulesDirectory
模块目录的路径。默认为 ".\modules"。 如果使用了 ModulesDirectory,则不能使用 EvasionPath 和 ObfuscationPath 参数。
-EvasionPath
规避脚本的路径。如果使用了 EvasionPath 和 ObfuscationPath,则不能使用 ModulesDirectory 参数。
-ObfuscationPath
混淆脚本的路径。如果使用了 EvasionPath 和 ObfuscationPath,则不能使用 ModulesDirectory 参数。
-ValidateOnly
与 "-Config" 一起使用,让脚本验证 JSON 配置文件的基本语法而不执行它。
-GithubCredentials
将 GitHub 用户名和访问令牌作为凭据对象传递,这样脚本就不会提示输入。如果您重复测试创建 armoury,这很有用。
使用方法如下:
$c = get-credential
New-PSArmoury -GithubCredentials $c
您必须提供有效的 GitHub 用户名和个人访问令牌,以便脚本正确使用 GitHub API。不要使用用户名/密码,因为如果您启用了 MFA(您应该启用 MFA),这将无法工作。此外,使用基本用户名/密码访问 API 已被弃用。
按照此指南创建个人访问令牌。
请注意:访问令牌所需的唯一权限是 repo 部分中的 public_repo。
这是因为您只需要这个令牌,以便 GitHub 在您解析较大的存储库(如 PowerSploit)以包含 .ps1 文件时不会阻止我们。
如果您想使用默认设置创建 armoury(注意:除了 base64 编码之外,不会进行任何混淆),只需运行以下命令。
. .\New-PSArmoury.ps1
New-PSArmoury
这将在当前工作目录下创建一个名为 "MyArmoury.ps1" 的 .ps1 文件,使用:
您可以通过以下命令将 armoury 加载到当前会话中:
cat -raw .\MyArmoury.ps1 | iex
加载 armoury 会执行以下步骤:
之后,您放入 armoury 的所有 PowerShell 代码都将可用。像平常一样调用 cmdlet:
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
如果您不记得 armoury 中放了什么,只需加载它并调用清单:
Get-PSArmoury
像这样使用 -EvasionPath 和 -ObfuscationPath 参数启动 New-PSArmoury:
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
注意:在这种情况下,由于我们提交的是文件夹路径,文件夹中的所有 .ps1 文件都将被添加。如果我们提交的是单个文件的路径,则只处理该文件。
New-PSArmoury -FromFile C:\myscriptfolder