Почему Win32 API-функция CredEnumerate () возвращает ERROR_NOT_FOUND, если я выдал себя за другого? - PullRequest
1 голос
/ 09 сентября 2010

Я написал некоторый пример кода, который при вызове из командной строки Windows в контексте обычной учетной записи пользователя сбрасывает все сохраненные учетные данные пользователя с помощью CredEnumerate (). Однако я действительно хочу сделать это из пользовательского контекста SYSTEM, поэтому я протестировал свою программу из командной строки SYSTEM.

Когда я запускаю свою программу как SYSTEM, я запускаю LogonUser следующим образом:

bLoggedOn = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &userToken_);

Затем я запускаю ImpersonateLoggedOnUser () на токене, чтобы дать мне контекст безопасности локального пользователя. После этого я делаю:

bOk = CredEnumerate(NULL, 0, &count, &pCredentials);

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

1 Ответ

2 голосов
/ 06 февраля 2011

Полагаю, я должен ответить на этот вопрос сам, так как я уже целую вечность работал над тем, как это сделать, и я не уверен, что это широко известно.CredEnumerate / CredRead никогда не будет предоставлять информацию о паролях для паролей домена, независимо от того, в каком контексте процесса вы находитесь или какой у вас токен, несмотря на то, на что он, похоже, намекает в MSDN.Единственный способ получить доступ к сохраненной информации о полномочиях - это использовать недокументированную функцию LSAICryptUnprotectData (), которая находится в lsasrv.dll.Это может расшифровать файлы, которые вы найдете в% APPDATA% \ Microsoft \ Credentials, и может предоставить CredEnumerate идентичную структуру данных за исключением введенного пароля. Единственный улов - это то, что это должно быть сделано в контексте процесса lsass.exeПодсистема безопасности Windows), никаких настроек привилегий и т. д. недостаточно, чтобы дать нормальному процессу права на это.Если вы хакер, вы можете сделать это, выполнив CreateRemoteThread (), чтобы внедрить поток в lsass.exe, или если вы пытаетесь сделать это законным способом, то есть вы каким-то образом расширяете операционную систему Windows.для стороннего приложения, как я, вы можете сделать это, создав пакет аутентификации Windows, который загрузит lsass.Этот AP может затем использовать именованный канал или некоторый такой метод, чтобы позволить взаимодействие с остальной частью вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...