LogonUser -> CreateProcessAsUser из системного сервиса - PullRequest
5 голосов
/ 03 июня 2010

Я прочитал все сообщения о переполнении стека о CreateProcessAsUser, и очень мало решенных вопросов, так что я не могу остановиться на этом. Но похоже, что я определенно что-то упускаю, так что это может быть легко.

Целевая ОС - Windows XP. У меня есть служба, работающая как «Локальная система», из которой я хочу создать процесс, выполняющийся от имени другого пользователя. Для этого пользователя у меня есть имя пользователя и пароль, поэтому LogonUser работает нормально, и я получаю токен для пользователя (в данном случае, учетную запись администратора.) Затем я пытаюсь использовать этот токен для вызова CreateProcessAsUser, но он не работает, потому что этот токен не поставляется с SeAssignPrimaryTokenPrivilege - однако он имеет SeIncreaseQuotaPrivilege. (Я использовал GetTokenInformation, чтобы сбросить все привилегии, связанные с этим токеном.) Согласно странице MSDN для CreateProcessAsUser, вам нужны обе привилегии для успешного вызова CreateProcessAsUser.

В нем также говорится, что вам не нужен SeAssignPrimaryTokenPrivilege, если токен, который вы передаете CreateProcessAsUser (), является «ограниченной версией основного токена вызывающего процесса», которую я могу создать с помощью CreateRestrictedToken (), но тогда он быть связанным с пользователем локальной системы, а не с целевым пользователем, я пытаюсь запустить процесс как.

Итак, как мне создать токен входа в систему, который является одновременно ограниченной версией основного токена вызывающего процесса И связан с другим пользователем? Спасибо!

Обратите внимание, что здесь нет необходимости во взаимодействии с пользователем - все это без присмотра - поэтому нет необходимости делать такие вещи, как захват WINSTA0 и т. Д.

1 Ответ

4 голосов
/ 03 июня 2010

SE_ASSIGNPRIMARYTOKEN_NAME - это привилегия, которую вы можете включить в своем процессе / потоке с помощью OpenProcessToken / OpenThreadToken + LookupPrivilegeValue + AdjustTokenPrivileges (это легко перепутать с TOKEN_ASSIGN_PRIMARY * 1004, MS вам нужно сказать, 1004 оба, чтобы присоединить основной токен к процессу)

На этой машине XP: SP2, просто вызывая LogonUser (..., LOGON32_LOGON_INTERACTIVE, ...) + CreateProcessAsUser прекрасно работает, не связываясь с какими-либо привилегиями (используя поддельный сервис cmd.exe, но это не должно иметь значения)

Эта цитата на MSDN:

Если необходимых привилегий нет уже включен, CreateProcessAsUser позволяет им на время звоните

и тот факт, что вы работаете от имени SYSTEM и должны иметь возможность включить любую привилегию, заставляет меня поверить, что это назначение основного материала не является проблемой.

...