天天看點

借助DNS解析來檢測Java反序列化漏洞

本文講的是<b>借助DNS解析來檢測Java反序列化漏洞</b>,

借助DNS解析來檢測Java反序列化漏洞

安全問題中最重要的是什麼,我們認為重要的就是確定資料來源的安全性和對敏感資料的保護。

域名系統(DNS)是關聯網址(如www.makeuseof.com)和IP位址(54.221.192.241)的系統。當你使用浏覽器通路一個網站,它會向DNS伺服器發送你輸入的位址請求,然後DNS伺服器會指出其正确的IP位址,這是網際網路如何工作的一個關鍵部分。但是DNS中的資訊經常會發生洩漏。

Java 對象序列化是 JDK 1.1 中引入的一組開創性特性之一,用于作為一種将 Java 對象的狀态轉換為位元組數組,以便存儲或傳輸,不過我們還可以将位元組數組轉換回 Java 對象原有的狀态。這種特性給我們帶來了友善,但是也給我們帶來了危險。

如果我們傳輸的序列化資料中途被截獲,截獲方通過反序列化就可以獲得裡面的敏感資料,比如DNS的資訊,甚至對裡面的資料進行修改然後發送給接收方。

目前,Java反序列化漏洞已被大家所熟知。盡管如此,我們仍然會遇到這類型的漏洞,不過我們可以使用一些工具來識别出這些漏洞。大多數識别工具依賴于指令執行API。但是,由于作業系統的環境限制,有效載荷的指令有時也會失敗。另外,使用的指令有時也會丢失,或者有效載荷的指令會由于所安裝版本所需的參數不同而發生變化,例如GNU netcat vs OpenBSD netcat所需的參數。

由于執行指令的上述限制,檢測這些漏洞就不可避免的需要做許多嘗試。由于每個漏洞都不得不發送多個有效載荷,是以要實作Java 反序列化漏洞的檢測是非常困難的。不過,我們可以自定義一個通用的有效載荷,将進行大規模檢測。不過在介紹我們的這個檢測方法之前,讓我們先說明一下這個檢測所針對的有效載荷的運作環境:

YSoSerial(于java反序列化工具)生成的大多數載荷都符合這些條件:

借助DNS解析來檢測Java反序列化漏洞

檢測思路的調整

例如,我們發現了一個老的由5.1.0 GA – EOL支援JBoss樣本,并且還對外開放了JMXInvokerServlet接口。根據我們的經驗,這個JBoss樣本應該存在Java 反序列化漏洞。但我們利用所有已知的漏洞測試工具對這個JBoss樣本進行測試,但沒有發現漏洞。

測試失敗存在兩種可能性:一是這些工具在這個特定的環境中起不到檢測效果,二是目标系統已經打了更新檔。然而,我們利用一個簡單的有效載荷進行了DNS查詢,發現DNS已經洩露,這就證明我們的猜想是對的。是以現在,我們要通過對DNS洩露的檢測來進行漏洞檢測,不過要避免指令執行API。

建立一個檢測DNS洩露的工具

為了确認建立的工具可用,我們将修改YSoSerial提供的一個現成工具。

接下來,我們将使用一個簡單的代碼來代替指令執行載荷,該代碼将觸發一個DNS解析。使用的最常見的一個有效載荷是Commons Collection。其中,“Transformer”鍊會觸發下面的代碼:

Transformer鍊(使用了指令執行載荷):

觸發的代碼:

不過不能使用nslookup指令觸發DNS解析,因為我們是希望避免使用指令執行API的,是以隻能直接使用Java API。唯一的特殊要求是代碼序列必須使用telescopic API,換句話說,代碼序列不能使用臨時變量。

下面是修改過的Transformer鍊(使用了DNS解析載荷):

Transformer鍊相當于以下的Java代碼。它将嘗試啟動HTTP連接配接,但這裡的關鍵問題是要觸發DNS解析:

确認檢測目标中是否存在Java 反序列化漏洞

現在,我們就生成一個可以解析唯一主機名的工具。唯一的名稱可以確定我們跟蹤伺服器,以監控是否進行了任何反序列化的操作。伺服器可能會對Java 反序列化漏洞進行多次評估這個漏洞,或延遲評估。另外,使用唯一主機名可以避免檢測時所産生的混亂,尤其是掃描多台主機時。在ysoserial中,已經有可用的完整POC代碼:

如果收到DNS查詢,則證明存在Java 反序列化漏洞。記錄DNS查詢請求的工具很多,如 DNS chef,Burp Collaborator或tcpdump。在下面的檢測中,我們使用DNS Chef來記錄查詢請求:

借助DNS解析來檢測Java反序列化漏洞

一旦确認有漏洞被檢測到,為了得到一個SHELL指令,我們還需要繼續做一些嘗試來觸發一些錯誤指令。下面,就是一些擷取SHELL指令的方法: 

1.確定你已經測試了各種反向shell指令

2.“Common collection”載荷在某些特定的JVM中可能會失敗(如IBM J9)

3.如果目标強制執行了一個安全管理器,你可能需要制作一個自定義的檢測工具。你可以通過“DEADCODE’s blog article”去了解transformer鍊的大概情況。目前比較流行的做法是找到Web根目錄的路徑,并編寫一個可以延遲執行的web shell。不過這個工具隻有在目标環境中的安全管理器阻止指令執行時才會用到。

工具視訊示範

以下是我們開發的Break Fast Serial工具的簡短示範,視訊示範了如何對單個Web伺服器進行掃描,使得Java 反序列化漏洞通過DNS 洩露被最終确認。該工具還支援在掃描模式下,同時對多個IP和端口進行掃描。該掃描器将會對JBoss,Weblogic和Jenkins等易受攻擊的版本進行檢測。

總結

DNS滲透檢測有三個好處:

1.它可以提升反序列化漏洞檢測的效率,

2.它可以同時對多台主機進行自動掃描,

3.即使目标伺服器處于最嚴密的防火牆環境中,它也會識别出Java 反序列化漏洞。

那麼要怎麼安全的使用序列化呢?

針對開頭提到的兩點,我們有如下思路:

1.避免傳遞敏感資料,在對象中,可以使用關鍵字修飾敏感資料的變量,這樣它就不會寫入到序列化流中。

2.對資料進行先簽名後加密的政策。如果非要傳遞敏感資料,那就使用這個方法,别人也就無法解密以及僞造。

原文釋出時間為:2017年4月6日

本文作者:xiaohui 

本文來自雲栖社群合作夥伴嘶吼,了解相關資訊可以關注嘶吼網站。

<a href="http://www.4hou.com/technology/4054.html" target="_blank">原文連結</a>