從MS03-049漏洞利用看調(diào)試系統(tǒng)進程(圖)
前置知識:溢出漏洞基本調(diào)試步驟、Softice基本使用方法
WTF:Windows XP
SP2相信是大家都在關(guān)注的一個系統(tǒng),這個版本剛推出的時候,由于其具有溢出保護機制,傳統(tǒng)的溢出利用方式已經(jīng)不行了,它也因此而備受青睞。記得當時同行們也開始嘀咕著是否還有繼續(xù)研究溢出漏洞利用技術(shù)的必要。但是隨著時間的推移,XP
SP2也慢慢暴露出與以前的操作系統(tǒng)版本存在的兼容性問題,比如,有的軟件在Windows 2000或XP SP0、SP1上能正常使用,在SP2上卻不行;XP
SP2對利用原始套接字傳送TCP數(shù)據(jù)包做了很大的限制,導致我們開發(fā)某些網(wǎng)絡(luò)程序的時候出現(xiàn)障礙,等等。于是,出現(xiàn)了大量的用戶仍然堅持長期使用其它版本系統(tǒng)的情況。我并不是一個守舊者,我只是想借此來說明一下其實MS是給了我們很大的時間來繼續(xù)研究傳統(tǒng)的溢出漏洞的——針對XP SP2的IE漏洞不就出了好幾個了嗎?好了,廢話到此為止,看文章先:
菜鳥版Exploit編寫指南之九——
從MS03-049漏洞利用看調(diào)試系統(tǒng)進程
本文我主要是從前段時間利用WorkStation服務(wù)溢出漏洞(MS03-049)過程中遇到的一些問題為基礎(chǔ),談?wù)勎沂窃鯓油ㄟ^對該系統(tǒng)進程的調(diào)試來達到利用該漏洞為自己服務(wù)的。我的目的不完全是講這個漏洞,而是更想通過介紹漏洞的利用過程來探討一下以后在沒有公布利用代碼,或則有人公布了利用代碼但是在關(guān)鍵的地方有所保留的情況下,如何能一步一步地寫出自己的利用代碼。當然,現(xiàn)在的方法只是很初步的。
盡可能地利用現(xiàn)有的資料
前段時間閑得無聊,想看看有什么新的溢出漏洞可以利用,但是打開Xfocus和Nsfocus一看,實在找不到新的基于Windows的堆棧溢出漏洞。于是就想起了去年的WorkStation漏洞好象沒有爆發(fā)蠕蟲,也就是說雖然網(wǎng)上已有相關(guān)補丁,但該漏洞還是有廣泛存在的可能性。于是,我決定拿它來練練手。
EEYE發(fā)現(xiàn)的MS03-049溢出是在Wkssvc.dll的某個API中Call
vsprintf函數(shù)時發(fā)生的。我后來找到了Snake的兩個分析文章,了解了漏洞的原理以及適用范圍,這里不再多講。遺憾的是,可能由于輿論的壓力,Xfocus或Nsfocus都沒有在顯要的位置公布利用代碼,最后費了好大的力氣才從論壇上找到了Sbaa的寫的那篇代碼。有了利用代碼,那當然馬上試一試。好家伙!居然很快就進了朋友的一臺機器,如圖1、2所示:
javascript:if(this.width>500)this.width=500" border=0>
圖1
javascript:if(this.width>500)this.width=500" border=0>
圖2
居然這么順利?!既然如此,看看能否將利用代碼改寫為自動傳送文件。好在這方面的ShellCode以前編寫過,那就用現(xiàn)成的?,F(xiàn)在剩下的就是找到溢出點再往下修改即可,為了方便起見,以下的工作都是針對Windows
2000,并且當前系統(tǒng)分區(qū)為Fat32。
溢出點的確定
溢出點當然是從現(xiàn)成的代碼中找了。再次打開開DOS窗口的源代碼,發(fā)現(xiàn)其中有兩處值得注意的地方,一個地方如圖3所示:
javascript:if(this.width>500)this.width=500" border=0>
圖3
另一個是代碼中發(fā)送數(shù)據(jù)包的安排如下:
| ShellCode| AAAAAAAA…| 跳轉(zhuǎn)地址|
AAAA…|
奇怪!整個代碼中只有這個地址覆蓋,但是0x7ffa4a1b是Windows 2000下通用的JMP
EBX的地址。我最初的理解是作者要覆蓋SEH的處理函數(shù)地址,但是為什么在兩處使用0x7ffa4a1b呢?而且沒有向前跳轉(zhuǎn)的指令,為何剛好跳到ShellCode開始的地方呢?還有,究竟溢出點在什么地?WorkStation服務(wù)究竟分配了多少個字節(jié)的空間來存儲參數(shù)?Snake在分析文章中大概指出在2023附近,那就先試試這個。
我填充好數(shù)據(jù)后,在第2023字節(jié)開始的地方覆蓋上通用的JMP
ESP地址0x7ffa4512,后面大約40個字節(jié)為\xeb\xfe(為什么要這樣做,繼續(xù)往后看?。缓蟠蜷_Softice,如果溢出點在這里的話,Softice回彈出來將停在“eb
fe”處??上?,這次沒有出現(xiàn)想要的效果,顯然2023不是溢出點。但是不用急,再從2001到2040這段區(qū)域內(nèi)依次填寫“ABCD…XYZ0123456789JJJJ”,剛好40個字節(jié)。編譯,連接,得到可執(zhí)行文件,然后重啟系統(tǒng)(這是比較繁瑣的地方,每次試驗后都得重啟),正好彈出來如下圖4所示的信息:
javascript:if(this.width>500)this.width=500" border=0>
圖4
現(xiàn)在就清楚了,0x54535251對應(yīng)的是“QRST”,對應(yīng)位置是在2017處。也就是說,可以認為WorkStation服務(wù)分配了2013個字節(jié)的緩沖區(qū)來存放參數(shù),而函數(shù)返回地址是在第2017(下標)字節(jié)處。溢出點找到了,下面的事情也就好做一些了。
檢測EIP之后的保留地址
前面我在探測2023是不是包含函數(shù)返回地址時,在后面約40個字節(jié)填滿了\xeb\xfe,目的其實在于檢查JMP
ESP后面是否有保留地址。因為有時候,BUF中填寫JMP ESP的后面是不能直接跟ShellCode的。例如RPC(MS03-026)漏洞就是在JMP
ESP后面必須留8字節(jié)的保留地址,那么在WorkStation服務(wù)漏洞中呢?按前面的方法一試,如圖5所示:
javascript:if(this.width>500)this.width=500" border=0>
圖5
從圖5可以看出,0x7ffa4512之后到執(zhí)行“eb
fe”的地方剛好有12個字節(jié),換句話說這12個字節(jié)就是保留地址。一般情況下,那我們就只需要把ShellCode放在這12個字節(jié)之后就可以了。
檢測服務(wù)的接收緩沖區(qū)大小
其實我覺得這是一個比較容易忽略的地方,在有的漏洞利用過程中,可能會出現(xiàn)該服務(wù)用于接收網(wǎng)絡(luò)參數(shù)的緩沖區(qū)大小受限。如果是這種情況,我們就不能把ShellCode放在JMP
ESP地址的后面,而應(yīng)該考慮放在前面。這個檢驗方法從Softice里查看內(nèi)存就知道了,這里不再多講。當然,經(jīng)過測試WorkStation服務(wù)漏洞不存在這個問題。
使用通用跳轉(zhuǎn)地址
能采用通用的跳轉(zhuǎn)地址最好,即使找不到通用的JMP ESP 的地址,也可以找找其他通用跳轉(zhuǎn)地址,而且有的服務(wù)本身就有通用的跳轉(zhuǎn)地址。例如SQL
Resolution服務(wù)漏洞中,就有一個通用的JMP
ESP的地址0x42b0c9dc, 而RPC溢出漏洞中有通用的具有JMP ESI功能的跳轉(zhuǎn)地址0x0100139d。
如果要想跳轉(zhuǎn)地址更通用,這里推薦現(xiàn)在比較流行的兩個:對Windows 2000、XP、2003都通用的具有JMP
EBX功能的地址是0x7ffa1571,通用的具有JMP ESP功能的地址是0x7ffa4512。在WorkStation服務(wù)漏洞中,我用的是0x7ffa4512。
接下來,就可以改寫我想要的傳送文件并執(zhí)行的利用代碼了,ShellCode是以前編寫好了的,這里不在講述。寫好的利用代碼和下載Sbaa的利用代碼都附在光盤的代碼中。
利用JMP ESP
這里在補充一點。前面已經(jīng)說過,Sbaa的代碼中其實有效的覆蓋函數(shù)返回地址的代碼只有一句:memcpy(szBuffer+2017,
“\x1b\x4a\xfa\x7f”,
4),但是他的ShellCode是放在SzBuffer的最前面的。從前面的分析入手,肯定是函數(shù)返回時ebx指向了SzBuffer!通過Softice查看如下圖6所示:
javascript:if(this.width>500)this.width=500" border=0>
圖6
EBX = 0x00109744,而szBuffer的首地址也是0x00109744,果然和想象的一樣!
我之所以要說這一點,其實是想說明我們對漏洞利用的原理其實都是差不多的,但是實現(xiàn)的手法卻可以有多種。具體怎么實現(xiàn),那是八仙過海,各顯神通。
好了,上面就是我通過利用WorkStation服務(wù)漏洞中得出的一些體會,可能有的地方寫的不是很清楚,希望能和大家相互交流。此外,本文中對Softice的抓屏我沒有其它辦法,是用數(shù)碼相機直接照下來的,所以有點模糊,希望大家見諒。
相關(guān)文章
由mysql弱口令取得system權(quán)限的實戰(zhàn)
由mysql弱口令取得system權(quán)限的實戰(zhàn)...2007-01-01