Cobalt Strike 4.8 用户指南-第十一节 C2扩展

11.1、概述

Beacon HTTP 指标由 Malleable Command and Control (Malleable C2) 配置文件控制。Malleable C2 配置文件是一个简单的程序,它指定如何转换数据并将其存储在事务中。转换和存储数据的同一程序(向后解释)也会从事务中提取和恢复数据。

要使用自定义配置文件,你必须启动 Cobalt Strike 团队服务器的时候指定你的配置文件。

./teamserver [external IP] [password] [/path/to/my.profile]

每个 Cobalt Strike 实例只能加载一个配置文件。

查看加载的配置文件

要查看团队服务器启动时加载的 C2 配置文件,选择菜单上的 Help > Malleable C2 Profile。当连接多个 TeamServer 时,这将显示当前所选 TeamServer 的配置文件。对话框为只读。

要关闭对话框,请点击对话框右上角的 "x"。

# 11.2、检查错误

Cobalt StrikeLinux 软件包包含一个 c2lint 程序。 该程序将检查一个通信配置文件的语法,进行一些额外的检查,甚至使用随机数据对你的配置文件进行单元测试。强烈建议你在将配置文件加载进 Cobalt Strike 之前先使用此工具检查你的配置文件。

c2lint 返回并记录指定配置文件的以下结果代码:

  • 如果 c2lint 完成且没有错误,则返回结果 0
  • 如果 c2lint 完成时仅发出警告,则返回结果 1
  • 如果 c2lint 完成且仅出现错误,则返回结果 2
  • 如果 c2lint 完成时同时显示错误和警告,则返回结果 3。

c2lint 输出的最后几行显示检测到的错误和警告的计数。如果未找到任何消息,则不会显示任何消息。输出中显示的错误消息可能多于计数所表示的错误消息,因为单个错误可能会产生 1 个以上的错误消息。这与警告的可能性相同,但可能性较小。例如:

  • [!] Detected 1 warning.

  • [-] Detected 3 errors.

# 11.3、配置文件语言

创建配置文件的最佳方法是修改现有配置文件。Github 上提供了几个示例配置文件:https://github.com/cobalt-strike/Malleable-C2-Profiles

打开配置文件时,你会看到以下内容:

# this is a comment
set global_option "value";

protocol-transaction {
     set local_option "value";

     client {
          # customize client indicators
     }

     server {
          # customize server indicators
     }
}

注释以 # 开始,直至行尾。set语句是为选项赋值的一种方式。配置文件使用 { 大括号 } 将语句和信息组合在一起。语句始终以分号结尾。

为了帮助理解,请看这里的配置文件片段:

此部分配置文件定义了HTTP GET事务的指标。第一个语句, set uri,设定客户端和服务器在此事务期间将引用的URI。此set语句在客户端和服务器代码块之外,因为它适用于它们两者。

client 块为执行 HTTP GET请求的客户端定义指标。在本例中,客户端是 Cobalt Strike Beacon payload

Cobalt StrikeBeacon 回连时,它会向 Cobalt Strike 发送有关自身的元数据。在此配置文件中,我们必须定义如何编码此元数据并通过 HTTP GET 请求发送。

metadata 关键字后跟一组语句,用于指定如何将元数据转换和嵌入到我们的 HTTP GET 请求中。位于metadata关键字后面的一组语句称为数据转换。

Step Action Data
0. Start metadata
1. base64 Base64 Encode bWV0YWRhdGE=
2. prepend "user=" Prepend String user=bWV0YWRhdGE=
3. header "Cookie" Store in Transaction

数据转换中的第一条语句指出,我们将对元数据进行 base64 编码[1],第二个语句 prepend 获取我们编码的元数据,并在其前面加上字符串 user= [2],现在,我们转换后的元数据是"user=" . base64(metadata)。第三个语句指出,我们将转换后的元数据存储到一个名为Cookie[3] 的客户端 HTTP 标头中。这一部分配置文件就是这个意思。

