任高明, 喬向東, 楊 仝, 白軍亮
(空軍工程大學(xué)電訊工程學(xué)院,陜西西安710077)
WehnTrust是一款由微軟安全工程師研發(fā)的基于主機(jī)的入侵防御系統(tǒng)[1-4],其研發(fā)者聲稱WehnTrust主要具有3種特性:地址空間隨機(jī)化[5-6]、防止SEH(即結(jié)構(gòu)化異常處理)覆寫攻擊[7],防止格式化字符串[8-9]攻擊,但WehnTrust的防御性能到底如何,卻鮮有人給出書面性的測試報(bào)告。本文為了驗(yàn)證其防御能力,針對性地設(shè)計(jì)并模擬實(shí)現(xiàn)了3個(gè)實(shí)驗(yàn),對此入侵防御系統(tǒng)的性能進(jìn)行了測試。
圖1 WehnTrust主界面
在WehnTrust的主頁下載安裝包及源代碼,運(yùn)行后界面如圖1所示。WehnTrust采用visual studio 2008開發(fā)環(huán)境,包含7個(gè)項(xiàng)目:Common,de_DE,en_us,es_ES,NRER,WehnServ,WehnTrust。其中Common為靜態(tài)庫,de_DE,en_us,es_ES,NRER為動態(tài)鏈接庫,而WehnServ,WehnTrust為應(yīng)用程序。其中,NRER動態(tài)鏈接庫的核心代碼在3個(gè)源文件中:NRER.c,SEH.c,format.c。NRER.c負(fù)責(zé)完成地址空間隨機(jī)化;SEH.c實(shí)現(xiàn)防止結(jié)構(gòu)化異常處理攻擊;format.c負(fù)責(zé)實(shí)現(xiàn)防止格式化串攻擊。
可以看出,WehnTrust阻止攻擊的主要功能是在NRER.dll實(shí)現(xiàn)的。但是,經(jīng)過大量反復(fù)的調(diào)試、測試和源碼分析,發(fā)現(xiàn)該動態(tài)鏈接庫從未被調(diào)用,但是動態(tài)鏈接庫已經(jīng)生成。嘗試使用動態(tài)加載和隱式調(diào)用兩種方法,都以失敗告終。所以,我們認(rèn)為動態(tài)鏈接庫NRER.dll本身的編寫就有問題。這樣,就有充足的理由懷疑其防御攻擊的能力。為此,模擬了C++虛函數(shù)攻擊、SEH攻擊、格式化字符串攻擊,對其進(jìn)行測試。
為了驗(yàn)證WehnTrust是否對緩沖區(qū)溢出具有預(yù)期的防御和檢測效果,搭建實(shí)驗(yàn)環(huán)境,完成了4類緩沖區(qū)溢出實(shí)驗(yàn)。
MetasploitFramework是一個(gè)開源攻擊平臺。我們嘗試了幾種攻擊,下面是攻擊過程說明,由于篇幅所限,只給出實(shí)驗(yàn)1的攻擊成功界面截圖。
(1)實(shí)驗(yàn)1:選取漏洞exploit為:windows/smb/ms08_067_netapi,選取有效載荷payload為windows/shell/bind_tcp;目標(biāo)主機(jī)選擇使用Windows XP SP1中文版。
攻擊時(shí),目標(biāo)主機(jī)地址設(shè)置為200.200.200.66,目標(biāo)端口設(shè)置為445,強(qiáng)制打開的端口設(shè)置為4444。
攻擊成功界面如圖2所示,已經(jīng)進(jìn)入了目標(biāo)主機(jī)的命令提示符窗口,此時(shí)可以在目標(biāo)主機(jī)上進(jìn)行任意操作,說明攻擊成功。安裝WehnTrust后攻擊還可以成功。
圖2 攻擊成功界面
(2)實(shí)驗(yàn) 2:選取漏洞 exploit為:windows/smb/psexec;選取有效載荷payload為:windows/shell/bind_tcp;目標(biāo)主機(jī)使用Windows 2000中文版。安裝WehnTrust后仍可以攻擊成功。
(3)實(shí)驗(yàn)3:選取漏洞exploit為:windows/browser/ani_loadimage_chunksize;選取有效載荷payload為:windows/shell/bind_tcp;目標(biāo)主機(jī)使用Windows XP SP1中文版。安裝WehnTrust后仍可以攻擊成功。
(4)實(shí)驗(yàn)4:選取漏洞exploit為:windows/browser/aim_goaway;選取有效載荷payload為:windows/shell/bind_tcp;目標(biāo)主機(jī)使用Windows XP SP1中文版。安裝WehnTrust后仍可以攻擊成功。
(5)實(shí)驗(yàn)5:選取漏洞exploit為:windows/browser/aol_ampx_convertfile;選取有效載荷payload為:windows/shell/bind_tcp;目標(biāo)主機(jī)使用Windows XP SP1中文版。安裝WehnTrust后仍可以攻擊成功。
上述5種成功的攻擊實(shí)驗(yàn),WehnTrust都不能阻止攻擊行為,甚至根本無法發(fā)現(xiàn)。這樣就驗(yàn)證了對其防御能力的懷疑。為了進(jìn)一步確定我們的結(jié)論,模擬實(shí)現(xiàn)了 C++虛函數(shù)攻擊、SEH覆寫攻擊、格式化字符串攻擊,進(jìn)行針對性測試。
首先編寫一個(gè)通用的shellcode[10-11],下文中都將用到這個(gè)shellcode,它的功能是彈出一個(gè)對話框,顯示字符串“success!”。
char shellcode[]=
"xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C"
"x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53"
"x68x75x73x65x72x54x33xD2x64x8Bx5Ax30x8Bx4Bx0Cx8B"
"x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95"
"xFFx57xF8x95x60x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59"
"x20x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A"
"xC4x74x08xC1xCAx07x03xD0x46xEBxF1x3Bx54x24x1Cx75"
"xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03"
"x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB"
"x53x68x65x73x73x21x68x73x75x63x63x8BxC4x53x50x50"
"x53xFFx57xFCx53xFFx57xF8x90x90x90x90x90x90x90x90";
關(guān)于C++虛函數(shù)存在的漏洞,請參考相關(guān)文獻(xiàn),這里不再贅述。當(dāng)內(nèi)存中有多個(gè)虛表對象時(shí),如果上一對象中的成員變量[12-13]發(fā)生溢出,能夠有機(jī)會去修改下一對象的虛表指針,就可以通過人為修改,使程序在調(diào)用下一個(gè)對象的虛函數(shù)時(shí),轉(zhuǎn)而去執(zhí)行設(shè)計(jì)好的shellcode。設(shè)計(jì)的源碼的核心代碼如下:
int*addr=(int*)(overflow.buf-4);
int*my_addr=(int*)(my_overflow.my_buf-4);
int addr_shellcode=(int)&shellcode;
int addr_proc=(int)&addr_shellcode;
*my_addr=addr_proc;
strcpy(overflow.buf,bufoverflow);
Cmy_test*p=&my_overflow;
p->my_test();
程序中通過addr=overflow.buf-4定位到虛表指針1;上一對象的成員變量向下溢出,使其精確地覆蓋掉第2個(gè)對象的虛表指針,將其修改為定制的虛表地址;當(dāng)程序調(diào)用第2個(gè)對象的虛函數(shù)時(shí),會找到偽造的虛表地址,進(jìn)而找到定制的shellcode,并執(zhí)行它。本過程如圖3所示。
實(shí)驗(yàn)環(huán)境為:WindowsXPSP2,VisualC++6.0Debug版本。按照上述的環(huán)境運(yùn)行,可以得出的結(jié)果如圖4所示。
安裝WehnTrust后,WehnTrust修改了注冊表,并生成了系統(tǒng)目錄下的驅(qū)動文件baserand.sys,此時(shí),不能阻止實(shí)驗(yàn)成功。重啟計(jì)算機(jī)后,實(shí)驗(yàn)不能成功。刪除baserand.sys,再次重啟計(jì)算機(jī)后,實(shí)驗(yàn)可以正常進(jìn)行,WehnTrust并不能阻止,由此可以說明,正是baserand.sys阻止了實(shí)驗(yàn)的正常進(jìn)行。
關(guān)于SEH攻擊[14]的詳細(xì)原理,請參考相關(guān)文獻(xiàn)。本次實(shí)驗(yàn)使用的shellcode1中的“…shellcode…”部分為上文用到的shellcode內(nèi)容。測試代碼如下:
圖3 攻擊C++虛函數(shù)過程
圖4 C++虛函數(shù)攻擊成功界面
char shellcode1[]=
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90"
"… shellcode…"
"x90x90x90x90"
"x98xFEx12x00";//shellcode1的地址
void test(shellcode1)
{char buf[200];
int zero=0;
__try
{strcpy(buf,shellcode1);
zero=4/zero; }
__except(MyExceptionhandler()){} }
對代碼說明如下:
(1)函數(shù)test()中使用了函數(shù)strcpy()創(chuàng)造一個(gè)典型的棧溢出漏洞;除零操作zero=4/zero會產(chǎn)生一個(gè)異常。
(2)由于函數(shù)中使用了_try{}_except{},編譯器將會在test的函數(shù)棧幀中安裝一個(gè)SEH結(jié)構(gòu)來實(shí)現(xiàn)異常處理。
(3)當(dāng)strcpy操作沒有產(chǎn)生溢出時(shí),除零操作的異常將最終被MyExceptionhandler函數(shù)處理。
(4)當(dāng)strcpy操作產(chǎn)生溢出,并精確地將棧幀中的SEH異常處理句柄修改為shellcode的入口地址時(shí),操作系統(tǒng)將會錯(cuò)誤地使用shellcode去處理除零異常。
本實(shí)驗(yàn)的關(guān)鍵在于確定棧幀中SEH回調(diào)句柄的偏移,然后布置緩沖區(qū),精確地淹沒這個(gè)位置,將該句柄修改為shellcode的起始位置。使用環(huán)境為:Windows2000,VisualC++6.0Release版本。SEH攻擊過程如圖5所示,攻擊成功界面如圖6所示。
圖5 SEH攻擊過程
圖6 SEH攻擊成功界面
安裝WehnTrust后的實(shí)驗(yàn)結(jié)果與攻擊C++虛函數(shù)的實(shí)驗(yàn)結(jié)果相同,也就是說,baserand.sys驅(qū)動文件阻止了攻擊行為。
格式化字符串漏洞[15]的有關(guān)內(nèi)容請參考相關(guān)文獻(xiàn)。在本次實(shí)驗(yàn)中,采用最常用的printf()函數(shù)。源代碼如下:
int p=111,q=222;
printf("p=%d,q=%b",p,q);
printf(" p=%d,q=%d,t=%d ");
int m=0;
printf("寫入之前:m=%d ",m);
printf("success:%d%n ",m,&m);
printf("寫入之后:m=%d ",m);
上面代碼中,第1個(gè)printf()函數(shù)的調(diào)用是正確的,而第2個(gè)printf()函數(shù)則缺少了輸出數(shù)據(jù)的變量列表。
本次實(shí)驗(yàn)環(huán)境為:WindowsXPSP2,Release版本。編譯運(yùn)行后,實(shí)驗(yàn)結(jié)果如圖7所示。
圖7 格式化串實(shí)驗(yàn)截圖
第2個(gè)printf()函數(shù)編譯器并沒有報(bào)錯(cuò),程序可以正常運(yùn)行,但結(jié)果為“p=4223088,q=111,t=222”。使用OllyDbg調(diào)試后得到,第1次調(diào)用printf()時(shí),參數(shù)按照從右向左的順序入棧。第2次調(diào)用發(fā)生時(shí),由于參數(shù)中少了數(shù)據(jù)列表部分,故只壓入格式控制符參數(shù)。這時(shí)棧中狀態(tài)如圖8所示。
圖8 printf調(diào)用時(shí)的內(nèi)存格局
由于printf()函數(shù)調(diào)用時(shí),沒有給出“輸出數(shù)據(jù)列表”,但系統(tǒng)仍按照“格式控制符”所指明的方式輸出棧中緊隨其后的兩個(gè)DWORD。故4223088的十六進(jìn)制形式為0x00407070,是指向格式控制符“p=%d,q=%d,t=%d ”的指針;111是殘留下來的變量p的值,而222是殘留下來的q的值。
第4個(gè)printf()函數(shù)中使用了控制符“%n”,此控制符用于把當(dāng)前輸出的所有數(shù)據(jù)的長度寫入一個(gè)變量中去。這條語句會將調(diào)用最終輸出的字符串長度寫入變量m中,“success:0”長度為9,所以這次調(diào)用后m將被修改為9。安裝上WehnTrust之后,程序依然可以運(yùn)行,并且結(jié)果正常。此實(shí)驗(yàn)表明WehnTrust并不能阻止格式化串攻擊。格式化串漏洞原理如圖9所示。
圖9 格式化串漏洞原理
通過對WehnTrust源碼的分析及調(diào)試,使用緩沖區(qū)溢出工具 Metasploit Framework進(jìn)行了 5種攻擊實(shí)驗(yàn),并針對WehnTrust所具有的特性,設(shè)計(jì)了3種針對性的攻擊實(shí)驗(yàn),可以得出如下結(jié)論:8次攻擊實(shí)驗(yàn),只有兩次攻擊被baserand.sys阻止,但WehnTrust沒有檢測到攻擊行為;刪除baserand.sys后,WehnTrust沒有任何防御攻擊的能力。因此,可以看出,WehnTrust并不完全具備其研發(fā)者所聲稱的防御特性,只能的阻止部分攻擊。盡管如此,但該開源項(xiàng)目所提出的思想及設(shè)想很有價(jià)值,對其進(jìn)行研究并在此基礎(chǔ)上開發(fā)、擴(kuò)展,將是下一步的工作重點(diǎn)。
[1]wehnus.WehnTrust[OL].http://www.wehnus.com/products.pl,2006.
[2]吳海燕,蔣東興,程志銳,等.入侵防御系統(tǒng)研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(24):5844-5866.
[3]李小平,王意潔,王勇軍.入侵防御系統(tǒng)的研究與設(shè)計(jì)[J].微計(jì)算機(jī)信息,2006,22(11-3):88-90.
[4]Wang Jie,Zheng Xiao,Liu Ya-bin.Complete rule base of intrusion prevention system[J].Computer Engineering and Application,2009,45(9):88-91.
[5]ShachamH.Ontheeffectivenessofaddress-spacerandomization[C].Washington,DC:Proceedings of the 11th ACM Conference on Computer and Communications Security,2004:53-61.
[6]LiLixin,JamesE just.Address-spacerandomization for windows systems[C].Virginia:Defense Advanced Research Project Agency,2007:72-79.
[7]Nagy B.SEH(structured exception handling)security changes in XP SP2 and SP1[C].Phoenix:eEye Digital Security,2006:60-66.
[8]James E S,Ravi N.Virtual machines versatile platforms for systems and process[M].San Francisco:Morgan Kaufmann,2006:12-49.
[9]Wei Li,Tzi-cker Chiueh.Automated format string attack prevention for Win32/X86 binaries[C].Miami:23rd Annual Computer Security Applications Conference,2007:398-407.
[10]王清.0day安全:軟件漏洞分析技術(shù)[M].北京:電子工業(yè)出版社,2008:72-79.
[11]Meyers S.More effective C++[M].北京:電子工業(yè)出版社,2006:77-94.
[12]Roos T,Wetting H,Grunwald P.On discriminative bayesian network classifiers and logistic regression[J].Machine Learning,2005,59(3):267-296.
[13]CWE,Vulnerability type distributions in CVE[OL].http://cwemitre.org/documents/vulntrends/index.htm#introduction,2007.
[14]Pietrek,Matt.A crash course on the depths of Win32 structured exception handling[OL].http://www.microsoft.com/msj/0197/exception/excep-tion.aspx,2006.
[15]Chen S,Tang Y,Stateful D.Dos attacks and targeted filtering[J].Journal of Networking and Computer Applications,2007,30(3):20-26.