无需GUI客户端通过python控制Cobalt Strike团队服务器

无需GUI客户端通过python控制Cobalt Strike团队服务器

Cobalt Strike Sleep Python Bridge简介

这个项目是 sleep 和 python 语言之间的“桥梁”。它允许通过 python 控制 Cobalt Strike 团队服务器,而无需标准 GUI 客户端。

注意:该项目目前处于 BETA 阶段。目标是为测试提供一个游乐场,绝不是官方支持功能。也许这可能会在未来添加到核心产品中。

该项目的灵感来自@BinaryFaultline 和@Mcgigglez16 在项目
https://github.com/emcghee/PayloadAutomation 中所做的工作。
我要特别感谢你们两个!!

这座桥的核心是一个无头 Cobalt Strike 客户端的 Python 实现。
这是通过使用agscript提供的Aggressor Script Console作为引擎来实现的。
Agscript 允许与 Cobalt Stike ( https://www.cobaltstrike.com/aggressor-script/index.html )进行无头交互。
‘bridge’ 通过使用 sleepy.py 中的 python 辅助函数来生成 agscript 控制台所需的睡眠命令。
与编写 sleep 函数不同,strike.py 提供了辅助函数来抽象 sleep 并允许使用 python。

原始项目的注释更改

因为 PayloadAutomation 项目启发了这一点,所以它从大部分相同的代码开始,但我想将其剥离以使用充当 agscript 包装器所需的组件。

  • 从 Payload_Automation 重命名为 sleep_python_bridge。这个项目不仅仅是payload生成。
  • 从 PyPI 库更改为本地模块。这已停止测试,经过广泛的测试,它可能是 Python 库的一个很好的候选者
  • 更新并添加了帮助程序以匹配攻击者版本
  • 添加加载外部脚本的能力。

包含的库

  • Striker:一组与 Cobalt Strike 交互并执行通常只能通过睡眠/GUI 访问的功能的函数。
  • Sleepy:一组函数,有助于在 Sleep 对象和 Python 对象之间建立桥梁。
  • Compyler:一组用于从平台或跨平台编译各种payload的函数。
  • Artifactor:一组用于检查和审查工件以及收集和跟踪 IoC 的功能。

文件和目录

文件描述
sleep_python_bridge允许 python 与 Cobalt Strike 交互的库
output/htmlhtml 数据查看器的路径
output/html/data数据查看器使用的 json 数据的路径
output/payloads保存的payload的路径(由payload生成器使用)
payload_scripts由payloadgenerator.py加载的外部脚本的路径
payload_scripts.cna用于加载由payloadgenerator.py加载的外部脚本的init脚本
beaconlogtracker.py信标日志跟踪器的实现,使用 HTML 数据网格来显示信标日志
payloadgenerator.py为每个侦听器创建payload的信标payload生成器的实现
beacongrapher.py信标图跟踪器的实现,使用 HTML javascript 定向图到信标

去做

  • 记录暴露的函数
  • 将基于编译的函数从strike.py 移动到compyler.py
  • 添加额外的错误检查,专门针对应用程序依赖项
  • 扩展编译器以包含远程构建和 mingw
  • 向通过 artifactor.py 生成的有效负载添加 IOC 跟踪
  • 处理错误:“用户已连接。”
  • 考虑将其转换为正式的 python 库

如何使用

这个项目中的例子可能是最容易理解的方式
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 ~/cobaltstrike

实际例子

日志追踪器

无需GUI客户端通过python控制Cobalt Strike团队服务器

信标日志可在运行时在团队服务器中或通过保存在团队服务器上的信标日志文件获得。数据始终存在,但可能不会以您想要的方式呈现。这是使用 HTML 数据网格快速查看信标日志的日志跟踪器示例。

beaconlogtracker.py是一个连接到团队服务器的脚本,每 30 秒提取一次正在运行的信标日志,保存到<code>beaconlogs.json`,并显示在可搜索和可排序的 HTML 数据网格中。

信标日志始终保存在日志目录中,但这是使用备用查看器跟踪内存日志的另一种方法。如果团队服务器重新启动,内存中的日志会丢失,您必须参考团队服务器上日志目录中存储的日志。此脚本将日志保存在内存中,同步到文件中beaconlogs.json。通过这种方式,即使重新启动 Cobalt Strike,您也可以快速轻松地将所有数据可视化,而无需翻阅日志目录。

通过让脚本连接到您的团队服务器以每 30 秒同步日志来启动脚本

用法:

python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password ~/cobaltstrike

这将使beaconlogs.json 与保存和运行的信标日志保持同步。每 30 秒同步一次

从 output/html 目录启动网络服务器

python3 http.server

连接到http://localhost:8000/beaconlogs.html

payload生成器

无需GUI客户端通过python控制Cobalt Strike团队服务器

红队操作员经常要求的一项功能是能够在需要 Cobalt Strike GUI 的情况下以编程方式创建payload。参考项目使用payload生成器完成此操作。这很棒,但有一个独特的挑战。Aggressor 提供了几个钩子来影响payload的构建方式。这些挂钩被各种套件(即神器套件、睡眠面罩套件或 UDRL 套件)使用。它们通常通过通过 GUI 加载攻击者脚本来使用。该项目已扩展为允许加载外部脚本。没有这个,使用这个payload钩子将是困难的。可以轻松扩展此代码以将payload传递给外部函数,以添加自定义混淆、嵌入客户加载程序或任何其他修改。

payload生成器脚本连接到团队服务器,加载附加脚本并创建payload。

用法:

  • 使用外部脚本更新payload_scripts.cna(如果需要,请参阅下面关于外部脚本的注释)
  • 将外部脚本添加到 payload_scripts 目录
  • 运行如下命令
python3 payloadgenerator.py 127.0.0.1 50050 payloads password ~/cobaltstrike

注意:加载外部脚本

并非总是需要加载外部脚本,但它用于包含payload挂钩(即,artifiact、sleepmask 和 udrl 套件)的payload修改脚本。如果您从 Cobalt Strike GUI 加载脚本,则payload将接受来自 GUI 的这些脚本,而不是来自 agscript 客户端(这些是不同的客户端)。您必须在 Python 代码中加载脚本。

  • 脚本必须添加到“scripts”目录
  • 数据应该是平坦的以获得最佳文件路径分辨率
  • 目前没有提供任何反馈来让您知道脚本是否已成功加载。您可以使用该elog功能监视事件日志以进行调试。

默认script_resource函数在解析过程中将“/scripts/”添加到路径中。这必须更改或使用预期用途构建路径。如果不更新,此函数会流向加载的脚本,并可能导致奇怪的路径问题。playloadgenerator 脚本有一个内联补丁来帮助解决这个问题。

加载外部脚本的代码参考

striker.py

	def ag_load_script(self, script_path):
		command = f"include(getFileProper('{script_path}'))"
		self.ag_sendline(command)

init.cna

重载script_resource指向脚本目录的根目录

定时

脚本需要时间来加载。目前没有反馈提供让您知道脚本是否已成功加载。您可以使用该elog功能来监视事件日志以进行调试。

cs.ag_load_script(script_path.name)
time.sleep(3) # 允许脚本加载时间

信标绘图仪[Beacon Grapher]

无需GUI客户端通过python控制Cobalt Strike团队服务器

这是将在有向图中显示信标的 beta 代码。

脚本更新文件 output/data/beacons.json

启动一个网络服务器并打开http://localhost:8000/beacons.html

用法:

python3 beacongrapher.py 127.0.0.1 50050 grapher password ~/cobaltstrike

这将创建 javascript 绘图器使用的信标.json 文件。

从 output/html 目录启动网络服务器

python3 http.server

连接到http://localhost:8000/beacons.html

项目地址:

GitHub:
github.com/Cobalt-Strike/sleep_python_bridge

下载地址

①GitHub:

github.com/Cobalt-Strike/sleep_python_bridge.zip

②云中转网盘:

yunzhongzhuan.com/#sharefile=VqNEZsk3_14079
解压密码:www.ddosi.org

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注