Cobalt Strike 4.8 正式发布上线!
今天看到 cobaltstrike 官网3月7号更新到了 Cobaltstrike 4.8
这是一个新的版本,看下都更新了什么内容,以下为机器+人工翻译:
Cobalt Strike 4.8 现在已经发布。该版本支持系统调用、指定有效载荷防护的选项、新的令牌存储等等。
我们原本计划在 2022 年年底发布这个版本,但由于我们必须发布 4.7.1 和 4.7.2 补丁,以修复 4.7 版本中报告的漏洞,因此进展受阻。我们花了几个开发周期对代码进行了安全审查,并处理了一些技术问题,然后就到了假日季节。虽然现在已经到了,但迟到总比不到好!
在讨论这个版本的细节之前,我只想说,您现在应该能看到我们的更多内容来补充主要产品发布的信息。William Burgess最近发布了他加入Cobalt Strike团队后的第一篇博文,他将在为产品的未来方向提供技术指导方面发挥关键作用。在接下来的几周和几个月里,我们会有更多的博文和工具,首先是关于 UDRL 开发的系列文章(其中第一篇应在下周发布)。今年晚些时候,Cobalt Strike 本身将发生一些巨大的变化。更多细节将在不久后的后续博文中公布。我们知道,我们的用户正在为躲避问题而挣扎,并报告了其他痛点。正如我在去年的路线图更新中提到的那样,我们一直在积极地建立我们的研发团队,虽然花了一些时间来做这件事,并把所有的事情都安排好,但你现在会真正开始看到这些幕后变化的好处。
现在,回到4.8版本。
系统调用支持
这个版本增加了对直接和间接系统调用的支持。我们增加了对多个系统调用的支持,具体包括:
CloseHandle CreateFileMapping CreateRemoteThread CreateThread GetThreadContext MapViewOfFile OpenProcess OpenThread ResumeThread SetThreadContext UnmapViewOfFile VirtualAlloc VirtualAllocEx VirtualFree VirtualProtect VirtualProtectEx VirtualQuery
将无阶段的 Beacon 负载生成对话框进行了更新,以便您在执行时指定所要使用的系统调用方法。可用的选项包括:
None: 使用标准的 Windows API 函数
Direct: 使用 Nt*版本的函数
Indirect: 跳转到 Nt* 版本函数中的适当指令
elevate inject jump spawn spawnas spawnu teamserver 响应无阶段载荷请求 teamserver 响应外部C2载荷请求
增加了对 payload guardrails 的支持,可以在监听器级别设置,然后在生成负载时,如果需要,可以被覆盖。
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
当生成一个 Payload 时,相关监听器的 Guardrails 值被用作默认值。
你可以使用默认值或覆盖它们,为正在创建的有效载荷设置特定值。在此处设置特定值不会更改在 Listener 级别设置的默认值。
用于混淆Beacon的反射式DLL导入表的多字节支持
这个过程的一部分涉及从固定的单字节 XOR 密钥转移到随机生成的多字节 XOR 密钥。使用单字节 XOR 掩码容易被 YARA 等工具识别和捕获。转向随机生成的多字节 XOR 密钥应该有助于解决这些问题。
睡眠模式更新
对睡眠模式进行了一些更新,主要的变化是睡眠模式的大小限制已经从 8192 字节增加到 16384 字节。其他变化包括:
支持使用具有 MASK_TEXT_SECTION 功能的系统调用 更新还为 Windows API 函数增加了定义标签,以消除需要使用 LIBRARY$Function 语法的需求。 通过堆栈欺骗实现迴避性睡眠(只适用于 x64 )。相关变化包括增加了控制流保护( CFG )的 Bypass ,以及增加了一个辅助工具( getFunctionOffset )
令牌存储
我们已经将添加令牌存储进入待办事项清单,该更新可以方便地更换访问令牌。Windows 令牌是特定于进程的;因此每个 Beacon 都有自己的令牌存储和自己的令牌。请注意,这些令牌只能由那个特定的 Beacon 使用。令牌存储是围绕着新的 "token-store" 命令开展的。该命令支持一些选项来执行特定功能(全部由标签完成支持)。可用的功能如下:
token-store steal [pid,…] <OpenProcessToken access mask>
此命令会从指定的 PID(多个之间用逗号分隔)窃取 token。该命令会窃取token并将其存储到令牌存储中,但不会直接模拟用户。应该使用 steal-and-use 命令来实现这一目的(不过需要注意的是,steal-and-use只支持单个PID)。该命令支持可选的 OpenProcessToken 访问掩码,就像现有的 steal_token 命令一样。token-store use [id]
此命令会指示Beacon使用令牌存储中指定 ID 的令牌。token-store steal-and-use [pid] <OpenProcessToken access mask>
此命令允许你从指定的 PID 中窃取令牌,将其添加到令牌存储中并立即使用。该命令支持可选的 OpenProcessToken 访问掩码,就像现有的 steal_token 命令一样。token-store show
token-store remove [id,…]
token-store remove-all
最后,我们还实现了与上述选项相应的攻击者函数,即:
btoken_store_remove btoken_store_show btoken_store_steal_and_use btoken_store_steal btoken_store_remove_all btoken_store_use
ETW Blinding
execute-assembly 和 powerpick 命令现在有一个可选的 PATCHES 参数,如下所示:
execute-assembly "[PATCHES: [patch-rule] [patch-rule] [patch-rule] [patch-rule]]" [/path/to/file.exe] [arguments]
andpowerpick "[PATCHES: [patch-rule] [patch-rule] [patch-rule] [patch-rule]]" [commandlet] [arguments]
可选的 PATCHES 参数可以修改进程内存中的函数。最多可以指定四个 patch-rule(用空格分隔),每个 patch-rule 由库、函数、偏移量和 hex patch value 组成,例如。[ibrary]、[function]、[offset]、[hex-patch-value],其中:
library 可以是 1 - 260 个字符 function 可以是 1-256 个字符 offset 是指从可执行函数的起始位置开始的偏移量,可以是 0-65535 hex-patch-value 可以是 2-200 个十六进制字符( 0-9 , A-F ),长度必须是偶数(十六进制对)
Teamserver启动时同步数据
在 Cobalt Strike 中,存在一个长期存在的问题,即由于 Teamserver 重启后,从目标检索的任何数据(例如屏幕截图、按键记录数据等)在客户端中不可用。现已解决这个问题,之前从 UI 中“丢失”的数据现在可以在重启后保留。我们还添加了一个新脚本 clearteamserverdata,可用于在完成某项任务后删除所有数据。
更改许可证过期的处理方式
与产品安全相关的一个重要更新是改变了许可证到期日的处理方式。以前,在Teamerver 启动时检查过期日期,如果有效,Teamerver 就能启动,不会执行任何其他检查。并且仅有操作员关闭后,teamserver 才会停止运行。
我们已经加强了这一处理,以便每天检查许可证的过期日期。以前的行为背后的原因是,在某次任务进行中更新(以获取更新后的授权文件)并重新启动 teamserver并不总是方便的,或者在逻辑上不可能。在这种情况下,在更新后重新启动团队服务器也不方便。我们在新的处理中增加了对这些情况的缓解措施,这意味着在刷新授权文件时不会对操作产生任何影响。如果您需要在任务运行中更新许可证,请参阅文档以获取如何执行此操作的信息。但是,我们建议您在开始新任务之前考虑您的许可证过期日期,并尽可能避免出现这种情况。
为了确保您不会因为许可证到期而受到影响,我们已经在客户端UI中添加了几个新的标语。
在距离许可证到期还有 45 天时,客户端将出现警告标语,提示您的许可证即将到期以及到期时间。这条警告信息可以被忽略,但在每天检查到期日时将重新出现。这应该提供足够的时间来更新你的许可证密钥,如果这还没有被处理的话:
如果在许可证到期之前没有完成许可证续订,您将有 14 天的宽限期来完成续订。在这段宽限期内,您将看到一个无法取消的错误标语:
在宽限期结束后,如果您的许可证没有被续订并且授权文件也没有被刷新,teamserver将会关闭,并且您将无法在未续订许可证的情况下重新启动它,直到你更新了你的许可证。
便利性改进
除了已经提到的功能之外,我们还添加了许多小的改进,这些改进主要是根据用户的要求而进行的,具体如下:
增加了指定睡眠时间的灵活性
用户提出的一项小更改是使睡眠时间更容易设置。现在,你不再只能以秒为单位指定睡眠时间,而是可以分别以 "d"、"h"和 "m"为后缀来指定天、小时和分钟。
一个用法示例是:sleep 2d 13h 45m 8s 30j,它的意思是"睡眠2天13小时45分钟8秒,带有30%的抖动"
我们还增加了一个新的侵略者功能,bsleepu,其工作方式与此相同
在用户界面中显示当前的令牌
另一个用户的要求是在客户端用户界面上显示当前令牌。这与新的令牌存储很好地结合在一起,现在你可以在表视图和状态栏中看到当前的令牌(在用户名称旁边用括号括起来)
与此更改相关的是,我们还解决了 make_token 报告错误用户名称的问题(即当前 Beacon 进程的用户名称),这是由于 Windows API 限制引起的。这个问题已经解决,正确的用户名现在将出现在括号中。
从 Beacon 输出窗格复制/粘贴
我们已经添加了从 Beacon 输出窗格复制和粘贴命令的支持。
CTRL+C 复制和 CTRL+X 剪切输出窗格或命令行中的选定文本。文本只能在输出窗格或命令行中选择,两者不能同时选择。CTRL+V 将剪贴板上的文本粘贴到命令行上。这适用于任何控制台窗口(例如:Beacon控制台、SSH控制台、脚本控制台、事件日志和Web日志)
在一个Mimikatz调用中链接多个命令
mimikatz 命令已更新,支持在单个操作中链接多个命令。这也适用于bmimikatz 和 bmimikatz_small扩展功能(虽然 bmimikatz_small 仅限于lsadump::dcsync、sekurlsa::logonpasswords和sekurlsa::pth)
命令可以通过在命令之间添加分号作为分隔符来链接,例如:
mimikatz standard::coffee;standard::coffee
请注意,如果命令中需要分号,则仍然可以使用反斜杠进行转义(即"\;")。另外,命令的长度被限制为511个字符,以确保字符串中的最后一个字符是EOS(\0)
在无阶段的Windows可执行对话框中指定退出功能
在 4.7 版本中进行了更改,使您可以在 Stageless Payload Generator 对话框中指定退出选项("thread"或"process")。现在,在Stageless Windows可执行文件对话框中也进行了类似的更改,使您可以指定退出选项("thread"或"process")
Arsenal Kit校验码
最后要提到的一个变化,也是一个用户要求的,就是为Arsenal Kit增加一个校验码。已经完成了此项工作,并且校验和可以在这里找到:
https://verify.cobaltstrike.com/arsenal-kit
Cobalt Strike 的创始人一贯认为不要向 CobaltStrike 中添加尖端的、开箱即用的规避技术。一旦它们不可避免地被指纹识别,就会陷入解决这些问题而不是开发新功能的无休止循环中,这导致 CobaltStrike 的默认值很容易就被指纹识别,这是设计使然。但是在 Fortra 收购了 Cobalt Strike 后,目前的 CobaltStrike 开发经理 Greg 表示已经开始建立一支研发团队,开始在核心产品中加入开箱即用的规避,尝试做一些改变来解决用户在杀软绕过上的痛点
团队现在的目标是每年两次发布核心 Cobalt Strike(稳定性和灵活性)更新。一个版本将在夏季发布,另一个在冬季发布。
并且透露计划在 7月/8月 左右发布一个更大的版本,以纪念Cobalt Strike的10周年。