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的更多相关文章

  1. K:java中的RMI(Remote Method Invocation)

    相关介绍:  RMI全称是Remote Method Invocation,即远程方法调用.它是一种计算机之间利用远程对象互相调用,从而实现双方通讯的一种通讯机制.使用这种机制,某一台计算机(虚拟机) ...

  2. Spring Remoting: Remote Method Invocation (RMI)--转

    原文地址:http://www.studytrails.com/frameworks/spring/spring-remoting-rmi.jsp Concept Overview Spring pr ...

  3. java的RMI(Remote Method Invocation)

    RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络 ...

  4. 【杂谈】对RMI(Remote Method Invoke)的认识

    前言 对RMI接触的也比较早,基本上刚学完Java基础不久就机缘巧合遇到了.当时有尝试着去了解,但是没看到比较好的教程,而且对网络编程相关知识不太了解,看了不少文章,也没弄明白.现在对网络和I/O有了 ...

  5. Spring之RMI 远程方法调用 (Remote Method Invocation)

    RMI 指的是远程方法调用 (Remote Method Invocation) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程 ...

  6. Java远程方法调用(Remote Method Invocation,RMI)

    Java RMI简介: 它是Java的一个核心API和类库,允许一个Java虚拟机上运行的Java程序调用不同虚拟机上运行的对象中的方法,即使这两个虚拟机运行于物理隔离的不同主机上. Java RMI ...

  7. RMI(Remote Method Invocation ) 概念恢复

    1.RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象,通俗的说,远程调用就像一个class放在A机器上,然后在B机器中调用这个class的方法. 2.EMI术语 在研究 ...

  8. bubbo调用Failed to invoke remote method异常解决

    bubbo调用服务异常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getPlanFlowInfo, pr ...

  9. com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method解决方法

    报错日记: Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke remote method: getUserAuthLeve ...

随机推荐

  1. kubernetes常见日志采集问题和解决方案分析

    传统日志与kubernetes日志对比 传统服务 目录固定 重启不会丢失 不用关注标准与错误日志输出 容器服务 节点不固定 重启服务会漂移 需要关注标准与错误日志输出 日志文件重启会丢失 日志目录不固 ...

  2. C 函数指针语法总结

    C 函数指针语法总结 函数指针 定义 每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针. 注意:函数指针的本质是一个指针变量,且指针指向的函数的入口地址. 语法 返 ...

  3. List of devices attached 没有手机设备号 解决办法

    问题: cmd下使用adb devices 没有找到手机设备,如下图 解决办法: 采用360手机助手给我们自动安装对应的手机驱动,或者去对应的手机官网下载对应的驱动,这里手机要开启调试模式 我是opp ...

  4. Apache Hudi在华米科技的应用-湖仓一体化改造

    徐昱 Apache Hudi Contributor:华米高级大数据开发工程师 巨东东 华米大数据开发工程师 1. 应用背景及痛点介绍 华米科技是一家基于云的健康服务提供商,拥有全球领先的智能可穿戴技 ...

  5. SpringCloud升级之路2020.0.x版-34.验证重试配置正确性(3)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续上一节针对我们的重试进行测试 验证针对可重试的方法响应超时异常重试正确 我们可以通 ...

  6. 大爽Python入门教程 2-4 练习

    大爽Python入门公开课教案 点击查看教程总目录 方位输出 第一章有一个思考题,方位变换: 小明同学站在平原上,面朝北方,向左转51次之后(每次只转90度), 小明面朝哪里?小明转过了多少圈? (3 ...

  7. 浏览器 Proxy SwitchyOmega 插件设置代理访问内网服务器

    使用Proxy SwitchyOmega 插件通过代理 直接访问到内网网站 一.使用场景 如下图所示,如果在电脑的网络设置中开启代理,每次更换代理就需要进入这里设置改变代理.且我们可能回需求到两个网页 ...

  8. [bzoj1101]Zap

    1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 50001 4 int t,n,m,k,ans,mu[N],vis ...

  9. [51nod1587]半现串

    将s所有长度为d/2的子串放进ac自动机中,直接匹配就可以判定半现串了再对其做一个差分,询问一个前缀的半现串个数,在ac自动机上数位dp,f[i][j][0/1]表示走了i步(i位的字符串),走到节点 ...

  10. class动态样式绑定

    字符串,数组,对象