gpt4 book ai didi

c - LOGON32_LOGON_INTERACTIVE 是否提供受限 token ?

转载 作者:可可西里 更新时间:2023-11-01 11:46:43 28 4
gpt4 key购买 nike

我想了解的是 LogonUserLOGON32_LOGON_INTERACTIVE 是否会产生受限 token ?这是我的代码:

int davai()
{
FILE * fp;

fp = fopen ("C:\\tmp\\davai.txt", "a");
fprintf(fp, "shevedi davai");
fflush(fp);

HANDLE token = NULL;
HANDLE dupToken = NULL;

if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &token))
{
fprintf(fp, "davai: OpenProcessToken cheijva. %d\n", (int)GetLastError());
fflush(fp);
}

if (DuplicateTokenEx(token, MAXIMUM_ALLOWED, NULL, SecurityDelegation,
TokenPrimary, &dupToken) == 0)
{
fprintf(fp, "davai: OpenProcessToken DuplicateTokenEx. %d\n", (int)GetLastError());
fflush(fp);
}

PTOKEN_GROUPS pPrivilegesToken = NULL;
DWORD cbSize = 0;

GetTokenInformation(dupToken, TokenGroups, NULL, 0, &cbSize);

pPrivilegesToken = (PTOKEN_GROUPS) LocalAlloc(LPTR, cbSize);

if (GetTokenInformation(dupToken, TokenGroups,
pPrivilegesToken, cbSize, &cbSize) == FALSE)
{
fprintf(fp, "davai: GetTokenInformation cheijva. %d\n", (int)GetLastError());
fflush(fp);
}

char * gio;

for (ULONG i = 0; i < pPrivilegesToken->GroupCount; i++)
{
if (ConvertSidToStringSid(pPrivilegesToken->Groups[i].Sid, &gio) == 0)
{
fprintf(fp, "davai: ConvertSidToStringSid cheijva. %d\n", (int)GetLastError());
fflush(fp);
}

fprintf(fp, "Value: %s attribute -> %ld \n",gio, pPrivilegesToken->Groups[i].Attributes);
fflush(fp);
}

LocalFree (gio);

return 1;
}

它由 LOGON32_LOGON_INTERACTIVE 获得的 token 运行。我的输出是这样的:

Value: S-1-5-21-1018819917-2920201817-244685803-513 attribute -> 7 
Value: S-1-1-0 attribute -> 7
Value: S-1-5-21-1018819917-2920201817-244685803-1000 attribute -> 7
Value: S-1-5-32-544 attribute -> 16
Value: S-1-5-32-545 attribute -> 7
Value: S-1-5-4 attribute -> 7
Value: S-1-2-1 attribute -> 7
Value: S-1-5-11 attribute -> 7
Value: S-1-5-15 attribute -> 7
Value: S-1-5-5-0-19732224 attribute -> -1073741817
Value: S-1-5-64-10 attribute -> 7
Value: S-1-16-8192 attribute -> 96

注意 16Administrators Group。如果我使用 LOGON32_LOGON_BATCH 我会得到这个:

S-1-5-21-1018819917-2920201817-244685803-513 attribute -> 7 
Value: S-1-1-0 attribute -> 7
Value: S-1-5-21-1018819917-2920201817-244685803-1000 attribute -> 7
Value: S-1-5-32-544 attribute -> 15
Value: S-1-5-32-545 attribute -> 7
Value: S-1-5-3 attribute -> 7
Value: S-1-2-1 attribute -> 7
Value: S-1-5-11 attribute -> 7
Value: S-1-5-15 attribute -> 7
Value: S-1-2-0 attribute -> 7
Value: S-1-5-5-0-20537541 attribute -> -1073741817
Value: S-1-5-64-10 attribute -> 7
Value: S-1-16-12288 attribute -> 96

我也发现有些人和我有同样的问题。

  1. IsAdminUser returns incorrect value
  2. In Windows: How do you programatically launch a process in administrator mode under another user context?
  3. How to call LogonUser() to get a non-restricted full token inside a Windows Service with UAC enabled?

在我看来,LOGON32_LOGON_INTERACTIVE 生成受限 token (或者只是不同类型的登录生成不同类型的 token ?),是否有任何文档可以验证我是对的?

最佳答案

Does LOGON32_LOGON_INTERACTIVE give restricted token?

是的,对于所有交互式 logon types : { Interactive, RemoteInteractive, CachedInteractive, CachedRemoteInteractive }

调试 lsass.exe 并查看在调用 LsaApLogonUserEx2 期间发生了什么(当客户端进程调用 LsaLogonUser 或 shell LogonUser 时,此函数在 lsass 上下文中调用)

如果登录正常,lsass 必须为登录用户创建新 token 。这是在函数 LsaBuildAndCreateToken 中完成的(当然,这是内部实现,此函数的名称可以在不同版本之间更改,但一般如何工作 - 不变)。所以我在调试器下跟踪这个函数 - 查看右侧的调用树(这是用于交互式登录) enter image description here

寻找红色乡绅 - 在 ESI 中 - LogonType - SECURITY_LOGON_TYPE枚举值

接下来是一般代码:

    SECURITY_LOGON_TYPE LogonType;
switch (LogonType)
{
case Interactive://2
case RemoteInteractive://10
case CachedInteractive://11
case CachedRemoteInteractive://12
// optimization (LogonType == 2) || (LogonType - 10) <= 2
BOOLEAN b, c;
if (0 <= LsapShouldSplitToken(Sid, &b,&c) && b)
{
LsaSplitElevatedToken(..)
}
break;
}

这意味着 lsass 尝试限制ONLY INTERACTIVE 登录类型,如果是另一种登录类型,比如Batch - 永远不会过滤 token .

下一个有趣的点 - 让我们寻找 LsapShouldSplitToken 函数

enter image description here

知道 x64 的人 - 可以理解代码 :) 一般来说,如果 LUA 未启用 - 不要过滤 token 。如果全局变量 LsapGlobalFilterAdministratorToken 为 false - 检查用户是否是内置管理员 - 检查 SidRID - 是 0x1f4 - DOMAIN_USER_RID_ADMIN (换句话说,仅当 LsapGlobalFilterAdministratorToken 为真时,内置管理员才受限 - 基于全局竞争策略 (gpedit.msc)) - 并返回查询结果 10+4=0x14=TokenElevation 返回值TokenIsElevated

所以如果TokenIsElevated是真正的 lsass 调用(不要忘记仅用于 Interactive 登录类型)LsaSplitElevatedToken - 此函数的作用在图像中可见:

创建了额外的登录 session (针对同一用户在不同登录 session 中运行的提升和未提升进程),另外创建了一个 token (LsapCreateTokenObject) 并通过调用 NtFilterToken(hToken, LUA_TOKEN) 进行过滤, 0, 0, 0, &hNewToken)(win32 api CreateRestrictedTokenNtFilterToken 的外壳)

关于c - LOGON32_LOGON_INTERACTIVE 是否提供受限 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43074795/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com