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并打印结果
eprintln("foo");测试Sleep statement
help-列出所有命令
load/path/to/script.cna加载脚本
ls-列出已加载的脚本
proffscript.cna禁用脚本的Sleep Profiler
profilescript.cna转储脚本的性能统计信息
pronscript.cna启用脚本的Sleep Profiler
reloadscript.cna重新加载脚本
troffscript.cna禁用脚本的功能跟踪
tronscript.cna启用脚本的功能跟踪
unloadscript.cna卸载脚本
x2 + 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&keystrokesBeacon接收到键盘记录
screenshots&screenshots截图文件啊
services&services服务相关信息
sites&sites资产信息
socks&pivotsSOCKS代理服务以及端口转发
targets&targets主机信息
调用这些函数会返回一个模型中每个条目的数组,每行对于的是一个字典,字典中包含了键与其键值。
要理解这东西最简单的方式就是直接到控制台上手调试了,x命令就是为此准备的,看图
用x命令执行命令表达式,比如说上面的targets()是一个数组信息 用x命令就可以像python中字典一样轻松访问数据。
on keystrokes { println("I have new keystrokes: $1");}
这行代码表示,在接收到键盘记录的时候 就打印I have new keystrokes: 记录的字母
网友评论