姚 棟,魏占禎,高駿濤
(北京電子科技學院,北京100070)
基于Metasploit框架下SEH溢出漏洞的滲透測試研究
姚 棟,魏占禎,高駿濤
(北京電子科技學院,北京100070)
Metasploit作為安全領域中最具影響力的開源框架平臺,其最突出的貢獻是半工業化生產方式的漏洞研究與滲透代碼開發。以Easy File Sharing FTP v3.5軟件存在的基于PASS命令的SEH溢出漏洞為例,從漏洞挖掘與分析、滲透攻擊模塊編寫、滲透攻擊模塊測試這三個方面詳細闡述了基于Metasploit框架下SEH溢出漏洞的滲透測試通用方法,并編寫了針對上述軟件安全漏洞的滲透攻擊模塊。研究重點分析了針對SEH溢出滲透利用的三個關鍵環節:繞過SEH限制、獲取返回地址和編寫短跳轉指令。通過這一系列的深入研究,很好的推動了自動化滲透測試發展的研究,同時編寫Metasploit框架支持的滲透攻擊模塊也為安全領域內共享的系統化攻擊知識庫做出了重要補充,具有非常重要的意義。
Metasploit;客戶端滲透攻擊;SEH溢出攻擊;Ruby語言
Metasploit[1-2]是一個開源的滲透測試框架軟件,同時也是一個逐漸發展成熟的漏洞研究與滲透代碼開發平臺,它將公開發布的滲透攻擊代碼資源以一種通用化結構與標準化描述語言進行組織,使其成為安全領域共享的系統化攻擊知識庫,因此每一個新的滲透代碼的增加,就是對業界共享的系統化攻擊知識庫的一次補充,具有非常重要的意義。
Metasploit中集成了一系列的實用工具,不僅可以為充分剖析目標漏洞提供輔助,還能精確定位出漏洞利用過程可能依賴的關鍵指令與地址。此外,滲透攻擊模塊的編寫采用ruby元程序語言,使得代碼開發只需以類似攻擊模塊為模版,然后將重點放在漏洞觸發與利用過程中,編寫方式靈活多樣,此外還可以動態加載任意的攻擊載荷,大大提高了滲透測試工作效率[3]。這種滲透代碼的開發過程相較于以前的方式已經初具工業化生產方式,對自動化滲透測試發展的研究具有很好的推動作用。
本文以Easy File Sharing FTP v3.5軟件存在的基于PASS命令的SEH溢出漏洞為例,詳細闡述具有通用性的基于Metasploit框架的SEH滲透測試方案。該軟件沒有對FTP賬戶密碼輸入長度進行檢測,當輸入長度很長的密碼時會觸發棧溢出漏洞,從而可以執行攻擊者發送的任意代碼。
Fuzz測試,也稱模糊測試[4-5],目的是驗證程序接收處理畸形數據是否發生異常,發生什么樣的錯誤,以及堆棧是否能被溢出等。此次針對Easy File Sharing FTP Server的fuzz測試目的是確認程序是否存在基于SEH溢出漏洞,通過向其發送長度很長的隨機字符串作為登陸密碼,讓其服務端崩潰,從而驗證能否進行漏洞利用[6]。
為了能夠便于觀察堆棧是否溢出,登陸密碼用全“A”字符串來替代隨機字符串。下面列出了由python語言實現遠程連接到FTP服務端上的fuzz測試代碼。Fuzz測試通過登陸匿名用戶,使用長達1 024個字符“A”的登錄密碼,來觸發異常,測試程序是否崩潰,并使用OllyDbg調試器進行觀察。經過多次測試,當密碼長度達到3 000字節后,Winxp平臺下的Easy File Sharing FTP Server客戶端最終出現崩潰。
fuzz測試代碼如下:

在OllyDbg調試器所示查看SEH鏈的內容,如圖1所示,結構化異常處理鏈(SEH)已被成功覆蓋為41414141,同時觀察堆棧中改寫的內容,如圖2,表明程序確實存在基于PASS命令的棧溢出漏洞,并且該漏洞可以被利用。

圖1 SEH鏈表

