徐 輝
(淮北職業(yè)技術(shù)學(xué)院 計算機科學(xué)技術(shù)系,安徽 淮北 235000)
5G帶來的超高速網(wǎng)絡(luò),網(wǎng)絡(luò)應(yīng)用多樣化,多樣化網(wǎng)絡(luò)應(yīng)用不可避免地會形成前所未見的漏洞,更多的漏洞可能產(chǎn)生更多的攻擊。 Windows操作系統(tǒng)在操作系統(tǒng)市場的高占比性,針對Windows的溢出攻擊比其它所有操作系統(tǒng)總和還多。 對Windows平臺溢出漏洞進行詳細(xì)分析,利用開源的框架式Metasploit的exploit模塊對Windows平臺下的進行遠(yuǎn)程溢出攻擊,分析攻擊原由,并提出有效的防御機制。
目前使用的各種操作系統(tǒng)、應(yīng)用軟件普遍存在著緩沖區(qū)溢出漏洞,[1]由于計算機對數(shù)據(jù)和代碼界定不是十分明確,讓系統(tǒng)自我區(qū)別數(shù)據(jù)和緩沖區(qū)還無法實現(xiàn),從而造成緩沖區(qū)漏洞無法在軟件編寫中被規(guī)避和消除。緩沖區(qū)溢出是指向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)超過緩沖區(qū)本身的容量,從而造成數(shù)據(jù)的溢出,溢出的數(shù)據(jù)會覆蓋在合法數(shù)據(jù)上。[2]利用緩沖區(qū)溢出,第三方攻擊者可以讓程序運行失敗或系統(tǒng)重啟,也可以獲得某些特定權(quán)限,進行非授權(quán)操作。目前,分布式和網(wǎng)絡(luò)系統(tǒng)安全中,超過50%以上的攻擊都是利用緩沖區(qū)溢出漏洞,緩沖區(qū)溢出中的堆棧溢出被第三方攻擊者使用最為頻繁。第三方攻擊者通過堆棧的溢出漏洞,在函數(shù)返回時改變返回的地址,地址的改變讓第三方攻擊者輕松實現(xiàn)兩個目標(biāo) :直接讓目標(biāo)程序崩潰,導(dǎo)致拒絕服務(wù);按照第三方攻擊者的意愿,跳轉(zhuǎn)執(zhí)行事先準(zhǔn)備好的惡意代碼,獲得用戶的SHELL,在未授權(quán)的情況下得到用戶的權(quán)限和數(shù)據(jù)信息。
為了更好地說明溢出攻擊的方式與原理,現(xiàn)對如下代碼進行分析。

圖1 存在溢出漏洞代碼
第三方攻擊者會利用name[]數(shù)組10個字節(jié)這個明顯的溢出漏洞進行攻擊,通過填寫超過10個字節(jié)的數(shù)據(jù)來超過??臻g邊界,從而執(zhí)行第三方惡意軟件或者執(zhí)行一個SHELL,第三方攻擊者會利用溢出漏洞覆蓋函數(shù)的返回地址,在Kali系統(tǒng)中,第三方攻擊者就會獲得一個和堆棧溢出程序相同的權(quán)限,如果這個程序恰恰又是setuid的,那么,第三方攻擊者就可以輕而易舉地得到ROOT,[3]獲得了ROOT也就意味著所有的一切都向非授權(quán)用戶開放了。通過對比正常的函數(shù)棧結(jié)構(gòu)圖和溢出情況下的函數(shù)棧結(jié)構(gòu)圖,我們可以清楚地看到,由于棧是由高地址向低地址生長,返回地址可以被有意識地覆蓋,溢出的函數(shù)棧覆蓋了EBP和return address,最后執(zhí)行了第三方攻擊者想要執(zhí)行的SHELL。
本文研究中使用的Kali版本共有1886種溢出(exploit)模塊。 針對溢出的exploit模塊大致可以分為兩種攻擊模式,一種為主動溢出,一種為被動溢出。目的性更強的是主動溢出攻擊,可以根據(jù)前期搜集的信息確定目標(biāo)主機,然后,針對目標(biāo)主機的漏洞,發(fā)起以獲得目標(biāo)主機的控制權(quán)限為目的主動攻擊;被動溢出相對來說目的性要弱 ,可以針對一個IP地址段中所有主機進行監(jiān)聽,然后,利用分析軟件對監(jiān)聽的結(jié)果批量分析,最后,根據(jù)分析結(jié)果再決定相關(guān)的后續(xù)操作。
Metasploit Framework(以下簡稱“MSF”)是一種框架式的開放源碼的安全測試工具,整合了代碼的開發(fā)、測試、滲透、漏洞研究,以及shellcode編寫,我們依托MSF發(fā)現(xiàn)溢出漏洞以后,可以創(chuàng)建獨立的溢出模塊或者二次開發(fā),其核心的主要部分可以由ruby來實現(xiàn),其余很少的一點核心部分由匯編語言和C語言來實現(xiàn)。MSF的GUI模式、console模式和CLI模式給了用戶更多的選擇,用戶可以根據(jù)自己的使用需求和使用環(huán)境選擇最適合自己的使用模式。由于console模式除了提供了MSF的所有功能外,專業(yè)計算機用戶熟悉的外部命令部分也可以在console使用,console模式是使用率和使用范圍最高的模式。
在圖形模式下Kali操作系統(tǒng)中,輸入msfconsole,啟動MSF,在命令行下輸入search ms12-020, 搜索針對ms12-020漏洞,得到如圖2所示。

