【问题标题】:Is it possible to impersonate a process's access token?是否可以模拟进程的访问令牌?
【发布时间】:2020-01-05 06:14:16
【问题描述】:

模拟用户的典型方式是调用LogOnUser()获取用户的访问令牌,并将该令牌传递给ImpersonateLoggedOnUser()进行模拟。

但是,这只会模拟用户调用线程。有没有办法模拟或更改进程的访问令牌(主令牌)?支持 我正在访问一个网络共享,并产生了多个线程来访问该网络共享的不同部分。我是否必须在所有这些线程中模拟远程用户(有权访问该共享)?或者有没有办法首先“模拟”进程,这样当新线程产生时,它们已经通过自动继承进程主令牌获得了访问权限?

【问题讨论】:

    标签: c++ windows security winapi impersonation


    【解决方案1】:

    不,这是不可能的。 NtSetInformationProcess 的正式存在 ProcessAccessToken 信息类。它以PROCESS_ACCESS_TOKEN 结构作为输入。它没有记录,但在 ntddk.h

    中声明
    //
    // Process Security Context Information
    //  NtSetInformationProcess using ProcessAccessToken
    // PROCESS_SET_ACCESS_TOKEN access to the process is needed
    // to use this info level.
    //
    
    typedef struct _PROCESS_ACCESS_TOKEN {
    
        //
        // Handle to Primary token to assign to the process.
        // TOKEN_ASSIGN_PRIMARY access to this token is needed.
        //
    
        HANDLE Token;
    
        //
        // Handle to the initial thread of the process.
        // A process's access token can only be changed if the process has
        // no threads or a single thread that has not yet begun execution.
        //
        // N.B. This field is unused.
        //
    
        HANDLE Thread;
    
    } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
    

    请注意

    只有在进程没​​有线程或单个线程尚未开始执行时才能更改进程的访问令牌。

    真的在 xp/2003 上没有那么严格的条件:来自 PspAssignPrimaryToken in wrk

    只有在进程没​​有线程时才能替换主令牌,或者 有一个线程。

    但是从 vista 开始,这个添加的还没有开始执行

    如果你调用它来进行自我处理(你可能需要 SeAssignPrimaryTokenPrivilege 权限并且没有它可以获得STATUS_PRIVILEGE_NOT_HELD,取决于令牌类型) - 你得到STATUS_NOT_SUPPORTED 错误。为example

    所以在实践中,我们只能在启动处于挂起状态的进程后才更改进程令牌(例如 answer )。但在这种情况下最好使用CreateProcessAsUserW 函数。

    【讨论】:

      【解决方案2】:

      似乎唯一可行的方法是在主线程中准备令牌并将相同的令牌传递给新线程以供它们模拟。这样,新线程本身就不必再次调用LogOnUser()。他们只需要冒充(相同的令牌)。

      【讨论】:

      • 是的。您只需要(以某种方式)获得一次模拟令牌,然后使用SetThreadToken 为线程设置令牌。您可以将此令牌传递给线程,因为它本身可以在需要时/如果需要。或创建处于挂起状态的线程,调用SetThreadToken 并恢复
      猜你喜欢
      • 2020-07-29
      • 1970-01-01
      • 2019-04-30
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多