圖2 堆棧中SEH有關內容
SEH[7-8]中文全稱為異常處理結構體,它是Windows異常處理機制所采用的重要數據結構,可以對程序異常做出處理,并指導程序下一步流程。SEH結構體包含兩個DWORED指針,共8 bytes存儲在系統棧中,它們分別是SEH鏈表指針和異常處理函數句柄。
Windows系統棧中同時存在多個SEH,他們通過鏈表指針在棧內由棧頂向棧底串成單向鏈表,位于鏈表最頂端的SEH通過線程環境塊(TEB)0字節偏移處的指針進行標識,即FS:[0],而底部則被指定為FFFFFFFF,因此SEH鏈也叫FS:[0]鏈。當異常發生時,操作系統會中斷程序,并首先從FS:[0]鏈的鏈表頂端處取出距離棧頂最近的SEH,使用異常處理函數句柄所指向的函數來處理異常,如果異常處理函數運行失敗,則順著SEH鏈表依次嘗試其他異常處理函數,直到程序自身所寫的所有異常處理函數都無法處理時,系統默認的異常處理函數UnhandledExceptionFilter()將會被調用,并彈出“程序遇到問題需要關閉,是否將錯誤報告發送給MS”的錯誤對話框,然后強制關閉程序。
正是由于SEH這些特性[9],導致溢出緩沖區的數據可以覆蓋SEH,并且能夠將SEH中異常處理函數的入口地址更改為shellcode的起始地址,從而錯誤的將shellcode當作異常處理函數來執行。
前面的模糊測試已經證明可以通過發送一個超長密碼字符串,來控制存在漏洞的FTP服務進程的SEH鏈,接下來確定覆蓋SEH所需要的緩沖區精確長度。修改fuzz測試代碼,利用Metasploit工具pattern_create生成3 000字節的 Metasploit rulez字符串,命令為 root@ kali:../msf3/tools#./pattern_create.rb 3000,用其替換字符串“A”,填充到 fuzz測試代碼中,部分修改代碼(Metasploit rulez字符串payload)如下:

在OllyDbg調試器中捕獲上述修改后的fuzz測試所引發的異常,查詢SEH鏈,如圖3所示,可知SEH被覆蓋為“68443468”。調用Metasploit框架下提供精確計算覆蓋發生位置的pattern_offset工具,命令為:#./pattern_offset.rb 68443468 3000,如圖 4 所示,可知偏移量為2563,表明覆蓋SEH四字節位置為2564~2567。

圖3 SEH被覆蓋為隨機字符串

圖4 計算SEH覆蓋精確位置
接下來繼續修改Fuzz測試代碼,來驗證此位置的正確性。以2 563個字符“A”開始,接著是4個字符“B”來覆蓋SEH,最后填充600個字符“A”,維持密碼長度為3 000字節,登錄遠端FTP服務,程序出現奔潰,調試器捕獲如圖5所示信息,SEH被覆蓋為42424242,成功獲得SEH控制權。fuzz測試部分修改代碼如下(精確獲取SEH控制權payload):


圖5 成功獲得SEH控制權
基于棧溢出漏洞的fuzz測試完成并獲得SEH控制權后,滲透攻擊模塊的開發便成為最終實現滲透利用的關鍵過程。
基于SEH溢出攻擊的常見漏洞利用方式[10]是:覆蓋處理異常的SEH例程指針,同時觸發一個有意偽造的異常(通常這個偽造異常是通過POP POPRET這一系列指令來完成的),從而強制讓程序跳轉到攻擊者的 shellcode處,具體見圖6。其中諸如POP-POP-RETN這類偽造異常的指令,由于程序在調用異常處理例程之前,所有的寄存器都將先被清空(如:xor eax,eax),因此只能依靠從已加載的DLL/EXE模塊中去調用這些指令。區別于棧溢出攻擊的重寫EIP,跳轉到寄存器下執行shellcode,基于SEH漏洞攻擊最大的區別正是所有的寄存器均不可用。
根據針對SEH異常的漏洞利用方式,可以歸納出一個典型的exploit結構如表4所示。

