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 Strike
的 Linux
软件包包含一个 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 Strike
的Beacon
回连时,它会向 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 /foobar
的 GET
请求。现在,它需要从事务中提取元数据。
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 |
Send data as transaction body | |
uri-append | Append to URI |
header
终止语句将转换后的数据存储在HTTP
头中。parameter
终止语句将转换后的数据存储在HTTP
参数中。此参数始终为作为 URI 的一部分发送。print 语句在事务主体中发送转换后的数据。
print
语句是 http-get.server.output
、http- post.server.output
和 http-stager.server.output
块的预期终止语句。你可以对其他块使用 header
、parameter
、print
和 uri-append
终止语句。
如果你在 httppost.client.output
上使用 header
、parameter
或 uri-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 GET
或POST
事务中。
以下这段代码将强制 Beacon
在发出请求时将 ?bar=blah
参数添加到 /foobar
URI 中。
http-get {client {parameter "bar" "blah";
在客户端或服务器块中使用header
(标头)声明,可在客户端请求或服务器响应中添加任意 HTTP 头。该header
语句添加了一个指标来让网络安全监控团队放心。
http-get {server {header "X-Not-Malware" "I promise!";
配置文件解释器将按顺序解释你的header
和parameter
语句。也就是说,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
选项,可以用空格分隔的字符串指定多个 URI
。Cobalt Strike
的Web
服务器将绑定所有这些 URI,并在构建Beacon
阶段时为每台 Beacon
主机分配其中一个 URI。
即使 useragent
选项存在;你可以使用header
语句来覆盖此选项。
“task_”设置的其他注意事项
tasks_max_size
、tasks_proxy_max_size
和tasks_dns_proxy_max_size
一起创建一个数据缓冲区,以便在签入时传输到beacon
。当beacon
签入时,它会请求准备传输到该beacon
及其子项的任务和代理数据列表。数据缓冲区开始填充任务,然后填充父beacon
的代理数据。然后,它会继续为每个子beacon
提供这种模式,直到没有更多任务或代理数据可用,或者下一个任务或代理数据超出 tasks_max_size
设置的限制。
tasks_max_size
控制填充任务和代理数据的数据缓冲区的最大大小(以字节为单位),以便通过 DNS
、HTTP
、HTTPS
和点对点通信通道将其传输到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-get
和 http-post
指标不会生效。Malleable C2
的 http-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_useragents 和allow_useragents -这些选项配置通过 404 响应阻止或允许的用户代理列表。默认情况下,来自以curl
、lynx
或wget
开头的用户代理的请求都会被阻止。如果两者都指定,则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-get
、http-post
、http-stager
和 httpscertificate
指定变体块来打包当前配置文件的变体。
变体块的指定格式为 [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 Payload 和 Windows 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
检查失败,就意味着你的配置文件确实存在问题。