摘要:Windows系統(tǒng)中潛在的RPC緩沖區(qū)漏洞溢出是目前信息系統(tǒng)面臨的最嚴(yán)重安全威脅之一。本文介紹了RPC原理,分析了緩沖區(qū)溢出的原理,總結(jié)了RPC漏洞分析的一般方法,并針對(duì)一個(gè)RPC漏洞進(jìn)行了詳細(xì)分析,包括定位溢出函數(shù),分析溢出點(diǎn),溢出實(shí)現(xiàn)。還介紹了緩沖區(qū)溢出攻擊實(shí)例與防范措施。
關(guān)鍵字:RPC溢出;緩沖區(qū);漏洞
一、RPC介紹
(一)RPC的基本原理
RPC是操作系統(tǒng)的一種遠(yuǎn)程過程調(diào)用協(xié)議,是分布式計(jì)算中常用到的技術(shù)。目前,使用最普遍的是開放式軟件基礎(chǔ)的分布式計(jì)算環(huán)境(DCE),微軟所用的RPC系統(tǒng)就是基于DCE RPC開發(fā)的。計(jì)算機(jī)間通訊的過程分為兩種形式:一種是數(shù)據(jù)的交換,一種是進(jìn)程的通訊。RPC屬于后者。RPC可以讓程序員調(diào)用一個(gè)函數(shù),而這個(gè)函數(shù)是在另外一臺(tái)或多臺(tái)就算機(jī)上運(yùn)行的,執(zhí)行完成后將結(jié)果傳回本機(jī)進(jìn)行后續(xù)操作。調(diào)用過程中的網(wǎng)絡(luò)操作對(duì)程序員是透明的,在代碼中調(diào)用一個(gè)遠(yuǎn)程函數(shù)就像調(diào)用本地的一樣方便,只要把接口定義好,RPC體系會(huì)幫助完成建立網(wǎng)絡(luò)鏈接、會(huì)話握手、身份驗(yàn)證、參數(shù)傳遞、返回結(jié)果等細(xì)節(jié)操作。
二、緩沖區(qū)結(jié)構(gòu)及溢出原理
(一)棧結(jié)構(gòu)及溢出原理
當(dāng)一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)的時(shí)候,其棧幀結(jié)構(gòu)在正常情況下,被調(diào)函數(shù)執(zhí)行完畢,將被調(diào)函數(shù)的返回地址傳給EIP寄存器,CPU從EIP寄存器取指令地址,繼續(xù)執(zhí)行主函數(shù)。被調(diào)函數(shù)的局部變量在棧中一個(gè)挨著一個(gè)排列。如果這些局部變量中有數(shù)組之類緩沖區(qū),并且程序中存在數(shù)組越界的缺陷,那么越界的數(shù)組元素就有可能破壞棧中的相鄰變量的值,甚至破壞棧幀中所保存的EBP值,EIP值等重要數(shù)據(jù)。成功的緩沖區(qū)溢出攻擊會(huì)用精心設(shè)計(jì)的數(shù)據(jù)覆蓋返回地址,使被調(diào)函數(shù)執(zhí)行完后將修改后的返回地址傳入EIP,從而使CPU執(zhí)行攻擊代碼(shellcode)。
三、RPC漏洞分析
MS06.040是微軟公布的一個(gè)漏洞,Ms06.040是微軟的編號(hào),其CVE編號(hào)為CVE-2006-3439,對(duì)應(yīng)補(bǔ)丁編號(hào)為KB921883,微軟對(duì)它的描述是:Server服務(wù)中存在一個(gè)遠(yuǎn)程執(zhí)行代碼漏洞,成功利用此漏洞的攻擊者可以完全控制受影響的系統(tǒng)。同其他緩沖區(qū)溢出漏洞一樣,分析該溢出漏洞的關(guān)鍵是定位溢出函數(shù),尋找關(guān)鍵溢出點(diǎn),計(jì)算跳轉(zhuǎn)地址。
(一)漏洞簡介
打開chm文件時(shí),Microsoft HTML Help會(huì)對(duì)數(shù)據(jù)進(jìn)行解壓,對(duì)“/#WINDOWS”列表塊數(shù)據(jù)復(fù)制到棧中數(shù)據(jù)時(shí),對(duì)其棧中的大小沒進(jìn)行檢查,如果復(fù)制較大的數(shù)據(jù)塊導(dǎo)致棧溢出。如果用戶打開惡意構(gòu)造的chm文件,則會(huì)受到木馬侵入的危險(xiǎn)。
(二)檢測方法
1.點(diǎn)擊“瀏覽”按鈕,選擇要進(jìn)行掃描的chm文件。
2.點(diǎn)擊“掃描”按鈕進(jìn)行掃描,如果工具提示“該文件包含危險(xiǎn)代碼,請(qǐng)不要打開”,表明該CHM文件中含有可利用此漏洞的惡意代碼,請(qǐng)勿打開。
3.用戶可注冊鼠標(biāo)右鍵快捷方式,便于CHM文件的掃描操作。
(三)RPC緩沖區(qū)溢出漏洞的分析方法
1.定位溢出函數(shù)
若機(jī)器打過補(bǔ)丁可以在\\Winnt\$NtUninstallKB921883$目錄下找到補(bǔ)丁前的netapi32.dll。對(duì)補(bǔ)丁前后的dll文件進(jìn)行反匯編分析,使用補(bǔ)丁比對(duì)工具,如Eeye的EBDS和Darun Grim,Bindiff等,可以很快查到微軟在補(bǔ)丁中修改的地方,查看—下一個(gè)改動(dòng)較大的函數(shù),sub 7517FC68,若下載了微軟的符號(hào)文件,就能顯示出該函數(shù)的名字是CanonicalizePathName。使用IDA可以查看該函數(shù)的調(diào)用關(guān)系圖,選擇chart ofxrefs to功能,看到是NetpwPathcanonicalize調(diào)用了CanonicalizePathName這個(gè)子函數(shù);選擇chart ofxrefs from功能,看到CanonicalizePathName函數(shù)調(diào)用--imp wcscat,--imp-wcscpy等容易發(fā)生溢出的系統(tǒng)函數(shù)。至此,可以將溢出函數(shù)定位縮小到NetpwPathcanonicalize及其調(diào)用的子函數(shù)CanonicalizePathName上。
2.分析溢出點(diǎn)
查看問題函數(shù)NetpwPathCanonicalize在IDA中反匯編出的代碼,得出結(jié)論,該函數(shù)是netapi32.dll的導(dǎo)出函數(shù)(Exported),有6個(gè)參數(shù)。后面調(diào)用CanonilizePathName,之前進(jìn)行了一些參數(shù)檢查,在這次驗(yàn)證中,如果第4個(gè)參數(shù)的Unicode長度超過0xi03 I)8弓1起程序退出。在CanonicalizePathName中,實(shí)現(xiàn)的功能是將NetpwPathCanonicalize函數(shù)的第4個(gè)參數(shù)所指的字符串連接上‘\和第1個(gè)參數(shù)所指的字符串,這個(gè)函數(shù)使用局部變量,在棧內(nèi)開空間暫存新串,這塊空間可以溢出。由于前面對(duì)4號(hào)串的長度進(jìn)行了檢查,所以無法僅僅由4號(hào)串實(shí)現(xiàn)溢出,但是后面忽略了對(duì)1號(hào)串的檢查,使得在使用wcscpy連接l號(hào)串的時(shí)候發(fā)生溢出成為可能,1號(hào)串足夠長的話可以覆蓋掉EBP和EIP。
3.溯源
RPC通常是以opnum來確定函數(shù)的接13,在得知某個(gè)函數(shù)(opnum)可以觸發(fā)溢出時(shí),攻擊者可以構(gòu)造出觸發(fā)這個(gè)函數(shù)的數(shù)據(jù)包來觸發(fā)漏洞。NetpwPathcanonicalize這個(gè)函數(shù)可以被RPC遠(yuǎn)程調(diào)用,下面我們找—下通過誰可以調(diào)用它,查詢((Windows network services internals))隅】,可以查到以下信息:
The 81"VSVC interface is used to manage the laamaaservcr service.
我們要找的接171在srvsvc.dll中的opnum為Oxlf的地方。利用IDA反匯編srvsvc.dll并使用一個(gè)極好的抽象RPC接口的IDA插件mlDA,尋找opnum為Oxlf的函數(shù),跟進(jìn)去可以確定就是這里調(diào)用的netapi32.dll中的NetpwPathCanonicalize:idata:76781260extrn…imp NetpwPathCanoniealize:dword。
四、緩沖區(qū)溢出攻擊及其防范
(一)實(shí)驗(yàn)環(huán)境如圖4.1所示
入侵者(192.168.85.1):對(duì)192.168.85.128進(jìn)行緩沖區(qū)溢出攻擊。
被入侵者(192.168.85.128):是開啟DNS服務(wù)的所有版本的Windows 2000 Server或Windows 2003 Server SP1,在本次測試中使用Windows 2003 Server SP1。
(二)緩沖區(qū)溢出攻擊過程
第1步:入侵者下載并且執(zhí)行dns.exe命令。到網(wǎng)上下載dns.exe工具,將其復(fù)制到C:\Documents and Settings\ Administrator,在DOS窗口執(zhí)行dns.exe命令
第2步:尋找漏洞。執(zhí)行dns.exe -s 192.168.85.128命令,對(duì)主機(jī)進(jìn)行掃描,顯示出被入侵主機(jī)(192.168.85.128)開放的端口以及操作系統(tǒng),最主要的是顯示“1047:Vulnerability”,意思就是1047端口存在漏洞。
第3步:實(shí)施溢出。執(zhí)行dns.exe -t 2003chs 192.168.85.128 1047命令。
出現(xiàn)“Attack sent, check port 1100”字樣,說明已經(jīng)打開了目標(biāo)地址的1100端口。
第4步:成功入侵。執(zhí)行telnet 192.168.85.128 1100命令,我們現(xiàn)在已經(jīng)成功的入侵了對(duì)方的電腦,并且得到了管理員的權(quán)限。
第5步:在已經(jīng)成功入侵的電腦上執(zhí)行簡單的操作:dir 和del temp.txt。
第6~11步介紹在被入侵電腦中開3389端口(遠(yuǎn)程桌面)的方法。
第6步:創(chuàng)建用來下載的VBS腳本tony.vbs。
上面的命令創(chuàng)建一個(gè)用來下載的VBS腳本tony.vbs。
第7步:在入侵者的電腦上上傳wrsky.exe。把開3389端口的工具(wrsky.exe,可以到網(wǎng)站下載)上傳到自己的個(gè)人空間。
第8步:在被入侵電腦上下載wrsky.exe。
第9步:在被入侵電腦執(zhí)行wrsky.exe命令。
第10步:重新設(shè)置被入侵電腦的管理員密碼。
第11步:打開被入侵電腦的遠(yuǎn)程桌面服務(wù)。
第12步:遠(yuǎn)程桌面連接被入侵計(jì)算機(jī)。
(三)緩沖區(qū)溢出攻擊的防范措施
(1)關(guān)閉不需要的特權(quán)程序。
(2)及時(shí)給系統(tǒng)和服務(wù)程序漏洞打補(bǔ)丁。
(3)強(qiáng)制寫正確的代碼。
(4)通過操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者植入攻擊代碼。
(5)利用編譯器的邊界檢查來實(shí)現(xiàn)緩沖區(qū)的保護(hù),這個(gè)方法使得緩沖區(qū)溢出不可能出現(xiàn),從而完全消除了緩沖區(qū)溢出的威脅,但是代價(jià)比較大。
(6)在程序指針失效前進(jìn)行完整性檢查。
(7)改進(jìn)系統(tǒng)內(nèi)部安全機(jī)制。
五、總結(jié)
由于RPC在網(wǎng)絡(luò)中使用的普遍性,RPC漏洞對(duì)網(wǎng)絡(luò)安全的威脅極大,必須提高安全意識(shí),進(jìn)一步研究漏洞的利用方法,從根本上預(yù)防此種漏洞的出現(xiàn)和針對(duì)此種漏洞的攻擊,增強(qiáng)系統(tǒng)的安全性。
從攻擊的角度而言,研究漏洞的發(fā)掘與利用技術(shù)的意義自不必說,一個(gè)未知漏洞的發(fā)現(xiàn),特別是廣泛應(yīng)用的軟件中存在的漏洞,其可能造成的危害是無法衡量的。
而從防御的角度來說,深入研究漏洞檢測與防御技術(shù)可以有效的預(yù)防并抵擋攻擊者的攻擊,但若疏忽對(duì)漏洞發(fā)掘與利用技術(shù)的鉆研,就會(huì)使得防御者在攻防對(duì)壘中處于被動(dòng)挨打的局面,而且無法有效的阻止未知漏洞的攻擊,避免損失的產(chǎn)生。所以,必須倡導(dǎo)“積極防御”,攻守技術(shù)都要精通。
所以,無論從攻還是守的角度來看,研究漏洞發(fā)掘及緩沖區(qū)溢出檢測技術(shù)都有著深遠(yuǎn)的意義。
參考文獻(xiàn):
[1]陸殿軍、張強(qiáng).入侵檢測和漏洞檢測系統(tǒng)[EB/OL].http://www.networkunion.org/.
[2]張慶華. 網(wǎng)絡(luò)安全與黑客攻防寶典[M].北京: 電子工業(yè)出版社, 2007 .
作者簡介:宋娟娟(1984.12--)性別:女,民族:漢,工作單位:鄭州電力職業(yè)技術(shù)學(xué)院,學(xué)歷:本科,職稱:講師,職務(wù):教師。