cobalt strike 插件开发
0x01 agscript简介
agscript
为Aggressor Script
的简写。
agscript
是CobaltStrike 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
功能。
0x0201 脚本控制台
Cobalt Strike
提供了交互式的脚本控制台。 通过控制台可跟踪,配置,调试以及管理脚本。
可以通过View
- > Script Console
获得进入agscript
控制台。
命令 | 参数 | 作用 |
? | "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();
}
0x0204 交互式操作
agscript
显示输出同样使用了Sleep
的&println
, &printAll
, &writeb
, 以及&warn
这四个函数,这些函数均可在控制台输出内容。
大多数语言都可以注册快捷命令,agscript
也不例外,使用command
即可创建命令:
command foo {
println("Hello $1");
}
这段代码将会注册命令foo,脚本控制台会自动解析命令的参数,并按空格将它们拆分为参数,$1是第一个参数,$2是第二个参数,依此类推。用户可以使用“双引号”来创建带空格的参数。 如果这种解析对您可能会对输入执行造成破坏性的操作,请使用$0访问传递给命令的原始文本。
0x0205 控制台文本颜色
如果你想给Cobalt Strike
的控制台添加一些色彩,通过\c
,\U
和\o
转义即可告诉Cobalt Strike
如何格式化文本。 值得提醒的是这些转义仅在双引号字符串内有效。
\cX
就是告诉Cobalt Strike
你想输出什么颜色,X是颜色的值:
0x03 cobalt strike客户端
cobalt strike 内置的default.cna(https://www.cobaltstrike.com/aggressor-script/default.cna) 就是定义了工具栏是如何显示的,并且规定了脚本控制台中的命令等等
本章将向您展示这些功能的工作流程,并使您能够根据需要打造自己的Cobalt Strike
客户端。
0x0301 快捷键绑定
使用bind可以快速的绑定快捷键,如果说我们像做一个按ctrl+P的快捷键打印出hello fengxuan的程序,我们该如何实现?
bind Ctrl+P {
show_message("hello fengxuan!")
}
加载后,按ctrl+p 就打印出
快捷键可以是任何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/
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.");
}
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
命令就是为此准备的,看图
用x命令执行命令表达式,比如说上面的targets()是一个数组信息 用x命令就可以像python中字典一样轻松访问数据。
on keystrokes {
println("I have new keystrokes: $1");
}
这行代码表示,在接收到键盘记录的时候 就打印I have new keystrokes: 记录的字母