weblogic之cve-2015-4852分析(重写)

有时间打算分析weblogic历史漏洞,但是又要面试啥的,没空。又刚好最近面试会问weblogic反序列化。具体啥时候分析weblogic反序列化,可能会在护网后,或者我开学了再分析。期间可能我会分析一下fastjson的吧。环境我都打包到附件中

0x01、环境搭建

不想动手去下载的,可以去网盘这边,我已经打包好了
链接:https://pan.baidu.com/s/1bOo82tAIC0ia95Z0nKQp5w
提取码:1234
复制这段内容后打开百度网盘手机App,操作更方便哦

漏洞环境:https://github.com/QAX-A-Team/WeblogicEnvironment

jdk:https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html

weblogic:

链接:https://pan.baidu.com/s/1I3FUCkuD7lfwdEFo1Yg5hQ
提取码:ungx

docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=wls1036_generic.jar -t weblogic1036jdk7u21 . docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic1036jdk7u21 weblogic1036jdk7u21

weblogic之cve-2015-4852分析(重写)

然后在这里需要去将一些weblogic的依赖Jar包给导出来进行远程调试

docker exec -it weblogic1036jdk7u21 /bin/bash cd /u01/app/oracle/ cp -r middleware/ /root/WeblogicEnvironment-master/ 也可以使用如下命令 docker cp 363:/root . mkdir jar_lib find ./ -name *.jar -exec cp {} jar_lib/ \;

weblogic之cve-2015-4852分析(重写)

这边就导出成功了

0x02、Weblogic远程调试 第一步

修改docker-compose.yml文件,开启8453端口

weblogic之cve-2015-4852分析(重写)

第二步 cd u01/app/oracle/Domains/ExampleSilentWTDomain/bin/ vi setDomainEnv.sh

添加两行代码

debugFlag="true" export debugFlag

这个环境是默认就有了,所以这边只是讲一下

weblogic之cve-2015-4852分析(重写)

最后差不多就这样了,还有其他地方就参考网上文章,我就不一一讲解了

docker exec -it weblogic1036jdk7u21 /bin/bash //进入docker

地址为::7001/console/login/LoginForm.jsp

0x03、RMI通信

在了解RMI前还需要弄懂一些概念。

RMI(RemoteMethodInvocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。

Java本身对RMI规范的实现默认使用的是JRMP协议,也可以选择IIOP协议。而在Weblogic中对RMI规范的实现使用T3协议。

JRMP:JavaRemoteMessageProtocol,Java远程消息交换协议。这是运行在Java RMI之下、TCP/IP之上的线路层协议。该协议要求服务端与客户端都为Java编写,就像HTTP协议一样,规定了客户端和服务端通信要满足的规范。

RMI(Remote Method Invocation)即Java远程方法调用,RMI用于构建分布式应用程序,RMI实现了Java程序之间跨JVM的远程通信。顾名思义,远程方法调用:客户端比如说是在手机,然后服务端是在电脑;同时都有java环境,然后我要在手机端调用服务端那边的某个方法,这就是,远程方法调用;

​ 使用RMI的时候,客户端对远程方法的调用就跟对同一个Java虚拟机(也就是本地)上的方法调用是一样的。一般调用和RMI调用有一点不同,虽然对客户端来说看起来像是本地的,但是客户端的stub会通过网络发出调用,所以会抛出异常;其中还是会涉及到Socket和串流的问题,一开始是本地调用,然后就代理(stub)会转成远程,中间的信息是如何从Java虚拟机发送到另外一台Java虚拟机要看客户端和服务端的辅助设施对象所用的协议而定;使用RMI的时候,需要选择协议:JRMP或IIOP协议;JRMP是RMI的原生的协议,也就是默认JRMP协议。而IIOP是为了CORBA而产生的~~~

远程方法调用,具体怎么实现呢?

远程服务器提供具体的类和方法,本地会通过某种方式获得远程类的一个代理,然后通过这个代理调用远程对象的方法,方法的参数是通过序列化与反序列化的方式传递的,所以,

1. 只要服务端的对象提供了一个方法,这个方法接收的是一个Object类型的参数
2. 且远程服务器的classpath中存在可利用pop链,那么我们就可以通过在客户端调用这个方法,并传递一个精心构造的对象的方式来攻击rmi服务。

某种方式获得远程对象的代理,那么具体是怎么的实现机制呢?RMI模式中除了有Client与Server,还借助了一个Registry(注册中心)。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfyyx.html