【JavaWeb安全】RMI-Remote Method Invocator
RMI-Remote Method Invocator
什么是RMI?RMI有什么用?
RMI允许用户通过数据传输,调用远程方法,在远程服务器处理数据。例如将1,3传到远程服务器的加法运算器,加法运算器处理后再把结果4传回来,从而实现远程调用。
RMI怎么使用?
- RMI调用
p神的一个图

其中的流程就是开启RMI服务器--》将目标方法绑定到RMI Register上--》cli调用时,先去询问RMI regitser,找到方法对应的名字--》判断是否有目标方法--》有就进行方法调用。
- 获取RMI所有绑定的对象
String[] list = Naming.list("rmi://127.0.0.1:1099");
- RMI和web或者说servlet有很多相似的地方,而且支持多重绑定
private void start() throws Exception{
        RemoteHello remoteHello = new RemoteHello();
        LocateRegistry.createRegistry(1099);
        Naming.bind("rmi://127.0.0.1:1099/Hello",remoteHello);
        Naming.bind("rmi://127.0.0.1:1099/Hello1",remoteHello);
    }
用list可以得到

透过流量包分析rmi
window上的流量太多了,混淆太高,没办法,只能起一个虚拟机

很少做具体流量内容分析,有点吃力。计网的知识还需要落地
捋清了流程就是先和Register建立tcp连接--》发送查询请求--》存在即返回一个端口号,让客户端去访问--》客户端拿着返回的端口去进行RMI--》完成调用
初步了解了RMI,那怎么攻击RMI Register呢?
RMI就是一种对象后台,通过这个后台,我们可以操作绑定的对象。
那我们可不可以对Register进行绑定呢?例如远程给Register绑定一个对象。
try {
            Naming.bind("rmi://10.1.1.1:1099/Hello3", (Remote) new RemoteTest());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException | AlreadyBoundException e) {
            e.printStackTrace();
        }

可以看到当以上述的方式继续绑定一个对象时,是可以实现的。那我不经思考--》如果在我调用前,先绑定一个恶意的对象上去,再去调用岂不是很nice??
但后面发现,似乎会对请求方进行检测,必须为本地绑定才行。。。
对RMI的重思考~~~
RMI Server就是一个服务,可以进行路径或者叫名称绑定,和web类似。操作上没啥高级的
那怎么攻击RMI呢?
按照上面的说法,似乎如果想攻击RMI Register,必须服务器端自带可控对象,不然正常情况下就不可能被攻击。
RMI利用CodeBase进行RCE(简单介绍下)
就是最开始java能在浏览器中运行,类不可能都在本地,所以避免不了远程加载。此时codeBase就是用于指明类的路径,不仅支持类似ClassPath这种本地的,更主要的是可以加载远程的。既然可以加载远程的,那不就gg了。但由于现在基本不可能被利用。所以目前就简要分析下。
从原理分析codebase如何传递到被利用
分析上面抓到的数据包

0xACED 是java反序列化数据
使用NickstaDB / SerializationDumper来分析java的反序列化数据
java -jar SerializationDumper.jar "aced0005770f014183be440000017d6eb0a0238009737d00000002000f6a6176612e726d692e52656d6f74650016524d49536572766572244952656d6f746548656c6c6f70787200176a6176612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174696f6e48616e646c65723b7078707372002d6a6176612e726d692e7365727665722e52656d6f74654f626a656374496e766f636174696f6e48616e646c65720000000000000002020000707872001c6a6176612e726d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e0300007078707732000a556e696361737452656600093132372e302e312e3100008fc704b70c39403fd45e4183be440000017d6eb0a02380010178"
协议格式如下,根据java官方序列化协议的文档进行对照。
STREAM_MAGIC - 0xac ed
STREAM_VERSION - 0x00 05
Contents
  TC_BLOCKDATA - 0x77
    Length - 15 - 0x0f
    Contents - 0x014183be440000017d6eb0a0238009
  TC_OBJECT - 0x73
    TC_PROXYCLASSDESC - 0x7d
      newHandle 0x00 7e 00 00
      Interface count - 2 - 0x00 00 00 02
      proxyInterfaceNames
        0:
          Length - 15 - 0x00 0f
          Value - java.rmi.Remote - 0x6a6176612e726d692e52656d6f7465
        1:
          Length - 22 - 0x00 16
          Value - RMIServer$IRemoteHello - 0x524d49536572766572244952656d6f746548656c6c6f
      classAnnotations
        TC_NULL - 0x70
        TC_ENDBLOCKDATA - 0x78
      superClassDesc
        TC_CLASSDESC - 0x72
          className
            Length - 23 - 0x00 17
            Value - java.lang.reflect.Proxy - 0x6a6176612e6c616e672e7265666c6563742e50726f7879
          serialVersionUID - 0xe1 27 da 20 cc 10 43 cb
          newHandle 0x00 7e 00 01
          classDescFlags - 0x02 - SC_SERIALIZABLE
          fieldCount - 1 - 0x00 01
          Fields
            0:
              Object - L - 0x4c
              fieldName
                Length - 1 - 0x00 01
                Value - h - 0x68
              className1
                TC_STRING - 0x74
                  newHandle 0x00 7e 00 02
                  Length - 37 - 0x00 25
                  Value - Ljava/lang/reflect/InvocationHandler; - 0x4c6a6176612f6c616e672f7265666c6563742f496e766f636174696f6e48616e646c65723b
          classAnnotations
            TC_NULL - 0x70
            TC_ENDBLOCKDATA - 0x78
          superClassDesc
            TC_NULL - 0x70
    newHandle 0x00 7e 00 03
    classdata
      java.lang.reflect.Proxy
        values
          h
            (object)
              TC_OBJECT - 0x73
                TC_CLASSDESC - 0x72
                  className
                    Length - 45 - 0x00 2d
                    Value - java.rmi.server.RemoteObjectInvocationHandler - 0x6a6176612e726d692e7365727665722e52656d6f74654f626a656374496e766f636174696f6e48616e646c6572
                  serialVersionUID - 0x00 00 00 00 00 00 00 02
                  newHandle 0x00 7e 00 04
                  classDescFlags - 0x02 - SC_SERIALIZABLE
                  fieldCount - 0 - 0x00 00
                  classAnnotations
                    TC_NULL - 0x70
                    TC_ENDBLOCKDATA - 0x78
                  superClassDesc
                    TC_CLASSDESC - 0x72
                      className
                        Length - 28 - 0x00 1c
                        Value - java.rmi.server.RemoteObject - 0x6a6176612e726d692e7365727665722e52656d6f74654f626a656374
                      serialVersionUID - 0xd3 61 b4 91 0c 61 33 1e
                      newHandle 0x00 7e 00 05
                      classDescFlags - 0x03 - SC_WRITE_METHOD | SC_SERIALIZABLE
                      fieldCount - 0 - 0x00 00
                      classAnnotations
                        TC_NULL - 0x70
                        TC_ENDBLOCKDATA - 0x78
                      superClassDesc
                        TC_NULL - 0x70
                newHandle 0x00 7e 00 06
                classdata
                  java.rmi.server.RemoteObject
                    values
                    objectAnnotation
                      TC_BLOCKDATA - 0x77
                        Length - 50 - 0x32
                        Contents - 0x000a556e696361737452656600093132372e302e312e3100008fc704b70c39403fd45e4183be440000017d6eb0a023800101
                      TC_ENDBLOCKDATA - 0x78
                  java.rmi.server.RemoteObjectInvocationHandler
                    values
      <Dynamic Proxy Class>
