翻译+实践
原文地址:
https://www.cobaltstrike.com/agscript-script/index.html
agscript
?(agscript
为Aggressor Script的简写,直译攻击者脚本通篇读起来怪怪的,故保留。)
agscript
是CobaltStrike 3.0
之后版本中内置的脚本语言,利用Aggresor
编写脚本可轻松地武装您的CobaltStrike
客户端。
agscript
是Armitage
的开源脚本引擎Cortana
的精神继承者。 因为DARPA
的Cyber Fast Track
计划才使Cortana
成了可能。 Cortana
支持开发者通过Armitage
的团队服务器扩展Armitage
并控制Metasploit Framework
及其功能。 当然,Cobalt Strike 3.0
并不是以Armitage
为基础的重写的。 这次大弧度的版本升级是为了重新审视Cobalt Strike
,并围绕Cobalt Strike
的功能进行重构。 产物就是agscript
的诞生。
agscript
是一种简单脚本语言,主要用于红队编写针对肉鸡的攻击脚本。 它有两个作用,一是可以用来对自己的肉鸡做持久性控制,二是可以用来扩展或修改Cobalt Strike
客户端以满足您的个性化需求。
agscript
是以Cobalt Strike 3.0
为基础的。 Cobalt Strike 3.0
中绝大部分菜单/按钮事件都是由agscript
引擎支撑。 Strategic Cyber LLC
尚未为Cobalt Strike
的大多数功能写API
,也就是说,agscript
目前仍处于起步阶段。 在未来,我们也期待看到agscript
的发展壮大。这份文档也会随着时间的推移而变动。
agscript
内置于Cobalt Strike
客户端, 如果需要长期使用agscript
, 请移步Cobalt Strike
客户端 -> Script Manager and press Load
功能。
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 | 执行表达式并返回结果 |
您也许会希望在在没有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(); }
agscript
是基于Raphael Mudge
的Sleep
语言的二次开发的。原手册见:
http://sleep.dashnine.org/manual
(译者注:Sleep是一种基于java开发的脚本语言)
Sleep
能做的agscript
都能做,下面是一些注意事项:
Sleep
的语法,运算符甚至俚语都与Perl
极其类似,简单说一个他们的区别,Sleep
需要的语句之间需要有空格,以下代码无效:
$x=1+2; # this will not parse!!
正确的语法是这样的:
$x = 1 + 2;
Sleep的变量有标量,字符串,各自类型的数字,Java对象引用,函数,数组以及字典等。 以下是Sleep中的常见的几种变量:
$x = "Hello World"; $y = 3; $z = @(1, 2, 3, "four"); $a = %(a => "apple", b => "bat", c => "awesome language", d => 4);
使用@
和%
函数即可创建数组和字典,数组和字典不仅可以引用其他数组和字典,还可以可以引用自己。
Sleep
的注释以#
开头,直到结束。
Sleep
会插入双引号的字符串,这意味着以\$符号开头的任何以空格分隔的标记都将替换为其值。 特殊变量$+
将插字符串与另一个值连接起来。
println("\$a is: $a and \n\$x joined with \$y is: $x $+ $y");
运行结果为:
$a is: %(d => 4, b => 'bat', c => 'awesome language', a => 'apple') and $x joined with $y is: Hello World3
这儿有一个和println
类似的函数叫warn
,不同的是warn
输出的内容中包含了当前代码的文件名和行数,对于开发者来说,调试定位错误特别方便。
使用sub字符即可声明函数,传给函数的参数标记为$1
,$2
,一直到$n
。函数可以接受无数个参数。 变量@_
是一个包含所有参数的数组,$1
,$2
等变量的更改将改变@_
的内容。
sub addTwoValues { println($1 + $2); } addTwoValues("3", 55.0);
运行结果:
58.0
在Sleep语法中,函数是任何其他对象的首选类型,下面语法您可以会常见到:
$addf = &addTwoValues;
$addf
变量引用了&addTwoValues
函数,调用并传参可以这样写:
[$addf : "3", 55.0];
这括号的表示方法还可用于操作Java对象,需要了解更多建议您阅读上面提到的Sleep手册,以下语句是等效的:
[$addf : "3", 55.0]; [&addTwoValues : "3", 55.0]; [{ println($1 + $2); } : "3", 55.0]; addTwoValues("3", 55.0);
Sleep有三变量范围:全局变量,特殊变量,本地变量。Sleep手册中的介绍更为详细一些,这里不做赘述。 示例中看到local('$x $y $z')
中的$x
,$y
和$z
就是当前函数的本地变量,并且当函数返回时它们的值将重置。
更多Sleep相关的语法结构请参考官方手册。
agscript
显示输出同样使用了Sleep
的&println
, &printAll
, &writeb
, 以及&warn
这四个函数,这些函数均可在控制台输出内容。
大多数语言都可以注册快捷命令,agscript
也不例外,使用command
即可创建命令:
command foo { println("Hello $1"); }
这段代码将会注册命令foo,脚本控制台会自动解析命令的参数,并按空格将它们拆分为参数,$1是第一个参数,$2是第二个参数,依此类推。用户可以使用“双引号”来创建带空格的参数。 如果这种解析对您可能会对输入执行造成破坏性的操作,请使用$0访问传递给命令的原始文本。
如果你想给Cobalt Strike
的控制台添加一些色彩,通过\c
,\U
和\o
转义即可告诉Cobalt Strike
如何格式化文本。 值得提醒的是这些转义仅在双引号字符串内有效。
\cX
就是告诉Cobalt Strike
你想输出什么颜色,X是颜色的值:
\U
是告诉控制台添加下划线,\o
则是重置这些花里胡哨的东西。
agscript
引擎是糅合到Cobalt Strike
的功能之一,Cobalt Strike
的绝大部分对话框和功能都是以独立模块的形式编写的,并面向agscript引擎开放了一些接口。
内置的脚本default.cna就定义了工具栏的按钮,弹出的菜单等等。
本章将向您展示这些功能的工作流程,并使您能够根据需要打造自己的Cobalt Strike
客户端。
使用bind即可快速绑定关键字,这里加上我们要按Ctrl+H快捷输出一个Hello Word该怎么写?看代码:
bind Ctrl+H { show_message("Hello World!"); }
快捷键可以是任何ASCII字符或特殊键,快捷方式可能会应用一个或多个修饰符,修饰符修饰符仅为以下几个特定按键:Ctrl,Shift,Alt,Meta。脚本可以指定修饰符+键。
使用agscript可以添加或是重新定义CoblatStrike菜单,popup这个关键字即为Hook弹出菜单的语句。
看一个添加菜档的demo代码:
popup help { item("&Homepage", { url_open("https://www.cobaltstrike.com/"); }); item("&Support", { url_open("https://www.cobaltstrike.com/support"); }); item("&Arsenal", { url_open("https://www.cobaltstrike.com/scripts?license=" . licenseKey()); }); separator(); item("&System Information", { openSystemInformationDialog(); }); separator(); item("&About", { openAboutDialog(); }); }
如上图所示,脚本新添件并定义了多个按钮事件,点击机制执行对应代码。
再看看如何添加子菜单:
popup pgraph { menu "&Layout" { item "&Circle" { graph_layout($1, "circle"); } item "&Stack" { graph_layout($1, "stack"); } menu "&Tree" { item "&Bottom" { graph_layout($1, "tree-bottom"); } item "&Left" { graph_layout($1, "tree-left"); } item "&Right" { graph_layout($1, "tree-right"); } item "&Top" { graph_layout($1, "tree-top"); } } separator(); item "&None" { graph_layout($1, "none"); } } }
如果你想覆盖已存在的菜单,使用&popup_clear函数清除其他已注册的菜单项,并代码新定义的菜单弹出选项。
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中默认的各种设置都可以通过统一的方法来修改覆盖。
使用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); }
转自先知社区
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.