工具开发|CobaltStrike插件编写入门(三)

作者: 飞天魔鬼
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

引言

之前发了两篇关于cs插件编写的基础文章,写的是杀软判断的功能,用到的都是sleep脚本基础语法,这次想写一篇关于sleep脚本的高级用法的文章,那就是使用sleep脚本调用java对象。
本篇主要用sleep脚本调用java对象来实现一个powershell_encoder的功能。

项目源码:https://github.com/gooderbrother/Sleep_powershell_encoder

0x01 JavaObject介绍

sleep可以通过对象表达式来创建、访问和查询JAVA对象。该功能可以说是sleep脚本中最为实用的功能了。

对象表达式放在方括号之中,第一个参数被称作“目标”(target),第二个参数被称作“消息”(message)。sleep会自动将对象表达式的返回值转换为sleep变量。

[target message]
target可以为sleep变量、java class或者是其他的对象表达式。

对象表达式可以接收参数,参数之间使用逗号隔开,参数和消息之前使用冒号隔开。栗子如下:

[target message: argument, argument, ...]
[[System out] println: "Hello World!"];

效果:
在这里插入图片描述
上面println例子中,对象表达式[System out]作为了外部对象表达式的目标(target),消息(message)为println,参数为“Hello World!”。

当然同样可以使用完整的java类名称来指定target。

[[java.lang.System out] println: "Hello World!"];

以上代码内部对象表达式为完整的class name,如果去掉java.lang程序是无法运行的。

0x02 powershell_encoder实现

平时用的比较多的是一个在线的powershell_encode的网站,但是觉得太麻烦,使用sleep编写不仅可以省去打开网站复制粘贴的时间,还可以当成插件直接集成在cs之中。

pwershell encode的原理为先将字符串转换为UTF-16LE,然后再对其进行base64编码。使用java可以首先使用getBytes方法以UTF16LE读取,然后使用Base64库对其进行base64编码。代码如下:

$s = @ARGV[0];
$s_utf16 = [$s getBytes: "utf-16LE"];
$s_utf16_base64 = [[java.util.Base64 getEncoder] encodeToString: $s_utf16];
println("待加密字符串:\n".$s."\n加密后字符串:\n".$s_utf16_base64."\nlauncher command:\npowershell.exe -exec bypass -enc ".$s_utf16_base64);

上述代码为sleep脚本代码,经过稍微的修改即可集成在cna插件之中。

0x03 效果截图

在这里插入图片描述

将以上代码稍作修改集成进cna插件即可实现使用cs来直接对powershell命令进行编码。

往期文章:

CobaltStrike 插件编写入门教程

CobaltStrike插件编写之语言陷阱(一)

CobaltStrike 插件编写入门教程(二)

0x04 了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_42282189/article/details/121804080