表4 基于SEH溢出的典型Exploit結構
在前面的Fuzz測試中,我們已經找到了next SEH和SE Handler的偏移,偏移分別為2560~2563和2564~2567字節,之后就需要用指向pop pop ret指令串的指針去覆蓋SE Handler,偽造一個二次異常,而為了保證滲透代碼在windows平臺下的通用性,pop-pop-ret指令應該避免使用系統DLL[11],而用程序自身的DLL/EXE中的地址來編寫,同時還需要保證使用的DLL沒有用/safeSEH選項去編譯,因為這一選項添加了額外的保護,幫助禁止非法的SEH覆蓋。
首先編寫攻擊模塊關鍵初始代碼,如下:


圖6 基于seh漏洞利用方式
滲透代碼中的初始化模塊聲明了“BadChars”,它列出了所有可能會使目標程序在未執行shellcode前就崩潰掉的壞字符[12]。識別壞字符的通用方法是加載字符串連續的shellcode,eg(\x00\x01\x02……),然后在調試器中觀察最先被截斷的字符,將其標識為badchar。由于在Metasploit平臺下存在類似的FTP攻擊模塊,可以采用從類似的代碼中尋找badchar這種高效簡便的方法。
此時的滲透攻擊模塊完成的主要功能是:連接和登陸到遠程FTP服務上,使用一長串的“A”字符來作為初始緩沖區,用字符串“BBBB”來覆蓋SEH,緊隨其后填充全“C”字符串,生成整個滲透注入字符串作為FTP的登錄密碼,發送到目標主機上。
在確定SE Handler的偏移后,就需要使用指向pop pop ret指令串的指針將其覆蓋,來偽造一個二次異常,接下來從Easy File Sharing FTP Server程序中定位一個pop pop ret指令。
首先使用OllyDbg加載目標程序,然后啟用OllySSEH插件,查詢所有已加載的模塊中,哪些未開啟safeSEH保護,如圖7所示,因為WINXP下未啟用ALRS,找到包含pop/pop/ret指令串的且沒有safeSEH保護的DLL模塊對于成功滲透至關重要[13]。

圖7 safeSEH模塊掃描
經過篩選,最終確定程序自帶的SSLEAY32.DLL這一模塊。使用msfpescan功能例程的-p選項來從此DLL中尋找pop+pop+ret指令串的地址[14]。具體指令為:msfpescan-p ssleay32.dll。msfpescan找到了非常多的符合pop-pop-ret指令,從中任意選擇一個不含NULL(00)字節的地址,如圖8所選地址0x100189b4,用來在滲透代碼中覆蓋SEH。

圖 8 pop-pop-ret指令地址
確定返回地址后,對滲透代碼中的‘target’字節進行修改,用0x100189b4地址將原來的占位符替換掉。同時修改exploit函數,將原來的“BBBB”字符串修改為[targt.ret].pack(“V”),這樣Metasploit利用[target.ret].pack(“V”)函數就能自動對返回地址進行正確排序并寫入,從而準確對SEH覆蓋,繞過SEH限制[15]。
完成上述步驟后,接下來進行shellcode定位,從而精確的填寫nseh中短跳轉指令。為了能夠對shellcode進行定位,將“next SEH”中的4 bytes替換為斷點[16],當異常發生時程序被中斷,方便觀 察 shellcode,同 時 shellcode用 特 殊 字 符 串 -“1ABCDEFGH2ABCDEFGH3ABCDEFGH4ABCDEFGH”替代,最后調整初始緩沖區長度為2 559字節,修改代碼如下(驗證shellcode位置攻擊代碼)。