Beacon 及其服务器都使用配置文件。上面我们从 Beacon 客户端的角度解读了配置文件。Beacon 服务器将获取相同的信息并向后解释。假设我们的 Cobalt Strike Web 服务器收到对 URI /foobarGET 请求。现在,它需要从事务中提取元数据。

Step Action Data
0. Start
1. header "Cookie" Recover from Transaction user=bWV0YWRhdGE=
2. prepend "user=" Remove first 5 characters bWV0YWRhdGE=
3. base64 Base64 Decode metadata

header 语句将告诉我们的服务器从哪里恢复转换后的元数据 [1]。HTTP 服务器会为我们解析来自 HTTP 客户端的标头。接下来,我们需要处理 prepend (前置)语句。为了恢复转换后的数据,我们将prepend解释为删除前X个字符 [2],其中 X 是我们添加的的原始字符串的长度。现在,只剩下解释最后一个语句 base64。我们之前使用了 base64 encode 函数来转换元数据。现在,我们使用 base64 decode来恢复元数据 [3]。

一旦配置文件解释器执行完这些逆语句,我们就会得到原始元数据。

# 11.3.1、数据转换语言

数据转换是转换和传输数据的一系列语句。数据转换语句包括:

Statement Action Inverse
append "string" Append "string" Remove last LEN("string") characters
base64 Base64 Encode Base64 Decode
base64url URL-safe Base64 Encode URL-safe Base64 Decode
mask XOR mask w/ random key XOR mask w/ same random key
netbios NetBIOS Encode 'a' NetBIOS Decode 'a'
netbiosu NetBIOS Encode 'A' NetBIOS Decode 'A'
prepend "string" Prepend "string" Remove first LEN("string") characters

数据转换是上述任意语句的组合,顺序不限。例如,你可以选择对要传输的数据进行netbios编码,预置一些信息,然后对整个数据包进行 base64 编码。

数据转换始终以终止语句结尾。在一个数据转换中只能使用一个终止语句。此语句告诉Beacon及其服务器在事务中的哪个位置存储转换后的数据。

有四个终止语句:

Statement What
header "header" Store data in an HTTP header
parameter "key" Store data in a URI parameter
print Send data as transaction body
uri-append Append to URI

header 终止语句将转换后的数据存储在HTTP头中。parameter 终止语句将转换后的数据存储在HTTP

参数中。此参数始终为作为 URI 的一部分发送。print 语句在事务主体中发送转换后的数据。

print 语句是 http-get.server.outputhttp- post.server.outputhttp-stager.server.output 块的预期终止语句。你可以对其他块使用 headerparameterprinturi-append 终止语句。

如果你在 httppost.client.output 上使用 headerparameteruri-append 终止语句,Beacon 会将其响应分块到合理的长度,以匹配事务的此部分。

这些数据块及其发送的数据将在后面的章节中介绍。

# 11.3.2、字符串

Beacon 的配置文件语言允许你在多处使用 "字符串"。一般来说,字符串按原样解释。不过,你可以在字符串中使用一些特殊值:

Value Special Value
"\n" Newline character(换行符)
"\r" Carriage Return(回车)
"\t" Tab character(tab符)
"\u####" A unicode character(Unicode字符)
"\x##" A byte (e.g., \x41 = 'A')(一个字节,比如\x41 = 'A')
"\\" \
# 11.3.3、标头和参数

数据转换是自定义指标过程的重要组成部分。数据转换允许你装饰 Beacon 在每个事务中必须发送或接收的数据。你也可以给每个事务添加额外的指标。

HTTP GET POST 请求中,这些无关的指示符以标头或参数的形式出现。使用client块中的 parameter 语句将任意参数添加到 HTTP GETPOST事务中。

以下这段代码将强制 Beacon 在发出请求时将 ?bar=blah 参数添加到 /foobar URI 中。

