通过更改提升进程中的提升进程安全描述符,非提升进程是否有可能在提升进程具有相同的登录会话ID时获得非默认访问权限(例如<textarea id="x"></textarea>
<textarea id="y"></textarea>
<textarea id="z"></textarea>
<button id="calculate">Calculate</button>
<br>
<p id="p"></p>
)。进程资源管理器安全标签?
我尝试更改已提升进程的安全描述符,并为登录会话SID选择了完全访问权限。但是当我使用PROCESS_QUERY_INFORMATION
访问权限调用OpenProcess()
时,仍然在非提升的进程中返回{{1 }}
答案 0 :(得分:0)
从vista开始也存在Mandatory Integrity Control。提升过程具有高强制标签( S-1-16-12288 ),带有SYSTEM_MANDATORY_LABEL_NO_WRITE_UP
和SYSTEM_MANDATORY_LABEL_NO_READ_UP
掩码。从另一方面来看,未提升的进程在令牌中具有中等强制等级( S-1-16-8192 )。因此,当它尝试使用PROCESS_QUERY_INFORMATION
打开进程时,这是进程对象的通用读取的一部分 - 我们通常无法从非提升进程(中等级别)执行升级进程(高标签和SYSTEM_MANDATORY_LABEL_NO_READ_UP
)。
让我们打开PROCESS_QUERY_INFORMATION
提升的流程从未提升 - 我们需要更改提升流程强制标签。或将其设置为中等或低,或删除SYSTEM_MANDATORY_LABEL_NO_READ_UP
标志。最后一个选项 - 最适合我的目标
要删除SYSTEM_MANDATORY_LABEL_NO_READ_UP
,我们可以使用下一个代码:
// hProcess must have READ_CONTROL | WRITE_OWNER
ULONG RemoveNoReadUp(HANDLE hProcess = NtCurrentProcess())
{
union {
PVOID buf;
PSECURITY_DESCRIPTOR pSD;
};
ULONG cb = 0, rcb = 128;
static volatile UCHAR guz = 0;
PVOID stack = alloca(guz);
ULONG err;
do
{
if (cb < rcb)
{
cb = RtlPointerToOffset(buf = alloca(rcb - cb), stack);
}
if (GetKernelObjectSecurity(hProcess, LABEL_SECURITY_INFORMATION, pSD, cb, &rcb))
{
BOOL bPresent, bDefault;
PACL Acl;
if (!GetSecurityDescriptorSacl(pSD, &bPresent, &Acl, &bDefault))
{
return GetLastError();
}
if (bPresent)
{
if (DWORD AceCount = Acl->AceCount)
{
union {
PVOID pv;
PBYTE pb;
PACE_HEADER pAH;
PSYSTEM_MANDATORY_LABEL_ACE pMLA;
};
pv = Acl + 1;
do
{
if (pAH->AceType == SYSTEM_MANDATORY_LABEL_ACE_TYPE)
{
if (pMLA->Mask & SYSTEM_MANDATORY_LABEL_NO_READ_UP)
{
pMLA->Mask &= ~SYSTEM_MANDATORY_LABEL_NO_READ_UP;
return SetKernelObjectSecurity(hProcess, LABEL_SECURITY_INFORMATION, pSD)
? NOERROR : GetLastError();
}
}
} while (pb += pAH->AceSize, --AceCount);
}
}
return ERROR_NOT_FOUND;
}
} while ((err = GetLastError()) == ERROR_INSUFFICIENT_BUFFER);
return err;
}