0x00 基础概念
学习这个漏洞需要一些前置知识,比如CORBA与RMI
简单的概述一下:
CORBA是OMG制定的一套技术标准,用于分布式应用,其中用到了IDL进行跨语言支持,客户端与服务端之间用IIOP协议进行通信
RMI是另一种分布式应用技术,在JAVA中可以用JNDI进行简化应用,客户端与服务端使用JRMP协议进行通信,不过在weblogic中RMI使用的是T3协议,关于这个之前也爆出过不少漏洞
RMI-IIOP结合了RMI与CORBA各自的优点,通过IIOP协议部署RMI应用
官方文档也提到:
RMI server objects can use the IIOP protocol and communicate with CORBA client objects written in any language
0x01 RMI-IIOP
暂时不提weblogic,先关注一下如何编写一个RMI-IIOP实例:
客户端代码可以参考Java 中 RMI、JNDI、LDAP、JRMP、JMX、JMS那些事儿(上)中的测试项目,可以自己编译HelloClient和HelloServer,也可以用测试项目中编译好的
在命令行启动名称服务器(java自带):start orbd -ORBInitialPort 1050
命令行开启服务端HelloServer并配置远程调试,关于如何用IDEA进行远程调试,可以参考这里开头提到的方法java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 HelloServer
当然不远程调试直接看结果也行,直接启动java HelloServer
命令行开启客户端Java HelloClient
此时会弹出计算器,成功远程调试的话,可以看到如下调用栈
EvilMessage.readObejct()中执行命令
题外话:weblogic的安装与调试文章
那么weblogic中的RMI-IIOP呢?关于 Java 中的 RMI-IIOP这篇文章中有提到关于weblogic RMI-IIOP的利用,在它的基础上进行了一些研究,Using WebLogic’s RMI over IIOP讲到几种weblogic使用RMI-IIOP客户端的几种方式,包括:
1.独立RMI客户端(配合jndi,不使用weblogic的任何东西)
2.WebLogic客户端
3.J2EE clients
4.CORBA/IDL clients
前两种方式的区别,看来只是JNDI_FACTORY设置上的区别