Русский / Russian English / Английский

Сейчас на форуме: (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Программирование —› Как запустить процесс от SYSTEM в NT5 ?
Посл.ответ Сообщение


Ранг: 69.9 (постоянный)
Статус: Участник

Создано: 18 марта 2020 22:11 New!
Цитата · Личное сообщение · #1

Тестил 1 прогу и задумался над такой вещью - почему-то не получается запустить процесс с правами Системы в XP/2000. Как бы оно уже никому не надо, но почему так? Мой код возвращает ACCESS_DENIED, популярные тулзы тоже вылетают с ошибкой. Почему-то на десятке даже можно скопировать токен winlogon'a (ес-но от админа), и запустить софт с правами системы, а на ХР нельзя? Как служба - понятно, можно, но если без службы?
Копал кто-то эту тему или может знает, в чем причина?




Ранг: 72.5 (постоянный)
Статус: Участник

Создано: 18 марта 2020 23:20 · Поправил: BlackCode New!
Цитата · Личное сообщение · #2

morgot пишет:
Как служба - понятно, можно, но если без службы?

Если только первоначально процесс запущен от администратора с привилегией отладки.
Тогда можно открыть целевой процесс службы, дублировать токен и имперсонировать его себе.
Таким образом вы получите большинство привилегий системного процесса. Но не все.

Code:
  1. SetDebugPrivilege proc uses ecx ebx edx
  2.  
  3.      local hToken:dword
  4.      local tkp:TOKEN_PRIVILEGES
  5.  
  6.     lea ebx,hToken
  7.     invoke OpenProcessToken,FUNC(GetCurrentProcess),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ebx
  8.     .if(!eax)
  9.         return FALSE
  10.     .endif
  11.     invoke LookupPrivilegeValue,NULL,chr$("SeDebugPrivilege"),addr tkp.Privileges[0].Luid 
  12.     .if(!eax)
  13.         invoke CloseHandle,hToken
  14.         return FALSE
  15.      ret
  16.     .endif
  17.     mov tkp.PrivilegeCount,1 
  18.     mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED
  19.     invoke AdjustTokenPrivileges,hToken,FALSE,addr tkp,0,NULL,0
  20.     .if(!eax)
  21.         invoke CloseHandle,hToken
  22.         return FALSE
  23.     .endif
  24.     invoke CloseHandle,hToken
  25.     ret
  26.  
  27. SetDebugPrivilege endp


Code:
  1. GetLsassID proc uses ebx ecx edx esi edi
  2.  
  3.          local hSnapshot:dword
  4.          local hProcess:dword
  5.          local uProcess:PROCESSENTRY32
  6.          
  7.          invoke RtlZeroMemory,addr uProcess,sizeof uProcess
  8.          mov uProcess.dwSize,sizeof uProcess
  9.  
  10.          mov hSnapshot,FUNC(CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0)
  11.          .if hSnapshot == INVALID_HANDLE_VALUE
  12.                  invoke LastError
  13.          .endif
  14.  
  15.          invoke Process32First,hSnapshot,addr uProcess
  16.          .while TRUE
  17.                  invoke Process32Next,hSnapshot,addr uProcess
  18.                or eax,eax
  19.                .if zero?
  20.                     invoke LastError
  21.                .endif
  22.                  invoke _strcmpi,addr uProcess.szExeFile,chr$("lsass.exe")
  23.                  .if eax == NULL
  24.                         invoke CloseHandle,hSnapshot
  25.             .break
  26.                  .endif
  27.          .endw
  28.          return uProcess.th32ProcessID
  29.  
  30. GetLsassID endp


Code:
  1. SetUserSystem proc uses ebx ecx edx esi edi
  2.  
  3.     local hProcess:dword
  4.     local hExistingToken:dword
  5.     local hNewToken:dword
  6.     local sa:SECURITY_ATTRIBUTES
  7.  
  8.     mov hProcess,FUNC(OpenProcess,PROCESS_QUERY_LIMITED_INFORMATION,FALSE,FUNC(GetLsassID))
  9.     .if !hProcess
  10.         invoke LastError
  11.     .endif
  12.     invoke OpenProcessToken,hProcess,MAXIMUM_ALLOWED,addr hExistingToken
  13.     .if !eax
  14.         invoke LastError
  15.     .endif
  16.     invoke RtlZeroMemory,addr sa,sizeof sa
  17.     mov sa.nLength,sizeof sa
  18.     invoke DuplicateTokenEx,hExistingToken,TOKEN_ALL_ACCESS,addr sa,SecurityImpersonation,TokenPrimary,addr hNewToken
  19.     .if !eax
  20.         invoke LastError
  21.     .endif
  22.     invoke ImpersonateLoggedOnUser,hNewToken
  23.     .if !eax
  24.         invoke LastError
  25.     .endif
  26.     invoke CloseHandle,hExistingToken
  27.     invoke CloseHandle,hNewToken
  28.     ret
  29.  
  30. SetUserSystem endp

| Сообщение посчитали полезным: morgot



Ранг: 69.9 (постоянный)
Статус: Участник

Создано: 18 марта 2020 23:44 New!
Цитата · Личное сообщение · #3

BlackCode
вот у меня код прекрасно работает даже на десятке, но не хочет работать на ХР. Именно на DuplicateTokenEx возвращает access_denied. Пробовал уже разные параметры, все равно ошибка в этой вот апи.




Ранг: 72.5 (постоянный)
Статус: Участник

Создано: 19 марта 2020 00:10 · Поправил: BlackCode New!
Цитата · Личное сообщение · #4

morgot

Только сейчас проверил под ХР.
Разница только в флаге открытия процесса.
В ХР надо OpenProcess с флагом PROCESS_ALL_ACCESS выполнить а не с PROCESS_QUERY_LIMITED_INFORMATION.
И OpenProcessToken отрабатывает как надо

P.S. И вообще, вот исходники тулз RunAsEx, ZAccessMan, ZTokenMan для ХР.
Там все понятно

{ Атач доступен только для участников форума } - RunUser_src.zip




Ранг: 69.9 (постоянный)
Статус: Участник

Создано: 19 марта 2020 00:19 New!
Цитата · Личное сообщение · #5

BlackCode
странно все это. На ХР действительно запустилось, создал cmd.exe , но повышения нет - т.е. обычная консоль от админа.
Можете скинуть свой бинарник?




Ранг: 72.5 (постоянный)
Статус: Участник

Создано: 19 марта 2020 00:23 · Поправил: BlackCode New!
Цитата · Личное сообщение · #6

morgot пишет:
но повышения нет

Посмотри права процесса в ProcessHacker-е к примеру, если права скопировались, то они должны появиться в твоем процессе, после имперсонации.
Ты процесс запускаешь от учетки пользователя с правами админа, надо перезапускать процесс с дублированным токеном. (CreateProcessAsUser) Только тогда процесс будет запущен от учетки, чей токен ты дублировал.
Или перезапустить самого себя с дублированным токеном.




Ранг: 69.9 (постоянный)
Статус: Участник

Создано: 19 марта 2020 00:36 New!
Цитата · Личное сообщение · #7

BlackCode
в SetUserSystem написал invoke CreateProcessAsUser,hNewToken,chr$("C:\windows\system32\cmd.exe"),edx,edx,edx,edx,CREATE_NEW_CONSOLE,edx,edx,addr s_i,addr p_i
cоздает обычную консоль..

Не могу я с этим разобраться, или усталость ,или не знание какой-то матчасти.

Добавлено спустя 1 минуту
p.s. за сорцы спасибо, не видел сразу. Щас буду разбираться.




Ранг: 72.5 (постоянный)
Статус: Участник

Создано: 19 марта 2020 00:40 · Поправил: BlackCode New!
Цитата · Личное сообщение · #8

morgot пишет:
Не могу я с этим разобраться

Посмотри исходники которые я выше дал. Там все понятно, и последовательность вызова АПИ тоже.
Смотри исходники RunAsEx. Там есть скомпилированный ехешник. Под ХР он запускается.
morgot пишет:
не знание какой-то матчасти

Главное - это желание разобраться

Добавлено спустя 48 минут
Вот еще что. Самое главное, для создания полноценного процесса с дублированным токеном от процесса запущенного от сторонней учетной записи, в данном случае SYSTEM,
необходимо чтобы процесс который дублирует токен и в последствии создает дочерний процесс с данным токеном имел привилегию SeTcbPrivilege.
Эта привилегия присутствует только у процессов сервисов (служб) соответственно работающих от учетки SYSTEM.
У юзермодных процессов этой привилегии нет априори.

Это получение дубликата токена из процесса сервиса.
Code:
  1. GetProcessTokenW proc uses rbx rcx rdx rsi rdi r8 r9 r10 r11 r12 r13 r14 r15 lpProcessName:LPSTR
  2.  
  3.     local hToken:qword
  4.     local hNewToken:qword
  5.     local hProcess:qword
  6.     local hSnapshot:qword
  7.     local soa:OBJECT_ATTRIBUTES
  8.     local uProcess:PROCESSENTRY32W
  9.    
  10.     memalign rsp,16
  11.  
  12.     invoke memset,addr uProcess,0,sizeof uProcess
  13.     mov uProcess.dwSize,sizeof PROCESSENTRY32W
  14.  
  15.          mov hSnapshot,FUNC(CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0)
  16.          .if hSnapshot == INVALID_HANDLE_VALUE
  17.                  invoke DebugLastError
  18.          .endif
  19.          invoke Process32FirstW,hSnapshot,addr uProcess
  20.          .while TRUE
  21.                  invoke Process32NextW,hSnapshot,addr uProcess
  22.                or rax,rax
  23.                .if zero?
  24.                     invoke DebugLastError
  25.                .endif
  26.                  invoke _wcsicmp,addr uProcess.szExeFile,lpProcessName
  27.                  .if rax == NULL
  28.                         invoke CloseHandle,hSnapshot
  29.                         .break
  30.                  .endif
  31.          .endw
  32.     invoke memset,addr soa,0,sizeof soa
  33.     mov soa._Length,sizeof soa
  34.     invoke NtOpenProcess,addr hProcess,PROCESS_QUERY_INFORMATION,addr soa,addr uProcess.th32ProcessID
  35.     .if eax
  36.         invoke DebugLastError
  37.     .endif
  38.     invoke NtOpenProcessToken,hProcess,TOKEN_ALL_ACCESS,addr hToken
  39.     .if eax
  40.         invoke DebugLastError
  41.     .endif
  42.     invoke NtClose,hProcess
  43.     .if eax
  44.         invoke DebugLastError
  45.     .endif
  46.     invoke memset,addr soa,0,sizeof soa
  47.     mov soa._Length,sizeof soa
  48.     invoke NtDuplicateToken,hToken,TOKEN_ALL_ACCESS,addr soa,SecurityDelegation,TokenPrimary,addr hNewToken
  49.     .if eax
  50.         invoke DebugLastError
  51.     .endif
  52.     invoke NtClose,hToken
  53.     .if eax
  54.         invoke DebugLastError
  55.     .endif
  56.     return hNewToken
  57.  
  58. GetProcessTokenW endp


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

Code:
  1. SetDesktopWinStaAccess proc uses rbx rcx rdx rsi rdi r8 r9 r10 r11 r12 r13 r14 r15
  2.  
  3.     local allAppPackagesSid[SECURITY_DESCRIPTOR_MIN_LENGTH + sizeof(ULONG)]:byte
  4.  
  5.     memalign rsp,16
  6.  
  7.     invoke RtlInitializeSid,addr allAppPackagesSid,addr appPackageAuthority,SECURITY_BUILTIN_APP_PACKAGE_RID_COUNT
  8.     invoke RtlSubAuthoritySid,addr allAppPackagesSid,0
  9.     mov dword ptr[rax],SECURITY_APP_PACKAGE_BASE_RID
  10.     invoke RtlSubAuthoritySid,addr allAppPackagesSid,1
  11.     mov dword ptr[rax],SECURITY_BUILTIN_PACKAGE_ANY_PACKAGE
  12.     mov rbx,FUNC(RtlLengthSid,addr PhSeEveryoneSid)
  13.     add rbx,FUNC(RtlLengthSid,addr allAppPackagesSid)
  14.     add ebx,SECURITY_DESCRIPTOR_MIN_LENGTH + sizeof(ACL) + (3*sizeof(ACCESS_ALLOWED_ACE)) + (2*sizeof(DWORD)) ; allocationLength
  15.     mov rdi,FUNC(RtlAllocateHeap,FUNC(GetProcessHeap),HEAP_ZERO_MEMORY,ebx) ; securityDescriptor
  16.     invoke RtlCreateSecurityDescriptor,rdi,SECURITY_DESCRIPTOR_REVISION
  17.     lea rsi,[rdi+SECURITY_DESCRIPTOR_MIN_LENGTH*2] ; dacl
  18.     lea rdx,[rbx-SECURITY_DESCRIPTOR_MIN_LENGTH*2]
  19.     invoke RtlCreateAcl,rsi,rdx,ACL_REVISION
  20.     invoke RtlAddAccessAllowedAce,rsi,ACL_REVISION,GENERIC_ALL,addr PhSeEveryoneSid
  21.     invoke GetWindowsVersion
  22.     .if eax >= WINDOWS_8
  23.         invoke RtlAddAccessAllowedAce,rsi,ACL_REVISION,GENERIC_ALL,addr allAppPackagesSid
  24.     .endif
  25.     invoke RtlSetDaclSecurityDescriptor,rdi,TRUE,rsi,FALSE
  26.     mov rbx,FUNC(OpenWindowStationW,uni$("WinSta0"),FALSE,WRITE_DAC)
  27.     invoke NtSetSecurityObject,rbx,DACL_SECURITY_INFORMATION,rdi
  28.     invoke CloseWindowStation,rbx
  29.     mov rbx,FUNC(OpenDesktopW,uni$("Default"),0,FALSE,WRITE_DAC or DESKTOP_READOBJECTS or DESKTOP_WRITEOBJECTS)
  30.     invoke NtSetSecurityObject,rbx,DACL_SECURITY_INFORMATION,rdi
  31.     invoke CloseDesktop,rbx
  32.     invoke RtlFreeHeap,FUNC(GetProcessHeap),0,rdi
  33.     ret
  34.  
  35. SetDesktopWinStaAccess endp


Код 64-битный, под х86 легко партируется
Это все привилегии которые необходимо разрешить для создания полноценного процесса с дублированным токеном, помимо SeTcbPrivilege.
Code:
  1.         invoke EnablePrivilege,chr$("SeAssignPrimaryTokenPrivilege"),TRUE
  2.         invoke EnablePrivilege,chr$("SeBackupPrivilege"),TRUE
  3.         invoke EnablePrivilege,chr$("SeImpersonatePrivilege"),TRUE
  4.         invoke EnablePrivilege,chr$("SeIncreaseQuotaPrivilege"),TRUE
  5.         invoke EnablePrivilege,chr$("SeRestorePrivilege"),TRUE
  6.         invoke EnablePrivilege,chr$("SeLoadDriverPrivilege"),TRUE
  7.         invoke EnablePrivilege,chr$("SeTakeOwnershipPrivilege"),TRUE




Ранг: 47.6 (посетитель)
Статус: Участник

Создано: 19 марта 2020 18:32 New!
Цитата · Личное сообщение · #9

проще самому залогиниться как систем
Экран выбора учётной записи > 5 раз шифт > справка> проводник "explorer.exe"




Ранг: 69.9 (постоянный)
Статус: Участник

Создано: 19 марта 2020 21:28 New!
Цитата · Личное сообщение · #10

BlackCode
Самое удивительно то, что на виста и выше нужно "всего лишь" 1 привилегия и совсем немного кода. Почему так? С другой стороны, понятно, что в ХР можно было от админа создать службу, но все же.
За сорцы спасибо

mdscorp
Мне нужно программно, но спасибо, мб пригодится.



Ранг: 145.8 (ветеран)
Статус: Участник

Создано: 20 марта 2020 06:55 New!
Цитата · Личное сообщение · #11

BlackCode
Какой бред ты несешь, ей богу. Не говоря уже о том что твой гавнокод пихает sid everyone туда где его быть не должно от слова совсем.




Ранг: 72.5 (постоянный)
Статус: Участник

Создано: 20 марта 2020 09:17 · Поправил: BlackCode New!
Цитата · Личное сообщение · #12

Alchemistry
Ты это разработчику PocessHacker-a скажи, умник
Ты свой говнокод покажи... прежде чужой обсерать..
Пи@деть не мешки ворочать...



Ранг: 145.8 (ветеран)
Статус: Участник

Создано: 20 марта 2020 09:26 New!
Цитата · Личное сообщение · #13

BlackCode
Напоминаю тебе, дурачок, у WinSta0 и Default десктопа в списке разрешений есть и LocalSystem и Administrators. Твой гавнокод запихал туда еще принудительно Everyone.
С удовольствием скажу это и wj32, зови его сюда, только в отличие от тебя рандомного идиота, он меня знает, а тебя нет)




Ранг: 72.5 (постоянный)
Статус: Участник

Создано: 20 марта 2020 09:29 New!
Цитата · Личное сообщение · #14

Alchemistry
Твоего мнения никто не спрашивал.
Alchemistry пишет:
он меня знает, а тебя нет

Тебя, пиздабола знает весь форум.



Ранг: 145.8 (ветеран)
Статус: Участник

Создано: 20 марта 2020 09:33 New!
Цитата · Личное сообщение · #15

Кукарекай дальше, мне фиолетово.

BlackCode пишет:
Эта привилегия присутствует только у процессов сервисов (служб) соответственно работающих от учетки SYSTEM.
У юзермодных процессов этой привилегии нет априори.


Вот это проясни, гуру копирования ты наш)


 eXeL@B —› Программирование —› Как запустить процесс от SYSTEM в NT5 ?

Видеокурс ВЗЛОМ