CVE-2018-2628 Weblogic反序列化POC重构详解

01 背景

Oracle官方在修补老的Weblogic反序列化漏洞时,将已经在互联网上暴露的PoC都加入了黑名单,所以若是绕过他的黑名单限制就依旧可以触发命令执行。接下来我们简单分析一下本次漏洞的成因,具体的weblogic反序列化漏洞原理这里不做具体分析,之后可以分享一次专题。这里我们来看看InboundMsgAbbrev中resolveProxyClass的实现,resolveProxyClass是处理rmi接口类型的,只判断了java.rmi.registry.Registry,其实随便找一个rmi接口即可绕过。

其实核心部分就是JRMP(Java Remote Methodprotocol),在这个PoC中会序列化一个RemoteObjectInvocationHandler,它会利用UnicastRef建立到远端的tcp连接获取RMI registry,加载回来再利用readObject解析,从而造成反序列化远程代码执行。

02 PoC重构

由于互联网上公开的poc,是通过服务器向rmi远程服务器获取命令执行代码从而执行命令并通过t3协议的回报告诉我们是否存在漏洞。但是这样的poc有很明显存在不能控制权限的问题。rmi远程服务器的命令执行代码我们不可控,并且会暴露我们有漏洞的资产,所以我们必须把poc重构成无风险的,也就是将rmi远程服务器改成自己的。

但是我们也知道,java会将对象序列化成字节码,如何在字节码中找到我们需要修改的ip和端口成为了一个问题。以下是我们的解决方法以及可以提供反序列化漏洞的一些研究方案。

我们可以通过 SerializationDumper(https://github.com/NickstaDB/SerializationDumper)将字节码的strut解析成我们更容易理解的格式。

由此我们可以过滤大部分构造poc所需要的java对象,根据功能直接定位到java.rmi.server.RemoteObject的content值。

将其hex解码后复制到010Editor里

结合之前SerializationDumper解析的字节码的格式我们可以大胆猜测 104.251.228.50前的000E为ip长度,000E转成10进制就是14,所以我们可以知道该字段为ip长度,相应的IP之后的为端口号7001。

通过查阅oracle的标准文档(https://docs.oracle.com/javase/10/docs/specs/serialization/index.html)我们可以了解到java反序列化字节码为对象的流程以及字节码的一些struct构造。我们可以由SerializationDumper的源码看出字节码事实上是二进制结构体嵌套结构体的产物。

我们在这里只需要把poc的rmi远程服务器指向我们自己的服务器即可。

由于存在嵌套关系,所以外层长度也需要修改为修改后的长度。

剩下的就是在远程服务器上启用ysoserial.exploit.JRMPListener,JRMPListener会将含有恶意代码的payload响应至请求方,也就是从在漏洞的weblogicserver。

$ java -cp ysoserial-0.0.5-SNAPSHOT-all.jarysoserial.exploit.JRMPListener 8888 CommonsCollections1 calc

03 后记

本文主要提供了对java序列化后字节码的一种研究方案,便于大部分人理解序列化和反序列化的原理,也便于后续漏洞的分析,有问题和想法的同学欢迎和我们共同探讨交流。

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-04-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习_散列函数与散列表

1855
来自专栏python3

python .pyc是个什么啥?

我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言...

1201
来自专栏积累沉淀

Javascript模块化编程(一)

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。 网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测...

37210
来自专栏Java帮帮-微信公众号-技术文章全总结

Java并发编程,一定要有自己的理解【面试+工作】

编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的...

1567
来自专栏IMWeb前端团队

【原译】javascript中的错误处理

本文作者:IMWeb ouven 原文出处:IMWeb社区 未经同意,禁止转载 【原译】javascript中的正确错误处理 A Guide to P...

2449
来自专栏Golang语言社区

Golang使用pprof监控性能及GC调优

作者:峰云就她了 链接:http://xiaorui.cc/?p=3000 來源:个人博客

3453
来自专栏性能与架构

mysql 一个表装入内存需要多少空间?

一个表装入内存所需空间 = 表行数 * 一行的大小 这就是为什么在设计表字段的数据类型时要非常计较 例如 (1)对于固定长度列,应使用char而不是varcha...

2896
来自专栏瓜大三哥

​UVM(九)之sequencej机制续1

UVM(九)之sequencej机制续1 当一个sequence启动起来之后,UVM会自动执行sequence的body任务,所以要产生各种和杨的激励,就要写好...

25010
来自专栏欧阳大哥的轮子

iOS的MVC框架之控制层的构建(上)

在我前面的两篇文章里面分别对MVC框架中的M层的定义和构建方法进行了深入的介绍和探讨。这篇文章则是想深入的介绍一下我们应该如何去构建控制层。控制层是联系视图层和...

1132
来自专栏FreeBuf

挖洞经验 | 如何在一条UPDATE查询中实现SQL注入

前段时间,我在对Synack漏洞平台上的一个待测试目标进行测试的过程中发现了一个非常有意思的SQL注入漏洞,所以我打算在这篇文章中好好给大家介绍一下这个有趣的漏...

2465

扫码关注云+社区

领取腾讯云代金券