今年hvv的事了,能有2也是可以,发发...
工具解反反编译
工具链接如下,老外写的可以识别混淆
https://github.com/java-deobfuscator/deobfuscator
点击下载jar包
https://github.com/java-deobfuscator/deobfuscator-gui
点击下载gui
和上面的jar包放在一个目录下,双击gui打开。
对拿到的恶意样本进行检测混淆测试,这个工具只支持jar输入,但是会把里面的class都检测混淆一遍,所以这里把恶意class 压缩到zip里面,改成jar后缀就好了。
选detect 检测 检测到加密算法是zelix
把zelix混淆都加进去
然后选DebugRulesAnalyzer 或者 DeleteUselessClasses 点击run 解混淆 生成一个out.jar 解压打开得到class
这是攻击者混淆后的 a() 反编译不出来
解混淆以后的 a()函数都被成功反编译出来了
可以看到密钥就是k() 函数的值
动态调试解混淆
这里要模仿客户的web环境,可以多准备几个版本的tomcat或者其他中间件
这里用maven 和tomcat 搭建一个debug环境
这里写一个servlet加载类
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
"index",value = "/hello") (name =
public class MyServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
MyClassLoader myClassLoader=new MyClassLoader();
byte[] bytes = Files.readAllBytes(Paths.get("todo.class"));
Class aClass = myClassLoader.defineClass(bytes);
try {
Object o = aClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
new Scanner(System.in).nextLine();
super.doGet(req, resp);
}
}
class MyClassLoader extends ClassLoader{
public Class defineClass(byte[] var1) {
return super.defineClass(var1, 0, var1.length);
}
}
先给newInstance打断点
断到以后再去给defineClass打断点 拿到想要加载的byte,总之这些个混淆的东西最后都是要去触发类加载的。
b 里面就是要加载的类 这里直接 new一个 保存下来即可
new FileOutputStream("1234.class").write(b)
成功解开拿到webshell
最后,感谢一起度过今年hvv的L0ne1y
原文始发于微信公众号(FXDSecurity):一次眼熟的webshell混淆探索(二)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论