“冰蝎”是一个动态二进制加密网站管理客户端。在我们的攻防运用中越来越多,特征也被各大杀软加入特征库,于是想自己深入研究,修改一波。
传输解密分析
我们从原始的冰蝎jsp马看起,Class U 继承了ClassLoader类,Class g 传入字节数组b[] 。这里我们看下defineClass方法,
由此猜测冰蝎远程传输的是一个类的字节码,进行类的导入与实例化。
先执行whoami命令,看下冰蝎传输的包体。
POST发送的是一个经过AES加密、base64编码的POST数据。
用JAVA写了个解密
可以看到,是个class的字节码,并且里面有我们执行系统命令的指令,我们转换成java文件。(但这里的whoami在保存成JAVA文件不知道为啥看不到了。)
可以看面传输的类中有equals方法,我们回到shell.jsp中。
整句代码的意思就可以理解了,实例化经过base64解码,AES解密的类,并执行equals方法。
继续跟踪equals方法,发现里面有个runCmd()方法。
这里应该是执行系统命令的方法。
后面就是把执行结果和status放在map里返回。
冰蝎客户端分析
接下来分析冰蝎客户端的命令执行。
执行whoami命令,在ul.controller#getCurrentCmd方法中断点。
持续跟进至返回结果,这里是把前面的执行路径去掉,只取执行的系统命令。
持续跟进,重点在requestAndParse()方法,是负责发送数据与处理数据的方法。
里面有个sendPostRequestBinary方法,我们继续逐步跟踪调试。
获取当前代理方式,如果有设置代理是从这里判断。
设置请求为POST方法。
这里是设置请求头配置的地方,比如header-agent等。我们可以在常量文件里设置修改。
这里有个writedata是我们发送的POST数据 ,具体data数据内容我们在后面分析。
POST请求包的设置到这里就结束了,我们可以看到burp中与发送数据是一致的,说明我们找对了。
跟踪到这里差不多就结束了,后面就是对返回包进行解密与解码的操作。
返回了一个含有执行结果与状态的map。
还有个疑点,之前的data发送的是什么。再重新进行调试。
跟进到getdata方法,先判断类型是否为jsp,寻找对应的class类。
这里有个获取Class方法,根据className=Echo,这里应该传输的是一个Echo.class
在payload文件夹发现对应的echo.java。
整体的分析流程只分析了一小部分有关流量传输与执行命令的,后续有时间会出其他部分与整体思路。