運行上述編寫的 easy_file_sharing_ftp_pass_3.5 滲透攻擊模塊,攻擊winxp下的FTP客戶端,程序出現崩潰,OllyDbg調試器在崩潰點處暫停,進入View->SEH Chain菜單項,按F2設置斷點,如圖9所示,之后將異常傳遞給應用程序并進入到SSLEAY.DLL模塊下pop-pop-ret指令中,如圖10所示,接著使用單步步入進行調試,最終執行到NSEH中的斷點,如圖11所示,觀察緩沖區的數據可以發現在next SEH中地址指針指向了\xcc\xcc\xcc\xcc,正如滲透代碼中編寫的一樣,其后的shellcode代碼變為“DEFG…”,由此可知shellcode開始位置為SEH后4 bytes。跳轉指令short jump的機器碼為EB,后面跟上跳轉距離,加上nSEH、SEH各占4 bytes空間,因此跳轉距離=2bytes(nop)+4bytes(SEH)+4bytes,此外shellcode前通常添加一段空指令(\x90),來提供在內存中緩沖區位置變化時的一段錯誤容忍空間,這樣以空指令滑行區大小為30 bytes來設置最終跳轉距離為10 bytes,所以我們用0xEB,0x0A,0x90,0x90 覆蓋“next SEH”[17-20]。

圖9 在SEH處設置斷點

圖10 SSLEAY.DLL模塊下的pop-pop-ret指令

圖11 shellcode在緩沖區中的位置
確定跳轉指令后,替換掉代碼中原來4 bytes的中斷字符串,將shellcode利用Metasploit下的payload.encoded函數來代替[14],這樣Metasploit在運行時刻會將指定的攻擊載荷經過編碼之后,附加到邪惡攻擊字符串后面,修改如下(滲透攻擊代碼):

這樣一個完整的滲透攻擊代碼已經完成,之后在Metasploit平臺下裝載新編寫的 eaay_file_sharing_ftp_pass_3.5 攻擊模塊,驗證其可用性。
在Kali攻擊機(IP:192.168.40.200)下,進入MSF,搜索 easy_file_sharing_ftp_pass_3.5 攻擊模塊,首先查看該模塊具體信息是否與我們編寫一致,接下來利用該滲透攻擊模塊攻擊利用上述軟件開啟FTP服務的目標主機WIN XP SP3,IP:192.168.40.128,驗證是否能夠獲得目標主機的遠程訪問權限。
easy_file_sharing_ftp_pass_3.5 模塊信息如下:
root@ kali:~# msfconsole
msf>search easy_file_sharing_ftp_pass_3.5

上面的攻擊模塊信息完整顯示了模塊適用平臺為windows,攻擊目標為XP sp3,目標地址為192.168.40.128,目標端口21,payload空間為600字節,壞字符數為14個。
配置攻擊載荷為常用的windows/meterpreter/reverse_tcp,創建一個具有反彈式meterpreter會話連接,監聽地址設為攻擊機地址192.168.40.200,FTP登錄用戶名為anonymous,實施攻擊。如圖12所示,攻擊模塊成功運行,同時發起針對FTP服務的滲透攻擊,并且開放回連端口,等待靶機連接,等待幾秒,攻擊機成功獲得遠程主機winxp的訪問權限。

