cobalt strike 插件开发

2021-03-31  本文已影响0人  风炫安全

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: 记录的字母

上一篇下一篇

猜你喜欢

热点阅读