【问题标题】:ImpersonateLoggedOnUser doesn't appear to workImpersonateLoggedOnUser 似乎不起作用
【发布时间】:2010-12-05 20:15:08
【问题描述】:

成功调用 LogonUser 和 ImpersonateLoggedOnUser 后,我的进程似乎没有以新用户身份运行...

system("whoami");

打印出来: 克里斯-PC\克里斯

什么时候应该: 克里斯-PC\LimitedGuy

有什么我没有调用的函数吗?

我的代码:

if(argc == 6) // impersonate
        {

            printf("[~] Logging in as %ws\\\\%ws..\n", argv[3], argv[4]);
            if(!LogonUser(argv[4], argv[3], argv[5], LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &logonToken))
            {
                printf("[!] Failed to login as %ws. Error Code: %X\n", argv[4], GetLastError());
                return 1;
            }


            if(!ImpersonateLoggedOnUser(logonToken))
            {
                printf("[!] ImpersonateLoggedOnUser failed with error code: %X\n", GetLastError());
                return 1;
            }

            LoadUserProfile(logonToken, &plinfo);
            system("whoami");
            printf("[~] Login successful!\n");
} 

【问题讨论】:

    标签: c++ winapi login impersonation


    【解决方案1】:

    当您使用系统调用时,会创建一个新进程来执行命令,但在 Windows 中,始终使用来自父进程而不是线程的令牌创建新进程(除非您专门使用 CreateProcessAsUser、CreateProcessWithLogonW 等之一. 呼叫)。因此,在您的情况下,“whoami”是在原始用户的上下文中执行的,而不是冒充的。要检查被模拟的用户的名称,请调用 GetUserName。

    【讨论】:

    • 当我使用 CreateProcessAsUser 启动 cmd.exe 时,当我输入“whoami”时它仍然失败。无论如何强制启动的进程具有我想要的安全属性?
    • 我刚刚尝试使用 CreateProcessWithLogonW 进行快速测试,它按预期工作 - whoami 提供了启动进程的帐户的用户名,而不是原始用户的用户名。尽管看起来不太可能,但它可能与环境块或类似的东西有关。也许您可以发布您的 CreateProcessAsUser 代码。
    猜你喜欢
    • 2016-11-29
    • 2016-02-01
    • 2020-09-23
    • 2011-06-14
    • 2015-01-10
    • 2016-02-24
    • 2011-01-18
    • 2018-06-20
    • 2011-12-27
    相关资源
    最近更新 更多