0x01 概述
任何行动的第一步都是建立基础设施。就 Cobalt Strike 而言,基础设施由一个或多个团队服务器、重定向器以及指向你的团队服务器和重定向器的 DNS 记录组成。一旦团队服务器启动并运行,你将需要连接到它并将其配置为接收来自受害系统的连接。监听器就是 Cobalt Strike 中用来执行这种任务的机制。
一个监听器既是一个 payload 的配置信息,同时又是 Cobalt Strike 起一个服务器来接收来自这个payload 的连接的指示。一个监听器由用户定义的名称、payload 类型和几个特定于 payload 的选项组成。
0x02 监听器管理
要管理 Cobalt Strike 的监听器,通过 Cobalt Strike → Listeners 。这会打开一个标签页,列举出所有你的配置的 payload 和监听器。
Cobalt Strike 4.0:
下图是 Cobalt Strike 3.12中的监听器管理标签页,对比可以看到 4.0 多了 bindto 和 profile字段:
按 Add 按钮来创建一个新的监听器。
当你创建一个监听器,确保你给他一个好记的名称。在 Cobalt Strike 的命令和工作流程中你需要使用此名称来引用此监听器。
要编辑监听器,选中一个监听器,然后按 Edit 。
要移除一个监听器,选中该监听器,然后按 Remove 。
0x03 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 行动,比如使其流量看起来像其他的恶意软件,又或者将其流量掺入作为合法流量。
0x04 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 服务器上托管 payloadstage。这种设置有助于提升行为安全(避免反溯源),因为如果开启了 staging(分阶段),任何人都能连到你的服务器上,请求一个 payload、并分析它的内容,从而可以从你的 payload 配置中获取信息。
在 Cobalt Strike 4.0 及以后的版本中,后渗透和横向移动的行为避开了 stager 并选择去尽可能的投递一个完整的 payload。如果你禁用了 payload staging(分阶段),那么除非你准备做后渗透那么你应该不会注意到此变动。
0x05 HTTP Beacon 和 HTTPS Beacon
默认设置情况下,HTTP 和 HTTPS Beacon 通过 HTTP GET 请求来下载任务。这些 Beacon 通过 HTTP POST 请求传回数据。你也可以通过 C2 拓展文件来极尽可能的控制这个 payload 的行为和流量指标。
要起一个 HTTP 或 HTTPS Beacon 监听器,通过 Cobalt Stike → Listeners 。点击 Add 按钮,选择 Beacon HTTP 作为你的 payload 选项。
4.0:
3.14:
按 [+] 来为 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) 字段指定你的 HTTPBeacon 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 提供多个回连主机。使用重定向器还有助于提升行为安全,因为它会使溯源团队服务器的真实地址变得更加困难。
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
0x06 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 就有数据回来了。常规的 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 类型。
Cobalt Strike 13.3 DNS Beacon 选项(作为对照):
点击 [+] 来添加一到多个与 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 解析器从一台服务器请求信息,但是从另一台服务器接收回复时,DNS 解析器往往会丢弃回复。
如果你在 NAT 设备后面,请确保用你的公网 IP 地址作为 NS 记录,并将你的防火墙设置为转发53端口上的 UDP 流量到你的系统。Cobalt Strike 包含一个控制 Beacon 的 DNS 服务器。
所谓的「在 NAT 设备后面」,其实就是说团队服务器在内网中的情况。
当启动一个 DNS Beacon 的时候,就相当于 Cobalt Strike 把团队服务器作为了一个 DNS 的解析
服务器。当受害主机进行 DNS 请求的时候,就需要给53端口发包。如果团队服务器在内网中,
就需要把公网IP的53端口和内网IP做一个端口映射,相当于把外网的53端口映射到内网的团队服
务器上去。
0x07 SMB Beacon
SMB Beacon 使用命名管道通过一个父 Beacon 进行通信。这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效。Windows 将命名管道通信封装在 SMB 协议中。因此得名 SMB Beacon。
所谓的「这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效」是指 SMB
Beacon 通过管道( pipe )进行进程间的数据传递。管道通信的进程可以是本地主机上的两个进
程,也可以和远程主机上的进程通过网络进行通信。
要配置一个 SMB Beacon payload,通过 Cobalt Strike → Listeners 。点击 Add 。选择 BeaconSMB 作为你的 payload 选项。
Cobalt Strike 13.3 SMB Beacon(用于对照):
唯一的与 SMB Beacon 相关的选项是 pipeame (管道名称)。你可以设置一个明确的管道名称或接受默认选项。
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 链接到一个等待连接的 SMBBeacon。当当前 Beacon check in,它的链接的对等 Beacon 也会 check in。
前面已经解释过了,所谓的 check in ,指的是 Beacon 回连主机,回传受害系统的元数据,准备好进行任务数据通讯的状态。
为了与正常流量融合,链接的 Beacon 使用 Windows 命名管道进行通信。这个流量被封装于 SMB 协议中。对于此方法有一些警告:
-
- 具有 SMB Beacon 的主机必须接受445端口上的连接。
-
- 你只能链接由同一个 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 的控制。
0x08 TCP Beacon
TCP Beacon 使用一个 TCP socket 来通过一个父 Beacon 通信。这种对等通信对同一台主机上的Beacon 和跨网络的 Beacon 都有效。
Cobalt Strike 13.3 TCP 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] [sessionPID]
。以后,你可以从同一主机(或其他主机)重新连接到 TCP Beacon。
0x09 外置 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
0x0a Foreign Listeners
Cobalt Strike 支持对外监听器的概念。
这些是托管在 Metasploit 框架或其他 Cobalt Strike 实例的 x86 payload handler 的别名。要传递一个Windows HTTPS Meterpreter 会话到一个使用 msfconsole 的朋友那里,建立一个 Foreign HTTPSpayload 并将主机和端口的值指向它们的 handler。你可以在任何你想要使用 x86 Cobalt Strike 监听器的地方使用 foreign listener(对外监听器)。
0x0b 基础设施整合
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。
0x0c 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 因为其体积原因,没有这些内建的安全特性。