Windows管理員權限思考

進程以管理員權限和非管理員權限運行有很大的特權差別,具體怎麼檢查當前進程是否以管理員權限運行,代碼如下:

#include <stdio.h>
#include <Windows.h>
#include <Sddl.h>

int main()
{
	BOOL IsMember;
	PSID l_pSid=NULL;
	SID_IDENTIFIER_AUTHORITY IdentifierAuthority=SECURITY_NT_AUTHORITY;	//#define SECURITY_NT_AUTHORITY  {0,0,0,0,0,5}  
	// 生成一個當前進程的PSID
	AllocateAndInitializeSid(&IdentifierAuthority,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,&l_pSid);
	// 檢查當前進程的PSID是否是管理員權限
	CheckTokenMembership(NULL,l_pSid,&IsMember);
	FreeSid(l_pSid);
	if(IsMember==TRUE)
	{
		printf("當前用戶是以管理員權限運行\n");
	}
	else
		printf("當前用戶不是以管理員權限運行\n");
	system("pause");
	return 0;
}

Windows10下使用不同方式運行,結果如下圖:

惡意代碼往往也喜歡知道自身進程的運行權限,彙編代碼如下:

續一(通過系統漏洞升級爲管理員權限):

管理員權限和非管理員權限到底有哪些區別,可以通過使用不同身份的cmd窗口輸入whoami/ALL查看,Windows10中測試如下圖:

非管理員權限只有5個特權,其中包括更改時區、關機;管理員權限有n個特權,包括更改時間、遠程強制關機、調試程序。

如果一個惡意進程想要從非管理員升級到管理員,在操作系統看來是不合法的,這樣的惡意進程會絞盡腦汁利用操作系統的漏洞來獲得管理員權限(XP系統沒有區分這2個概念,都是管理員權限;WIndows7區分的有點模糊,也可能我用的是盜版系統),至於獲得管理員權限後,惡意進程如何利用管理員那些特權、做了哪些壞事,見續二。

續二(啓用管理員權限的SeDebugPrivilege特權):

惡意進程從非管理員權限到獲取管理員權限,也就有了n個特權,其中SeDebugPrivilege特權特別重要,看MSDN中如何描述:If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor。

SeDebugPrivilege特權在續一的圖片有看到,但是狀態時禁用的,就需要激活或者說時啓用(很多地方都說是提權,很不恰當,而且容易和上面的提權概念搞混),啓用代碼如下:

#include <stdio.h>
#include <Windows.h>
 
 
BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege) 
{
	TOKEN_PRIVILEGES tp;
	LUID luid;
 
	if( !LookupPrivilegeValue(NULL,lpszPrivilege,&luid) )
	{
		printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
		return FALSE; 
	}
 
	tp.PrivilegeCount = 1;
	tp.Privileges[0].Luid = luid;
	if( bEnablePrivilege )
		tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
	else
		tp.Privileges[0].Attributes=0;
 
	if( !AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )
	{ 
		printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
		return FALSE; 
	} 
 
	if( GetLastError()==ERROR_NOT_ALL_ASSIGNED )
	{
		printf("The token does not have the specified privilege. \n");
		return FALSE;
	} 
 
	return TRUE;
}
 
int main( )
{
	HANDLE hToken;
	BOOL bRet=OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken);
	SetPrivilege(hToken,SE_DEBUG_NAME,TRUE);
 
	return 1;
}

續三(啓用SeDebugPrivilege特權的管理員權限進程):

現在好了,管理員權限有了,SeDebugPrivilege特權也啓用了,可以做那些事呢?

惡意進程常用的就是控制其他進程,比如ReadProcessMemory( )、WriteProcessMemory()、CreateRemoteThread( )、ExitProcess( )

如果進程不是管理員權限或者沒有啓用SeDebugPrivilege特權,這些函數調用寫的再正確,權限不允許,白廢功夫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章