在JAVA中盛行的反序列化漏洞中 , 如果将RCE的功能简单的通过Runtime.getRuntime().exec(cmds)这种结构来进行实现可能大概率也不能达到我们的目的 , 所以探索一下Runtime的底层实现 , 使用更加底层且复杂的调用来进行RCE功能的实现相对来说更加的可行概述在RASP等安全产品防护严密的现在 , 普通的寻找Runtime.getRuntime().exec(cmds)的调用已经成为了一件不现实的事情 。
同样的 , 在Java中盛行的反序列化漏洞中 , 如果将RCE的功能简单的通过Runtime.getRuntime().exec(cmds)这种结构来进行实现可能大概率也不能达到我们的目的 , 所以探索一下Runtime的底层实现 , 使用更加底层且复杂的调用来进行RCE功能的实现相对来说更加的可行 。
这里主要是对Java中多种命令执行的方式跟踪源码进行原理分析、构造利用代码、集成自研工具 。
前置首先需要对Java中的反射机制有着基本的掌握
通过反射的方式 , 我们可以获取到任何类的构造方法 , 类方法 , 成员变量 , 且能够获取对应类对象进行对应方法的调用等等目的
- 获取Class类对象对于类对象的获取 , 主要可以通过Class.forName / loadClass的方式来获取 , 值得注意的是 , 在调用Class.forName进行类的加载的时候 , 将会调用static方法
Class.forName("java.lang.Runtime")
- 1.
文章插图
- 获取对应类的构造方法对于获取类的构造方法 , 主要可以通过getConstructor或者getDeclaredConstructor这两种方法来进行实现
文章插图
两者的区别主要是前者不能够反射获取private修饰的构造方法 , 而后者能够获取 。
所以通常使用后者进行构造函数的获取 , 传入的参数就是对应构造方法的参数类 。
clazz.getDeclaredConstructor(type.class)clazz.getConstructor(type.class)
- 1.
- 2.
- 反射获取成员变量和构造方法类似的 , 存在有getField和getDeclaredField两个不同的获取方法 , 区别和构造函数类似 。
clazz.getField(name)clazz.getDeclaredField(name)
- 1.
- 2.
- 反射获取类方法同样具有getMethod和getDeclaredMethod两种 。
- ...............
Runtime.getRuntime().exec("calc");
- 1.
Class.forName("java.lang.Runtime").getMethod("exec", String.class).invoke(runtime, "calc");
- 1.
command跟踪Runtime首先我们跟踪Runtime执行命令的过程 。
文章插图
在这里接收一个String类型的参数 , 调用exec的另一个重在方法对参数进行处理 , 将其通过分隔符 , 将其封装成了数组对象(这里就是一个字符串) 。
文章插图
之后通过参数是String[]类型的另一个重载方法 , 通过调用ProcessBuilder类的方法进行执行 。
文章插图
在ProcessBuilder#start方法中 , 将命令传递给了ProcessImpl#start方法进行处理
文章插图
windows在windows中主要是在ProcessImpl的构造方法中调用了create方法 。
文章插图
。这个create方法是通过win32的方式创建了一个进程 。
推荐阅读
- 如何搭建一个智能客服:从NLP到多轮对话与多流程设计
- 使用 Linux 命令从图像中删除背景
- 从iPhone换到安卓手机是什么体验?过来人给我说了两个结果
- 毕滢|洪欣和张丹峰被曝没离婚,毕滢从中劝和,曝光和洪欣电话聊天内容
- 葡萄酒中的营养成分
- 自动化|要想当领导,从正确的推动开始
- 张丹峰|曝张镐濂仍感激张丹峰原因:从小给父爱,能帮拼事业,是彤彤亲爹
- 央视|从“央视一姐”到“查无此人”的鲁豫,终于落到如今这一下场
- 型男|从“中年油腻大叔”到“阳光时尚型男”只需这3步,不信你不会
- 大学生|北大女生从体制内离职,抑郁症不治而愈,能力并不能左右职场等级