CobaltStrike 4.8 版本发布,有哪些亮点

CobaltStrike 4.8 版本发布,有哪些亮点

一、前述

CobaltStrike 4.8 现已发布,此版本支持系统调用、指定 payload guardrails 的选项、新的令牌存储等。

原计划在 2022 年晚些时候发布此版本,但由于不得不发布 4.7.1 和 4.7.2 补丁版本来修复 4.7 版本中的漏洞,因此进展受阻。花了几个开发周期对代码进行安全审查并处理一些技术问题,然后就是假期了。不过现在就在这里,迟到总比不到好!

在详细介绍此版本之前,只想提一下,现在应该开始看到我们提供的更多内容,以补充主要产品版本。William Burgess 最近发布了他加入 CobaltStrike 团队后的第一篇博文,他将在为产品的未来方向提供技术指导方面发挥关键作用。在接下来的几周和几个月内,将发布更多博客文章和工具,首先是关于 UDRL 开发的系列文章 (第一篇应该在下周发布)。今年晚些时候,CobaltStrike 本身将发生一些巨大的变化,更多详细信息将很快出现在后续博客文章中。我们知道用户正在为规避查杀而苦苦挣扎,并报告了其他痛点。正如我在去年的路线图更新中提到的那样,我们一直在积极组建研发团队,虽然花了一些时间才做到这一点并让我们所有的 duck 都排成一行,但你现在会真正开始看到这些的好处幕后的变化,现在,回到 4.8 版本。

二、支持系统调用

发布的新版本支持直接系统调用或间接系统调用:

  • CloseHandle
  • CreateFileMapping
  • CreateRemoteThread
  • CreateThread
  • GetThreadContext
  • MapViewOfFile
  • OpenProcess
  • OpenThread
  • ResumeThread
  • SetThreadContext
  • UnmapViewOfFile
  • VirtualAlloc
  • VirtualAllocEx
  • VirtualFree
  • VirtualProtect
  • VirtualProtectEx
  • VirtualQuery

生成 stageless 类的 Beacon payload 对话框也更新了,能在上面指定系统调用方法:

  • None:使用标准的 Windows API 函数;
  • Direct (直接调用):使用 Nt* 开头的 API 函数;
  • Indirect (间接调用):跳转到 API 函数对应的 Nt* 版本;
图片[1]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
生成 stageless 类的 Beacon payload 对话框

重要的是要注意,有一些注入或生成新 Beacon 的命令和工作流不允许设置初始系统调用方法,这些命令/工作流程是:

  • elevate
  • inject
  • jump
  • spawn
  • spawnas
  • spawnu
  • teamserver responding to a stageless payload request
  • teamserver responding to an External C2 payload request

MalleableC2 配置文件中的 stage.syscall_method 控制了执行时使用的方法,可以使用 syscall-method [method] 命令修改后续命令使用的方法。此外,不带任何参数的 syscall-method 将查询并返回当前方法。

官方打算在未来的版本中继续更新和增强系统调用支持。

三、使用内置的 Guardrails 生成 Payloads

添加了对有 payload Guardrails 的支持,可以在监听器 (listener) 里设置,然后,如果需要,在生成 payload 时覆盖。

可以根据以下条件设置 Guardrails:

  • IP Address:这可以是单个 IP 地址或使用通配符替换最右边八位字节的范围。例如,123.123.123.123、123.123.123.、123.123..* 和 123...* 都是有效输入,123..123. 不是;
  • 用户名 (Username):这可以是特定的用户名,或者可以为通配符添加前缀,后缀 (即 *user 或 user*),用户名字段不区分大小写;
  • 服务名 (Server name):同样,这可以是特定的服务器名称,或者可以为通配符添加前缀,后缀 (即 *server 或 server*),服务器名称字段不区分大小写。
  • 域 (Domain):与用户名和服务器名称一样,域字段可以是特定域,也可以为通配符添加前缀,后缀 (即 *domain 或 domain*),域字段也不区分大小写;

监听器 (listener) 对话框在底部有一个新的 Guardrails 选项,可为该 listener 设置和更新 Guardrails。

图片[2]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
New Listener
图片[3]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
Guardrail 设置

生成 payload 时,关联 listener 的 Guardrail 值用作默认值。

四、混淆 Beacon 的反射 DLL 导入表对多字节支持

对用于 stage.obfuscate MalleableC2 选项的混淆例程进行了更改,该选项与 Beacon 的反射 DLL 的导入表的混淆方式有关。

此过程的一部分涉及从固定的单字节 XOR 密钥移动到随机生成的多字节 XOR 密钥,单字节 XOR 掩码很容易被 YARA 等工具签名和捕获,转向随机生成的多字节 XOR 密钥应该有助于解决这些问题。

