
该项目是sleep语言与python语言之间的“桥梁”。它允许通过python控制Cobalt Strike团队服务器,而无需使用标准的GUI客户端。注意:该项目目前仍处于BETA阶段。其目标是提供一个测试游乐场,绝非官方支持的功能。也许未来这可以成为核心产品的一部分。
本项目是 Sleep 与 Python 语言之间的“桥梁”。它允许通过 Python 控制 Cobalt Strike 团队服务器,而无需使用标准 GUI 客户端。
注意:本项目仍处于 BETA 阶段。目标是提供一个用于测试的游乐场,绝非官方支持的功能。也许未来可以将其作为核心产品的附加功能。
本项目的灵感来源于 @BinaryFaultline 和 @Mcgigglez16 在项目 https://github.com/emcghee/PayloadAutomation 中的工作。我想向两位表示特别的感谢!!
这座桥梁的核心是一个无头(headless)Cobalt Strike 客户端的 Python 实现。这是通过使用 agscript 提供的 Aggressor Script 控制台作为引擎来实现的。Agscript 允许与 Cobalt Strike 进行无头交互(https://www.cobaltstrike.com/aggressor-script/index.html)。该“桥梁”的工作原理是使用 sleepy.py 中的 Python 辅助函数来生成 agscript 控制台所需的 sleep 命令。与其编写 sleep 函数,striker.py 提供了抽象 sleep 并允许使用 Python 的辅助函数。
由于 PayloadAutomation 项目启发了本项目,因此最初包含了许多相同的代码,但我想将其精简为作为 agscript 包装器所需的组件。
| 项目 | 描述 |
|---|---|
| sleep_python_bridge | 允许 Python 与 Cobalt Strike 交互的库 |
| output/html | html 数据查看器的路径 |
| output/html/data | 数据查看器使用的 json 数据路径 |
| output/payloads | 已保存 payload 的路径(由 payload 生成器使用) |
| payload_scripts | payloadgenerator.py 要加载的外部脚本路径 |
| beaconlogtracker.py | beacon 日志追踪器的实现,使用 HTML 数据网格显示 beacon 日志 |
| payloadgenerator.py | beacon payload 生成器的实现,为每个 listener 创建 payload |
| beacongrapher.py | beacon 图形追踪器的实现,使用 HTML javascript 有向图显示 beacon |
本项目中的示例可能是最容易理解的方式,但脚本 example.py 是其中的关键。
#!/usr/local/bin/python3
## Import the bridge
from sleep_python_bridge.striker import CSConnector
from argparse import ArgumentParser
from pprint import pp, pprint
###################
## Argparse
def parseArguments():
parser = ArgumentParser()
parser.add_argument('host', help='The teamserver host.')
parser.add_argument('port', help='The teamserver port.')
parser.add_argument('username', help='The desired username.')
parser.add_argument('password', help='The teamserver password.')
parser.add_argument('path', help="Directory to CobaltStrike")
args = parser.parse_args()
return args
## Let's go
def main(args):
cs_host = args.host
cs_port = args.port
cs_user = args.username
cs_pass = args.password
cs_directory = args.path
## Connect to server
print(f"[*] Connecting to teamserver: {cs_host}")
with CSConnector(
cs_host=cs_host,
cs_port=cs_port,
cs_user=cs_user,
cs_pass=cs_pass,
cs_directory=cs_directory) as cs:
# Perform some actions
#
# Get beacon metadata - i.e., x beacons() from the script console
beacons = cs.get_beacons()
print("BEACONS")
pprint(beacons)
# Get list of listners - i.e., x listeners_stageless() from the script console
listeners = cs.get_listeners_stageless()
print("LISTENERS")
pprint(listeners)
if __name__ == "__main__":
args = parseArguments()
main(args)
调用脚本
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

Beacon 日志在运行时可在团队服务器上获取,也可通过保存在团队服务器上的 beacon 日志文件获取。数据一直都在,但可能不是以你期望的方式呈现。这是一个日志追踪器示例,使用 HTML 数据网格快速查看 beacon 日志。
beaconlogtracker.py 是一个连接到团队服务器的脚本,每 30 秒提取一次正在运行的 beacon 日志,保存到 beaconlogs.json,并在可搜索、可排序的 HTML 数据网格中显示。
Beacon 日志始终保存在日志目录中,但这是使用备用查看器追踪内存中日志的另一种方式。如果团队服务器重启,内存中的日志将会丢失,你必须查阅团队服务器日志目录中存储的日志。此脚本会将内存中的日志同步到 beaconlogs.json 文件。这样,即使 Cobalt Strike 重启,你也可以快速轻松地可视化所有数据,而无需翻查日志目录。
通过让脚本连接到你的团队服务器来启动它,每 30 秒同步一次日志。
用法:
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
这将使 beaconlogs.json 与保存的和正在运行的 beacon 日志保持同步。它每 30 秒同步一次。
从 output/html 目录启动一个 Web 服务器
python3 -m http.server 8000
访问 http://localhost:8000/beaconlogs.html

红队操作人员经常要求的一个功能是能够以编程方式创建 payload,而无需使用 Cobalt Strike GUI。参考项目通过 payload 生成器实现了这一点。这很好,但存在一个独特的挑战。Aggressor 提供了几个钩子来影响 payload 的构建方式。这些钩子被各种工具包(即 artifact kit、sleep mask kit 或 UDRL kit)使用。通常是通过 GUI 加载 aggressor 脚本来使用它们。本项目进行了扩展,允许加载外部脚本。如果没有这一点,使用这些 payload 钩子将会很困难。这段代码可以很容易地扩展为将 payload 传递给外部函数,以添加自定义混淆、嵌入到用户加载器中,或进行任何其他修改。
payload 生成器脚本连接到团队服务器,加载附加脚本,并创建 payload。
python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike本示例将列出添加 Arsenal kit(启用了 artifact 和 sleep mask kits)的步骤。
cp -r /path/to/arsenal_kit/dist/* /path/to/sleep_python_bridge/payload_scriptspython3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike通常在使用 GUI 时,外部脚本可以使用 println aggressor 函数将信息输出到脚本控制台,这对于反馈或调试非常有用。使用 payloadgenerator.py 时,println 输出会丢失,唯一可用的选项是 elog 函数。使用 elog 时,需要 GUI 才能在事件日志中查看信息。
继续上面的“带外部工具包”用法示例,让我们更新 /path/to/sleep_python_bridge/payload_scripts/arsenal_kit.cna 文件,并将两处 println 改为 elog。进行此更改后,所有 arsenal kit 日志现在都可以在 GUI 事件日志中查看。
并非总是需要加载外部脚本,除非是包含 payload 钩子的 payload 修改脚本(即 artifact、sleep mask 和 udrl kits)。如果你从 Cobalt Strike GUI 加载脚本,payload 将遵循这些来自 GUI 的脚本,但不会遵循来自 agscript 客户端的脚本(它们是不同的客户端)。你必须将脚本和支持文件添加到 payload_scripts 目录中。
payloadgenerator.py 将自动加载位于 payload_scripts 目录顶层的任何 .cna 脚本。位于子目录中的任何 .cna 脚本都不会被加载。
包含 Arsenal Kit 的示例目录结构。
$ ls -1R ./payload_scripts
./payload_scripts:
arsenal_kit.cna
artifact
sleepmask
./payload_scripts/artifact:
artifact32big.dll
artifact32big.exe
artifact32.dll
artifact32.exe
artifact32svcbig.exe
artifact32svc.exe
artifact64big.exe
artifact64big.x64.dll
artifact64.exe
artifact64svcbig.exe
artifact64svc.exe
artifact64.x64.dll
artifact.cna
./payload_scripts/sleepmask:
sleepmask.cna
sleepmask_pivot.x64.o
sleepmask_pivot.x86.o
sleepmask.x64.o
sleepmask.x86.o
感谢 @mgeeky 最近提供的更新,payloadgenerator.py 脚本现在支持额外的参数,以支持 4.8 中新增的 artifact_payload 函数参数。有了这些参数,你可以对生成的 payload 拥有更多控制权。
$ python3 payloadgenerator.py --help
------------------------
Beacon Payload Generator
------------------------
usage: payloadgenerator.py [-h] [-o path] [-l name] [-a arch] [-t types] [-e exit] [-c method] host port username password path
positional arguments:
host The teamserver host.
port The teamserver port.
username The desired username.
password The teamserver password.
path Directory to CobaltStrike
optional arguments:
-h, --help show this help message and exit