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

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获得的令牌运行。我的结论是:
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)Perl: 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产生了受限令牌(或者只是不同类型的登录产生了不同类型的令牌?),有什么文件可以证明我是对的吗?

最佳答案

logon32_logon_interactive是否提供受限令牌?
是,对于所有交互式logon types:{InteractiveRemoteInteractiveCachedInteractiveCachedRemoteInteractive}
让debug lsass.exe看看在调用LsaApLogonUserEx2期间发生了什么(当客户端进程调用LsaLogonUser或shellLogonUser时,此函数在lsass的上下文中调用)
如果登录正常,lsass必须为登录的用户创建新令牌。这是在函数LsaBuildAndCreateToken中完成的(当然这是内部实现,这个函数的名称可以从一个版本更改到另一个版本,但它的一般工作方式不变)。所以我在调试器下跟踪这个函数-看看右边的调用树(这是用于交互式登录的)
c - Winapi:LOGON32_LOGON_INTERACTIVE是否提供受限 token ?-LMLPHP
在esi中查找red squire-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尝试仅限制交互式登录类型,如果将是另一种登录类型,则说永远不会筛选批处理令牌。
下一个有趣的点-让我们寻找LsapShouldSplitToken函数
c - Winapi:LOGON32_LOGON_INTERACTIVE是否提供受限 token ?-LMLPHP
谁知道x64-可以理解代码:)一般来说,如果lua没有启用-不要过滤令牌。如果全局变量LsapGlobalFilterAdministratorToken为false-check are user is built-in-admin-check rid of sid-是不是0x1f4-DOMAIN_USER_RID_ADMIN(换句话说,只有当LsapGlobalFilterAdministratorToken为true-基于全局comp politics(gpedit.msc)-并且返回查询结果10+4=0x14=TokenElevation和返回值TokenIsElevated
因此,如果TokenIsElevated是真的lsass调用(不仅仅是交互式登录类型的忘记)LsaSplitElevatedToken-这个函数在图像中的作用是可见的:
创建了其他登录会话(为在不同登录会话中运行的同一用户提升和未提升的进程),创建了一个令牌(LsapCreateTokenObject),并通过调用进行了筛选(win32 apiNtFilterToken(hToken, LUA_TOKEN, 0, 0, 0, &hNewToken)是shell overCreateRestrictedToken

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

10-12 20:03