DuplicateToken

Тема в разделе "WASM.WIN32", создана пользователем soveren, 6 апр 2008.

  1. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Добрый день.

    Извините за возможно дико ламерский вопрос.

    Как скопировать токен существующего процесса?
    В MSDN указано, что для этого он должен быть открыть с TOKEN_DUPLICATE правами. Задача состоит в создании процесса с пользователем - SYSTEM. Попытка открыть токен процесса с такими правами дает 0xC0000022. Права админа, пробовал поднимать всевозможные привилегии.

    Порядок действий следующий

    создание процесса
    NtOpenProcess PROCESS_ALL_ACCESS
    NtOpenProcessToken TOKEN_DUPLICATE
    NtDuplicateToken
    NtSetInformationProcess ProcessAccessToken
    NtResumeThread
    ....

    Возможно, что-то не так в этой последовательности.

    Спасибо.
     
  2. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Кажись вопрос оказался не таким уж и ламерским, раз нет ответа.
    Да, кстати, можно создать токен SYSTEM'а, по примеру Ньюбета, но там тоже какие-то косяки пошли с реализацией.
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Вначале б попробовал открыть через WinAPI

    А потом уже думал бы )

    Порядок такой :
    Код (Text):
    1.    
    2. if ( !OpenProcessToken(GetCurrentProcess(),
    3.         TOKEN_DUPLICATE | TOKEN_QUERY, &hToken) )
    4.         return -1;
     
  4. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Это если нужно сдуплицировать токен самого себя. А вот попробуйте тоже самое сделать например с svchost.exe даже со всеми привилегиями. 0xC0000022. К тому же никакой принципиальной разницы.

    Суть моего топика заключается в том, что мне нужно впихать токен SYSTEM создаваемому процессу.

    CreateProcessAsUser (SystemToken....);

    Токен SYSTEM удалось создать с помощью вышеописанной NtCreateToken (по примеру из книги Ньюбета), но при создании процесса выдается ошибка, что "Клиент не обладает требуемыми правами". Другой подводный камень, процесс создающий токен должен обладать привилегией создания маркерного объекта, которая по дефолту у администраторов отсутствует. Так что пришлось задействовать ещё и lsass. Голова уже кругом идет.
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    soveren
    Хм а не проще сделать так:

    Код (Text):
    1. //здесь опен токен TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
    2. LookupPrivilegeValueW(NULL, L"SeDebugPrivilege", &tkp.Privileges[0].Luid)
    3.  
    4. tkp.PrivilegeCount = 1;
    5. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;        //Активируем привелегию DEBUG
    6.  
    7. NtAdjustPrivilegesToken(....)
    И у процесса права системные. И не надо гемороиться с новым токеном.
     
  6. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Ну куда проще вообще тогда сделать одной строкой и без advapi32
    RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, TRUE, FALSE, &prev); :)

    Процесс должен обладать правами SYSTEM (это касается например файловых объектов, записей в реестре на которые закрыт доступ по умолчанию всем кроме системы), вариант сервиса к сожалению в моем случае не уместен :dntknw:
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не пойдёт. Что такое SE_DEBUG_PRIVILEGE ?
    Есть константа SE_DEBUG_NAME='SeDebugPrivilege', а advapi32!LookupPrivilegeValue возвращает для имени идентификатор, который и передаётся в NtAdjustPrivilege.
     
  8. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Clerk
    Ещё как пойдет. Вы вообще знакомы с NT? SE_DEBUG_PRIVILEGE это и есть та самая константа.

    Код (Text):
    1. // begin_wdm
    2. #define SE_MACHINE_ACCOUNT_PRIVILEGE      (6L)
    3. #define SE_TCB_PRIVILEGE                  (7L)
    4. #define SE_SECURITY_PRIVILEGE             (8L)
    5. #define SE_TAKE_OWNERSHIP_PRIVILEGE       (9L)
    6. #define SE_LOAD_DRIVER_PRIVILEGE          (10L)
    7. #define SE_SYSTEM_PROFILE_PRIVILEGE       (11L)
    8. #define SE_SYSTEMTIME_PRIVILEGE           (12L)
    9. #define SE_PROF_SINGLE_PROCESS_PRIVILEGE  (13L)
    10. #define SE_INC_BASE_PRIORITY_PRIVILEGE    (14L)
    11. #define SE_CREATE_PAGEFILE_PRIVILEGE      (15L)
    12. #define SE_CREATE_PERMANENT_PRIVILEGE     (16L)
    13. #define SE_BACKUP_PRIVILEGE               (17L)
    14. #define SE_RESTORE_PRIVILEGE              (18L)
    15. #define SE_SHUTDOWN_PRIVILEGE             (19L)
    16. #define SE_DEBUG_PRIVILEGE                (20L)
    17. #define SE_AUDIT_PRIVILEGE                (21L)
    18. #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE   (22L)
    19. #define SE_CHANGE_NOTIFY_PRIVILEGE        (23L)
    20. #define SE_REMOTE_SHUTDOWN_PRIVILEGE      (24L)
    21. #define SE_UNDOCK_PRIVILEGE               (25L)
    22. #define SE_SYNC_AGENT_PRIVILEGE           (26L)
    23. #define SE_ENABLE_DELEGATION_PRIVILEGE    (27L)
    24. #define SE_MANAGE_VOLUME_PRIVILEGE        (28L)
    25. #define SE_IMPERSONATE_PRIVILEGE          (29L)
    26. #define SE_CREATE_GLOBAL_PRIVILEGE        (30L)
    27. #define SE_MAX_WELL_KNOWN_PRIVILEGE       (SE_CREATE_GLOBAL_PRIVILEGE)
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Работает, я и не знал, cпасибо за константы;
    Я давно смотрел какую работу геморную выполняет advapi32!LookupPrivilegeValue, она возвращает значение, меняющееся при перезагрузке системы. В таком случае непонятно зачем..
    Я мельком глянул NtOpenProcessToken:
    NtOpenProcessToken()->PsOpenTokenOfProcess()->ObReferenceObjectByHandle()->SeComputeDeniedAccesses[]
    GrantedAccess = Process->GrantedAccess ;EPROCESS.GrantedAccess, текущий процесс
    Макрос SeComputeDeniedAccesses определён как: GrantedAccess And (not DesiredAccess)
    SeComputeDeniedAccesses(GrantedAccess, DesiredAccess) == 0 ;Ноль в случае успеха
    -------------------------------------------------------------------------------------
    Толком не разбирался, но по ходу EPROCESS.GrantedAccess=DesiredAccess - для успешного выполнения.
     
  10. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Потому что это LUID который генерируется системой исходя из параметров сессии, потому он каждый раз уникальный. Гляньте в reactos, там довольно похожая на правду реализация.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да это я знаю, просто я всегда получал SeDebugPrivilege перечислением всех привилегий подряд с попыткой открытия системного процесса, не используя константы. Интересно, во всех версиях они одинаковы ?
     
  12. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    Да, во всей линейке НТ.
     
  13. soveren

    soveren Дмитрий Петерсон

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    94
    Адрес:
    Россия
    К сожалению ответ так и не получен. Есть советы создать сервис и выполнить из-под него cmd.exe, но это не совсем то :dntknw: