Возможно ли переназначить токен процесса?

Тема в разделе "WASM.X64", создана пользователем k3rnl, 21 дек 2024.

  1. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    62
    У уже созданных процессов токены априори являются типом TokenPrimary.
    В связи с этим при работе с SetTokenInformation некоторые перечисления TOKEN_INFORMATION_CLASS могут выдавать ошибку 1375 - ERROR_TOKEN_ALREADY_IN_USE (The token is already in use as a primary token).
    Что интересно многие перечисления спокойно выполняются и меняют токен можно сказать в реальном времени применяя эти изменения.

    Из этого у меня возникают два вопроса:
    1. Почему какие-то перечисления спокойно отрабатывают, а другие выдают ошибку (доступа?), что внутри них разного?
    2. Из области теории: возможно ли отсоединить токен от процесса, произвести с ним определенные действия и снова присоединить? Если нет, то возможно ли олицетворенный (Impersonation) токен (через DuplicateTokenEx) сделать основным (Primary)?
     
    Mikl___ нравится это.
  2. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Имхо замки стоят в токенах самих процессов. На моей Win7-x64 это вложенная в EPROCESS структура размером ~800 байт. Можно установить WinDbg и сравнивая данные в структурах TOKEN, найти соответствующее поле. Если привязать утилиту "LiveKd" к отладчику WinDbg, то даже вторая машина не нужна, т.к. при каждом запуске LiveKd делает дампы ядерной памяти на текущий момент. Например так выглядит поиск и сам токен процесса "System":
    Код (Text):
    1. 0: kd> !process 0 0 system
    2. PROCESS fffffa80039ce040
    3.     SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    4.     DirBase: 00187000  ObjectTable: fffff8a000001940  HandleCount: 477.
    5.     Image: System
    6.  
    7. 0: kd> !process  fffffa80039ce040 1
    8. ........
    9.     Token        fffff8a000004040
    10. .......
    11.  
    12. 0: kd> dt _token fffff8a000004040
    13. nt!_TOKEN
    14.    +0x000 TokenSource         : _TOKEN_SOURCE
    15.    +0x010 TokenId             : _LUID
    16.    +0x018 AuthenticationId    : _LUID
    17.    +0x020 ParentTokenId       : _LUID
    18.    +0x028 ExpirationTime      : 0x06207526`b64ceb90
    19.    +0x030 TokenLock           : 0xfffffa80`0396df90  _ERESOURCE
    20.    +0x038 ModifiedId          : _LUID
    21.    +0x040 Privileges          : _SEP_TOKEN_PRIVILEGES
    22.    +0x058 AuditPolicy         : _SEP_AUDIT_POLICY
    23.    +0x074 SessionId           : 0
    24.    +0x078 UserAndGroupCount   : 5
    25.    +0x07c RestrictedSidCount  : 0
    26.    +0x080 VariableLength      : 0xa4
    27.    +0x084 DynamicCharged      : 0x400
    28.    +0x088 DynamicAvailable    : 0
    29.    +0x08c DefaultOwnerIndex   : 1
    30.    +0x090 UserAndGroups       : 0xfffff8a0`00004350  _SID_AND_ATTRIBUTES
    31.    +0x098 RestrictedSids      : (null)
    32.    +0x0a0 PrimaryGroup        : 0xfffff8a0`00004fb0  Void
    33.    +0x0a8 DynamicPart         : 0xfffff8a0`00004fb0  -> 0x101
    34.    +0x0b0 DefaultDacl         : 0xfffff8a0`00004fbc  _ACL
    35.    +0x0b8 TokenType           : 1 ( TokenPrimary )
    36.    +0x0bc ImpersonationLevel  : 0 ( SecurityAnonymous )
    37.    +0x0c0 TokenFlags          : 0x2000
    38.    +0x0c4 TokenInUse          : 0x1 ''
    39.    +0x0c8 IntegrityLevelIndex : 4
    40.    +0x0cc MandatoryPolicy     : 1
    41.    +0x0d0 LogonSession        : 0xfffff8a0`00001270  _SEP_LOGON_SESSION_REFERENCES
    42.    +0x0d8 OriginLogonSession  : _LUID
    43.    +0x0e0 SidHash             : _SID_AND_ATTRIBUTES_HASH
    44.    +0x1f0 RestrictedSidHash   : _SID_AND_ATTRIBUTES_HASH
    45.    +0x300 pSecurityAttributes : 0xfffff8a0`00001120  _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION
    46.    +0x308 SessionObject       : (null)
    47.    +0x310 VariablePart        : 0xfffff8a0`000043a0
    48. 0: kd>
    Если посмотреть на мемберов "TOKEN_INFORMATION_CLASS", то большая часть инфы берётся из данной структуры. Поскольку WinDbg поддерживает скрипты, всё/это дело легко автоматизировать.
     
    k3rnl и Mikl___ нравится это.
  3. k3rnl

    k3rnl Member

    Публикаций:
    0
    Регистрация:
    28 янв 2021
    Сообщения:
    62
    Marylin, из листинга погуглил на тему IntegrityLevelIndex и нашёл довольно интересную https://windows-internals.com/explo...y-part-2-what-if-we-made-exploitation-harder/

    Я как раз пытаюсь понят почему уменьшать уровень целостности можно, а вот увеличивать (по крайней мере до первоначального состояния) нельзя.
    Простейших код, открывающий токен процесса с доступом к объекту по умолчанию (основному (primary) токену), великолепно отрабатывает на понижение уровня целостности.
    А вот в обратную сторону говорит, что токен уже используется в качестве основного (primary)
    Код (C):
    1.  
    2. BOOL SetTokenIntegrityLevel(DWORD SubAuthority)
    3. {
    4.     HANDLE hProcess = nullptr, hToken = nullptr;
    5.  
    6.    hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, g_dwProcessId);
    7.  
    8.    if (!OpenProcessToken(hProcess, TOKEN_ADJUST_DEFAULT, &hToken)) {
    9.       CloseHandle(hProcess);
    10.       return FALSE;
    11.    }
    12.    CloseHandle(hProcess);
    13.  
    14.    TOKEN_MANDATORY_LABEL TokenMandatoryLabel = { 0 };
    15.    TokenMandatoryLabel.Label.Attributes = SE_GROUP_INTEGRITY;
    16.  
    17.    static SID_IDENTIFIER_AUTHORITY SidAuthority = SECURITY_MANDATORY_LABEL_AUTHORITY;
    18.  
    19.    if (!AllocateAndInitializeSid(&SidAuthority, 1, SubAuthority, 0, 0, 0, 0, 0, 0, 0, &TokenMandatoryLabel.Label.Sid)) {
    20.       CloseHandle(hToken);
    21.       return FALSE;
    22.    }
    23.  
    24.    if (!SetTokenInformation(hToken, TokenIntegrityLevel, &TokenMandatoryLabel, sizeof(TOKEN_MANDATORY_LABEL))) {
    25.       FreeSid(TokenMandatoryLabel.Label.Sid);
    26.       CloseHandle(hToken);
    27.       return FALSE;
    28.    }
    29.    FreeSid(TokenMandatoryLabel.Label.Sid);
    30.    CloseHandle(hToken);
    31.  
    32.    return TRUE;
    33. }
    34.  
    Логичный шаг - дублировать токен с уровнем олицетворения. Но это делается для последующего создания процесса (например CreateProcessAsUser), но не для созданного.
    Олицетворять токен для объекта ядра можно, например https://learn.microsoft.com/en-us/w...hreadsapi/nf-processthreadsapi-setthreadtoken
    Но вот аналогичной функции для процесса к сожалению нет.

    Есть ещё одна интересная статья https://www.tiraniddo.dev/2021/06/the-much-misunderstood.html
    (и самый объёмный материал MSDN по WIC, который мне удалось найти https://learn.microsoft.com/en-us/previous-versions/dotnet/articles/bb625963(v=msdn.10) )
    Насколько я могу судить привилегия SeRelabelPrivilege как раз и должна позволять увеличивать уровень целостности, но понять как она работает пока не получилось.
     
    Marylin и Mikl___ нравится это.
  4. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Тема мутная, и о ней мне известно только следующее..
    Lsass.exe раздаёт токены каждой учётной записи, а загрузчик образов потом копирует их в процессы. В токене могут быть до 16-ти идентификаторов безопасности со-своими атрибутами SID_AND_ATTRIBUTES (см. whoami /all /fo list).

    Теперь чтобы защитить ядерные объекты, система привязывает к ним дескрипторы безопасности SECURITY_DESCRIPTOR, линк на который прописывается в заголовке OBJECT_HEADER. Размер хидера =30h байт, и он всегда предваряет сам объект (лежит выше). В SD имеются 2 списка контроля доступа DACL и SACL, причём уровень доверия "Integrity-Level" хранится в последнем SACL. Таким образом юзер со-своим "TOKEN" атакует объект, а "SECURITY_DESCRIPTOR" объекта защищается.

    mic.png

    Процесс тоже является объектом, который описывает структура EPROCESS, а потому в WinDbg можно просмотреть как его заголовок, так и сам SD:
    Код (Text):
    1. 0: kd> !process 0 0 taskmgr.exe
    2. PROCESS fffffa8003b30640
    3.     SessionId: 1  Cid: 0d90    Peb: 7fffffdf000  ParentCid: 0764
    4.     DirBase: a6ab5000  ObjectTable: fffff8a0036d5c40  HandleCount: 125.
    5.     Image: taskmgr.exe
    6.  
    7. 0: kd> !object    fffffa8003b30640
    8.     ObjectHeader: fffffa8003b30610  <---------- Заголовок лежит на 30h выше объекта
    9.     Type: Process   HandleCount: 3  PointerCount: 72
    10.  
    11. 0: kd> dt _object_header fffffa8003b30610
    12. nt!_OBJECT_HEADER
    13.    +0x000 PointerCount       : 0n72
    14.    +0x008 HandleCount        : 0n3
    15.    +0x010 Lock               : _EX_PUSH_LOCK
    16.    +0x018 TypeIndex          : 0x7
    17.    +0x019 TraceFlags         : 0
    18.    +0x01a InfoMask           : 0x8
    19.    +0x01b Flags              : 0
    20.    +0x020 ObjectCreateInfo   : 0xfffffa80`05505d80
    21.    +0x028 SecurityDescriptor : 0xfffff8a0`01ac8f53  <------ Сбросить мл.тетраду!
    22.    +0x030 Body               : _QUAD  <-------------------- Здесь начинается EPROCESS
    23.  
    24. 0: kd> !sd 0xfffff8a0`01ac8f50 1
    25. ->Revision: 0x1
    26. ->Control : 0x8814
    27.             SE_DACL_PRESENT
    28.             SE_SACL_PRESENT
    29.             SE_SACL_AUTO_INHERITED
    30.             SE_SELF_RELATIVE
    31.  
    32. ->Owner   : S-1-5-32-544 (Alias: BUILTIN\Администраторы)
    33. ->Group   : S-1-5-21-xxxx-xxxx-xxxx-513
    34.  
    35. ->Dacl    : ->Ace[0]: ->AceType : ACCESS_ALLOWED_ACE_TYPE
    36. ->Dacl    : ->Ace[0]: ->AceSize : 0x18
    37. ->Dacl    : ->Ace[0]: ->Mask    : 0x001fffff
    38. ->Dacl    : ->Ace[0]: ->SID     : S-1-5-32-544 (Alias: BUILTIN\Администраторы)
    39.  
    40. ->Dacl    : ->Ace[1]: ->AceType : ACCESS_ALLOWED_ACE_TYPE
    41. ->Dacl    : ->Ace[1]: ->AceSize : 0x14
    42. ->Dacl    : ->Ace[1]: ->Mask    : 0x001fffff
    43. ->Dacl    : ->Ace[1]: ->SID     : S-1-5-18     (Well Known Group: NT AUTHORITY\System)
    44.  
    45. ->Dacl    : ->Ace[2]: ->AceType : ACCESS_ALLOWED_ACE_TYPE
    46. ->Dacl    : ->Ace[2]: ->AceSize : 0x1c
    47. ->Dacl    : ->Ace[2]: ->Mask    : 0x00121411
    48. ->Dacl    : ->Ace[2]: ->SID     : S-1-5-5-0-104982 (no name mapped)
    49.  
    50. ->Sacl    : ->Ace[0]: ->AceType : SYSTEM_MANDATORY_LABEL_ACE_TYPE
    51. ->Sacl    : ->Ace[0]: ->AceSize : 0x14
    52. ->Sacl    : ->Ace[0]: ->Mask    : 0x00000003
    53. ->Sacl    : ->Ace[0]: ->SID     : S-1-16-12288 (Mandatory Label: High Mandatory Level)
    54. 0: kd>
    Поле "Mask" в списке DACL определяет флаги доступа к объектам типа RWE/Delete/WriteDAC etc, где 0x1fffff = полный доступ. При этом если тип записи ACE стоит ACCESS_ALLOWED это разрешения, а ACCESS_DENIED = запрет (см.свойства файла на вкладке Безопасность).

    Но в данном случае интересна запись ACE в последнем листе SACL, в которой Mask=3, а SID хранит уровень целостности объекта IL. Эта маска определяет политику доступа MANDATORY_POLICY и может принимать 4 значения:
    Код (Text):
    1. TOKEN_MANDATORY_POLICY_OFF              = 0   ; Политика целостности IL отключена.
    2. TOKEN_MANDATORY_POLICY_NO_WRITE_UP      = 1   ; Запрет на запись в объекты с более высоким уровнем.
    3. TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN  = 2   ; / что-то непонятное /
    4. TOKEN_MANDATORY_POLICY_VALID_MASK       = 3   ; NO_WRITE_UP + NEW_PROCESS_MIN
    Соответственно если сбросить данную маску в нуль, то проверки IL вообще можно будет обойти. В advapi32.dll есть SetAclInformation(), которая по сути должна была этим заниматься, но функционал её кастрировали, оставив только бесполезную смену версии и размера записей DACL/SACL. Там-же есть класс api Get\SetSecurityDescriptorXX() - наверное можно ими как-то подобраться к маске SACL, но из под юзера врядли что-то получится, и нужен дров.
    Ну здесь всё прозрачно..
    В токене, поле "UserAndGroups" указывает на массив структур SID_AND_ATTRIBUTES, а общее их кол-во в пределах 16 хранится в поле "UserAndGroupCount". В свою очередь, индекс SID уровня целостности IL в этом массиве лежит в поле "IntegrityLevelIndex" - это и будет указателем на SACL выше.
    Код (Text):
    1. 0: kd> dt _token fffff8a0038c4060 UserAndGroupCount UserAndGroups IntegrityLevelIndex MandatoryPolicy
    2. nt!_TOKEN
    3.    +0x078 UserAndGroupCount   : 0xf
    4.    +0x090 UserAndGroups       : 0xfffff8a0`038c4370 _SID_AND_ATTRIBUTES
    5.    +0x0c8 IntegrityLevelIndex : 0xe
    6.    +0x0cc MandatoryPolicy     : 3
    7.  
    8. 0: kd> dq 0xfffff8a0`038c4370 L20
    9. fffff8a0`038c4370  fffff8a0`038c4460 00000000`00000000
    10. fffff8a0`038c4380  fffff8a0`038c447c 00000000`00000007
    11. fffff8a0`038c4390  fffff8a0`038c4498 00000000`00000007
    12. fffff8a0`038c43a0  fffff8a0`038c44a4 00000000`00000007
    13. fffff8a0`038c43b0  fffff8a0`038c44b0 00000000`0000000f
    14. fffff8a0`038c43c0  fffff8a0`038c44c0 00000000`00000007
    15. fffff8a0`038c43d0  fffff8a0`038c44d0 00000000`00000007
    16. fffff8a0`038c43e0  fffff8a0`038c44dc 00000000`00000007
    17. fffff8a0`038c43f0  fffff8a0`038c44e8 00000000`00000007
    18. fffff8a0`038c4400  fffff8a0`038c44f4 00000000`00000007
    19. fffff8a0`038c4410  fffff8a0`038c4500 00000000`00000007
    20. fffff8a0`038c4420  fffff8a0`038c450c 00000000`c0000007
    21. fffff8a0`038c4430  fffff8a0`038c4520 00000000`00000007
    22. fffff8a0`038c4440  fffff8a0`038c452c 00000000`00000007
    23. fffff8a0`038c4450  fffff8a0`038c453c 00000000`00000060  <------ SACL
    24. fffff8a0`038c4460  05000000`00000501 02cb6e5a`00000015
    25.  
    26. 0: kd> dq fffff8a0`038c453c L4
    27. fffff8a0`038c453c  10000000`00000101 00000000`00003000  <------ 0x3000 = SID-1-16-12288
    28. fffff8a0`038c454c  00000000`00000000 00000000`00000000
    Можно было потестить, почему понижать IL разрешено, а обратно нет.
    Но пока не до этого, может быть после НГ.
     
    k3rnl, mantissa и Mikl___ нравится это.
  5. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Кстати есть консольная команда icacls, которая позволяет менять атрибуты в записях SACL, в том числе и уровень IL. Так-что если есть соответствующие права, можно заюзать и её, что намного проще реализовать программно:
    Код (Text):
    1. ICACLS имя [/grant[:r] Sid:разрешение[...]]
    2.        [/deny Sid:разрешение [...]]
    3.        [/remove[:g|:d]] Sid[...]] [/T] [/C] [/L] [/Q]
    4.        [/setintegritylevel уровень:политика[...]]
    5.  
    6.     /grant[:r] Sid:разрешение - предоставление указанных прав доступа
    7.         пользователя. При использовании параметра :r эти разрешения заменяют
    8.         любые ранее предоставленные явные разрешения. Если параметр :r не
    9.         используется, разрешения добавляются к любым ранее предоставленным
    10.         явным разрешениям.
    11.  
    12.     /deny Sid:разрешение - явный отзыв указанных прав доступа пользователя.
    13.         ACE явного отзыва добавляется для заявленных разрешений,
    14.         и любое явное предоставление этих же разрешений удаляется.
    15.  
    16.     /remove[:[g|d]] Sid - удаление всех вхождений Sid в ACL. При использовании
    17.         параметра :g удаляются все вхождения предоставленных прав в этом Sid.
    18.         При использовании параметра :d удаляются все вхождения отозванных
    19.         прав в этом Sid.
    20.  
    21.     /setintegritylevel [(CI)(OI)]уровень - явное добавление ACE уровня
    22.         целостности ко всем соответствующим файлам. Уровень может принимать
    23.         одно из следующих значений:
    24.             L[ow]:    низкий
    25.             M[edium]: средний
    26.             H[igh]:   высокий
    27.         Перед уровнем могут указываться параметры наследования для ACE
    28.         целостности, которые применяются только к каталогам.
     
    k3rnl нравится это.
  6. algent

    algent Active Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    104
    Вы говорите о том, что в WinDbg называется "debugger command programs" ??
    А получилось заставить нормально эту штуку работать?? У меня цикл из 512 повторов, выполняется 7(!!!) минут. По сути пустой цикл из if(0) {}. Может там какая-то хитрая опция есть, как заставить её нормально работать, подскажите кто знает... Ведь по задумке классная штука, но пришибленная :dntknw:.
    пс. WinDbg у меня ещё старый.
     
  7. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Да, вроде так называется фишка.
    Раньше у меня ничё не тормозило, правда на старте была пауза ~1 сек.
    Но после переустановки системы с ломаной/левой на чистую Win7 с ключом, почему-то перестала работать команда организации цикла .foreach и не только - например вывод !idt тоже сократился в 2-раза, ну и так по мелочам.
     
  8. algent

    algent Active Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    104
    Нашёл в архиве свои попытки заставить Windbg нормально работать со скриптами.
    У кого есть 15 минут и Windbg, сделайте плз, ради статистики:
    1. Запускаем Windbg от админа.
    2. Выбираем File->Kernel Debug => вкладка Local, ОК.
    3. Вводим в командную строку:
    r $t2 = 0; .for (r $t3 = $t2+1000; $t2 < $t3; r $t2 = $t2+8) { .if ($t2 % 40 == 0) { .printf "$t2 %p\n", $t2 } }
    4. Жмём ентер и засекаем время, пока не появится lkd>
     
  9. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Ну здесь даже без тестов проблема очевидна.
    Да, ваш скрипт исполняется долго, и не дожидаясь окончания я прервал его по Ctrl+Break.

    Когда вы используете 20 своих псевдо-регистров $t0-$t19, значения им присваиваются как обычно r $t2 = 0. Но когда вы обращаетесь к ним позже, нужно предварять их собакой по типу @$t2, в результате чего парсеру ком.строк не нужно будет обходить весь свой огромный список в поисках алиасов. Другими словами, это исключит двумысленность, и он сразу поймёт, что обращаются именно к псевдо-регистрам. Я переписал ваш скрипт в такой вид, и теперь он исполняется за 0.5 сек. Сохраните следущее в файл "script.txt", и запустите его командой $$>a< F:\script.txt (укажите свой путь):
    Код (Text):
    1. r $t2 = 0
    2. .for (r $t3 = @$t2+1000; @$t2 < @$t3; r @$t2 = @$t2+8) { .if (@$t2 % 40 == 0) { .printf "$t2 %p\n", @$t2 } }
     
    algent и Mikl___ нравится это.
  10. algent

    algent Active Member

    Публикаций:
    0
    Регистрация:
    11 апр 2018
    Сообщения:
    104
    Ха, прикол:). И в хелпе Windbg, в примерах, все регистры с собачкой, как-то я это упустил. Спасибо!
     
    Marylin нравится это.
  11. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Простой скрипт для WinDbg, который обходит все процессы, и выводит информацию из их структур TOKEN. Достаточно вызвать команду !for_each_process " ", и внутри её кавычек указать нужные действия. К ней привязан псевдорегистр @#Process, в который на каждом степе отладчик будет сбрасывать линк на очередную EPROCESS.

    В файле скрипта *.txt прописываем следующее:
    Код (Text):
    1. r $t0 = @@C++(#FIELD_OFFSET(_EPROCESS, Token))
    2.  
    3. !for_each_process "
    4.    r $t1 = @#Process + @$t0
    5.    r $t2 = poi(@$t1)
    6.    r $t2 = @$t2 >> 4 << 4
    7.    dt @#Process nt!_EPROCESS -o ImageFileName
    8.    dt @$t2 nt!_TOKEN -o SessionId MandatoryPolicy TokenType ImpersonationLevel
    9.    .echo          "
    ..и загружаем его в режиме kd/lkd командой $$>a< путь - как результат получаем такой лог:
    Код (Text):
    1. 0: kd> $$>a< f:\1234.txt
    2.  
    3.    ImageFileName : [15]  "System"
    4.    SessionId          : 0
    5.    TokenType          : 1 ( TokenPrimary )
    6.    ImpersonationLevel : 0 ( SecurityAnonymous )
    7.    MandatoryPolicy    : 1
    8.  
    9.    ImageFileName : [15]  "smss.exe"
    10.    SessionId          : 0
    11.    TokenType          : 1 ( TokenPrimary )
    12.    ImpersonationLevel : 0 ( SecurityAnonymous )
    13.    MandatoryPolicy    : 1
    14.  
    15.    ImageFileName : [15]  "csrss.exe"
    16.    SessionId          : 0
    17.    TokenType          : 1 ( TokenPrimary )
    18.    ImpersonationLevel : 0 ( SecurityAnonymous )
    19.    MandatoryPolicy    : 1
    20.  
    21.    ImageFileName : [15]  "wininit.exe"
    22.    SessionId          : 0
    23.    TokenType          : 1 ( TokenPrimary )
    24.    ImpersonationLevel : 0 ( SecurityAnonymous )
    25.    MandatoryPolicy    : 1
    26.  
    27.    ImageFileName : [15]  "csrss.exe"
    28.    SessionId          : 1
    29.    TokenType          : 1 ( TokenPrimary )
    30.    ImpersonationLevel : 0 ( SecurityAnonymous )
    31.    MandatoryPolicy    : 1
    32.  
    33.    ImageFileName : [15]  "winlogon.exe"
    34.    SessionId          : 1
    35.    TokenType          : 1 ( TokenPrimary )
    36.    ImpersonationLevel : 0 ( SecurityAnonymous )
    37.    MandatoryPolicy    : 1
    38.  
    39.    ImageFileName : [15]  "services.exe"
    40.    SessionId          : 0
    41.    TokenType          : 1 ( TokenPrimary )
    42.    ImpersonationLevel : 0 ( SecurityAnonymous )
    43.    MandatoryPolicy    : 1
    44.  
    45.    ImageFileName : [15]  "lsass.exe"
    46.    SessionId          : 0
    47.    TokenType          : 1 ( TokenPrimary )
    48.    ImpersonationLevel : 0 ( SecurityAnonymous )
    49.    MandatoryPolicy    : 1
    50.  
    51.    ImageFileName : [15]  "lsm.exe"
    52.    SessionId          : 0
    53.    TokenType          : 1 ( TokenPrimary )
    54.    ImpersonationLevel : 0 ( SecurityAnonymous )
    55.    MandatoryPolicy    : 1
    56.  
    57.    ImageFileName : [15]  "svchost.exe"
    58.    SessionId          : 0
    59.    TokenType          : 1 ( TokenPrimary )
    60.    ImpersonationLevel : 0 ( SecurityAnonymous )
    61.    MandatoryPolicy    : 3
    62.  
    63.    ImageFileName : [15]  "taskhost.exe"
    64.    SessionId          : 1
    65.    TokenType          : 1 ( TokenPrimary )
    66.    ImpersonationLevel : 0 ( SecurityAnonymous )
    67.    MandatoryPolicy    : 3
    68.  
    69.    ImageFileName : [15]  "dwm.exe"
    70.    SessionId          : 1
    71.    TokenType          : 1 ( TokenPrimary )
    72.    ImpersonationLevel : 0 ( SecurityAnonymous )
    73.    MandatoryPolicy    : 3
    74.  
    75.    ImageFileName : [15]  "explorer.exe"
    76.    SessionId          : 1
    77.    TokenType          : 1 ( TokenPrimary )
    78.    ImpersonationLevel : 0 ( SecurityAnonymous )
    79.    MandatoryPolicy    : 3
    80.  
    81.    ImageFileName : [15]  "GoogleCrashHan"
    82.    SessionId          : 0
    83.    TokenType          : 1 ( TokenPrimary )
    84.    ImpersonationLevel : 0 ( SecurityAnonymous )
    85.    MandatoryPolicy    : 3
    86.  
    87.    ImageFileName : [15]  "igfxsrvc.exe"
    88.    SessionId          : 1
    89.    TokenType          : 1 ( TokenPrimary )
    90.    ImpersonationLevel : 0 ( SecurityAnonymous )
    91.    MandatoryPolicy    : 3
    92.  
    93.    ImageFileName : [15]  "hkcmd.exe"
    94.    SessionId          : 1
    95.    TokenType          : 1 ( TokenPrimary )
    96.    ImpersonationLevel : 0 ( SecurityAnonymous )
    97.    MandatoryPolicy    : 3
    98.  
    99.    ImageFileName : [15]  "igfxpers.exe"
    100.    SessionId          : 1
    101.    TokenType          : 1 ( TokenPrimary )
    102.    ImpersonationLevel : 0 ( SecurityAnonymous )
    103.    MandatoryPolicy    : 3
    104.  
    105.    ImageFileName : [15]  "punto.exe"
    106.    SessionId          : 1
    107.    TokenType          : 1 ( TokenPrimary )
    108.    ImpersonationLevel : 0 ( SecurityAnonymous )
    109.    MandatoryPolicy    : 3
    110.  
    111.    ImageFileName : [15]  "ps64ldr.exe"
    112.    SessionId          : 1
    113.    TokenType          : 1 ( TokenPrimary )
    114.    ImpersonationLevel : 0 ( SecurityAnonymous )
    115.    MandatoryPolicy    : 3
    116.  
    117.    ImageFileName : [15]  "svchost.exe"
    118.    SessionId          : 0
    119.    TokenType          : 1 ( TokenPrimary )
    120.    ImpersonationLevel : 0 ( SecurityAnonymous )
    121.    MandatoryPolicy    : 3
    122.  
    123.    ImageFileName : [15]  "Totalcmd.exe"
    124.    SessionId          : 1
    125.    TokenType          : 1 ( TokenPrimary )
    126.    ImpersonationLevel : 0 ( SecurityAnonymous )
    127.    MandatoryPolicy    : 3
    128.  
    129.    ImageFileName : [15]  "AkelPad.exe"
    130.    SessionId          : 1
    131.    TokenType          : 1 ( TokenPrimary )
    132.    ImpersonationLevel : 0 ( SecurityAnonymous )
    133.    MandatoryPolicy    : 3
    134.  
    135.    ImageFileName : [15]  "livekd64.exe"
    136.    SessionId          : 1
    137.    TokenType          : 1 ( TokenPrimary )
    138.    ImpersonationLevel : 0 ( SecurityAnonymous )
    139.    MandatoryPolicy    : 3
    140.  
    141.    ImageFileName : [15]  "conhost.exe"
    142.    SessionId          : 1
    143.    TokenType          : 1 ( TokenPrimary )
    144.    ImpersonationLevel : 0 ( SecurityAnonymous )
    145.    MandatoryPolicy    : 3
    146.  
    147.    ImageFileName : [15]  "audiodg.exe"
    148.    SessionId          : 0
    149.    TokenType          : 1 ( TokenPrimary )
    150.    ImpersonationLevel : 0 ( SecurityAnonymous )
    151.    MandatoryPolicy    : 3
    152.  
    153.    ImageFileName : [15]  "kd.exe"
    154.    SessionId          : 1
    155.    TokenType          : 1 ( TokenPrimary )
    156.    ImpersonationLevel : 0 ( SecurityAnonymous )
    157.    MandatoryPolicy    : 3
    158.  
    159.    ImageFileName : [15]  "dllhost.exe"
    160.    SessionId          : 0
    161.    TokenType          : 0 (No matching name)
    162.    ImpersonationLevel : 0 ( SecurityAnonymous )
    163.    MandatoryPolicy    : 0
    164. 0: kd>
     
    k3rnl нравится это.
  12. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    217
    Интересную картину возвращает этот скрипт на виртуалке с WinXP-x32.
    Здесь видно, что процесс "svchost.exe" дублирует свой токен потомкам, и он превращается из "Anonymous" в "Impersonation". Так-же на хрюше не было и "MandatoryPolicy", в результате чего обычная смена указателя на токен в структуре EPROCESS решала все вопросы с привилегиями.
    Код (Text):
    1. kd> $$>a< c:\1234.txt
    2.    ImageFileName : [16]  "svchost.exe"
    3.    SessionId          : 0
    4.    TokenType          : 1 ( TokenPrimary )
    5.    ImpersonationLevel : 0 ( SecurityAnonymous )
    6.  
    7.    ImageFileName : [16]  "svchost.exe"
    8.    SessionId          : 0
    9.    TokenType          : 1 ( TokenPrimary )
    10.    ImpersonationLevel : 2 ( SecurityImpersonation )
    11.  
    12.    ImageFileName : [16]  "smss.exe"
    13.    SessionId          : 0x6ae7
    14.    TokenType          : 0xe1017ba8 (No matching name)
    15.    ImpersonationLevel : 0xe1017bb4 (No matching name)
    16. ...........
    Но как оказалось, скрипт столкнулся с ещё одной проблемой - это число выделенных бит под счётчик-ссылок "RefCount". Дело в том, что в EPROCESS лежит только указатель на токен, а младшие биты в нём отводятся под счётчик, соответственно чтобы получить валидный адрес, нужно сбросить их в нуль. Так вот на х64 под этот count выделяются 4-бита, а на х32 всего 3. Поэтому скрипт не смог правильно вычислить адрес токена "smss.exe" в логе выше, т.к. я писал его для х64 r $t2 = @$t2 >> 4 << 4.
    Код (Text):
    1. kd> !process 0 0 kd.exe    <------- WinXP x32
    2. PROCESS 81548950  
    3.     Image: kd.exe
    4.  
    5. kd> dt _eprocess 81548950 Token.
    6. nt!_EPROCESS
    7.    +0x0c8 Token  :
    8.       +0x000 Object : 0xe15a6d4d
    9.       +0x000 RefCnt : 0y101       <---- 3 мл.бита
    10.       +0x000 Value  : 0xe15a6d4d
    11.  
    12. ;//**********************************************
    13.  
    14. 0: kd> !process 0 0 kd.exe
    15. PROCESS fffffa800402f8d0
    16.     Image: kd.exe
    17.  
    18. 0: kd> dt _eprocess fffffa800402f8d0 token.
    19. ntdll!_EPROCESS
    20.    +0x208 Token  :
    21.       +0x000 Object : 0xfffff8a0`04638a38
    22.       +0x000 RefCnt : 0y1000      <------------ 4 мл.бита
    23.       +0x000 Value  : 0xfffff8a0`04638a38
     
    alex_dz и k3rnl нравится это.