Elastic Security Labs

Cobalt Strike Beacon 提取器

Python 脚本,用于收集来自 Elasticsearch 集群的安全事件生成的 Cobalt Strike 内存数据,从 CS Beacon 中提取配置,并将数据写回 Elasticsearch。

阅读 5 分钟工具
Cobalt Strike Beacon Extractor

Python 脚本,用于收集来自 Elasticsearch 集群的安全事件生成的 Cobalt Strike 内存数据,从 CS Beacon 中提取配置,并将数据写回 Elasticsearch。

下载 cobalt-strike-extractor.tar.gz

概述

此工具提供了一个 Python 模块和命令行工具,用于搜索 Elastic Endpoint 警报数据中检测到的 Cobalt Strike 和提取的内存数据。如果存在,此工具将使用 cobaltstrike-config-extractor 提取植入配置。然后将信息规范化为 ECS 格式的 JSON 文档,并索引到 Elasticsearch 集群中,或以 JSON 格式输出到终端。

有关创建 Fleet 策略以在 Elastic Stack 中收集和分析 Cobalt Strike Beacon 的帮助,请查看我们详细介绍此内容的博客文章

入门指南

Docker

推荐且最简单的方法是使用 Docker。从此 README 所在的目录,您可以构建本地容器。

docker build . -t cobalt-strike-extractor

接下来,复制 config.reference.yml 并将其命名为 config.local.yml,并为您的环境进行编辑。最小的配置如下例所示。输入和输出可以使用相同的值,但您可以选择将其推送到不同的集群进行分析。

## Using an Elastic Cloud instance (this is a randomly generated example)
input.elasticsearch:
  enabled: True
  cloud.id: security-cluster:dXMtd2VzdDEuZ2NwLmNsb3VkLmVzLmlvJGU0MWU1YTc3YmRjNzY2OTY0MDg2NjIzNDA5NzFjNjFkJDdlYjRlYTJkMzJkMTgzYTRiMmJkMjlkNTNjODhjMjQ4
  cloud.auth: elastic:<PASSWORD>

## Default output will use localhost:9092, see reference config
output.elasticsearch:
  enabled: True
  username: elastic
  password: <PASSWORD>

现在,运行容器,传入我们的本地配置。此处的 -v 标志将信息性消息添加到日志输出。在这里,它告诉我们有多少文档已成功解析和写入。

docker run -ti --rm -v "$(pwd)/config.local.yml:/config.yml" \
    cobalt-strike-extractor:latest -c /config.yml -v

输出:

[2022-01-10T21:33:31.493][INFO] Setting up input/output
[2022-01-10T21:33:31.493][INFO] Connecting to Elasticsearch for input
[2022-01-10T21:33:31.493][INFO] Successfully connected to Elasticsearch for input
[2022-01-10T21:33:31.834][INFO] Connecting to Elasticsearch for output
[2022-01-10T21:33:31.835][INFO] Successfully connected to Elasticsearch for output
[2022-01-10T21:33:33.030][WARNING] Could not parse source as PE file (DOS Header magic not found.)
[2022-01-10T21:33:33.078][WARNING] CobaltStrike Beacon config not found:
[2022-01-10T21:33:33.093][WARNING] Could not parse source as PE file (DOS Header magic not found.)
[2022-01-10T21:33:33.096][WARNING] CobaltStrike Beacon config not found:
[2022-01-10T21:33:33.097][WARNING] Could not parse source as PE file (DOS Header magic not found.)
[2022-01-10T21:33:33.097][WARNING] CobaltStrike Beacon config not found:
[2022-01-10T21:33:33.097][WARNING] Could not parse source as PE file (DOS Header magic not found.)
[2022-01-10T21:33:33.098][WARNING] CobaltStrike Beacon config not found:
[2022-01-10T21:33:33.186][WARNING] Could not parse source as PE file (DOS Header magic not found.)
[2022-01-10T21:33:33.191][WARNING] CobaltStrike Beacon config not found:
[2022-01-10T21:33:33.461][WARNING] Could not parse source as PE file (DOS Header magic not found.)
[2022-01-10T21:33:33.516][WARNING] CobaltStrike Beacon config not found:
[2022-01-10T21:33:33.927][INFO] Wrote 2 docs to Elasticsearch

此处的 [WARNING] 消息是预期的。这些只是不包含配置信息的源文档。

按时间筛选

要限制按时间范围搜索,您可以添加 --since 参数,该参数接受 ISO 格式的日期时间字符串,或者您可以使用 Elastic 日期数学。例如,要将搜索限制为最近 30 天,您可以执行以下操作。

docker run -ti --rm -v "$(pwd)/config.local.yml:/config.yml" \
    cobalt-strike-extractor:latest --since "now-30d/d" -c config.local.yml

将输出管道传输到其他工具

最后,您可以将输出管道传输到其他命令,例如 jq 以进行本地分析。您还可以使用环境变量覆盖配置文件值。

docker run -i --rm -a stdin -a stdout -a stderr \
    -v "$(pwd)/config.local.yml:/config.yml" \
    -e "OUTPUT_ELASTICSEARCH_ENABLED=False" \
    -e "OUTPUT_CONSOLE_ENABLED=True" cobalt-strike-extractor:latest -c /config.yml -q | jq  '.cobaltstrike.server.hostname'

在上面的示例中,我们禁用 Elasticsearch 输出并使用环境变量启用控制台输出。我们使用 -q 标志(隐藏警告)使输出更加安静。然后,我们使用 jq 仅提取配置的“hostname”值。

本地运行

如上所述,Docker 是运行此项目的推荐方法,但是您也可以在本地运行它。此项目使用 Poetry 来管理依赖项、测试和元数据。如果您已经安装了 Poetry,则可以从此目录中简单地运行以下命令来运行该工具。这将设置一个虚拟环境,安装依赖项,激活虚拟环境并运行控制台脚本。

poetry lock
poetry install
poetry shell
cobalt-strike-extractor --help

一旦可以运行,您就可以执行与上面 Docker 说明中提到的相同操作。