不需要管理员权限,一个进程是否可以向另一个进程注入代码?

6
在DPAPI中,CryptProtectMemory API允许您传递CRYPTPROTECTMEMORY_SAME_PROCESS标志,这可以防止其他进程解密内存。绕过此限制的一种方法是使用OpenProcessWriteProcessMemoryCreateRemoteThread来将代码注入目标进程,并使其调用CryptUnprotectMemory,从而解密内存并将其泄漏给其他进程。

假设两个进程都在Windows Vista或更高版本上以相同受限权限用户的上下文运行(即不是管理员),这是否仍然可能?我认为无论进程ACL如何,有限用户都会被拒绝进程内存写操作,但我可能错了。


不需要使用CreateRemoteThread来提升权限。请参见我的问题:https://dev59.com/62fWa4cB1Zd3GeqPk9Uc - David Heffernan
如果可以对_无关的_进程执行此操作(使用另一个用户的权限运行),那么现在是时候真正快速地解决这个问题了。 - vonbrand
@vonbrand:用户一直拥有调试自己进程的权限。您建议如何“修复”这个问题? - Billy ONeal
@vonbrand:不,默認的ACL只允許訪問本地系統、運行進程的用戶以及當前登錄會話的登錄SID。 - Harry Johnston
2个回答

2

Windows尊重进程ACL,默认情况下,这允许用户以及本地系统账户和用户的登录会话SID访问该进程。管理员可以使用SeDebugPrivilege绕过此ACL。

否则,您需要成为管理员才能调试自己的代码。

您可以更改进程ACL,但由于通常(如果我没记错)当前用户是进程所有者,因此我不确定是否可以防止当前用户上下文中的另一个进程将其更改回来。另外,由于这些进程很可能在同一桌面上运行,因此无论如何都会受到突破攻击的影响。


实际上,在进程 ACL 中通常不允许管理员。但管理员通常可以获取 SeDebugPrivilege 权限,从而使他们能够“绕过”ACL。 - Billy ONeal

2
您没有描述您需要使用代码注入的确切场景。例如,如果一个没有管理员权限的进程使用CreateProcess创建另一个进程,则可以使用所有权限PROCESS_ALL_ACCESS (PROCESS_INFORMATIONhProcess)获取新进程的句柄。您可以在此处阅读以下内容:

CreateProcess函数返回的句柄对进程对象具有PROCESS_ALL_ACCESS访问权限。

因此,您应该仅保留从CreateProcess返回的句柄,并在需要完全访问子进程时才关闭它。这样,您将拥有调用CreateRemoteThreadWriteProcessMemory所需的PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_VM_WRITE和PROCESS_VM_READ访问权限。

因此,对于您的问题的答案是:“是的,在某些附加条件下是可能的。”

我认为原帖作者并不想使用代码注入,他想要防止另一个进程对他的进程使用代码注入。 - Harry Johnston
不要紧。如果他的程序将由另一个进程直接启动(使用CreateProcess),所有者进程将对创建的进程拥有完全控制权。因此,可以进行代码注入。 - Oleg
既然通常可以进行代码注入,我不确定这是否有太大的区别。但这确实是另一个例子,说明更改进程ACL并不能解决问题。 - Harry Johnston
@HarryJohnston:我自己没有测试过,但我认为ACL将在使用某些权限创建句柄之前进行验证。CreateProcess的句柄甚至会在进程开始运行之前就被创建。例如,可以使用CREATE_SUSPENDED标志在进程完全运行之前创建该进程。如果要使用AssignProcessToJobObject将新进程放置在作业中,则可以执行此操作。因此,我不认为新进程可以更改其ACL以保护自己免受具有PROCESS_ALL_ACCESS的父进程的DLL注入。 - Oleg
我认为在涉及从CreateProcess返回的句柄时,ACL根本不会被检查,即使默认的ACL不允许访问(在某些情况下可能是可能的),你仍然可以获得PROCESS_ALL_ACCESS。所以我同意你无法保护自己免受父进程的影响。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接