Здравствуйте.
Пытаюсь реализовать запуск процесса (cmd.exe) под аккаунтом SYSTEM.
В качестве основы взят пример из известной книги Ньюбета.
Напомню, что там создается новый токен и большая часть информации берется из токена текущего процесса.
Реализацию делаю на Native API, потому что таковы требования проекта.
Алгоритм следующий
NtOpenProcessToken(текущий процесс)
RtlAllocateAndInitializeSid(.....system_sid)
NtQueryInformationToken( .... TokenSource ....)
NtAllocateLocallyUniqueId
InitializeObjectAttributes с SECURITY_QUALITY_OF_SERVICE, ImpersonationLevel = SecurityAnonymous
потом чтение следующих данных из токена
TokenGroups
TokenPrivilegies
TokenOwner
TokenDefaultDacl
TokenPrimaryGroup вообщем все необходимое для NtCreateToken
AuthenticationId = SYSTEM_LUID;
sqos.Length = sizeof sqos;
sqos.ImpersonationLevel = SecurityAnonymous;
sqos.ContextTrackingMode = SECURITY_STATIC_TRACKING;
sqos.EffectiveOnly = false;
user.User.Sid = system_sid;
user.User.Attributes = 0;
NtCreateToken(...)
Возвращает 0xC000005A — указанный код безопасности нельзя назначить в качестве владельца объекта.
В чем грабли?
Благодарю за помощь, извините за псевдокод. Оригинал такой же как у Ньюбета с вычетом namespace.
Ок, токен создан, TokenOwner взят у SYSTEM процесса.
Однако при создании процесса — CreateProcessAsUser ос говорит, что клиент не обладает необходимыми правами ...
Здравствуйте, soveren, Вы писали:
http://www.rsdn.ru/forum/NewMsg.aspx?mid=2906110Автор: soveren
Дата: 07.04.08
S>Ок, токен создан, TokenOwner взят у SYSTEM процесса.
S>Однако при создании процесса — CreateProcessAsUser ос говорит, что клиент не обладает необходимыми правами ...
Использование функции NtCreateToken требует привилегии SeCreateToken, которая доступна только для очень ограниченного количества системных процессов, работающих под системным эккаунтом (lsass, csrss).
Если есть доступ к токену SYSTEM, то проще всего сделать его копию (DuplicateToken), чем создавать новый.
CreateProcessAsUser может возвращать ошибку из-за того, что у токена тип не PrimaryToken