作者: 飞天魔鬼
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。
引言
之前发了两篇关于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命令进行编码。
往期文章:
0x04 了解更多安全知识
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!