趙長松,余華興,賀 勝,董 緯,王 玉
(國網(wǎng)重慶市電力公司江北供電公司,重慶401147)
Java反序列化漏洞利用工具的實現(xiàn)
趙長松,余華興,賀 勝,董 緯,王 玉
(國網(wǎng)重慶市電力公司江北供電公司,重慶401147)
通過對Java反序列化漏洞形成原因及利用原理的研究,結(jié)合RMI編程技術(shù),自主設(shè)計漏洞掃面及漏洞利用算法,并實現(xiàn)了針對WebLogic中間件的漏洞利用工具,包含自動掃描探測漏洞以及系統(tǒng)命令執(zhí)行、文件上傳等功能。通過實際測試,該工具能準確地發(fā)現(xiàn)存在的漏洞主機并有效地利用漏洞執(zhí)行相關(guān)操作,在一定程度上可幫助運維人員及時修補安全隱患,提高業(yè)務(wù)系統(tǒng)防護水平。
反序列化;RMI;漏洞掃描;漏洞利用;WebLogic
Java是一種可以編寫跨平臺應(yīng)用程序的純面向?qū)ο蟮某绦蛟O(shè)計語言。該語言技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺、科學超級計算機、移動電話和互聯(lián)網(wǎng)。與傳統(tǒng)程序不同,Java語言在推出之際就作為一種開放的技術(shù)。全球數(shù)以萬計的Java開發(fā)公司被要求所設(shè)計的Java軟件必須相互兼容?!癑ava語言靠群體的力量而非公司的力量”是Sun公司的口號之一,并獲得了廣大軟件開發(fā)商的認同。
序列化就是把對象轉(zhuǎn)換成字節(jié)流,便于保存在內(nèi)存、文件、數(shù)據(jù)庫中;反序列化即逆過程,由字節(jié)流還原成對象[1]。Java中的ObjectOutputStream類的writeObject()方法可以實現(xiàn)序列化,ObjectInput Stream類的readObject()方法用于反序列化。如果Java應(yīng)用對用戶輸入,即不可信數(shù)據(jù)做了反序列化處理,那么攻擊者可以通過構(gòu)造惡意輸入,讓反序列化產(chǎn)生非預(yù)期的對象,非預(yù)期的對象在產(chǎn)生過程中就有可能帶來任意代碼執(zhí)行[2-4]。
基于Java語言的應(yīng)用系統(tǒng)在國內(nèi)的應(yīng)用范圍比較廣,支撐著很多企業(yè)的核心業(yè)務(wù)。因此,2015年11月6日,F(xiàn)oxGlove Security安全團隊發(fā)布的博客中介紹的Java反序列化漏洞產(chǎn)生了巨大影響。Java反序列化漏洞是利用Apache Commons Collec tions這個常用的Java庫來實現(xiàn)任意代碼執(zhí)行,可以用來攻擊最新版的WebLogic,WebSphere,JBoss,Jen kins,OpenNMS等Java應(yīng)用。Apache Commons Col lections包含了很多開源的工具,用于解決平時編程經(jīng)常會遇到的問題,減少重復勞動。該漏洞出現(xiàn)的根源在Apache Commons Collections組件中,對于集合的操作存在可以進行反射調(diào)用的方法,并且Ob jectInputStream類在反序列化時,沒有對生成對象的類型進行限制以及任何校驗。
2.1 工具簡介
Java反序列化漏洞利用工具是基于Java反序列化漏洞,針對WebLogic中間件進行漏洞利用。在基于Java的分布式應(yīng)用中,遠程方法調(diào)用(remote method invocation,RMI)技術(shù)默認使用序列化和反序列化來完成所有的交互。此外,WebLogic是通過T3協(xié)議來傳輸序列化的類,只要能訪問WebLogic,就可以使用,不需要加載遠程類。因此,利用RMI技術(shù)編寫包含Apache Commons Collections組件的接口,并通過T3協(xié)議來完成工具和服務(wù)器之間的通信,就可以利用漏洞完成相關(guān)操作[5]。
RMI是jdk1.1中引入的分布式對象軟件包,支持存儲于不同地址空間的程序級對象之間彼此進行通信,實現(xiàn)遠程對象之間的無縫遠程。RMI目前使用Java遠程消息交換協(xié)議(java remote messaging protocol,JRMP)進行通信,其開發(fā)的應(yīng)用系統(tǒng)可以部署在任何支持Java運行環(huán)境(java run environ ment,JRE)的平臺上。此外,RMI可利用標準Java本機方法接口JNI與現(xiàn)有的和原有的系統(tǒng)相連接。RMI還可利用標準JDBC包與現(xiàn)有的關(guān)系數(shù)據(jù)庫連接[6]。RMI/JNI和RMI/JDBC相結(jié)合,可使RMI與目前使用非Java語言的現(xiàn)有服務(wù)器進行通信,而且在需要時可擴展Java在這些服務(wù)器上的使用。
RMI工作過程如圖1所示。RMI由4個主要的類組成:遠程對象的本地接口、遠程對象實現(xiàn)、RMI客戶機和RMI服務(wù)器。RMI服務(wù)器生成遠程對象實現(xiàn)的1個實例,并用1個專有的URL注冊。RMI客戶機在遠程RMI服務(wù)器上查找服務(wù)對象,并將它轉(zhuǎn)換成本地接口類型。其中RMI客戶機中stub程序扮演著遠程服務(wù)器對象的代理角色,使該對象可被客戶激活。遠程引用層處理語義、管理單一或多重對象的通信,決定調(diào)用是應(yīng)發(fā)往1個還是多個服務(wù)器。傳輸層管理實際的連接,并且追蹤可以接受方法調(diào)用的遠程對象。服務(wù)器端的Skeleton程序完成對服務(wù)器對象實際的方法調(diào)用,并獲取返回值。返回值向下經(jīng)遠程引用層、服務(wù)器端的傳輸層傳遞回客戶端,再向上經(jīng)傳輸層和遠程調(diào)用層返回[7]。
圖1 RMI工作過程
2.2 工具功能簡介
Java反序列化漏洞利用工具采用Java RMI技術(shù),利用Java反序列化漏洞原理,對運行有WebLog ic中間件的主機進行漏洞掃描,并利用存在的漏洞實現(xiàn)進行命令執(zhí)行等功能[8]。
工具通過解析用戶輸入的主機地址、網(wǎng)段、端口號、線程數(shù)量等信息,自動生成任務(wù)隊列,在調(diào)度算法的作用下對目標進行掃描探測,測試漏洞是否存在,并及時輸出反饋探測結(jié)果,有助于管理人員及時發(fā)現(xiàn)并修補相關(guān)漏洞。此外,工具還提供了漏洞利用功能,對存在漏洞的主機進行文件上傳、命令執(zhí)行等操作,進一步驗證漏洞的真實性[9]。
本文所介紹的Java反序列化漏洞利用工具,包含漏洞掃描以及漏洞利用模塊兩大部分。其使用流程如圖2所示。
首先,操作人員啟動漏洞掃描模塊,在指定的輸入框內(nèi)輸入所需要掃描的多個目標地址或網(wǎng)段、相應(yīng)的端口范圍,以及掃描時所需的線程數(shù)量,并以逗號進行分隔。而后,點擊“掃描”按鈕開始掃描。工具會根據(jù)相應(yīng)算法生成任務(wù)隊列,在調(diào)度算法的調(diào)度管理下進行掃描工作,再將掃描進度以及存在漏洞的主機信息,如IP地址、端口號、操作系統(tǒng)類型等輸出顯示。當操作人員得到存在漏洞的主機信息時,可使用漏洞利用模塊對漏洞進行進一步驗證以及實現(xiàn)執(zhí)行系統(tǒng)命令、文件上傳等功能[10]。
圖2 工具使用過程
4.1 漏洞掃描模塊
漏洞掃描模塊旨在根據(jù)操作人員輸入的目標地址信息(包含網(wǎng)段、地址范圍等)以及端口信息,自動生成掃描任務(wù)隊列,并在調(diào)度程序的作用下進行掃描、探測漏洞信息,并將掃描結(jié)果返回輸出。該模塊主要包含輸入數(shù)據(jù)處理子模塊、作業(yè)調(diào)度子模塊、漏洞探測子模塊等3部分。其主要結(jié)構(gòu)如圖3所示。
圖3 漏洞掃描模塊結(jié)構(gòu)圖
1)輸入數(shù)據(jù)處理子模塊
輸入數(shù)據(jù)處理子模塊旨在根據(jù)操作員輸入的信息,自動生成任務(wù)隊列,為作業(yè)調(diào)度子模塊提供作業(yè)信息。其中,IP地址輸入信息支持多地址、多網(wǎng)段輸入,各個地址及網(wǎng)段之間用“,”分隔,如“192.168.1.1,192.168.1.2,192.168.3.0/24”;端口輸入信息支持多端口輸入,各個端口之間用“,”分隔,如“7001,7002,7010-7020”。操作員輸入完成后,工具會根據(jù)不同的作業(yè)調(diào)度算法生成不同的作業(yè)隊列。
①“線程-主機”算法作業(yè)隊列
“線程-主機”算法作業(yè)隊列由主機地址信息隊列和主機端口信息隊列組成。
主機地址信息隊列主要存放目標主機IP地址信息,通過對IP地址輸入信息進行解析并生成。
首先,對非空的IP地址輸入信息按“,”進行分割。而后,逐一判斷分割后的子信息是否為一個單獨的IP地址:若是單獨的IP地址,則加入到主機地址信息隊列;若不是單獨的IP地址,則對該子信息按“/”分割,分離出網(wǎng)絡(luò)號和子網(wǎng)掩碼。最后,通過網(wǎng)絡(luò)號和子網(wǎng)掩碼位數(shù)計算出該網(wǎng)段中所有IP地址,并逐一加入到主機地址信息隊列中。
主機端口信息隊列主要存放目標主機端口信息,通過對端口輸入信息進行解析并生成。
首先,對非空的端口輸入信息按“,”進行分割。而后,逐一判斷分割后的子信息是否為一個單獨的端口:若是單獨的端口信息,則加入到主機端口信息隊列;若不是單獨的端口,則對該子信息按“-”分割,分離出其實端口號和結(jié)束端口號。最后,計算出該端口范圍中所包含的端口信息,并逐一加入到主機端口信息隊列中。
②“線程-端口”算法作業(yè)隊列
“線程-端口”算法作業(yè)隊列僅有一個作業(yè)信息隊列,隊列中每個元素包含1個主機IP地址信息和1個端口信息。該隊列生成方法與“線程-主機”算法作業(yè)隊列類似,將主機地址信息隊列中每個IP地址和主機端口信息隊列中所有端口進行對應(yīng),形成作業(yè)信息隊列。
2)作業(yè)調(diào)度子模塊
作業(yè)調(diào)度子模塊旨在根據(jù)不同的調(diào)度算法為作業(yè)隊列中的作業(yè)分配線程進行處理[11]。
①“線程-主機”調(diào)度算法
“線程-主機”調(diào)度算法是將主機地址信息隊列中某1個地址分配給1個線程,由該線程完成該地址所有端口的掃描任務(wù)。其算法流程如圖4所示。
首先,判斷當前線程是否已達到操作員要求的線程數(shù)上限:若已達到,則等待線程退出;若未達到,則新建線程。而后,線程判斷目前主機地址信息隊列是否為空:若為空,則線程退出;若不為空,則從主機地址信息隊列中取出該地址信息,并和主機端口信息中所有端口信息進行組合后,交由漏洞探測子模塊進行漏洞探測,所有端口均已探測后,線程退出。待所有線程退出且主機地址信息隊列為空時,調(diào)度算法退出,掃描工作完成。
圖4 “線程-主機”調(diào)度算法流程圖
②“線程-端口”調(diào)度算法
“線程-端口”調(diào)度算法是將作業(yè)信息隊列中每個作業(yè)分配給1個線程,每個線程只負責1個地址1個端口的掃描任務(wù)。
首先,判斷當前線程是否已達到操作員要求線程數(shù)上限:若已達到,則等待線程退出;若未達到,則新建線程。而后,線程判斷目前作業(yè)信息隊列是否為空:若為空,則線程退出;若不為空,則從作業(yè)信息隊列中取出1條作業(yè)信息,將其中的地址信息和端口信息交漏洞探測子模塊進行漏洞探測,探測完畢后線程退出。待所有線程退出且作業(yè)信息隊列為空時,調(diào)度算法退出,掃描工作完成[12]。
3)漏洞探測子模塊
漏洞探測子模塊旨在根據(jù)作業(yè)調(diào)度子模塊中傳送的地址信息和端口信息,進行漏洞探測驗證,并將結(jié)果反饋顯示。
首先,根據(jù)地址信息和端口信息連接目標主機,上傳漏洞驗證包,并進行服務(wù)注冊操作。若系統(tǒng)報錯,并經(jīng)過重連測試后仍不成功,則斷開連接,并退出;若系統(tǒng)不報錯則遠程執(zhí)行系統(tǒng)命令,如“whoami”。若執(zhí)行成功則說明存在該漏洞,工具在顯示輸出目標主機信息后斷開連接;若命令執(zhí)行不成功則斷開連接。
4.2 漏洞利用模塊
漏洞掃描模塊主要功能是利用漏洞原理,對存在漏洞的主機進行命令執(zhí)行、文件上傳等操作。該模塊主要包含目標主機連接子模塊、命令執(zhí)行子模塊、文件上傳子模塊等3部分其主要結(jié)構(gòu)如圖5所示[13]。
圖5 漏洞利用模塊結(jié)構(gòu)圖
1)主機連接子模塊
主機連接子模塊為整個漏洞利用模塊的前驅(qū)模塊,其功能是根據(jù)操作人員輸入的目標主機信息(含IP地址、端口號、操作系統(tǒng)類型),連接目標主機,將已經(jīng)編譯好的包含函數(shù)接口的jar包通過WebLogic中T3協(xié)議上傳至目標主機,并在目標主機上注冊綁定已上傳的jar包服務(wù)。該jar包主要包括命令執(zhí)行接口和文件上傳接口,如圖6所示。此外,該子模塊還負責在連接斷開時解綁并刪除目標主機上的jar包服務(wù)。
圖6 服務(wù)接口定義
2)系統(tǒng)命令執(zhí)行子模塊
系統(tǒng)命令執(zhí)行子模塊在主機連接子模塊成功的前提下進行操作。其主要功能為通過本地遠程調(diào)用已注冊的服務(wù)中命令執(zhí)行功能,執(zhí)行操作人員所輸入的命令,并回顯命令執(zhí)行結(jié)果。
3)文件上傳子模塊
文件上傳子模塊同樣是在主機連接子模塊成功的前提下進行操作。其主要功能為通過本地遠程調(diào)用已注冊的服務(wù)中文件讀寫功能,將操作人員所指定的文件內(nèi)容寫在目標主機指定的目錄下,實現(xiàn)文件上傳功能[14]。
5.1 實踐環(huán)境部署
本次實踐在虛擬機上進行,目標主機IP為192.168.56.100,操作系統(tǒng)為Windows Server 2003 SP2,安裝WebLogic 10.36,服務(wù)端口7001。工具運行機IP為192.168.56.1,操作系統(tǒng)為win10專業(yè)版,安裝Java 8.0(工作版本為1.8.0_60-b27)。
5.2 工具運行實踐
啟動工具,對192.168.99,192.168.100,192.168.101這3個地址的7000-7010號端口進行掃描,總計任務(wù)量33個,掃描線程3個。掃描結(jié)果如圖7所示,發(fā)現(xiàn)存在漏洞的主機IP地址為192.168.56.100,端口為7001,操作系統(tǒng)為Windows。
圖7 漏洞掃描
根據(jù)掃描結(jié)果進行漏洞利用,執(zhí)行系統(tǒng)命令“net user”,其結(jié)果如圖8所示。上傳java_test.txt文件至目標主機“C:\”下,執(zhí)行結(jié)果如圖9所示[15]。
圖8 命令執(zhí)行
圖9 文件上傳
5.3 存在的不足與改進
在工具的實踐過程中,利用工具對存在漏洞的虛擬服務(wù)器進行漏洞掃描和利用,能較為真實地模擬實際運行環(huán)境,充分驗證工具漏洞掃描模塊的準確性和漏洞利用模塊的穩(wěn)定性。然而,該工具僅針對WebLogic中間件進行掃描和利用,目標環(huán)境較為單一,可逐步增加對Jenkins,Jboss,WebSphere等常用中間件的支持。
本文針對2015年年底發(fā)布的Java反序列化漏洞進行了深入分析。在對漏洞原理進行深入研究的基礎(chǔ)上,給出了基于Java反序列化漏洞掃描利用工具的設(shè)計,并且就漏洞掃描模塊及漏洞利用模塊的實現(xiàn)進行了比較詳細的闡述。在工具實踐環(huán)節(jié),筆者也通過搭建虛擬服務(wù)器模擬真實運行環(huán)境,并利用工具成功發(fā)現(xiàn)漏洞、利用漏洞,達到預(yù)期目標。
[1] 肖波,陳正學.基于JAVA的序列化應(yīng)用研究[J].智能計算機與應(yīng)用,2008(6):53-55.
[2] 晏立,沈銳.Java序列化技術(shù)的探討[J].紅河學院學報,2011(4):37-39.
[3] 朱建紅,陸保國.基于對象序列化技術(shù)的數(shù)據(jù)分發(fā)系統(tǒng)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2014(1):49-50.
[4] 許暉.應(yīng)用XML實現(xiàn)Java對象序列化技術(shù)簡述[C]//中國計算機學會計算機應(yīng)用專業(yè)委員會.Java技術(shù)及應(yīng)用的進展——第七屆中國Java技術(shù)及應(yīng)用交流大會文集.北京:[出版者不詳],2004:10.
[5] 佚名.Lib之過?Java反序列化漏洞通用利用分析[EB/OL].(2015-11-12)[2016-09-10].http://www.secpulse.com/archives/40420.html.
[6] 戴亮,方曉勤,李麗.一種新的基于序列化的Java RMI方法[J].計算機工程,2006,32(22):99-101.
[7] 高雅俠,鄒海榮.基于Java的RMI技術(shù)的研究與應(yīng)用[J].計算機與數(shù)字工程,2011,39(8):174-177.
[8] 劉楠,金護平.RMI分布式對象技術(shù)的研究與應(yīng)用[J].航空計算技術(shù),2009,39(1):142-145.
[9] BREG F,POLYCHRONOPOULOSC D.Java virtualma chine support for object serialization[C]//John Wiley&Sons,Ltd.,2001:173-180.
[10]LOERTSCHER D V.The library learning commons col lection is core-or is it?[J].Teacher Librarian,2014,41(4):48-63.
[11]毛莉,劉海.WebLogic安全構(gòu)架及安全技術(shù)應(yīng)用[J].計算機技術(shù)與發(fā)展,2004,14(9):56-59.
[12]夏家莉,陳輝,楊兵.一種動態(tài)優(yōu)先級實時任務(wù)調(diào)度算法[J].計算機學報,2012,35(12):2 685-2 695.
[13]CALLEJA G,PASTOR R.A dispatching algorithm for flexible job shop scheduling with transfer batches:an in dustrial application[J].Production Planning&Control,2014,25(2):93-109.
[14]Breenmachine.What Do WebLogic,WebSphere,JBoss,Jenkins,OpenNMS,and Your Application Have in Com mon?This Vulnerability[EB/OL].(2015-11-16)[2016-09-10].https://foxglovesecurity.com/2015/11/06/what-do-WebLogic-websphere-jboss-jen kins-opennms-and-your-application-h(huán)ave-incommon-this-vulnerability.
[15]張海南.用WebLogic中間件構(gòu)架應(yīng)用系統(tǒng)[D].南京:南京理工大學,2004.
[16]曾雅琳,郭斌.基于Java的GUI設(shè)計與實現(xiàn)[J].計算機與現(xiàn)代化,2005(10):116-117.
A Study on the Creation of the De Serialized Tool of the Exploitation of Vulnerabilities of Java
ZHAO Changsong,YU Huaxing,HE Sheng,DONGWei,WANG Yu
(Jiangbei Power Supply Branch of State Grid Chongqing Electric Power Company,Chongqing 401147,P.R.China)
Based on the causes and the exploitation principles of the de serialized vulnerabilities of Java,in combina tion with the RMIprogramming technique,this paper introduces a self designed algorithm for the scanning and ex ploiting of vulnerabilities,which can help create a tool of the exploitation of vulnerabilities for theWebLogicmiddle ware with such functions as automatically scanning and detecting vulnerabilities,implementing system commands and uploading files.Practical tests have shown that the tool can accurately discover hosts with vulnerabilities and carry out relevantoperations by exploiting them,which can help operation and maintenance staffmembers patch po tential safety hazards and improve their professional skills in the system protection.
deserialization;RMI;vulnerability scanning;exploitation of vulnerabilities;WebLogic
TP312.2
A
1008 8032(2017)03 0049 05
2016-11-03
該文獲重慶市電機工程學會2016年學術(shù)年會優(yōu)秀論文二等獎
趙長松(1987-),工程師,主要從事信息安全工作。