CobaltStrike是一个为对手模拟或红队攻击设计的平台,主要用于执行有目的的攻击和模拟高级威胁者的后渗透行动。它分为客户端和服务器组件,服务器需在Linux上运行,客户端用于连接团队服务器。团队服务器支持分布式团队行动,通过共享会话和数据协调行动。用户接口包括目标表、会话表和Pivot图等可视化展示。CobaltStrike支持多种Beacon payload,如HTTP、HTTPS、DNS、SMB和TCP Beacon,每种都有特定的通信方式和配置选项。监听器管理是配置payload和接收连接的关键。CobaltStrike还支持外置C2和Foreign Listeners,以及通过C2扩展文件自定义网络流量指标。Payload安全特性包括公钥加密和会话密钥,确保通信安全。数据管理功能包括目标、服务和凭据的导入、导出和重置。
前置知识
英文对照表
名词
翻译
注释
Artifact Kit
Artifact工件集
Data Channel
数据通道
Data Model
数据模型
External C2
外置 C2
Foreign Listener(s)
对外监听器
Keystroke Logger
键盘记录器
Malleable C2 Profile
C2 扩展文件
Named Pipe(s)
命名管道
Network Indicators
网络流量指标
Payload Staging
Payload 分阶段传递
Peer-to-peer C2
对等 C2
Pipe
管道
Pivot Graph
Pivot 图
Port Bending Redirector
端口弯曲重定向器
例:接受来自 80 或 443 端口的连接,但把这些连接路由到团队服务器所开在的另一个端口,这样的重定向器。
Post-Exploitation
后渗透
PowerShell one-liner
PowerShell 单行程序
Session
会话
Sessions Table
会话表
System Profiler
一个探针
Target Table
目标表
Token
令牌
一、CobaltStrike 是什么?
CobaltStrike 是一个为对手模拟和红队行动设计的平台,主要用于执行定向攻击,并模拟高级威胁的入侵后渗透行为。
一次深思熟虑的攻击始于侦察阶段。Cobalt Strike 的 System Profiler 是一个 Web 应用,用来分析客户端的攻击面。侦察过程中收集到的信息,能帮你分析情况,从而选定最合适的进攻方式。
武器化,就是把后渗透 Payload 与一份文档或一个能在目标上执行该 Payload 的漏洞利用结合起来。Cobalt Strike 提供了将普通文档转化为武器化工件(Artifacts)的选项,也支持以多种形式导出后渗透 Payload 和 Beacon,可与你工具集之外的其他工件搭配使用。
用 Cobalt Strike 的 Beacon 来控制你的目标网络。这种后渗透 Payload 采用异步、「低频且缓慢」的通信方式——这正是高级威胁中的恶意软件常用的模式。Beacon 会通过 DNS、HTTP 或 HTTPS 等方式回连团队服务器,也能借助常见的代理配置,回连多个主机以避免被阻断。
二、团队服务器
Cobalt Strike 分为客户端和服务器两个组件。
服务器组件必须在受支持的 Linux 环境中运行。上传 Cobalt Strike 软件包后,需要为 c2lint、teamserver、TeamServerImage 赋予 x(执行)权限。
如何启动:
团队服务器的启动命令包含两个必选参数和两个可选参数。
第一个必选参数是团队服务器对外可达的 IP 地址(公网 IP)。Cobalt Strike 会把这个值作为其功能所依赖的默认主机地址。
第二个必选参数是密码。你的团队成员将使用这个密码,从各自的 Cobalt Strike 客户端连接到 Cobalt Strike 团队服务器。
第三个参数是可选的,用于指定一个「C2 扩展文件」。
第四个参数同样可选,它以 YYYY-MM-DD 的日期格式指定结束日期。团队服务器会把这个结束日期嵌入它生成的每一个 Beacon Stage 中。过了这个日期之后,Beacon Payload 将拒绝运行;而且若 Beacon Payload 在这个日期之后被唤醒,也会自动终止(对应 Beacon 会话中的 exit 选项)。
团队服务器启动时,会公布其 SSL 证书的 SHA256 哈希值。你需要把这个哈希分发给团队成员。当团队成员连接团队服务器时,在向团队服务器进行身份验证之前,他们的 Cobalt Strike 客户端会询问是否认可这个哈希。这是抵御中间人攻击的重要防护措施。
三、CobaltStrike 客户端
使用 Cobalt Strike 客户端连接团队服务器。要启动 Cobalt Strike 客户端,请使用适用于你平台的软件包内自带的启动器。
Cobalt Strike 客户端启动后,你会看到一个连接对话框。
在 Host 主机字段中指定你的团队服务器地址。团队服务器的默认端口是 50050,通常没有必要修改这个默认端口。User 字段填写你的昵称,进入团队服务器后就会显示这个昵称;你可以把这个字段改成你的外号、称呼或艺名。Password 字段则填写团队服务器的共享密码。
点击 Connect 按钮,连接到 Cobalt Strike 团队服务器。
如果是第一次连接这个团队服务器,Cobalt Strike 会询问你是否认可该服务器的 SHA256 哈希。认可的话就点 OK,随后 Cobalt Strike 客户端便会连接到这个团队服务器。你可以通过 CobaltStrike-->Preferences-->Fingerprints 来管理这些团队服务器的哈希。
Cobalt Strike 会记录你连接过的团队服务器并记住你的信息。在连接对话框的左侧选择一个团队服务器的 Profile(连接信息),即可用它来填充该对话框中的各个字段。你可以通过 CobaltStrike-->Preferences-->TeamServer 来管理这个列表。
3.1 分布式与团队行动
你可以使用 CobaltStrike 来协调分散的红队行动——在一台或多台远程主机上分阶段搭建 CobaltStrike 基础设施,启动团队服务器,并让团队成员与其建立连接。
一旦连接到团队服务器,你的团队将:
如果想同时连接多个团队服务器,可以通过 CobaltStrike → New Connection(新建连接)来建立新的连接。在连接多个团队服务器时,CobaltStrike 窗口底部会出现一个切换条。
连接多个团队服务器时,CobaltStrike 会汇总所有已连接团队服务器的监听器。这种聚合使你能够从一台团队服务器发送钓鱼邮件,而这些邮件引用的是托管在另一台团队服务器上的恶意网站。在行动收尾阶段,CobaltStrike 的报告功能会查询所有已连接的团队服务器,合并这些数据,从而完整地描述整个事件。
3.2 为 CobaltStrike 编写脚本
CobaltStrike 可以通过它的 Aggressor Script 语言进行脚本化。Aggressor Script 是 Armitage 的 Cortana 脚本语言在精神上的继承者,但两者并不兼容。
可以通过 CobaltStrike → Script Manager 来管理脚本。
相关文档:https://www.cobaltstrike.com/aggressor-script/
四、用户接口
4.1 概述
CobaltStrike 的用户接口分为两部分。接口顶部是会话或目标的可视化展示;接口底部则显示你与之交互的每个 CobaltStrike 功能或会话的标签页。你可以点击这两个部分之间的分隔区域,根据自己的需要调整它们的大小。
4.2 工具条
CobaltStrike 4.9 顶部的工具条提供了访问 CobaltStrike 常用功能的快捷方式,熟悉这些工具条按钮能够提升你使用 CobaltStrike 的效率。
2.3 会话和目标可视化展示
Cobalt Strike 提供多种可视化展示,每种设计对应行动中的不同部分。
你可以通过工具条或 Cobalt Strike → Visualization(可视化)菜单在不同可视化形式之间切换。
目标表
目标表展示了 Cobalt Strike 数据模型中的目标。此表列出了每个目标的 IP 地址、NetBIOS 名称,以及你或团队成员为其标注的备注。每个目标最左侧的图标表示其操作系统。带有闪电的红色图标表示此目标有一个与之通信的 Cobalt Strike Beacon 会话。
点击表头字段(address)来对主机排序。高亮一行并右击可以打开一个菜单,其中包含针对这台主机的操作选项。按住 Ctrl + Alt,再通过点击来选中或取消选中某台主机。
这个目标表对于横向移动和理解目标网络很有用。
会话表
会话表展示了哪些 Beacon 回连到了这台 Cobalt Strike 实例。Beacon 是 Cobalt Strike 用于模拟高级威胁者的 payload。在这里,你将看到每个 Beacon 的外网 IP 地址、内网 IP 地址、该 Beacon 的出口监听器、它最后一次回连的时间,以及其他信息。每一行最左边是一个图标,用来标明受害者的操作系统。如果此图标为红色并带有闪电,说明该 Beacon 运行在管理员权限的进程
中。一个褪色的图标意味着此 Beacon 会话被要求离开,并且它接受了这条命令。
如果你使用 DNS Beacon 监听器,要注意 Cobalt Strike 在第一次回连团队服务器之前不会知道任何关于主机的信息。如果你看到一行带有 last call time(上次回连时间)的条目,就可以给那个 Beacon 下达第一个任务来查看更多信息。
在一个或多个 Beacon 上单击右键来查看你的后渗透选项。
Pivot 图
Cobalt Strike 能够把多个 Beacon 连接成一条链。链中的 Beacon 从父 Beacon 那里接收命令并发送其输出。这种链接对于控制哪些会话充当网络出口、以及模拟有纪律的攻击者很有用——这类攻击者会把他们在网络内部的通信路径限制在合理范围内。这种 Beacon 链是 Cobalt Strike 最强大的功能之一。
Cobalt Strike 的工作流程让建立这种链变得非常容易。对 Cobalt Strike 使用者来说,链接四到五层深的 Beacon 也很常见。如果不做可视化,跟踪和理解这些链会非常困难,这正是 Pivot 图的用武之地。
Pivot 图以一种非常自然的方式展示你的 Beacon 链。每个 Beacon 会话都有一个对应的图标。和会话表一样,每个主机的图标标识了它的操作系统。如果图标为红色并带有闪电,表示该 Beacon 运行在管理员权限的进程中。一个褪色的图标说明此 Beacon 会话被要求离开,并且它接受了这条命令。
防火墙图标代表你 Beacon payload 的流量出口点。绿色虚线表示使用HTTP 或HTTPS 连接出网。黄色虚线表示使用 DNS 协议出网。
从一个 Beacon 会话指向另一个 Beacon 会话的箭头表示两个 Beacon 之间存在连接。在这种对等通信模式中,Cobalt Strike 的 Beacon 使用 Windows 命名管道和 TCP sockets 来控制其他 Beacon。
橙黄色的箭头代表命名管道通道。SSH 会话也使用橙黄色箭头。湖蓝色的箭头代表 TCP socket 通道。红色的(命名管道)或紫色的(TCP)箭头表示某个 Beacon 连接断开了。
点击一个 Beacon 来选中它。通过点击并拖划出一个覆盖多台主机的矩形,你可以选择多个
Beacon。按住 Ctrl + Alt,再通过点击来选中或取消选中某个 Beacon。在一个 Beacon 上单击右键可以打开一个菜单,其中包含可用的后渗透选项。
Pivot 图提供了多个键盘快捷键:
Ctrl + + ——放大
Ctrl + - ——缩小
Ctrl + 0 ——重置缩放级别
Ctrl + A ——选择所有主机
Escape ——清除选择
Ctrl + C ——将主机排列成一个圆圈
Ctrl + S ——将主机排列成一行
Ctrl + H ——将主机排列到层次结构中(默认布局)
不选择任何 Beacon、在 Pivot 图上单击右键可以配置此图的布局。
2.4 标签页
Cobalt Strike 在一个新的标签页中打开每个对话、控制台和表。点击标签页上的 X 即可关闭它。使用 Ctrl + D(Delete)可以关闭当前正在查看的标签页。Ctrl + Shift + D 会关闭除当前停留的标签页之外的所有标签页。
你可以在 X 符号上面单击右键,会出现一些选项,包括:在单独的窗口中打开此标签页、对标签页截图,或者关闭所有同名的标签页。
这些功能也有对应的快捷键。使用 Ctrl + W(Window)在单独的窗口中打开当前停驻的标签页。使用 Ctrl + T 快速保存当前停留标签页的截图。
Ctrl + B(Bottom)会把当前停驻的标签页移动到 Cobalt Strike 窗口的底部。这对于你想要持续监视的标签页很有用。使用 Ctrl + E 可以取消此动作,并移除 Cobalt Strike 窗口底部的标签页。
按住 Shift 键并点击 X 可以关闭所有同名的标签页。同时按住 Ctrl 和 Shift 键并点击 X 可以在单独的窗口内打开标签页。
使用 Ctrl + 和 Ctrl + 来快速地在标签页之间切换。
你也可以通过拖拽来改变标签页的前后位置。
2.5 控制台
Cobalt Strike 提供一个控制台,用来与 Beacon 会话、脚本等交互,你也可以通过控制台与队友交流。
控制台会追踪你的命令历史。点击向上箭头可以浏览之前键入的命令,点击向下箭头可以回到你键入的最后一条命令。
使用 Tab 键可以补全命令和参数。
使用 Ctrl + + 可放大控制台,使用 Ctrl + - 可缩小控制台,使用 Ctrl + 0 可以重置控制台大小。此更改只对当前控制台生效。通过 Cobalt Strike → Preferences(偏好)来永久更改字体。
按 Ctrl + F 会显示一个面板,让你可以在控制台中搜索文本。
使用 Ctrl + A(ALL)全选控制台缓冲区中的所有文本。
2.6 表
Cobalt Strike 以表的形式来展示会话、凭据、目标以及行动中的其他信息。
Cobalt Strike 中的大多数表都有一个选项,可以指定用一种颜色高亮某些行。这些高亮在其他 Cobalt Strike 客户端中可见。单击右键查看颜色菜单。
在表内按 Ctrl + F 可以打开表中的搜索面板。这个功能让你可以在当前的表中进行过滤。
在搜索面板的搜索框内输入你的过滤标准。过滤标准的格式取决于你选择应用过滤器的主机。使用 CIDR 表示法(如:192.168.1.0/24)和主机范围(192.168.1-192.169.200)来过滤包含 IP 地址的条目。使用数字或数字范围来过滤包含数字的条目。使用通配符(*、?)来过滤包含字符串的条目。
! 按钮会否定当前标准。按 enter 键会将设定的标准应用于当前表。你可以根据需要堆叠尽可能多的条件。Reset 按钮将移除应用于当前表的过滤条件。
第三章 数据管理
3.1 概述
Cobalt Strike 的团队服务器是行动期间 Cobalt Strike 收集的所有信息的中转枢纽。Cobalt Strike 解析来自它的 Beacon payload 的输出,提取出目标、服务和凭据。
如果你想导出 Cobalt Strike 的数据,通过 Reporting → Export Data。Cobalt Strike 提供两种选项:把数据导出为 TSV 或 XML 文件。Cobalt Strike 客户端的导出数据功能会融合来自你当前连接的所有团队服务器的数据。
3.2 目标
你可以通过 View → Targets 来与 Cobalt Strike 的目标信息交互。这个标签页显示与目标表视图相同的信息。
点击 Import 来导入一个带有目标信息的文件。Cobalt Strike 接受每行一个主机的纯文本(flat)文件,也接受由 Nmap 生成的 XML 文件(-oX 选项)。
Flat File 是一种包含没有相对关系结构的记录的文件。这个类型通常用来描述去除了文字处理、其他结构字符或标记的文本。在此可以理解为「纯文本文件」。
点击 Add 按钮来给 Cobalt Strike 的数据模型添加新目标。
这个对话框允许你向 Cobalt Strike 的数据库添加多个主机。在 Address(地址)字段指定一个 IP 地址范围或使用 CIDR 表示法来一次添加多个主机。在给数据模型添加主机时,按住 shift 键即可在点击 Save 之后保持此对话框打开。
选择一个或多个主机,然后右击打开主机菜单。通过这个菜单你可以修改主机的备注、设置它们的操作系统信息,或者从数据模型中移除主机。
3.3 服务
在 Target(目标)视图中,在一台主机上右键单击并选择 Services(服务)。这会打开 Cobalt Strike 的服务浏览器。在这里你可以浏览服务、给不同服务备注,也可以移除服务条目。
3.4 凭据
通过 View → Credentials 来与 Cobalt Strike 的凭据模型交互。点击 Add 按钮来给凭据模型添加一条条目。同样地,你也可以按住 Shift 键来保持对话框打开,让给模型添加新凭据更方便。点击 Copy 来复制高亮的条目至剪贴板。使用 Export 来以 PWDump 格式导出凭据。
3.5 维持
Cobalt Strike 的数据模型将其所有状态和状态元数据存储在 data/ 文件夹中。data/ 文件夹位于你运行 Cobalt Strike 团队服务器的那个文件夹里。
要清除 Cobalt Strike 的数据模型:停止团队服务器,删除 data/ 文件夹及其内容。下次启动团队服务器时,Cobalt Strike 会重建 data/ 文件夹。
如果你想要存档数据模型,请停止团队服务器,然后使用你喜欢的程序把 data/ 文件夹及其文件存储到其他位置。要还原数据模型,请停止团队服务器,然后把旧内容还原到 data/ 文件夹。
通过 Reporting → Reset Data 可以在不重启团队服务器的情况下重置 Cobalt Strike 的数据模型。
4.1 概述
任何行动的第一步都是建立基础设施。就 Cobalt Strike 而言,基础设施由一个或多个团队服务器、重定向器,以及指向你的团队服务器和重定向器的 DNS 记录组成。一旦团队服务器启动并运行,你就需要连接到它,并将其配置为接收来自受害系统的连接。监听器就是 Cobalt Strike 中用来执行这种任务的机制。
一个监听器既是 payload 的配置信息,同时也是 Cobalt Strike 起一个服务器来接收来自这个
payload 的连接的指示。一个监听器由用户定义的名称、payload 类型和几个特定于该 payload 的选项组成。
4.2 监听器管理
要管理 Cobalt Strike 的监听器,通过 Cobalt Strike → Listeners。这会打开一个标签页,列出所有你配置的 payload 和监听器。
Cobalt Strike 4.0:
下图是 Cobalt Strike 3.12 中的监听器管理标签页,对比可以看到 4.0 多了 bindto 和 profile 字段:
按 Add 按钮来创建一个新的监听器。
当你创建监听器时,确保给它一个好记的名称。在 Cobalt Strike 的命令和工作流程中,你需要用这个名称来引用该监听器。
要编辑监听器,选中一个监听器,然后按 Edit。
要移除监听器,选中该监听器,然后按 Remove。
4.3 Cobalt Strike 的 Beacon Payload
最常见的情况是,你需要为 Cobalt Strike 的 Beacon payload 配置监听器。Beacon 是 Cobalt Strike 用于建模高级攻击者的 payload。使用 Beacon 来通过HTTP、HTTPS 或 DNS 出口网络。你也可以通过控制经由命名管道和 TCP sockets 的对等(peer-to-peer)Beacon 来限制出口网络,只允许部分主机直接回连。
Beacon 很灵活,支持异步通信模式和交互式通信模式。异步通信效率缓慢:Beacon 会回连团队服务器、下载其任务,然后休眠。交互式通信则是实时发生的。
Beacon 的网络流量指标具有可拓展性。可以使用 Cobalt Strike 可拓展的 C2 语言来重新定义 Beacon 的通信。这让你能够掩盖 Beacon 的行动,比如使它的流量看起来像其他恶意软件,又或者把它的流量掺入合法流量中。第 11 章会讨论此功能。
4.4 Payload Staging
作为背景,一个值得一提的主题是 payload staging(分阶段传送 payload)。很多攻击框架的设计把攻击和攻击执行的内容解耦了。payload 就是攻击执行的内容。payload 通常被分为两部分:payload stage 和 payload stager。stager 是一个小程序,通常是手工优化的汇编指令,用来下载 payload stage、把它注入内存,然后向其传达执行命令。这个过程被称为 staging(分阶段传送)。
staging(分阶段)过程在某些攻击行动中是必要的。很多攻击对能加载进内存并在漏洞利用成功后执行的数据大小有严格限制。这会极大地限制你的后渗透选择,除非你分阶段传送你的后渗透
payload。
Cobalt Strike 在它的用户驱动攻击中使用 staging(分阶段)。大多数这类项目会在
Attacks → Packages 和 Attacks → Web Drive-by 选项下。使用什么样的 stager 取决于与攻击配对的 payload。比如,HTTP Beacon 有一个HTTP stager。DNS Beacon 有一个 DNS TXT 记录 stager。不是所有的 payload 都有 stager 选项。没有 stager 的 payload 不能使用这些攻击选项投递。
如果你不需要 payload staging(分阶段),通过在你的 C2 拓展文件里把 host_stage 选项设为
false,你可以关闭这个选项。这会阻止 Cobalt Strike 在其 web 和 DNS 服务器上托管 payload stage
stage。这种设置有助于提升行为安全(减少被溯源的风险),因为如果开启了 staging(分阶段),任何人都能连到你的服务器上,请求一个 payload、并分析它的内容,从而可以从你的 payload 配置中获取信息。
在 Cobalt Strike 4.0 及以后的版本中,后渗透和横向移动的行为避开了 stager 并选择去尽可能的投递一个完整的 payload。如果你禁用了 payload staging(分阶段),那么除非你要进行后渗透活动,否则你应该不会注意到此变动。
4.5 HTTP Beacon 和HTTPS Beacon
默认设置情况下,HTTP 和 HTTPS Beacon 通过 HTTP GET 请求来下载任务。这些 Beacon 通过 HTTP POST 请求传回数据。你也可以通过 C2 拓展文件来尽可能精细地控制这个 payload 的行为和流量指标。
要起一个HTTP 或HTTPS Beacon 监听器,通过 Cobalt Strike → Listeners。点击 Add 按钮,选择 Beacon HTTP 作为你的 payload 选项。
4.0:
按 [+] 来为HTTP Beacon 增加一个或多个回连的主机。按 [-] 来移除一个或多个主机。按 [X] 来清除当前的主机。如果你有多个主机,仍然可以在此对话框中粘贴以逗号分隔的回连主机列表。
HTTP Host(Stager) 字段控制 HTTP Beacon 的HTTP Stager 的主机。仅当你将此 payload 与需要显式 stager 的攻击配对时,才使用此值。
通过 Profile 字段,你可以选择一个 C2 拓展文件变体。通过一个 C2 文件变体,你可以在一个文件中指定多个配置文件的变量。使用变体文件之后,你设置的每个HTTP 或HTTPS 监听器会有不同的网络流量指标。
HTTP Port(C2) 字段设置你的HTTP Beacon 回连的端口。 HTTP Port(Bind) 字段指定你的 HTTP
Beacon payload web 服务器绑定的端口。如果你要设置端口弯曲重定向器(例如,接受来自 80 或 443 端口的连接,但将其路由到团队服务器开在其他端口上的连接,这样的重定向器),那么这些选项会很有用。
如果 HTTP Host Header 值被指定了,会影响你的HTTP stagers,并通过你的 HTTP 通信。这个选项使得通过 Cobalt Strike 利用域名前置变得更加容易。
点击 HTTP Proxy 字段旁边的按钮来为此 payload 指定一个显式的代理配置。
手动的HTTP 代理设置
(Manual) Proxy Settings 对话框提供了多个选项来控制 Beacon 的 HTTP 和 HTTPS 请求的代理配置。Beacon 的默认行为是为当前的进程/用户上下文使用 Internet Explorer 代理配置。
Proxy Type 字段配置了代理的类型。Proxy Host 和 Proxy Port 字段告诉 Beacon 代理在哪里运行。Username 和 Password 字段是可选的,这些字段指定了 Beacon 用来对代理进行身份验证的凭据。
勾选 Ignore proxy settings;use direct connection(忽略代理设置;使用直连)来强制 Beacon 不通过代理尝试其 HTTP 和 HTTPS 请求。
当你填写好代理配置之后,点击 Set 来更新 Beacon 对话框。点击 Reset 可以把代理配置重置为默认行为。
注意:手动的代理设置仅影响HTTP 和HTTPS Beacon payload stage,不影响 payload stager。
重定向器
重定向器是位于你的目标网络和你的团队服务器之间的系统。任何去往重定向器的连接将转发到你的团队服务器进行处理。通过重定向器,可以为你的 Beacon payload 提供多个回连主机。使用重定向器还有助于提升行为安全,因为它会增加定位团队服务器真实地址的难度。
C2 Redirectors,就是在现有的 C2 上增加一个中转服务器,这个中转服务器起到功能和流量分离的作用,C2 流量可以被中转到不同战术意义的服务器,比如打完就走的短期 C2、需要长期控制驻留的 C2 和邮件钓鱼服务器等。
这个 C2 重定向器相当于位于团队服务器这个控制端和失陷主机之间的中转跳板。外界只能看到重定向器(跳板),一旦重定向器暴露可以被随时抛弃,除非重定向器被反制,否则很难追踪到背后真正的控制者。
Cobalt Strike 的监听器管理功能支持使用重定向器。当你设置一个HTTP 或HTTPS Beacon 监听器的时候,简单的指定你的重定向器 IP(在 Host 字段填入)。Cobalt Strike 不会验证这个信息。如果你提供的 host 不隶属于当前主机(不是团队服务器的 IP),那么 Cobalt Strike 就假设它是重定向器。一种把服务器转变为重定向器的简单方法是使用 socat。
下面这条 socat 命令的作用是:将 80 端口上的所有连接转发到位于192.168.12.100的团队服务器的 80 端口:
socat TCP4-LISTEN:80,fork TCP4:192.168.12.100:80
4.6 DNS Beacon
DNS Beacon 是一个很棒的 Cobalt Strike 功能。这个 payload 使用 DNS 请求来将 Beacon 返回给你。这些 DNS 请求用于解析那些以你的 Cobalt Strike 团队服务器作为权威 DNS 服务器的域名。DNS 响应告诉 Beacon 休眠或是连接到团队服务器来下载任务。DNS 响应也告诉 Beacon 如何从你的团队服务器下载任务。
在 Cobalt Strike 4.0 及之后的版本中,DNS Beacon 是一个仅 DNS 的 payload。在这个 payload 中,没有HTTP 通信模式。这是与之前的版本的产品不同的地方。
数据通道
今天,DNS Beacon 可以通过 DNS TXT 记录、DNS AAAA 记录或 DNS A 记录下载任务。当其在目标
上,此 payload 有在这些数据通道之间切换的灵活性。使用 Beacon 的模式命令来改变当前 Beacon 的数据通道。
mode dns 是 DNS A 记录数据通道;
mode dns6 是 DNS AAAA 记录数据通道;
mode dns-txt 是 DNS TXT 记录数据通道。DNS TXT 记录是默认的数据通道。
请注意,只有在有可用任务时,DNS Beacon 才能 check in。使用 checkin 命令来请求 DNS Beacon 在下次回连的时候 check in。
请注意,DNS Beacon 直到有可用任务时才会 check in。使用 checkin 命令要求 DNS Beacon 在下次回连的时候 check in。
译者注:
这里的 check in 和普通的回连团队服务器有什么区别呢?
这里的 check in 应该是数据通道的问题!DNS Beacon 会心跳回连,也就是 DNS 服务器发送一个xxx.xxx.com 的 DNS 请求,仅此而已!不会进行任务数据通讯,比如它都不会直接返回受害机器的任何信息,因为没有 check in。如果做个 DNS Beacon 测试,会发现 payload 在目标上执行之后会返回来一个会话,但是不显示任何信息。就是会话表中这个 Beacon 的一行数据中,只看见一个 last 的时间在走,其他信息都是空的。这就是因为没有数据返回。这个时候使用
Beacon 的模式命令来改变当前 Beacon 的数据通道,然后执行 checkin,Beacon 就会返回数据。常规的HTTP Beacon 会返回元数据信息,但是 DNS Beacon 若不 check in,就连元数据信息也没有。
如果不选择当前 Beacon 的数据通道,那么默认使用 DNS TXT 记录数据通道。Cobalt Strike 4.0 版本之前,在配置 DNS payload 的时候有HTTP 和 TXT 两种选择,4.0 及未来版本就只有 DNS TXT 记录这一种选择了,这是默认的。
其实不执行 checkin 也可以。如果执行一个其他命令,比如 whoami,它首先会自动 check in 再执行其他命令,也就是说,它会等到有可用任务时才 check in。如果只输入 checkin 命令,就只返回元数据。
监听器设置
要创建一个 DNS Beacon 监听器:通过 Cobalt Strike → Listeners,点击 Add 按钮,然后选择 Beacon DNS 作为 payload 类型。
点击 [+] 来添加一到多个与 beacon 通信的域名。你的 Cobalt Strike 团队服务器系统必须对你指定的域名具有权威性。创建一个 DNS A 记录然后指向你的 Cobalt Strike 团队服务器。使用 DNS NS 记录来将多个域名或子域名委派到你的 Cobalt Strike 团队服务器的 A 记录。
DNS HOST(Stager) 字段配置 DNS Beacon 的 TXT 记录 stager。这个 stager 仅被用在要求显式 stager 的 Cobalt Strike 功能中。你的 Cobalt Strike 团队服务器系统也必须对此域名具有权威性。
要测试你的 DNS 配置,打开一个终端并输入 nslookup jibberish.beacon domain(domain 自行替换为 stager 域名)。如果你得到了一个0.0.0.0 的 A 记录回复——这说明你的 DNS 配置是对的。如果你没有得到回复,那说明你的 DNS 配置不对、DNS Beacon 不会与你通信。
确保你的 DNS 记录引用了你的网络接口的首选地址(primary address)。Cobalt Strike 的 DNS 服务器会一直从你的网络接口的首选地址发送响应。当 DNS 解析器向一台服务器请求信息,却从另一台服务器收到回复时,它往往会丢弃该回复。
如果你在 NAT 设备后面,请确保用你的公网 IP 地址作为 NS 记录,并将你的防火墙设置为转发 53 端口上的 UDP 流量到你的系统。Cobalt Strike 包含一个控制 Beacon 的 DNS 服务器。
译者注:
所谓的「在 NAT 设备后面」,其实就是说团队服务器在内网中的情况。
当启动一个 DNS Beacon 的时候,就相当于 Cobalt Strike 把团队服务器作为了一个 DNS 的解析服务器。当受害主机进行 DNS 请求的时候,就需要给 53 端口发包。如果团队服务器在内网中,
就需要把公网 IP 的 53 端口和内网 IP 做一个端口映射,相当于把外网的 53 端口映射到内网的团队服务器上去。
4.7 SMB Beacon
SMB Beacon 使用命名管道通过一个父 Beacon 进行通信。这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效。Windows 将命名管道通信封装在 SMB 协议中,因此得名 SMB Beacon。
译者注:
所谓的「这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效」是指 SMB
Beacon 通过管道(pipe)进行进程间的数据传递。管道通信的进程可以是本地主机上的两个进程,也可以和远程主机上的进程通过网络进行通信。
要配置一个 SMB Beacon payload,通过 Cobalt Strike → Listeners,点击 Add,选择Beacon SMB 作为你的 payload 选项。
唯一的与 SMB Beacon 相关的选项是 pipename(管道名称)。你可以设置一个明确的管道名称或接受默认选项。
SMB Beacon 与 Cobalt Strike 中派生 payload 的大多数动作兼容。唯一的例外是用户驱动的攻击(例如 Attacks → Packages、Attacks → Web Drive-by)这种要求显式 stager 的。
Cobalt Strike 后渗透和横向移动行为派生一个 payload,会尝试为你承担对 SMB Beacon payload 的控制。如果你手动的运行 SMB Beacon,你将需要从一个父 Beacon 链接到它。
链接和取消链接
从 Beacon 控制台,使用 link [host] [pipe] 来把当前的 Beacon 链接到一个等待连接的 SMB Beacon。当当前 Beacon check in,它的链接的对等 Beacon 也会 check in。
译者注:
前面已经解释过了,所谓的 check in,指的是 Beacon 回连主机,回传受害系统的元数据,准备好进行任务数据通讯的状态。
为了与正常流量融合,链接的 Beacon 使用 Windows 命名管道进行通信。这个流量被封装于 SMB 协议中。对于此方法有一些警告:
1. 具有 SMB Beacon 的主机必须接受 445 端口上的连接。
2. 你只能链接由同一个 Cobalt Strike 实例管理的 Beacon。
如果你在尝试连接一个 Beacon 之后得到一个 error 5(权限拒绝),可以尝试这样解决:窃取域用户的令牌或使用 make_token DOMAIN\user password 来使用对目标系统有效的凭据来填充你的当前令牌,然后再次尝试去连接到 Beacon。
要销毁一个 Beacon 链接,在父会话或子会话中使用 unlink [ip address] [session PID]。[session PID] 参数是要取消链接的 Beacon 的进程 ID。该值用于当有多个子 Beacon 时,指定一个特定的 Beacon 来断开链接。
当你对一个 SMB Beacon 取消了链接,它不会离开并消失。相反,它进入一种等待其他 Beacon 连接的状态。你可以使用 link 命令来从将来的另一个 Beacon 恢复对 SMB Beacon 的控制。
4.8 TCP Beacon
TCP Beacon 使用一个 TCP socket 来通过一个父 Beacon 通信。这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效。
要配置一个 TCP Beacon payload,通过 Cobalt Strike → Listeners,点击 Add 按钮。选择 Beacon TCP 作为你的 payload 选项。
使用这种方法配置的 TCP Beacon 是一个绑定的 payload。一个绑定的 payload 会等待来自它的控制器(在此场景中,控制器是另一个 Beacon 会话)的连接。Port(C2) 选项控制 TCP Beacon 将等待连接的端口。要让它只监听来自本机的连接,请勾选 Bind to localhost only 使 TCP Beacon 绑定到127.0.0.1。
如果你为仅本地的行为使用 TCP Beacon,那么这是一个很好的选项。
类似于 SMB Beacon,TCP Beacon 与 Cobalt Strike 中派生 payload 的大多数动作相兼容。除了一些要求显式 stager 的用户驱动的攻击(比如:Attacks → Packages、Attacks → Web Drive-by)。
Cobalt Strike 后渗透和横向移动行为派生一个 payload,会尝试为你承担对 TCP Beacon payload 的控制。如果你手动的运行 TCP Beacon,你将需要从一个父 Beacon 链接到它。
连接和取消链接
从 Beacon 控制台,使用 connect [ip address] [port] 来把当前的 Beacon 连接到一个等待连接的 TCP Beacon。当当前的会话 check in,它的链接的对等 Beacon 也会 check in。
译者注:
前面已经解释过了,所谓的 check in,指的是 Beacon 回连主机,回传受害系统的元数据,准备好进行任务数据通讯的状态。
要销毁一个 Beacon 链接,在父会话或子会话的控制台中使用unlink [ip address] [session PID]。以后,你可以从同一主机(或其他主机)重新连接到 TCP Beacon。
4.9 外置C2
外置C2 是一种规范,允许第三方程序充当 Cobalt Strike 的 Beacon payload 的通信层。这些第三方程序连接到 Cobalt Strike,来读取供它们使用的帧,并写入由这种受控 payload 产生的输出帧。这些第三方程序使用外置C2 服务器来与你的 Cobalt Strike 团队服务器交互。
转到 Cobalt Strike → Listeners,点击 Add,选择 External C2 作为你的 payload。
外置C2 接口有两个选项。Port(Bind) 指定外置C2 服务器等待连接的端口。勾选Bind to localhost only 以使外置C2 服务器仅本地主机。
外置C2 监听器与其他 Cobalt Strike 监听器不同。这个监听端口其实是一个数据接收端口,没有相关的其他监听器的功能,所以不能用来发一些后渗透指令过去。
要了解有关外置C2 的更多信息,请访问此文档:
https://www.cobaltstrike.com/help-externalc2
4.10 Foreign Listeners
Cobalt Strike 支持对外监听器的概念。
这些是托管在 Metasploit 框架或其他 Cobalt Strike 实例的 x86 payload handler 的别名。要传递一个 Windows HTTPS Meterpreter 会话到一个使用 msfconsole 的朋友那里,建立一个 Foreign HTTPS
payload 并将主机和端口的值指向它们的 handler。你可以在任何你想要使用 x86 Cobalt Strike 监听器的地方使用 foreign listener(对外监听器)。
4.11 基础设施整合
Cobalt Strike 的分布式行动模型的基本思想是为你的每个行动阶段建立单独的团队服务器。比如,将你的后渗透基础设施和持久化基础设施分开。如果一个后渗透行为被发现,这个基础设施将被重建。
一些行动阶段要求多个重定向器和通信通道选项。Cobalt Strike 4.0 对此有非常友好的设计。
译者注:上图中的「配置文件“变体”允许每个出口监听器有不同的指示器」这句话存在翻译错误,更正为「C2 拓展文件“变体”允许每个出口监听器有不同的网络流量指标」。
你可以将多个HTTP、HTTPS 和 DNS 监听器绑定到一个单独的 Cobalt Strike 团队服务器。这些
payload 在它们的配置中也支持端口弯曲(port bending)。这允许在你的重定向器和 C2 设置中使用与你的通信通道(80、443 或 53)共同的端口,但是最好把这些监听器绑定到不同的端口以避免你的团队服务器系统中发生端口冲突。
为了使你的网络流量指标多样化,Cobalt Strike 的 C2 拓展文件可能包含多种变体。变体是一种将当前文件的变量加到一个配置文件中的方法。当你定义每个HTTP 或HTTPS Beacon 监听器时,你可以指定一个配置文件变体。
此外,你可以在一个团队服务器上定义多个 TCP 和 SMB Beacon,每一个都使用不同的管道和端口设置。一旦部署到目标环境中,来自同一团队服务器的任何一个出口 Beacon 都可以控制这些 TCP 和 SMB Beacon 中的任意一个 payload。
4.12 Payload 安全特性
Cobalt Strike 采取措施保护 Beacon 的通信,确保 Beacon 只能接收来自其团队服务器的任务并且只能将结果发送至其团队服务器。
首次设置 Beacon payload 时,Cobalt Strike 会生成一个团队服务器专有的公钥/私钥对。团队服务器的公钥会嵌入 Beacon 的 payload stage。Beacon 使用团队服务器的公钥来加密发送到团队服务器的会话元数据。
Beacon 必须在团队服务器可以发出任务和接收来自 Beacon 会话的输出之前持续发送会话元数据。此元数据包含一个由 Beacon 生成的随机会话密钥。团队服务器使用每个 Beacon 的会话秘钥来加密任务并解密输出。
每个 Beacon 都使用这种相同的方案来实现数据通道。当在混合HTTP 和 DNS Beacon 中使用记录(A、AAAA、TXT)数据通道时,你有和使用HTTPS Beacon 同样的安全保护。
请注意,当 Beacon 分阶段时,payload stager 因为其体积原因,没有这些内建的安全特性。