KingView 6.53漏洞學習研究

類別:堆溢出shell

描述:此漏洞存在於KingView6.53軟件的HistorySvr.exe進程中,這個軟件服務程序在TCP 777端口監聽時收到一個超長請求,致使堆緩衝區溢出從而執行任何代碼。windows

參考資料:《Metasploit魔鬼訓練營》p225-p232安全

 

下載此漏洞的利用代碼:http://downloads.securityfocus.com/vulnerabilities/exploits/45727.rb網絡

發現這個利用代碼中沒有針對windows 2003的target,因此直接攻擊不能成功數據結構

 可是查看靶機,會發現HistorySvr.exe這個進程已經消失了(若是沒消失,多試幾回exploit)。這說明應該是成功溢出了,只是沒有順利執行Shellcode。ide

 

爲了解決這個問題,咱們能夠經過OllyDbg在系統默認的異常處理函數運行前,進入程序異常時的現場。函數

在OllyDbg中開啓」Just-in-time debuggingspa

重啓HistorySvr.exe後,再次攻擊,OllyDbg截獲異常。發現此時eax寄存器的值正式源代碼中對應target的Ret值!操作系統

                

再觀察中斷處的代碼插件

經過view->log能夠看到中斷的地址和緣由

這說明異常發生時這一塊內存空間並無被分配使用,所以觸發了異常。

總的來講,此次攻擊咱們成功地用Ret值覆蓋了eax寄存器,可是須要將Ret值改成針對windows 2003的值才能成功將程序劫持到Shellcode處。因此接下來應該尋找Shellcode在內存中的位置。

 

咱們在攻擊模塊代碼中增長一個target,Ret值先隨便設一個:

 52                         [ 'Windows 2003 SP0 EN', {'Ret' => 0x00A1FB84} ], #New target    

    --snip--

85 elsif target.name =~ /2003 SP0/ 86 87 #sploit << make_nops(1024) 88 sploit << make_nops(1020) 89 sploit << "ABAC" #做爲查找Shellcode的特殊標記 90 sploit << payload.encoded 91 sploit << "\x44"*(31752-payload.encoded.length) 92 sploit << [target.ret].pack('V')

在msfconsole中reload這個模塊,靶機開啓HistorySvr.exe,設置target爲2後,再次攻擊。

 

靶機OllyDbg截獲異常,經過在內存中查找ASCII字符「ABAC」,成功找到咱們Shellcode的地址。

可知shellcode地址位於0x00CD04C4

Ret地址改成0x00CD04B4(0x00CD04C0-0xC)

而在0x00CD04C0地址上的內存應是Shellcode的地址,代碼中"ABAC"的位置相應改成"\xC4\x04\xCD\x00"。

修改源代碼後,從新載入模塊並exploit,試了3次,終於成功!

 

****************************************************************************************************************************

KingView堆溢出安全漏洞原理分析

因爲操做系統對堆內存的管理在調試態和非調試態存在區別,因此不一樣於前面的攻擊,此次先用OllyDbg附加HistorySvr.exe,同時啓用HideOD插件,而後讓程序運行起來,並在WSOCK32.dll模塊的接收數據recv函數處下斷點

爲了方便調試,將攻擊模塊代碼中的 sploit << "\xC4\x04\xCD\x00" 改成「ABCC」。

而後進行攻擊。

OllyDbg加載程序在接受網絡數據時就會中斷,用「ctrl+f9」執行到返回,來到nettrans.dll模塊。

這段代碼的做用至關於  memcpy(destbuf, sourcebuf, size)。

就是將接收到的網絡數據保存在buf中,而後按接收的長度,將buf 的數據複製到另一段緩衝區中。

因此咱們要獲得的是這3個參數,destbuf, sourcebuf, size。

在0x00322A9E和0x00332AB9處下斷點,從攻擊機進行exploit

(可是從metasploit攻擊後,在靶機OllyDbg上須要迅速按f9才能屢次在nettrans.dll模塊和wsock32.dll模塊中跳轉。慢的話按兩三次f9就不動了。這樣就不夠時間觀察了。.我猜多是沒被接收的數據包超時就被丟棄了吧。。個人解決辦法就是經過錄像軟件來分析)

 

①攻擊後程序會停在wsock32.recv函數的入口處,此時觀察棧能夠獲得sourcebuf爲0X00CCC0C4:

②按f9後程序來到nettrans模塊的0x00332A9E處,此時eax寄存器爲複製長度size

前兩次是,最後一次是

③停在0x00322AB9時edi的值爲destbuf的地址

第一次爲;第二次爲;第三次次爲

程序分3次一共接收了0x800C字節數據。

 

找到源緩衝區起始地址以前的內容

這裏塊首的0x180B是堆空間大小。

結合這些咱們能夠算出目的緩衝區的最大大小爲0x8000

也就是說而第三次的起始地址0x00CD80C4以後已是超出目的緩衝區的邊界,形成了溢出!

最後一次複製前時內存0x00CD80C4地址處的內容爲

咱們覆蓋掉的函數地址是本來爲 18 84 33 00 那裏。意味着原來應該執行的是[0x00338418+C]處的代碼。

 

這裏有幾個疑問:

一、不知道怎麼肯定堆塊塊首。塊首與buffer地址相隔0x2c,不知道這0x2c怎麼算的;

二、按書上說的,從藍色的地方開始是堆塊的數據部分起始地址,其中的數據和書上類似但不徹底同樣。我不清除這些藍色部分的數據表明的是什麼。

 

最後用書上的話來總結吧:

KingView堆溢出漏洞能夠被成功利用的緣由,是程序在分配堆塊後在塊尾維持了一個數據結構,而其中包括一個函數指針地址(也就是「ABCC」所在的位置),程序以後會根據這個地址去執行相應的函數,滲透利用代碼經過堆溢出漏洞覆蓋這個函數指針,使Shellcode得以執行。

調試的時候用ABCC去覆蓋了函數指針地址,因此最後會顯示錯誤:

相關文章
相關標籤/搜索