圖2 漏洞的模塊組成
為了啟用登錄和產(chǎn)生GDI圖形子系統(tǒng) ,須使用服務(wù)器遠(yuǎn)程桌面可用的模塊auxiliary/dos/windows/rdp/ms12_020_maxchannelids,只要保證這個模塊在遠(yuǎn)程桌面服務(wù)的服務(wù)器組件被RDP客戶端連接 。
auxiliary/scanner/rdb/ms12_020_check掃描目標(biāo)主機是否存在漏洞。命令行中繼續(xù)輸入use auxiliary/scanner/rdp/ms12_020_check,更改搜索模塊,敲擊show options來分析這個模塊使用條件,如圖3所示,可以看到,攻擊首先需要RHOSTS,可以是一個IP地址或者是一個IP地址段,其次需要RPORT, 特定的端口必須開放。本研究測試目標(biāo)主機操作系統(tǒng)版本號為Windows server 2008 standard,目標(biāo)主機的IP地址為172.16.43.192。

圖3 攻擊模塊使用條件
MSF中輸入如圖4的命令行, 設(shè)定攻擊的目標(biāo)主機IP。最后用exploit溢出模塊攻擊目標(biāo)主機。目標(biāo)被攻擊后,立刻藍(lán)屏,產(chǎn)生錯誤代碼為:0X000000D5,不得不進行重啟。系統(tǒng)的重啟,給第三方攻擊者有了更多的攻擊選擇。

圖4 exploit溢出模塊攻擊目標(biāo)主機
藍(lán)屏后目標(biāo)主機重新啟動,Windows server 2008重啟后提示windows已從異常關(guān)機中恢復(fù),點擊查看問題詳細(xì)信息,找到有助于描述該問題的文件Mini051920-01.dmp, 通過分析Mini051920-01.dmp文件,找出目標(biāo)主機崩潰原因,查看調(diào)用的堆棧,根據(jù)棧的性質(zhì),先進入棧的位高地址,后進入棧的位低地址,而棧的調(diào)用順序是從下到上。一般情況下,服務(wù)器會根據(jù)用戶的請求分配userID和channelID,在鏈表中保存connectINFO,maxchannelIDS在初始化的時候會設(shè)定成0,直接造成channelID分配失敗,channelID分配失敗,進入RDPWD!NM_Connect函數(shù),為了丟棄連接,會釋放connectINFO,但是,由于沒有設(shè)置標(biāo)志位,只能使用ICAfreestack進行free。 用戶繼續(xù)請求,但是maxchannelIDS被設(shè)定為0,還是會造成失敗,進而再次使用ICAfreestack進行free,就造成了double free,從而造成了內(nèi)核的崩潰, 通過反匯編,可以看到產(chǎn)生溢出,造成系統(tǒng)直接藍(lán)屏。
push 0
push 3
pushdword ptr [ebp+14h]
pushedx
pushesi
push 0FCh
call nt+0xce0f7 (81ad70f7)
mov eax,dword ptr [ebx] ds:0023:00000000=????????
堆棧溢出產(chǎn)生的藍(lán)屏可以讓第三方攻擊者獲得更多的攻擊選擇,比如:主機劫持、盜取信息、消耗目標(biāo)主機資源等等。現(xiàn)在的網(wǎng)絡(luò)環(huán)境讓這種攻擊方式更加頻繁,針對這種情況,采取主動防御和被動檢測兩種方式來抵御這種入侵方式。
4.3.1 被動檢測防御
被動檢測防御可以直接利用Kali 自帶的Metasploit模塊,對目標(biāo)系統(tǒng)進行檢查,如圖5所示,可以查看系統(tǒng)是否存在溢出漏洞,也可以采用Kali下的nmap圖形在界面方式對目標(biāo)主機進行掃描檢測,在命令窗格內(nèi)輸入nmap-p 3389-script rdp-vuln-ms12-020 172.16.43.58。通過掃描,可以發(fā)現(xiàn)目標(biāo)主機存在漏洞,現(xiàn)在絕大多數(shù)的掃描軟件采用載入腳本的方式來提高掃描效率,為了更有效地工作,通常情況下掃描的端口數(shù)都基本固定,可以采取修改默認(rèn)端口的方式抵御此類攻擊。