五、Sleep Mask 更新

Sleep Mask 已进行多项更新,主要变化是 Sleep Mask 大小限制已从 8192 字节增加到 16384 字节,其他变化包括:

  • 支持使用具有 MASK_TEXT_SECTION 功能的系统调用;
  • 为 Windows API 函数添加定义标签以消除对 LIBRARY$Function 语法的需要;
  • 通过堆栈欺骗实现规避 sleep (仅限 x64),相关更改包括添加了 bypass 控制流防护 (CFG),以及添加了辅助实用程序 (getFunctionOffset);

六、Token Store

一段时间以来,官方想进行的一项更改是添加令牌存储 (Token Store),以促进访问令牌的热交换。Windows 令牌是特定于进程的,因此每个 Beacon 都有自己的令牌存储和自己的令牌。请注意,这些令牌因此只能由特定的 Beacon 使用。

令牌存储基于新的令牌存储命令,该命令支持许多执行特定功能的选项 (全部由 tab 完成支持),可用的功能如下:

token-store steal [pid,…] <OpenProcessToken access mask>

这会从特定的 PID 中窃取令牌,使用逗号分隔每个 PID。此命令将窃取令牌并将其放入令牌存储中,但不会立即模拟。steal-and-use 命令应该用于此目的 (尽管应该注意 steal-and-use 仅支持单个 PID)。此命令支持可选的 OpenProcessToken 访问掩码,就像现有的 steal_token 命令一样。

图片[4]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
token-store steal 5600,6116,6332,6840

token-store use [id]

Beacon 使用令牌存储中具有指定 ID 的令牌

图片[5]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
token-store use 1

token-store steal-and-use [pid] <OpenProcessToken access mask>

这可从指定的 PID 窃取令牌,将其添加到令牌存储并立即使用它。此命令支持可选的 OpenProcessToken 访问掩码,就像现有的 steal_token 命令一样。

图片[6]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
token-store steal-and-use 6916

token-store show

显示令牌存储中的令牌

图片[7]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
token-store show

token-store remove [id,…]

这将从令牌存储中删除与特定 ID 对应的令牌,使用逗号指定多个 ID

图片[8]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
token-store remove 2,3

token-store remove-all

这将从令牌存储中移除所有令牌

图片[9]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
token-store remove-all

还有一点是令牌也可以通过 GUI 中的进程列表被盗,以通常的方式窃取令牌 (即 Explore -> Process 列表,选择一个或多个 PID 并单击窃取令牌),然后确保在窃取令牌之前选中 “在令牌存储中存储令牌” 复选框,还可以在打开进程列表之前一次选择多个 Beacon。

最后,还针对上述选项实现了相应的攻击者功能,即:

  • btoken_store_remove
  • btoken_store_show
  • btoken_store_steal_and_use
  • btoken_store_steal
  • btoken_store_remove_all
  • btoken_store_use

七、ETW Blinding

此版本还通过对 execute-assemblypowerpick 命令的修补增加了对 ETW Blinding 的支持,虽然此版本中的支持有限,但官方希望在未来的版本中对此进行构建。

execute-assemblypowerpick 命令现在有一个可选的 PATCHES 参数,指定如下:

execute-assembly "[PATCHES: [patch-rule] [patch-rule] [patch-rule] [patch-rule]]" [/path/to/file.exe] [arguments]

powerpick "[PATCHES: [patch-rule] [patch-rule] [patch-rule] [patch-rule]]" [commandlet] [arguments]

可选的 PATCHES 参数可以为进程修改内存中的函数,最多可以指定四个 patch-rule 规则 (以空格分隔),每个 patch-rule 由库、函数、偏移量和十六进制补丁值组成,例如:[library]、[function]、[offset] ,[hex-patch-value],其中:

  • library:1 到 260 个字符;
  • function:1 到 256 个字符;
  • offset:offset 是从可执行函数开始的偏移量,可以是 0 – 65535;
  • hex-patch-value:2 到 200 个十六进制字符 (0 – 9,A – F) 并且长度必须是偶数 (十六进制对);

有关补丁规则语法的更多信息可以在文档中找到。

八、在 Teamserver 启动时同步数据

Cobalt Strike 中存在一个长期存在的问题,即在团队服务器重新启动后,从目标检索的任何数据 (例如,屏幕截图、键盘记录数据等) 在客户端中都不可用。此问题已得到解决,之前丢失到 UI 的数据现在在重新启动之间保留。

另外还添加了一个新脚本 clearteamserverdata,可用于在参与完成后删除所有数据。

