我有一个服务(在会话0中作为NT AUTHORITY \ SYSTEM运行)。它使用CreateProcessAsUser创建两个子进入当前用户会话(在会话1中作为域\用户运行)。
孩子1我们会打电话给注射器,孩子2我们会打电话给注射器。
使用CREATE_SUSPENDED
进程创建标志暂停创建 注入。 Injector 针对注入调用CreateRemoteThread。 CreateRemoteThread
以8(ERROR_NOT_ENOUGH_MEMORY
)失败,经过一些谷歌搜索,它实际上与权限相关。
如果注射刚刚运行,那么注射器可以针对注射器流程成功调用CreateRemoteThread
来自用户帐户(CreateProcess
,CREATE_SUSPENDED
来自用户帐户)。
如果从用户帐户运行注射器,则它不能{<1}}针对注射器子项,但可以针对注射器是从用户帐户运行的。
CreateRemoteThread
有趣的是,如果删除了// With CREATE_SUSPENDED
// Session 0 -----------
// | Service |
// -----------
// // \\
// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Session 1 // \\
// // \\
// ------------ N ------------ N ------------
// | Injector | ----> | Injectee | <---- | Injector |
// ------------ ------------ ------------
// \ /
// \ Y ------------ Y /
// ---> | Injectee | <---
// ------------
标记,则所有CREATE_SUSPENDED
方案都会成功,但我需要使用CreateRemoteThread
。
CREATE_SUSPENDED
使用来自SYSTEM / session 0的// Without CREATE_SUSPENDED
// Session 0 -----------
// | Service |
// -----------
// // \\
// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Session 1 // \\
// // \\
// ------------ Y ------------ Y ------------
// | Injector | ----> | Injectee | <---- | Injector |
// ------------ ------------ ------------
// \ /
// \ Y ------------ Y /
// ---> | Injectee | <---
// ------------
必须有一些细微差别,这意味着孩子继承了拒绝CreateProcessAsUser
访问的内容,但我不知道是什么。
我正在使用CreateRemoteThread
所有默认参数。 MSDN说&#34;默认安全描述符是hToken参数&#34;中引用的用户的描述符,并且令牌由WTSQueryUserToken获得,是当前用户的。
使用Process Explorer查看两种注入类型的安全属性会显示完全相同的信息。
这让我发疯,这可能是什么?