cobalt strike 插件开发

0x01 agscript简介

 

agscriptAggressor Script的简写。

 

agscriptCobaltStrike 3.0之后版本中内置的脚本语言,利用Aggresor编写脚本可轻松地武装您的CobaltStrike客户端。

 

agscript是一种简单脚本语言,主要用于红队编写针对肉鸡的攻击脚本。 它有两个作用,

一是可以用来对自己的肉鸡做持久性控制。

二是可以用来扩展或修改Cobalt Strike客户端以满足您的个性化需求。

cobalt strike agscript的官方文档:

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

 

0x02 如何使用

0x0201 加载脚本

agscript内置于Cobalt Strike 客户端, 如果需要长期使用agscript, 请移步Cobalt Strike客户端 -> Script Manager and press Load功能。

image.png

 

0x0201 脚本控制台

Cobalt Strike提供了交互式的脚本控制台。 通过控制台可跟踪,配置,调试以及管理脚本。

可以通过View- > Script Console获得进入agscript控制台。

 

image.png

image.png

 

命令 参数 作用
? "foo" 即 "foobar" 测试Sleep predicate并打印结果
e println("foo"); 测试Sleep statement
help - 列出所有命令
load /path/to/script.cna 加载脚本
ls - 列出已加载的脚本
proff script.cna 禁用脚本的Sleep Profiler
profile script.cna 转储脚本的性能统计信息
pron script.cna 启用脚本的Sleep Profiler
reload script.cna 重新加载脚本
troff script.cna 禁用脚本的功能跟踪
tron script.cna 启用脚本的功能跟踪
unload script.cna 卸载脚本
x 2 + 2 执行表达式并返回结果

 

 

0x0203命令行使用agscript

您也许会希望在在没有GUI的情况下启动Cobalt Strike,客户端压缩包中的agscript这个脚本文件能够满足您的需求,连接命令:

./agscript [host] [port] [user] [password]

上述命令可以使您快捷的连接到团队的服务器,当然,如果您希望加载agscript脚本还可以这样写参数:

./agscript [host] [port] [user] [password] [/path/to/script.cna]

上述命令可以连接团队服务器并运行您的脚本,下面给出一段demo代码:

on ready {
    println("Hello World! I am synchronized!");
    closeClient();
}

image.png

0x0204 交互式操作

agscript显示输出同样使用了Sleep&println, &printAll, &writeb, 以及&warn这四个函数,这些函数均可在控制台输出内容。

大多数语言都可以注册快捷命令,agscript也不例外,使用command即可创建命令:

command foo {
    println("Hello $1");
}

这段代码将会注册命令foo,脚本控制台会自动解析命令的参数,并按空格将它们拆分为参数,$1是第一个参数,$2是第二个参数,依此类推。用户可以使用“双引号”来创建带空格的参数。 如果这种解析对您可能会对输入执行造成破坏性的操作,请使用$0访问传递给命令的原始文本。


image.png

 

0x0205 控制台文本颜色

如果你想给Cobalt Strike的控制台添加一些色彩,通过\c\U\o转义即可告诉Cobalt Strike如何格式化文本。 值得提醒的是这些转义仅在双引号字符串内有效。

\cX就是告诉Cobalt Strike你想输出什么颜色,X是颜色的值:

image.png

 

0x03 cobalt strike客户端

cobalt strike 内置的default.cna(https://www.cobaltstrike.com/aggressor-script/default.cna) 就是定义了工具栏是如何显示的,并且规定了脚本控制台中的命令等等

image.png

 

本章将向您展示这些功能的工作流程,并使您能够根据需要打造自己的Cobalt Strike客户端。

 

0x0301 快捷键绑定

使用bind可以快速的绑定快捷键,如果说我们像做一个按ctrl+P的快捷键打印出hello fengxuan的程序,我们该如何实现?

bind Ctrl+P {
    show_message("hello fengxuan!")
}

 

加载后,按ctrl+p 就打印出

image.png

快捷键可以是任何ASCII字符或特殊键,快捷方式可能会应用一个或多个修饰符,修饰符修饰符仅为以下几个特定按键:Ctrl,Shift,Alt,Meta。脚本可以指定修饰符+键。

 

0x0302 弹出菜单

 

cobalt strike 可以使用popup 这个关键字来实现我们自定义的弹窗。我们来举个例子:

menubar("风炫测试tab2", "newtab", 1);
popup newtab {
        item("&我的主页", { url_open("https://evalshell.com/"); });
        separator();
        separator();
        item("&About", { openAboutDialog(); });
}

这个例子就是新建一个风炫测试tab2的tab标签,然后下面有两个下拉菜单,分别是我的主页和about,点击我的主页就会跳转到https://evalshell.com/

image.png

0x0303 自定义输出

agscript中的set关键字定义了如何格式化事件并将其输出呈现给客户端。 以下是set关键字的demo:

set EVENT_SBAR_LEFT {
    return "[" . tstamp(ticks()) . "] " . mynick();
}
set EVENT_SBAR_RIGHT {
    return "[lag: $1 $+ ]";
}

上面的代码定义了Cobalt Strike的事件日志(View -> Event Log)中状态栏的内容,此状态栏的左侧显示当前时间和您的昵称,右侧显示了Cobalt Strike客户端和团队服务器之间的消息往返时间。

Cobalt Strike中默认的各种设置都可以通过统一的方法来修改覆盖。

 

0x0304 事件管理

使用on这个关键字可以为事件定义处理程序,当Cobalt Strike连接到团队服务器并准备代表您行动时,就绪事件将触发。demo:

on ready {
    show_message("Ready for action!");
}

使用* meta-event可查看再Cobalt Strike中发生的所有事件。

on * {
    local('$handle $event $args');
    $event = shift(@_);
    $args  = join(" ", @_);
    $handle = openf(">>eventspy.txt");
    writeb($handle, "[ $+ $event $+ ] $args");
    closef($handle);
}

 

 

0x04 数据API

teamserver  服务器存储了所有主机,服务,凭据等信息信息。

 

0x0401 数据模型

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

command dumpallinfo {
    local('$handle $model $row $entry $index');
    $handle = openf(">fengxuan.txt");
    foreach $model (data_keys()) {
        println($handle, "== $model ==");
        println($handle, data_query($model));
    }
    closef($handle);
    println("See fengxuan.txt for the data.");
}

 

image.png

image.png

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

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

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

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

image.png

用x命令执行命令表达式,比如说上面的targets()是一个数组信息 用x命令就可以像python中字典一样轻松访问数据。

 

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

这行代码表示,在接收到键盘记录的时候 就打印I have new keystrokes: 记录的字母

 

 

posted @ 2021-03-31 18:40  风炫安全  阅读(884)  评论(0编辑  收藏  举报