一、概述
微服務是目前較為熱門的技術,Spring boot 是 Spring 的一套快速配置腳手架,可以基于Spring boot 快速開發單個微服務,微服務的特點決定了功能模塊分布式部署,在不同的機器上相互通過服務調用進行交互,業務流會經過多個微服務的處理和傳遞。
多個微服務下,微服務的監控顯得尤為重要。Actuator組件為Spring Boot提供對應用系統的監控和管理的集成功能,可以查看應用配置的詳細信息,例如自動化配置信息、創建的Spring beans信息、系統環境變量的配置信以及Web請求的詳細信息等。
? 如果Actuator使用不當或者一些不經意的疏忽,可能造成信息泄露等嚴重的安全隱患。/heapdump作為Actuator組件最為危險的Web接口,如Actuator配置不當,攻擊者可無鑒權獲取heapdump堆轉儲文件,分析heapdump堆轉儲文件進一步獲取敏感信息。
? Actuator 用來對應用系統進行自省和監控的功能模塊,其提供的執行器端點分為兩類:
? 1.原生端點
? 2.用戶自定義擴展端點
? 原生端點主要有:
HTTP 方法 |
路徑 |
描述 |
GET |
/dump |
獲取當前應用的所有線程dump情況。當出現內存占用過高等情況下,可以幫助分析線程的使用情況,幫助定位問題。 |
GET |
/heapdump |
堆轉儲文件 |
GET |
/env |
獲取全部環境屬性 |
GET |
/env/{name} |
根據名稱獲取特定的環境屬性值 |
GET |
/autoconfig |
提供了一份自動配置報告,記錄哪些自動配置條件通過了,哪些沒通過 |
GET |
/configprops |
描述配置屬性(包含默認值)如何注入 Bean |
GET |
/beans |
描述應用程序上下文里全部的 Bean,以及它們的關系 |
GET |
/health |
報告應用程序的健康指標,這些值由 HealthIndicator 的實現類提供 |
GET |
/info |
獲取應用程序的定制信息,這些信息由 info 打頭的屬性提供 |
GET |
/mAppings |
描述全部的 URI 路徑,以及它們和控制器(包含 Actuator 端點)的映射關系 |
GET |
/metrics |
報告各種應用程序度量信息,比如內存用量和 HTTP 請求計數 |
GET |
/metrics/{name} |
報告指定名稱的應用程序度量值 |
POST |
/shutdown |
關閉應用程序,要求 |
GET |
/trace |
提供基本的 HTTP 請求跟蹤信息(時間戳、HTTP 頭等) |
搭建漏洞復現環境:
二、Actuator配置不當
【→所有資源關注我,私信回復“資料”獲取←】
1、網絡安全學習路線
2、電子書籍(白帽子)
3、安全大廠內部視頻
4、100份src文檔
5、常見安全面試題
6、ctf大賽經典題目解析
7、全套工具包
8、應急響應筆記
/heapdump作為Actuator組件最為危險的Web接口之一,如Actuator配置不當,攻擊者可無鑒權獲取heapdump堆轉儲文件,分析heapdump堆轉儲文件進一步獲取敏感信息。 其中 /dump 可獲取線程活動的快照, /heapdump 可獲取堆轉儲文件。
? 堆轉儲文件,是JAVA進程在某個時間點上的內存快照。HeapDump記錄有JVM中堆內存運行的情況,含Java對象、類以及線程棧以及本地變量等信息。
? 通過訪問/dump 路徑,返回線程活動的快照,可看到Springboot線程活動中存在RMI 監聽。
訪問/dump 路徑,效果如下圖所示:
通過訪問/heapdump 路徑,返回 hprof 堆轉儲文件壓縮包。在JVisualVM 打開該堆轉儲文件.hprof ,將泄露站點內存信息,比如后臺用戶的賬號密碼。
訪問/heapdump 路徑,效果如下圖所示:
三、識別版本
Springboot heapdump端點存在版本差異
? Spring boot 1.x版本,默認端點為/heapdump,下載的heapdump文件包含時間以及后綴hprof。
? Spring boot 2.x版本,默認端點為/Actuator/heapdump,需要將下載的heapdump文件加上.hprof后綴。
四、工具選擇
分析堆轉儲文件工具有幾個選擇
? JVisualVM:JDK自帶工具,供開發者用于監視,故障排除。
Eclipse MAT:Eclipse提供的一款Heap Dump分析工具,如使用Eclipse-UI內存崩潰,可使用MAT腳本解析大容量的heap dump。
IBM Heap Analyzer:IBM公司一款分析Heap Dump信息的工具,有效的列舉堆的內存使用狀況,幫助分析Java內存泄漏的原因。
五、OQL查詢語言
因為堆轉儲文件里面含有大量信息,要準確找到我們想要的信息需要借助一些工具和一些查詢技巧。
? Springboot OQL 對象查詢語言是一種結構化查詢語言,將類當作表、對象當作記錄行、成員變量當作表中的字段。通過OQL可以方便快捷的查詢一些需要的信息,加快檢出需要的屬性值。
版本差異
? Spring boot 1.x 版本 heapdump 查詢結果存儲在 java.util.Hashtable$Entry 實例鍵值對中:
? Spring boot 2.x 版本 heapdump 查詢結果存儲在 java.util.LinkedHashMap$Entry 實例鍵值對中:
? 利用password關鍵字檢索,對應的 oql 查詢語句
Eclipse MAT對應查詢語句
? Spring boot 1.x:select * from java.util.Hashtable$Entry s WHERE (toString(s.key).contains("password"))
? Spring boot 2.x:select * from java.util.LinkedHashMap$Entry s WHERE (toString(s.key).contains("password"))
六、具體步驟
此次使用JDK自帶JVisualVM工具,對Heap Dump進行分析,該工具位于<JDK_HOME>/bin/目錄。
JDK自帶工具,如下圖所示:
雙擊打開JVisualVM工具。
其主界面,如下圖所示:
? 通過JVisualVM加載heapdump文件,在概要欄目系統屬性處,可看到部分敏感信息泄露。
部分敏感信息泄露,如下圖所示:
切換至OQL控制臺標簽,在輸入框輸入如下語句,點擊執行進行查詢。
select s.value.toString() from java.util.Hashtable$Entry s where /password/.test(s.key.toString())
查詢結果,如下圖所示:
切換至類標簽,在下方輸入框限制檢索條件java.util.Hashtable,點擊結果中第一項java.util.Hashtable$Entry
查詢結果,如下圖所示:
切換不同的實例進行觀察,在第411項實例發現后臺管理員密碼明文。
管理員密碼明文,效果如下圖所示:
在第409項實例中進一步可看到 MySQL數據庫密碼。
查看MySQL數據庫密碼,效果如下圖所示:
在查找密碼上,可結合網站 /env 或 /Actuator/env 接口,檢索 關鍵詞,使用被星號 遮掩對應的屬性名作為OQL過濾條件。
查看遮擋屬性值,效果如下圖所示:
shiroKey
? 如目標網站使用Shiro安全框架,在過濾規則輸?
org.Apache.shiro.web.mgt.CookieRememberMeManager 尋找 decryptionCipherKey字段,可獲取key,進而rememberMe反序列化利用。
七、防控措施
在代碼白盒審計時,對Springboot項目重點檢測Actuator依賴,對安全依賴及配置進行復查,建議作為漏洞檢出規則加入代碼掃描器。
? 在網絡安全風險自查中,將/heapdump 等敏感路徑加入掃描器字典。
在使用Actuator時,不正確的使用或不經意的疏忽,都會造成嚴重的信息泄露等安全隱患。安全的做法是引入security依賴,打開安全限制并進行身份驗證。同時設置單獨的Actuator管理端口并配置不對外網開放。
引入 security 依賴,打開安全限制,或禁用不需要接口,endpoints.env.enabled= false