后面的知识区有些模糊,就先不讨论。想了解可以看p神的java安全漫谈
【JavaWeb安全】RMI-Remote Method Invocator的更多相关文章
- K:java中的RMI(Remote Method Invocation)
		相关介绍: RMI全称是Remote Method Invocation,即远程方法调用.它是一种计算机之间利用远程对象互相调用,从而实现双方通讯的一种通讯机制.使用这种机制,某一台计算机(虚拟机) ... 
- Spring Remoting: Remote Method Invocation (RMI)--转
		原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ... 
- java的RMI(Remote Method Invocation)
		RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ... 
- 【杂谈】对RMI(Remote Method Invoke)的认识
		前言 对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了.当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白.现在对网络和I/O有了 ... 
- Spring之RMI 远程方法调用 (Remote Method Invocation)
		RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ... 
- Java远程方法调用(Remote Method Invocation,RMI)
		Java RMI简介: 它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上. Java RMI ... 
- RMI(Remote Method Invocation ) 概念恢复
		1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ... 
- bubbo调用Failed to invoke remote method异常解决
		bubbo调用服务异常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getPlanFlowInfo, pr ... 
- com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method解决方法
		报错日记: Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getUserAuthLeve ... 
随机推荐
- 数字孪生 3D 科技馆的科学传播新模式
			前言 科技馆是一种参与型体验型的博物馆,以传播科学知识.培养公众的科学创新技术为宗旨,并以其生动的展现方式得到公众的广泛欢迎.一直以来,我国科技馆的发展受到各种因素的制约和影响,发展缓慢.如今在我国经 ... 
- 云主机新增swap分区
			云主机内存不够用,如何新增swap 分区. 如何启用swap分区? 步骤如下: 1.查看当前系统中是否已经启用swap分区 1 2 cat /proc/swaps top 2.如果没有启用swa ... 
- python环境搭建、pycharm安装
			一. 实验目标 (1) Python环境搭建 (2) 会pycharm安装和使用 (3) 了解python程序设计流程 二. 实验内容 1.勾选Add Python 3.7 ... 
- python基本数据类型操作
			str 字符串 #1.进行字符串转换 首字母转换成大写 # name = 'wangjianhui' # v = name.capitalize() # print(v) #2. 字符转换小写 # n ... 
- mysql 存储ipv6
			自定义列 https://groups.google.com/g/sqlalchemy/c/lZw0GipVYFw https://docs.sqlalchemy.org/en/14/core/cus ... 
- 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;
			考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ... 
- (五)MySQL函数
			5.1 常用函数 5.2 聚合函数(常用) 函数名称 描述 COUNT() 计数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 .... .... 想查询一 ... 
- win10让人愤怒的磁盘占用100%问题
			升级win10以后其他还好.但是系统经常响应非常非常慢,后来观察发现每次非常卡的时候我的磁盘占用就是100%的. 我是技嘉的B85主板. 1盘是128g的东芝SSD(GPT), 2盘是WD的3TB H ... 
- [bzoj4777]Switch Grass
			结论:最短路径一定是单独的一条边且在最小生成树上,可以用反证法证明.那么求出最小生成树,对于每一个点建立一棵权值线段树,再对每一个权值线段树上的叶子节点开一个multiset,维护所有儿子中该种颜色的 ... 
- [noi706]Sabotage
			先可以将所有出度为0的节点连向一个点,然后问题变为求到这个点的必经之点这其实是一道模板题,因为有一个东西叫做支配树容易发现一个点的必经之点都是一条链,其实可以把这条链上最浅的点作为这个点的父亲,那么一 ... 
