馮美琪 韓 杰 李建欣
1(中國民航信息網(wǎng)絡(luò)股份有限公司運行中心 北京 101318)
2(北京航天萬源科技有限公司 北京 100176)
近年來,Apache Shiro安全框架由于其強大的功能和易用性,逐漸成為主流的開源安全框架,其反序列化漏洞問題同樣備受關(guān)注.通過分析近3年國家攻防演練的攻擊手段,發(fā)現(xiàn)Apache Shiro反序列化漏洞在實戰(zhàn)中較為實用,成為攻防演練中使用率較高的漏洞之一.在實際工作中,按照官方修復(fù)建議進行版本升級后,發(fā)現(xiàn)仍會存在Apache Shiro反序列化漏洞,而現(xiàn)有檢測手段無法準確檢測出利用該漏洞進行攻擊的異常請求.
2006年已有學(xué)者提出了反序列化漏洞[1].2015年Lawrence[2]在Apache的Commons Collections基礎(chǔ)庫中找到了Java反序列化攻擊的執(zhí)行鏈,后續(xù)更多的Java類庫被驗證存在反序列化漏洞.Apache Shiro作為Java安全框架的一種,其反序列化漏洞的利用鏈與Java反序列化漏洞一致,區(qū)別在于攻擊者在利用Apache Shiro漏洞構(gòu)建惡意請求時還要事先知道AES加解密的密鑰.目前暫未發(fā)現(xiàn)關(guān)于Apache Shiro反序列化漏洞利用檢測的專項研究,而針對Java反序列化漏洞的研究,錢劼等人[3]通過網(wǎng)頁訪問在默認應(yīng)用中的空文件判斷是否存在Java反序列化漏洞,提供了一種應(yīng)急漏洞掃描的方法.杜笑宇等人[4]則對漏洞利用鏈進行研究,提出了一種反序列化漏洞調(diào)用鏈挖掘的方法,挖掘潛在調(diào)用鏈.郭瑞[5]提出在反序列化之前進行安全性檢查的方法防范反序列化漏洞.現(xiàn)有文獻研究多為應(yīng)急漏洞掃描、漏洞利用鏈分析等,針對漏洞利用攻擊的檢測較少,主要集中在人工智能在漏洞檢測方面的應(yīng)用[6].而在實際工作中發(fā)現(xiàn),現(xiàn)有的APT檢測設(shè)備對于Apache Shiro反序列化漏洞攻擊的檢測主要基于特征值匹配,即Set-Cookie:rememberMe=deleteMe.此類方法會產(chǎn)生大量告警,并存在較多誤報,需要大量人力進行人工研判,無法滿足安全運營過程中應(yīng)急響應(yīng)及處置的要求.
本文針對現(xiàn)有方法的不足之處,結(jié)合漏洞利用時的攻擊特征,構(gòu)建攻擊檢測模型,提升網(wǎng)絡(luò)安全監(jiān)測能力[7].攻擊特征需要從正常用戶訪問和漏洞利用訪問時的HTTP包深入分析研究,對比二者之間的顯著差異,據(jù)此建立檢測模型.在分析過程中,選取存在顯著差異的特征作為主要指標,使其檢測結(jié)果更加準確.
Apache Shiro安全框架提供“記住我”功能,讓用戶在關(guān)閉瀏覽器后,再次訪問時免登錄即可恢復(fù)之前的會話.其主要的工作原理是[8]:在首次訪問時,若用戶選擇“記住我”功能,則服務(wù)器會將身份信息序列化、AES加密和Base64編碼后,作為rememberMe的值增加到Cookie中并返回給用戶,在用戶第2次訪問時攜帶此Cookie進行訪問.首次訪問時的工作原理如圖1所示.
圖1 首次訪問時Apache Shiro“記住我”工作原理
在用戶第2次訪問時,服務(wù)器會對Cookie中的rememberMe字段進行逆向操作,即Base64解碼、AES解密和反序列化,獲得身份信息后與服務(wù)器端數(shù)據(jù)進行對比,若一致則完成身份確認,返回用戶請求的內(nèi)容.用戶再次訪問時的工作原理如圖2所示.
圖2 再次訪問時Apache Shiro“記住我”工作原理
由于Apache Shiro的“記住我”功能在實現(xiàn)過程中采用AES加解密,key值硬編碼在代碼中,且網(wǎng)上有很多Apache Shiro框架的key值,攻擊者可以通過key值爆破獲取到真實key值,依據(jù)這個key值構(gòu)造惡意請求以達到預(yù)期的攻擊效果.
根據(jù)漏洞的詳細描述,該漏洞主要影響Apache Shiro 1.2.4及以下的版本[9].因此,下載相關(guān)版本的Apache Shiro包,使用Docker技術(shù)進行漏洞實驗環(huán)境搭建,如圖3所示.
圖3 漏洞實驗環(huán)境效果
其中:Docker版本為19.03.13,Apache Shiro版本為1.2.4.
利用漏洞實驗環(huán)境模擬正常用戶在開啟“記住我”功能的前提下訪問網(wǎng)站,主要包括訪問首頁、用戶登錄、訪問個人主頁以及退出登錄等訪問行為.其訪問過程中HTTP包的主要流向及特征如圖4所示.
圖4 正常情況下HTTP包特征
對正常用戶訪問時的HTTP包進行深度分析,發(fā)現(xiàn)4種明顯訪問特征:
1) JSESSIONID相同.
首次訪問時,為每個用戶開啟1個session,服務(wù)器會創(chuàng)建Cookie,其中包含JSESSIONID信息,后續(xù)訪問均會攜帶JESSIONID,用于服務(wù)器判斷當前用戶對應(yīng)于哪個session.
2) HTTP響應(yīng)包中包含特征值Set-Cookie:rememberMe=deleteMe.
在訪問過程中,不同階段出現(xiàn)的Set-Cookie:rememberMe=deleteMe具有不同的含義,主要有:①在第1次訪問時出現(xiàn),表示網(wǎng)站使用Apache Shiro框架;②登錄時出現(xiàn),表示此字段為登錄的缺省值,先執(zhí)行刪除操作,再分配rememberMe,保證用戶攜帶的rememberMe字段與服務(wù)器端下發(fā)的一致;③退出登錄時出現(xiàn),表示清除用戶Cookie中攜帶的rememberMe字段,下次登錄時再分配新的;④其余階段出現(xiàn),表示對于無效的rememberMe字段進行刪除操作.
3) 同一用戶在同一session的Cookie中rememberMe字段相同.
Cookie中的rememberMe字段為第1次登錄時由服務(wù)器分配,關(guān)閉瀏覽器再次進入頁面后,Cookie中的rememberMe字段值仍相同.以上情況說明,用戶第1次訪問會由服務(wù)器統(tǒng)一分配rememberMe字段的值,后續(xù)用戶訪問均會使用同一個rememberMe.
4) HTTP響應(yīng)包中Set-Cookie:rememberMe=deleteMe出現(xiàn)2次.
正常用戶在訪問過程中,響應(yīng)包中Set-Cookie:rememberMe=deleteMe會出現(xiàn)2次,1次是用戶登錄時,1次是用戶退出登錄時.
通過分析,Apache Shiro反序列化漏洞的利用方式[10]主要有3種:一是反彈shell;二是命令執(zhí)行;三是寫入文件.以簡單的命令執(zhí)行為例,模擬攻擊者利用Apache Shiro反序列化漏洞來達到命令執(zhí)行目的的過程,主要觀察HTTP包的變化情況,其訪問過程中HTTP包的主要流向及特征如圖5所示.
圖5 漏洞利用情況下HTTP包特征
對漏洞利用情況訪問時的HTTP包進行深度分析,發(fā)現(xiàn)4種明顯訪問特征:
1) Cookie中無JSESSIONID等字段.
在正常情況下,用戶訪問會攜帶其他Cookie字段,如JSESSIONID等,但由于攻擊者目的明確,其往往只攜帶有攻擊載荷的Cookie字段.有一種特例,即在HTTP請求包中含有非常見字段,如Testecho等,該字段一般為rememberMe中擬執(zhí)行的命令或參數(shù).
2) 同一用戶Cookie中的rememberMe不斷變化.
在正常情況下,服務(wù)器分配給一個用戶的rememberMe字段是固定的,但是由于攻擊者在漏洞利用之前先通過爆破等方式獲取AES加解密的key值,導(dǎo)致其rememberMe字段的值不斷變化.實際環(huán)境中的攻擊請求,其變化頻率可達到10條/min.
3) 相同payload不同key,rememberMe長度相同;不同payload相同key,rememberMe長度不同.
攻擊者在利用Apache Shiro漏洞攻擊時,rememberMe字段會迅速變化,其長度也不一致.為驗證其具體的攻擊行為,對相同payload不同key和不同payload相同key這2種情況下rememberMe長度進行探索,分析使用3個常見的key值執(zhí)行2個不同的命令.3個key值如下.
key1:kPH+bIxk5D2deZiIxcaaaA==.
key2:2AvVhdsgUs0FSA3SDFAdag==.
key3:wGiHplamyX1VB11UXWol8g==.
擬執(zhí)行的2個命令如下.
命令1:ls.
命令2:〈?php @eval($_POST[‘a(chǎn)ttack’]);?〉.
分別使用3個key值對2個命令進行加密操作,不同情況下rememberMe長度對比如表1所示:
表1 不同key值不同命令的rememberMe字符數(shù)對比
根據(jù)以上結(jié)果發(fā)現(xiàn):
① 相同payload不同key時,rememberMe長度相同,說明其在進行key值爆破;
② 不同payload相同key時,rememberMe長度不同,說明其已獲取key值,正在進行命令執(zhí)行嘗試.根據(jù)攻擊者攻擊的思路,其在獲取爆破出key值后會進行命令執(zhí)行,此時疑似為攻擊成功,需要人工介入進行確認及處置.
4) 包含Set-Cookie:rememberMe=deleteMe的響應(yīng)包數(shù)量大于2.
根據(jù)訪問的先后邏輯關(guān)系,正常情況下,除了第1次訪問和退出登錄時,響應(yīng)包中存在Set-Cookie:rememberMe=deleteMe字符串,其余后續(xù)訪問中的響應(yīng)包中均不包含此類字符串.但由于攻擊者構(gòu)造的rememberMe字段不符合服務(wù)器可識別的類型,因此即便命令執(zhí)行成功,仍會在響應(yīng)包中包含deleteMe值.以反彈shell為例,發(fā)現(xiàn)ping攻擊機的666端口成功反彈了shell,但是在響應(yīng)包中仍包含Set-Cookie:rememberMe=deleteMe字符串,詳細過程如圖6所示.
圖6 Apache Shiro反序列化漏洞反彈shell流程
通過對比正常情況和異常情況下HTTP包的不同訪問特征,提取相關(guān)特征作為模型中的檢測特征,主要分為2個方面:一個是檢測是否為攻擊;另一個是檢測攻擊是否疑似成功.在檢測是否為攻擊的過程中,首先要確定同一IP地址HTTP請求包中rememberMe字段在單位時間內(nèi)的變化頻數(shù),其次確定HTTP請求包中是否僅包含rememberMe字段,最后確定HTTP響應(yīng)包中Set-Cookie:rememberMe=deleteMe的出現(xiàn)頻數(shù).以上3個指標用于檢測相關(guān)請求是否為攻擊請求.在檢測攻擊是否疑似成功時,通過分析攻擊者的攻擊思路,確定rememberMe字段長度的離散程度,通過計算該指標判斷攻擊是否疑似成功.
通過分析某IP地址1 min內(nèi)HTTP請求包中rememberMe的去重數(shù)量,得到該IP地址請求包中rememberMe字段在單位時間內(nèi)的變化頻數(shù),計算公式為
n=該IP地址1 min內(nèi)HTTP請求中
rememberMe的去重數(shù)量,
(1)
通過計算該指標可以初步判斷該IP地址是否為惡意IP,將明顯的攻擊IP檢測出來.
通過分析某IP地址1 min內(nèi)HTTP請求包Cookie中是否都只包含rememberMe這個字段,來輔助判斷相關(guān)請求是否為攻擊請求,表示是否為攻擊者重復(fù)進行爆破.其計算公式為
single_col=IF(該IP地址1 min內(nèi)HTTP請
求的Cookie中僅包含rememberMe字段).
(2)
通過分析某IP地址1min內(nèi)包含Set-Cookie:rememberMe=deleteMe 的HTTP響應(yīng)包數(shù)量來輔助判斷相關(guān)請求是否為攻擊請求,表示是否為攻擊者高度偽造的攻擊請求.其計算公式為
dl_n=該IP地址1 min內(nèi)包含Set-Cookie:
rememberMe=deleteMe的HTTP響應(yīng)包數(shù)量.
(3)
在完成攻擊檢測的條件下,進一步判斷是否為疑似成功的攻擊請求.通過分析攻擊者的攻擊思路,計算rememberMe字段長度的離散程度,該計算結(jié)果表示攻擊者是否已經(jīng)成功突破外網(wǎng),進入內(nèi)網(wǎng)進行命令執(zhí)行、內(nèi)存馬注入等相關(guān)操作,其計算公式為
(4)
攻擊特征提取結(jié)果無法直接應(yīng)用于攻擊檢測,需要結(jié)合攻擊檢測流程模型進行應(yīng)用.根據(jù)2.4節(jié)提到的指標,制定相關(guān)的檢測流程,如圖7所示.
圖7 檢測流程
首先需要確定是否存在漏洞,在存在漏洞的基礎(chǔ)上,通過n>10這一顯著特征判斷是否為攻擊.若是,則通過σ=0來判斷攻擊是否疑似成功;若不是,則依次通過single_col和dl_n的值進一步判斷是否為攻擊.若single_col和dl_n的值判斷為攻擊,則通過σ=0判斷攻擊是否疑似成功;若判斷不是攻擊,則說明為正常業(yè)務(wù)請求,為誤報.
根據(jù)2.5節(jié)的攻擊檢測流程,在單位時間內(nèi)rememberMe值的變化頻數(shù)為明顯特征,根據(jù)該特征可以快速判斷是否為漏洞利用攻擊,若該特征無法判斷時,則輔以Cookie中字段類型的特征以及返回包中字段特征進一步判斷.確認為攻擊后則通過rememberMe長度變化的特征來進一步確定具體的攻擊行為,進而確定是否疑似成功攻擊.本文以實際的2個攻擊行為和1個正常業(yè)務(wù)行為為例進行實驗.
攻擊行為1:內(nèi)部滲透測試時,利用網(wǎng)上現(xiàn)有Apache Shiro漏洞攻擊工具進行測試,分別進行key值爆破、利用鏈爆破、命令執(zhí)行和內(nèi)存馬注入,以上操作均成功執(zhí)行.根據(jù)實驗結(jié)果,發(fā)現(xiàn)rememberMe值的變化依舊是明顯的特征,無論是頻數(shù)的變化還是字段長度的變化,都可以在檢測Apache Shiro反序列化漏洞攻擊以及攻擊成功與否方面發(fā)揮關(guān)鍵作用,其Cookie中攜帶的rememberMe字段詳細信息如表2所示:
表2 攻擊行為1 rememberMe字段特征
攻擊行為2:外網(wǎng)IP地址120.x.x.x對某互聯(lián)網(wǎng)網(wǎng)站在短時間進行頻繁訪問并且現(xiàn)有檢測設(shè)備產(chǎn)生大量Apache Shiro告警信息.通過觀察其HTTP請求包,發(fā)現(xiàn)每次訪問的Cookie中攜帶的rememberMe字段值都不同,詳細如表3所示:
表3 攻擊行為2 rememberMe字段值
正常業(yè)務(wù)行為:用戶正常在網(wǎng)站上進行操作并在登錄時開啟了“記住我”功能,其rememberMe字段值固定.
以上2個攻擊行為和1個正常業(yè)務(wù)行為均被現(xiàn)有檢測設(shè)備判定為Apache Shiro漏洞利用攻擊,而采用2.5節(jié)的檢測流程進行檢測,得到的各行為指標值和檢測結(jié)果如表4所示:
表4 測試樣例的統(tǒng)計指標值和檢測結(jié)果
需要說明的是,在正常情況下,包含Set-Cookie:rememberMe=deleteMe的響應(yīng)包數(shù)量為2,分別是用戶登錄和退出登錄時,由于實例驗證過程中,統(tǒng)計分析的時間窗口一般無法完全覆蓋用戶登錄和退出登錄之間的全過程,只能覆蓋用戶的部分行為,因此在實際驗證中,dl_n的值一般小于等于2.
對比已有檢測設(shè)備的檢測結(jié)果,攻擊行為1和攻擊行為2可以檢測出是攻擊行為,但無法確定是否疑似成功,而利用本文檢測方法,可以進一步判斷攻擊行為1疑似成功,需要轉(zhuǎn)到人工進一步處置.除此之外,針對正常的業(yè)務(wù)行為,現(xiàn)有檢測方法將其檢測為異常攻擊行為并產(chǎn)生大量告警,說明現(xiàn)有檢測設(shè)備存在一定誤報,在一定程度上會增加企業(yè)的人力投入,降低安全事件的處置效率,而本文檢測方法則可以識別其為誤報,屬于正常業(yè)務(wù)操作.因此也證明了本文分析方法的正確性.
在攻防演練和實際攻擊中,Apache Shiro反序列化漏洞已經(jīng)成為利用率最高且危害性較大的一種漏洞,如何及時有效地檢測出漏洞利用攻擊也成為了企業(yè)最為關(guān)注的問題.現(xiàn)有一些學(xué)者在反序列化漏洞檢測方面的研究取得了很大進展,但對于如何檢測反序列化漏洞利用攻擊方面的研究成果還很少.本文從統(tǒng)計學(xué)的角度分析了Apache Shiro在正常情況和反序列化漏洞利用情況下的HTTP包特征,并提出了Apache Shiro反序列化漏洞利用攻擊的檢測流程,最后通過實例測試驗證了該方法的有效性.
通過實驗發(fā)現(xiàn),本文的檢測方法能夠有效降低誤報,但是對于攻擊是否成功存在一定的誤報,仍需人工進行研判分析,后續(xù)仍需思考如何實現(xiàn)自動化研判,實現(xiàn)安全事件自動化處置,提高處置效率.此外,本文檢測方法中的統(tǒng)計指標是基于IP維度來計算的,針對分布式的攻擊,本文的檢測方法可能會被繞過,導(dǎo)致檢出率降低,因此在下一步的工作中,需要重點研究如何唯一標識1個網(wǎng)絡(luò)用戶.
現(xiàn)有APT檢測設(shè)備大多都是基于特征值檢測,該方法無法識別異常的流量,存在嚴重的滯后性,已不能滿足現(xiàn)有網(wǎng)絡(luò)安全檢測的需要,希望后續(xù)安全廠商可將大數(shù)據(jù)分析技術(shù)和異常流量分析技術(shù)集成到檢測設(shè)備中,更好地防御APT攻擊.