圖12 滲透攻擊成功
本文針對Easy File Sharing FTP v3.5軟件存在的SEH溢出漏洞,從漏洞挖掘與分析、滲透攻擊模塊編寫、滲透攻擊模塊測試這三個方面進行闡述。研究首先利用Fuzz測試法針對Easy File Sharing FTP軟件自身進行了漏洞挖掘與分析,之后利用Ruby語言編寫初始骨架的滲透攻擊模塊,繼而完成繞過SEH限制、獲取返回地址和編寫段跳轉指令這三個環節,形成最終完善的滲透攻擊模塊。最后動態加載攻擊載荷,實施針對目標靶機的滲透攻擊,獲取目標主機遠程訪問權限。
隨著網絡安全日益成為人們關注的熱點,研究基于SEH漏洞攻擊對網絡安全問題的研究具有重要推動作用,同時編寫Metasploit框架支持的滲透攻擊模塊也為安全領域內共享的系統化攻擊知識庫做出了重要補充。
[1](美)David Kennedy,Jim O'Gorman,Devon Kearns著.Metasploit滲透測試指南[M].諸葛建偉,王珩,孫松柏譯.北京:電子工業出版社,2012:198-210.
[2]Rapid7.Metasploit User Guide[EB/OL].(2013-11-3)[2015-4-10].https://community.rapid7.com/docs/DOC-1567.
[3]諸葛建偉,陳力波,孫松柏等.Metasploit滲透測試魔鬼訓練營[M].北京:機械工業出版社,2013.
[4]SUTTON M,GREENE A,AMINIP.Fuzzing,brute vulnerability discovery[M].[S.I.]:Pearson Education Inc,2007.
[5]龔波,馮軍,徐雅麗.模糊測試一強制性安全漏洞發掘[M].北京:機械工業出版社,2009.
[6]王穎.Fuzzing漏洞挖掘與溢出利用分析技術研究[D].河南:解放軍信息工程大學,2009.
[7]王清.0day安全:軟件漏洞分析技術[M].第2版.北京:電子工業出版社,2011.
[8]彭贊.Windows平臺下緩沖區漏洞研究[D].杭州:浙江師范大學,2010.
[9]徐有福,張晉含,文偉平.Windows安全之SEH安全機制分析[J].信息網絡安全,2009(5):50.
[10]Corelanc0d3r.ExploitWriting Tutorial Part 3-SEH Based Exploits[EB/OL].(2010-02-26)[2015-4-10].http://www.corelan.be:8800.
[11] Aishwarya lyer,Liebrock L M.Vulnerability Scanning for Buffer Overflow[C]//Information Technology:Coding Computing,2004.ITCC International Conference on,2004:25.
[12](美)Michael Sikorski,Andrew Honig著.惡意代碼分析實戰[M].諸葛建偉,姜輝,張光凱譯.北京:電子工業出版社,2014.
[13]張曉磊,張曉明.基于堆棧的緩沖區溢出攻擊原理[J].廣州大學學報,2004,3(4):329-332.
[14]姜洋.滲透測試關鍵技術研究[D].西安:西安電子科技大學電路與系統,2014.
[15]鄧樂.基于緩沖區溢出的網絡滲透技術[D].上海:上海交通大學,2007.
[16]王煒,方勇.緩沖區溢出教程[M].北京:中電電子出版社,2005.
[17]羅愛國,鄭艷杰.黑客攻防技術寶典:系統實戰篇[M].第2版.北京:人民郵電出版,2010.
[18]趙麗娟.Fuzz安全測試技術研究[D].北京:北京郵電大學,2011.
[19]張明,徐萬里.Windows系統異常處理機制的研究及應用[J].計算機工程,2009,35(01):157-160.
[20](日)愛甲健二著,周自恒譯.有趣的二進制:軟件安全與逆向分析[M].北京:人民郵電出版社,2015:90-100.
[21](日)高橋征義,(日)后藤裕藏著.Ruby基礎教程[M].何文斯譯.第4版.北京:人民郵電出版社,2014.
SEH Buffer Overflow based on M etasp loit Framework
YAO Dong,WEIZhan-zhen,GAO Jun-tao
(Beijing Electronic Science and Technology Institute,Beijing 100070,China)
Metasploit,as themost influential open source framework platform in the field of security,itsmost prominent contribution is the development of semi industrial production mode of vulnerability research and penetration-code development.Taking Easy File Sharing FTP Server software as an example and from the three aspects of vulnerabilitymining and analysis,exploitwriting and exploit testing,the generalmethod of SHE exploit based on Metasploit framework is described,and the penetration attack exploit for the software security vulnerabilitiesalsowrote.The research focuses on the analysis of the three key aspectsof SEH exploit:through bypassing the SEH limit,acquiring the return address and writing a short jump instruction.Through in-depth study of this series,fairly the study of automated penetration testing development is fairly promoted.At the same time,development of penetration attack exploit under MSF serves as an important supplement to the system of the knowledge base of the system in the security field,and also it is of important significance.
Metasploit;client penetration attack;SEH based Exploit;Ruby
TP309
A
1009-8054(2016)06-0099-06
2016-02-16
姚 棟(1975—),男,工程師,主要研究方向為信息安全;
魏占禎(1971—),男,研究員級高工,主要研究方向為信息安全測評;
高駿濤(1990—),男,碩士研究生,主要研究方向為信息安全。