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 说明中提到的相同操作。