九、更改许可证到期日期的处理方式

与产品安全相关的一项重要更新是对许可证到期日期处理方式的更改。在之前,teamserver 启动时会检查过期日期,如果有效,teamserver 就可以启动。没有执行进一步的检查,teamserver 能够运行,直到被关闭。

官方已加强此处理,以便每天检查许可证到期日期。先前行为背后的原因是,在参与过程中运行更新 (以获取具有更新过期日期的新授权文件) 并不总是方便或逻辑上可行。在这种情况下,在更新后重新启动 teamserver 也不方便。我们在新处理中为这些场景添加了缓解措施,这意味着得刷新你的授权文件时不会对操作产生影响。如果需要在约定运行时更新许可证,请查阅文档以获取有关如何执行此操作的信息。但是,确实建议在开始新的约定之前考虑许可证到期日期,并尽可能避免这种情况的发生。

为确保不会因许可证过期而陷入困境,在客户端 UI 中添加了几个新横幅。

从许可证到期前 45 天开始,一个警告横幅将出现在客户端中,通知你的许可证即将到期以及何时到期。此警告消息可以消除,但会在每天检查过期日期时重新出现。如果尚未处理,这应该提供足够的时间来更新许可证密钥:

图片[10]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
快到期前提示

如果未能在许可证到期前续签,将有 14 天的宽限期来续签。在宽限期内,将看到一个无法关闭的错误横幅:

图片[11]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
无法关闭的错误横幅

宽限期结束后,如果许可证未续订并刷新授权文件,teamserver 将关闭,后面将无法重新启动它,直到续订许可证。

十、其它更新

以下是应用户的要求进行的小更新

10.1 增加指定 sleep 的灵活性

用户要求的一个小改动是让 sleep 时间更容易设置,现在不仅可以指定以秒为单位的 sleep 时间,还可以指定天、小时和分钟,方法是分别在这些值后加上 “d”、”h” 和 “m”。

一个用法示例是 sleep 2d 13h 45m 8s 30j,表示为 sleep 2 天 13 小时 45 分钟 8 秒,jitter 为 30%。

我们还添加了一个新的攻击者函数 bsleepu,其工作方式相同

图片[12]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
sleep

10.2 在当前页面上显示令牌

另一个用户要求的是在客户端 UI 中显示当前令牌,这与新的令牌存储很好地结合在一起,现在可以在用户名旁边的括号中的表格视图和状态栏中看到当前令牌。

与此更改相关的是,还解决了由于 Windows API 限制导致 make_token 报告错误用户名 (即当前 Beacon 进程的用户名) 的问题。这已得到解决,正确的用户名出现在括号中。

图片[13]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
在当前页面上显示令牌

10.3 在 Beacon 面板上复制粘贴

添加了对从 Beacon 输出面板中复制和粘贴命令的支持。

CTRL+C 复制和 CTRL+X 从输出面板或命令行剪切选定的文本,只能在输出面板或命令行中选择文本,而不能同时选择两者,CTRL+V 将剪贴板中的文本粘贴到命令行。这适用于任何控制台窗口 (例如,Beacon 控制台、SSH 控制台、脚本控制台、事件日志和 Web 日志)。

10.4 Mimikatz 调用中链接多个命令

mimikatz 命令已更新为支持在单个操作中链接多个命令,这也适用于 bmimikatz 和 bmimikazt_small 攻击者函数 (尽管 bmimikatz_small 仅限于 lsadump::dcsync、sekurlsa::logonpasswords 和 sekurlsa::pth)。

可以通过在命令之间添加分号作为分隔符来链接命令,例如:

mimikatz standard::coffee;standard::coffee

请注意,如果命令中需要分号 (即 “\;”),分号仍然可以转义。此外,命令长度限制为 511 个字符,以确保字符串中的最后一个字符是 EOS (\0)。

10.5 在 Stageless Windows 可执行对话框中指定退出函数

4.7 版本中进行了更改,可在 Stageless Payload Generator 对话框中指定退出选项 (“线程” 或 “进程”),现在对 Stageless Windows Executable 对话框进行了类似的更改,该对话框还可指定退出选项 (“线程” 或 “进程”)。

图片[14]-CobaltStrike 4.8 版本发布,有哪些亮点-零度非安全
Windows Executable (Stageless)

10.6 Arsenal Kit 校验和

再次应用户要求,最后要提及的一项更改是为军械库工具包添加校验和,这已经完成,可以在 https://verify.cobaltstrike.com/arsenal-kit 找到。

© 版权声明
THE END
喜欢就支持一下吧
点赞3 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容