http-get {
     client {
          parameter "bar" "blah";

在客户端或服务器块中使用header(标头)声明,可在客户端请求或服务器响应中添加任意 HTTP 头。该header语句添加了一个指标来让网络安全监控团队放心。

http-get {
     server {
         header "X-Not-Malware" "I promise!";

配置文件解释器将按顺序解释你的headerparameter语句。也就是说,WinINet WinHTTP(客户端)和 Cobalt Strike Web服务器对这些指标在事务中的出现位置有最终决定权。

# 11.3.4、选项

你可以通过配置文件配置 Beacon 的默认值。有两种类型的选项:全局选项和本地选项。全局选项可更改全局 Beacon 设置。本地选项特定于事务。你必须在正确的上下文中设置本地选项。使用 set 语句设置选项。

以下是一些选项:

Option(选项) Context(上下文) Default Value(默认值) Changes(改变)
data_jitter 0 Append random-length string (up to data_jitter value) to http-get and http-post server output.(在 http-get 和 http-post 服务器输出中添加随机长度字符串(最多为 data_jitter 值))。
headers_remove Comma-separated list of HTTP client headers to remove from Beacon C2(要从 Beacon C2 中删除的以逗号分隔的 HTTP 客户端标头列表)
host_stage true Host payload for staging over HTTP, HTTPS, or DNS. Required by stagers.(通过 HTTP、HTTPS 或 DNS 暂存的主机paylaod。stagers需要。)
jitter 0 Default jitter factor (0-99%)This property cannot be used when the sleep option is included in the profile.(默认抖动系数 (0-99%)当配置文件中包含睡眠选项时,无法使用此属性。)
pipename msagent_## Default name of pipe to use for SMB Beacon's peer-to- peer communication. Each # is replaced with a random hex value.(用于 SMB Beacon 点对点通信的默认管道名称。每个 # 会被一个随机十六进制值替换。)
pipename_stager status_## Name of pipe to use for SMB Beacon's named pipe stager. Each # is replaced with a random hex value.(用于 SMB Beacon 的命名管道 stager 的管道名称。每个 # 会被一个随机十六进制值替换。)
sample_name My Profile The name of this profile (used in the Indicators of Compromise report)(此配置文件的名称(在 "IoC"报告中使用))
sleep Default sleep time defined as either:seconds jitter (e.g. '20 25') or [n]d [n]h [n]m [n]s [n]j (e.g. '1d 13h 34m 45s 25j')This property cannot be used when the sleeptime and jitter options are included in the profile.(默认睡眠时间定义为秒抖动(例如 "20 25)或[n]d [n]h [n]m [n]s [n]j (例如 "1d 13h 34m 45s 25j)当配置文件中包含睡眠时间和抖动选项时,不能使用此属性。)
sleeptime 60000 Default sleep time (in milliseconds).This property cannot be used when the sleep option is included in the profile.(默认睡眠时间(以毫秒为单位)。当配置文件中包含睡眠选项时,无法使用此属性。)
smb_frame_header Prepend header to SMB Beacon messages(为 SMB Beacon信息预置标头)
ssh_banner Cobalt Strike 4.8 SSH client banner(SSH 客户端Banner)
ssh_pipename postex_ssh_#### Name of pipe for SSH sessions. Each # is replaced with a random hex value.(用于 SSH 会话的管道名称。每个 # 会被一个随机十六进制值替换。)
steal_token_access_mask Blank/0 (TOKEN_ALL_ACCESS) Sets the default used by steal_token beacon command and bsteal_token beacon aggressor script command for the OpenProcessToken functions "Desired Access".Suggestion: use "11" for "TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_QUERY"(设置 steal_token beacon 命令和 bsteal_token beacon aggressor 脚本命令使用的 OpenProcessToken 函数 "Desired Access "的默认值。)
tasks_max_size 1048576 The maximum size (in bytes) of task(s) and proxy data that can be transferred through a communication channel at a check in(签入时可通过通信通道传输的任务和代理数据的最大大小(以字节为单位))
tasks_proxy_max_size 921600 The maximum size (in bytes) of proxy data to transfer via the communication channel at a check in.(签入时通过通信通道传输的代理数据的最大大小(字节)。)
tasks_dns_proxy_max_size 71680 The maximum size (in bytes) of proxy data to transfer via the DNS communication channel at a check in.(签入时通过 DNS 通信通道传输的代理数据的最大大小(字节)。)
tcp_frame_header Prepend header to TCP Beacon messages(为 TCP Beacon报文预置报文头)
tcp_port 4444 Default TCP Beacon listen port(默认TCP Beacon监听端口)
uri http-get, http-post [required option] Transaction URI(事务 URI)
uri_x86 http-stager x86 payload stage URI
uri_x64 http-stager x64 payload stage URI
useragent Internet Explorer (Random) Default User-Agent for HTTP comms.(HTTP 通信的默认User-Agent。)
verb http-get, http-post GET, POST HTTP Verb to use for transaction(用于事务的 HTTP 动词)

使用uri选项,可以用空格分隔的字符串指定多个 URICobalt Strike Web服务器将绑定所有这些 URI,并在构建Beacon阶段时为每台 Beacon 主机分配其中一个 URI。

即使 useragent 选项存在;你可以使用header语句来覆盖此选项。

"task_"设置的其他注意事项

tasks_max_sizetasks_proxy_max_sizetasks_dns_proxy_max_size 一起创建一个数据缓冲区,以便在签入时传输到beacon。当beacon签入时,它会请求准备传输到该beacon及其子项的任务和代理数据列表。数据缓冲区开始填充任务,然后填充父beacon的代理数据。然后,它会继续为每个子beacon提供这种模式,直到没有更多任务或代理数据可用,或者下一个任务或代理数据超出 tasks_max_size 设置的限制。

tasks_max_size 控制填充任务和代理数据的数据缓冲区的最大大小(以字节为单位),以便通过 DNSHTTPHTTPS 和点对点通信通道将其传输到beacon。大多数情况下,默认值都没问题,但在某些情况下,自定义任务会超过最大值而无法发送。例如,如果你使用 execute-assembly,而可执行文件的大小超过 1MB,团队服务器和 beacon 控制台就会显示以下信息。

[TeamServer Console]
Dropping task for 40147050! Task size of 1389584 bytes is over the max task size limit of 1048576 bytes.

[Beacon Console]
Task size of 1389584 bytes is over the max task size limit of 1048576 bytes.

增加tasks_max_size 设置将允许发送此自定义任务。但是,需要重新启动团队服务器并生成新的beacon,因为在生成beacon时,tasks_max_size 会被修补到配置设置中并且无法修改。此设置还会影响beacon分配给进程任务的堆内存量。

最佳实践:

  • 确定将发送到beacon的最大任务大小。这可以通过测试和查找上面的信息来完成,也可以通过调查参与中使用的自定义对象(可执行文件、dll 等)来完成。确定这一点后,在值中添加一些额外的空间。根据上述示例中的信息,使用 1572864(1.5 MB)作为 tasks_max_size。之所以需要额外的空间,是因为较小的任务可能会跟随较大的任务读取响应。
  • 确定task_max_size 值后,更新配置文件中的task_max_size 设置并启动团队服务器并生成beacon可执行文件,部署到目标系统上。
  • 如果你的基础架构需要其他团队服务器生成的beacon通过点对点通信通道相互连接,则应在所有团队服务器上更新此设置。否则,当beacon超过其配置大小时,beacon将忽略请求。
  • 如果你使用的是 ExternaC2 监听器,则需要进行更新,以支持大于默认大小 1MB 的 tasks_max_size

执行大型任务时,应避免与其他任务一起排队,尤其是在使用点对点通信通道(SMB 和 TCP)的beacon上执行大型任务时,因为根据已排队任务的数量和要发送的代理数据,可能会延迟数次签入。原因是,当添加一个任务时,其大小为 X 字节,这就减少了可用于添加其他任务的总可用空间。此外,通过beacon代理数据也会减少发送大型任务的可用空间。任务延迟时,团队服务器和beacon控制台会显示以下信息。

[Team Server Console]
Chunking tasks for 123! Unable to add task of 787984 bytes as it is over the available size of 260486 bytes. 2 task(s) on hold until next checkin.

[Beacon Console]
Unable to add task of 787984 bytes as it is over the available size of 260486 bytes. 2 task(s) on hold until next checkin.

tasks_dns_proxy_max_size (DNS 通道) 和 tasks_proxy_max_size (其他通道) 控制要发送到 beacon 的代理数据的大小(以字节为单位)。这两个设置都需要小于tasks_max_size设置。建议不要修改这些设置,因为默认大小就可以了。这些设置的工作原理是,当需要将代理数据添加到父信标的数据缓冲区时,它使用通道 proxy_max_size 设置减去当前任务长度(可以是正值或负值)。如果为正值,则代理数据将加至该值。如果为负值,则此签入将跳过代理数据。对于子信标,proxy_max_size 会根据处理父信标和先前子信标留下的可用数据缓冲区空间暂时减小。

# 11.4、HTTP Staging

Beacon 是一种分阶段payload。这意味着payload是由stager下载并注入内存的。在 Beacon 进入目标内存之前,你的 http-gethttp-post 指标不会生效。Malleable C2http-stager 模块可自定义 HTTP staging过程。

http-stager {
     set uri_x86 "/get32.gif"; 
     set uri_x64 "/get64.gif";

uri_x86 选项设置用于下载x86 payload stage的 URI。uri_x64选项设置用于下载x64 payload stage的 URI。

client {
     parameter "id" "1234"; 
     header "Cookie" "SomeValue";
}

http-stager 上下文下的 client 关键字定义 HTTP 事务的客户端。使用 parameter 关键字给 URI增加一个参数。使用 header 关键字将标头添加到stager的 HTTP GET 请求中。

server {
     header "Content-Type" "image/gif"; 
     output {
          prepend "GIF89a"; 
          print;
     }
}

http-stager 上下文中的 server 关键字定义了 HTTP 事务的服务器端。header 关键字给服务器响应增加一个服务器头字段。 http-stager 的服务器上下文下的 output 关键字是一个改变 payload stage 的数据转换。这个数据转换仅仅是在 stage 之前添加字符串或给stage增加字符 串。使用 print 终止语句来关闭这个输出语句块。

# 11.5、Beacon HTTP 事务演练

要将所有这一切结合起来,有助于了解 Beacon 事务是什么样子以及每个请求发送哪些数据。

当 Beacon 向 Cobalt Strike 的 Web 服务器发出 HTTP GET 请求时,事务就开始了。此时,Beacon 必须发送包含有关受感染系统的信息的metadata(元数据)。

提示:会话元数据是加密的数据块。如果没有编码,它不适合在标头或 URI 参数中传输。应始终应用 base64、base64url 或 netbios 语句来对元数据进行编码。

Cobalt Strike 的 Web 服务器使用 Beacon 必须执行的任务来响应此 HTTP GET请求。这些任务最初作为一个加密的二进制blob发送。你可以在http-get 的服务器上下文中使用output 关键字转换此信息。

在 Beacon 执行任务的过程中,它会积累输出。所有任务完成后,Beacon 会检查是否有输出要发送。如果没有输出,Beacon 就会进入休眠状态。如果有输出,Beacon 会启动 HTTP POST 事务。

HTTP POST 请求必须在 URI 参数或标头中包含会话 ID。Cobalt Strike 会使用这些信息将输出与正确的会话关联起来。发布的内容最初是一个加密的二进制 blob。你可以在http-post的客户端上下文中使用 output 关键字来转换此信息。

Cobalt Strike 的 Web 服务器可以用任何它喜欢的内容响应 HTTP POST。 Beacon 不会消费或使用此信息。你可以使用 http-post 上下文中server下的output语句块来指定 HTTP POST 的输出。

注意:虽然 http-get 默认使用 GET,http-post 默认使用 POST,但你可以不拘泥于这些选项。使用verb选项可以更改这些默认值。这里有很大的灵活性。

下表总结了这些关键字及其发送的数据:

Request Component Block Data
http-get client metadata Session metadata
http-get server output Beacon's tasks
http-post client id Session ID
http-post client output Beacon's responses
http-post server output Empty
http-stager server output Encoded payload stage
# 11.6、HTTP服务器配置

http-config 块对 Cobalt Strike Web服务器提供的所有 HTTP 响应都有影响。在这里,你可以指定额外的 HTTP 标头和 HTTP 标头顺序。

http-config {
     set headers "Date, Server, Content-Length, Keep-Alive, 
                    Connection, Content-Type"; 
     header "Server" "Apache";
     header "Keep-Alive" "timeout=5, max=100";    
     header "Connection" "Keep-Alive";
     set trust_x_forwarded_for "true";
     set block_useragents "curl*,lynx*,wget*";
}

set headers-该选项指定了这些 HTTP 头信息在 HTTP 响应中的传递顺序。任何不在此列表中的头信息都会被添加到最后。

header -此关键字向 Cobalt Strike 的每个 HTTP 响应添加一个标头值。如果响应中已定义标头值,则忽略此值。

set trust_x_forwarded_for-此选项决定 Cobalt Strike 是否使用 X-Forwarded-For HTTP头来确定请求的远程地址。如果你的 Cobalt Strike 服务器在一个 HTTP 重定向器后,请使用此选项。

block_useragentsallow_useragents -这些选项配置通过 404 响应阻止或允许的用户代理列表。默认情况下,来自以curllynxwget 开头的用户代理的请求都会被阻止。如果两者都指定,则block_useragents将优先于allow_useragents。选项值支持逗号分隔值的字符串。值支持简单的泛型:

Example Description
not specified Use the default value (curl*,lynx*,wget*). Block requests from user agents starting with curl, lynx, or wget.(使用默认值(curl*、lynx*、wget*)。阻止来自以curl、lynx 或wget 开头的用户代理的请求。)
blank (block_useragents) No user agents are blocked.(未阻止任何用户代理。)
blank (allow user_agents) All user agents are allowed.(允许所有用户代理。)
something Block/Allow requests with useragent equal 'something'.阻止/允许用户代理等于 某个"的请求。
something* Block/Allow requests with useragent starting with 'something'.阻止/允许用户代理以 "某个"开头的请求。
*something Block/Allow requests with useragent ending with 'something'.(阻止/允许用户代理以"某个"结尾的 的请求。)
something Block/Allow requests with useragent containing 'something'.(阻止/允许用户代理包含 "某个"的请求。)
# 11.7、使用 SSL Beacon的自签名SSL证书

HTTPS Beacon 在其通信中使用 HTTP Beacon 的指标。Malleable C2 配置文件还可以指定 Beacon C2 服务器的自签名 SSL 证书的参数。如果你想在其 SSL 证书中复制具有独一无二的流量指标的 actor,这将非常有用。

https-certificate {
     set CN   "bobsmalware.com";
     set O    "Bob's Malware";
}

受你的配置文件控制的证书参数为:

Option Example Description
C US Country(国家)
CN beacon.cobaltstrike.com Common Name; Your callback domain(通用名称;你的回调域)
L Washington Locality(地区)
O Fortra, LLC Organization Name(组织名称)
OU Certificate Department Organizational Unit Name(部门名称)
ST DC State or Province(州或省)
validity 365 Number of days certificate is valid for(证书有效天数)
# 11.8、使用 SSL Beacon 的有效SSL证书

你可以选择在 Beacon 中使用有效 SSL 证书。使用Malleable C2 配置文件指定 Java Keystore 文件和Keystore的密码。该Keystore必须包含证书私钥、根证书、任何中间证书以及 SSL 证书供应商提供的域证书。Cobalt Strike 期望你的 Malleable C2 配置文件和 Java Keystore 文件在同一个文件夹中。

使用有效 SSL 证书的参数是:

Option Example Description
keystore domain.store Java Keystore file with certificate information(包含证书信息的 Java Keystore 文件)
password mypassword The password to your Java Keystore(Java keystore的密码)

以下是创建与 Cobalt Strike 的 Beacon 一起使用的有效 SSL 证书的步骤:

1、使用 keytool 程序创建 Java Keystore 文件。该程序会询问 "What is your first and last name?(你的姓和名是什么?)请确保你使用完全限定的域名回答你的 Beacon 服务器。此外,请确保记下密钥库(keystore)的密码。你稍后会用到它。

$ keytool -genkey -keyalg RSA -keysize 2048 -keystore domain.store

2、使用 keytool 生成证书签名请求 (CSR)。你需要把该文件提交给 SSL 证书供应商。他们将验证你的身份并颁发证书。一些厂商比其他厂商在处理此事上更加简单和便宜。

$ keytool -certreq -keyalg RSA -file domain.csr -keystore domain.store

3、导入你的 SSL 供应商提供的根证书和任何中间证书。

$ keytool -import -trustcacerts -alias FILE -file FILE.crt -keystore domain.store

4、最后,你必须安装你的域证书。

$ keytool -import -trustcacerts -alias mykey -file domain.crt -keystore domain.store

现在,你就拥有了一个可以与 Cobalt Strike 的 Beacon 一起使用的 Java Keystore 文件。

# 11.9、配置文件变体

默认情况下,Malleable C2 文件只包含一个配置文件。可以通过为 http-gethttp-posthttp-stagerhttpscertificate 指定变体块来打包当前配置文件的变体。

变体块的指定格式为 [block name] "variant name" { ... }。下面是一个名为My Variant的变体 http-get 块:

http-get "My Variant" { 
    client {
        parameter "bar" "blah";

变体块使用特定的变体块替代配置文件中的默认块来创建当前配置文件的复制。每个唯一的变量名都会创建一个新的变量配置文件。你可以根据需要使用任意数量的变体名填充配置文件。

在配置 HTTP 或 HTTPS Beacon 指标时,可以选择变量。 变量允许绑定到单个团队服务器的每个 HTTP或 HTTPS Beacon 监听器具有互不相同的网络 IOC。

# 11.10、代码签名证书

Payloads -> Windows Stager PayloadWindows Stageless Payload 提供了对可执行文件或 DLL 文件进行签名的选项。要使用此选项,你必须指定一个带有代码签名证书和私钥的 Java Keystore 文件。Cobalt Strike会在与Malleable C2文件相同的文件夹中找到Java Keystore文件。

code-signer {
    set keystore "keystore.jks"; 
    set password "password";
    set alias    "server";
}

代码签名证书设置为:

Option Example Description
alias server The keystore's alias for this certificate(该证书的keystore别名)
digest_algorithm SHA256 The digest algorithm(摘要算法)
keystore keystore.jks Java Keystore file with certificate information(包含证书信息的 Java Keystore 文件)
password mypassword The password to your Java Keystore(java keystore的密码)
timestamp false Timestamp the file using a third-party service(使用第三方服务为文件打上时间戳)
timestamp_url http://timestamp.digicert.com URL of the timestamp service(时间戳服务的 URL)
# 11.11、DNS Beacon

你可以选择使用 Malleable C2 来调整 DNS Beacon/监听器的网络流量。

这些设置包括:

Option Default Value Changes
dns_idle 0.0.0.0 IP address used to indicate no tasks are available to DNS Beacon; Mask for other DNS C2 values(用于指示 DNS Beacon 无任务可用的 IP 地址;其他 DNS C2 值的掩码)
dns_max_txt 252 Maximum length of DNS TXT responses for tasks( DNS TXT 响应的最大长度)
dns_sleep 0 Force a sleep prior to each individual DNS request. (in milliseconds)(在每个 DNS 请求之前强制休眠。(以毫秒为单位))
dns_stager_prepend Prepend text to payload stage delivered to DNS TXT record stager(将文本添加到传递到 DNS TXT 记录 payload stage)
dns_stager_subhost .stage.123456. Subdomain used by DNS TXT record stager.(DNS TXT 记录stager使用的子域。)
dns_ttl 1 TTL for DNS replies(DNS 回复的 TTL)
maxdns 255 Maximum length of hostname when uploading data over DNS (0-255)(通过 DNS 上传数据时主机名的最大长度(0-255))
beacon DNS subhost prefix used for beaconing requests. (lowercase text)(用于beacon请求的 DNS 子主机前缀。 (小写文字))
get_A cdn. DNS subhost prefix used for A record requests (lowercase text)(用于 A 记录请求的 DNS 子主机前缀(小写文本))
get_AAAA www6. DNS subhost prefix used for AAAA record requests (lowercase text)(用于 AAAA 记录请求的 DNS 子主机前缀(小写文本))
get_TXT api. DNS subhost prefix used for TXT record requests (lowercase text)(用于 TXT记录请求的 DNS 子主机前缀(小写文本))
put_metadata www. DNS subhost prefix used for metadata requests (lowercase text)(用于元数据请求的 DNS 子主机前缀(小写文本))
put_output post. DNS subhost prefix used for output requests (lowercase text)(用于输出请求的 DNS 子主机前缀(小写文本))
ns_response drop How to process NS Record requests. "drop" does not respond to the request (default), "idle" responds with A record for IP address from "dns_idle", "zero" responds with A record for 0.0.0.0(如何处理 NS 记录请求。"drop "不响应请求(默认),"idle "响应 "dns_idle "中 IP 地址的 A 记录,"zero "响应 0.0.0.0 的 A 记录。)

当 DNS 服务器响应目标时出现 "Server failure(服务器失败 )"错误时,可以使用 "ns_response"。公共 DNS 解析器可能会发起 NS 记录请求,而 Cobalt Strike Team Server 的 DNS 服务器默认情况下会丢弃这些请求。

{target}      {DNS Resolver} Standard query 0x5e06 A doc.bc.11111111.a.example.com


{DNS Resolver} {target}       Standard query response 0x5e06 Server failure A doc.bc.11111111.a.example.com
# 11.12、谨慎使用 Malleable C2

Malleable C2 为你提供了对网络和主机指标的全新控制级别。有了这种权力也伴随着责任。 Malleable C2 也可能导致操作者犯很多错误。自定义配置文件时,需要考虑以下几点:

  • 每个 Cobalt Strike 实例一次使用一个配置文件。如果你更改配置文件或加载新的配置文件,之前部署的beacon将无法与你通信。
  • 在开发数据转换时,始终要了解数据的状态和协议允许的范围。例如,如果你对元数据进行 base64 编码并将其存储在 URI 参数中,那么它将无法工作。为什么?某些 base64 字符(+= /)在 URL 中具有特殊含义。c2lint 工具和Profile编译器无法检测到这类问题。
  • 即使进行很小的更改,也要始终测试你的配置文件。如果 Beacon 无法与你通信,则可能是你的配置文件存在问题。编辑它,然后重试。
  • 相信 c2lint 工具。该工具超越了配置文件编译器。它的检查以该技术的实现方式为基础。如果 c2lint 检查失败,就意味着你的配置文件确实存在问题。
相关推荐
安全系统学习39 分钟前
快速入门web安全
安全·web安全·网络安全·系统安全
IT-sec2 小时前
tomcat 文件上传 (CVE-2017-12615)
java·安全·web安全·网络安全·tomcat·系统安全
Suckerbin2 小时前
DVWA靶场通过——文件上传漏洞
安全·web安全·网络安全
H轨迹H3 小时前
2024web漏洞扫描神器xray安装及使用_2024-11-28
网络安全·web漏洞
get2004 小时前
tcp、http、rpc的区别
tcp/ip·http·rpc
黑客Jack4 小时前
从攻击视角探讨ChatGPT对网络安全的影响
开发语言·计算机网络·安全·网络安全·php
云起无垠6 小时前
第76期 | GPTSecurity周报
人工智能·网络安全
花姐夫Jun6 小时前
node.js基础学习-http模块-创建HTTP服务器、客户端(一)
学习·http·node.js
广州一芯未来科技有限公司RFID8 小时前
科技惊艳:RFID技术引领被装物联网信息化革新
大数据·开发语言·前端·网络安全·信息与通信·rfid·数字化