我想了解的是LogonUser
和LOGON32_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
注意带有
16
的Administrators 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:{Interactive
,RemoteInteractive
,CachedInteractive
,CachedRemoteInteractive
}
让debug lsass.exe看看在调用LsaApLogonUserEx2期间发生了什么(当客户端进程调用LsaLogonUser或shellLogonUser时,此函数在lsass的上下文中调用)
如果登录正常,lsass必须为登录的用户创建新令牌。这是在函数LsaBuildAndCreateToken
中完成的(当然这是内部实现,这个函数的名称可以从一个版本更改到另一个版本,但它的一般工作方式不变)。所以我在调试器下跟踪这个函数-看看右边的调用树(这是用于交互式登录的)
在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
函数谁知道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/