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特权,这些函数调用写的再正确,权限不允许,白废功夫。

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