Возможно ли, чтобы один процесс внедрил код в другой без прав администратора?
CryptProtectMemory
API в DPAPI позволяет передавать CRYPTPROTECTMEMORY_SAME_PROCESS
флаг, который запрещает другим процессам дешифровать память. Одним из способов обойти это было бы использовать OpenProcess
, WriteProcessMemory
, а также CreateRemoteThread
ввести код в целевой процесс и вызвать его CryptUnprotectMemory
таким образом расшифровывая память и передавая ее другому процессу.
Предполагая, что оба процесса выполняются в контексте одного и того же пользователя с ограниченными правами (т.е. не администратора) в Windows Vista или более поздней версии, возможно ли это по-прежнему? У меня сложилось впечатление, что операции записи в память процесса были запрещены для ограниченных пользователей, независимо от ACL процесса, но я могу ошибаться.
2 ответа
Вы не описываете точный сценарий, в котором вам нужно использовать внедрение кода. Если процесс запущен без административных прав, создайте другой процесс в отношении CreateProcess, например, один дескриптор get для нового процесса со всеми правами PROCESS_ALL_ACCESS
(hProcess
из PROCESS_INFORMATION). Вы можете прочитать здесь, например, следующее
Ручка, возвращаемая
CreateProcess
функция имеет доступ PROCESS_ALL_ACCESS к объекту процесса.
Так что нужно просто держать обработчик, возвращенный из CreateProcess
и не закрывайте его, пока вам не понадобится полный доступ к дочернему процессу. Таким образом, у вас будут права доступа PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE и PROCESS_VM_READ, необходимые для вызова CreateRemoteThread и WriteProcessMemory.
Таким образом, ответ на ваш вопрос будет: "Да, это возможно при некоторых дополнительных условиях".
Windows учитывает ACL процесса, и по умолчанию это разрешает доступ пользователю, для которого выполняется процесс, а также учетной записи локальной системы и SID сеанса входа пользователя. Администраторы могут обойти этот ACL, используя SeDebugPrivilege.
В противном случае вам нужно быть администратором, чтобы отладить свой собственный код.
Вы можете изменить ACL процесса, но, поскольку обычно (IIRC) текущий пользователь является владельцем процесса, я не уверен, сможете ли вы помешать другому процессу в текущем пользовательском контексте изменить его обратно. Кроме того, поскольку вполне вероятно, что процессы выполняются на одном и том же рабочем столе, вы все равно подвергнетесь осколочным атакам.