圖5 Metasploit掃描目標(biāo)主機
4.3.2 主動防御
利用堆棧不可執(zhí)行,常用的操作系統(tǒng)里面任何一個進程,基本上都會涉及堆段、棧段,以及代碼段、BSS段和數(shù)據(jù)段。在操作系統(tǒng)中,一個進程被載入內(nèi)存中時,段又會分裂成小節(jié),多種可執(zhí)行文件中已經(jīng)完成初始化的全局變量會被放入數(shù)據(jù)段,由于現(xiàn)在系統(tǒng)都允許多數(shù)據(jù)段中放入代碼,第三方攻擊者利用這一點,就可以完成植入shellcode 動態(tài)代碼, shellcode 植入后,第三方攻擊者可以根據(jù)自己的目的,肆意利用系統(tǒng)API函數(shù)實現(xiàn)自己的最終攻擊意圖, 給用戶帶來巨大的損失。為避免產(chǎn)生這種情況,可以設(shè)定數(shù)據(jù)段地址空間不可執(zhí)行,防止執(zhí)行數(shù)據(jù)段中的代碼。雖然設(shè)定堆棧不可執(zhí)行,可以解決大部分的溢出攻擊,[4]但也會造成一些正常的程序無法正常運行,存在著局限性。
通過對過濾規(guī)則的相應(yīng)開發(fā),在應(yīng)用層上起到防御目的,配置 WAF實現(xiàn)對攻擊過濾,并對可以訪問端口的網(wǎng)段加以限制。對于ms12_020過濾規(guī)則 ,根據(jù)對攻擊載荷的數(shù)據(jù)報文進行分析,00時會觸發(fā)漏洞設(shè)定為DomainParameters::maxChannelId,正常用戶的行為也不允許出現(xiàn)將目標(biāo)主機的最大信道設(shè)置為0。具體步驟如下:
(1)對系統(tǒng)RDP端口上數(shù)據(jù)包進行匹配,發(fā)現(xiàn)數(shù)據(jù)流:03000013 0E E0 0000 0000 00 01 00 0800 00000000,從而判斷為RDP發(fā)起。
(2)接著讀取偏移0X2D數(shù)據(jù),通過和00比較,如果發(fā)現(xiàn)相同,阻止傳輸該IP后續(xù)的報文。
5G技術(shù)的應(yīng)用開發(fā)帶來更多的多樣性的網(wǎng)絡(luò)服務(wù),日益增多的網(wǎng)絡(luò)服務(wù)會產(chǎn)生更多的網(wǎng)絡(luò)安全隱患,如何能快速高效的發(fā)現(xiàn)主機存在的安全隱患,是今后研究的重點,目前,可以采用的措施有很多,建立日志記錄、監(jiān)控,威脅感知系統(tǒng)是最好的手段之一。[5]人為創(chuàng)建的應(yīng)用程序,攻擊性是最為復(fù)雜、多變的,結(jié)合最好的防御措施再通過WAF實現(xiàn)虛擬補丁,建立全方位的、立體的防御體系,能最大程度上實現(xiàn)對多種威脅攻擊的防御。