非升级进程对升级进程的非默认访问

时间:2017-11-13 18:54:37

标签: c++ windows winapi

抱歉英语不好

通过更改提升进程中的提升进程安全描述符,非提升进程是否有可能在提升进程具有相同的登录会话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 }}

1 个答案:

答案 0 :(得分:0)

从vista开始也存在Mandatory Integrity Control。提升过程具有高强制标签( S-1-16-12288 ),带有SYSTEM_MANDATORY_LABEL_NO_WRITE_UPSYSTEM_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;
}