Поднижение прав от SYSTEM до текущего пользователя.

Тема в разделе "WASM.WIN32", создана пользователем slesh, 3 апр 2011.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Подскажите как реализовать такое вот:
    1) Имеется процесс с правами SYSTEM (обычная служба)
    2) Из этой службы необходимо запускать другие программы, но с правами залогиневшегося пользователя. При этом пароль и логин неизвестны.
    т.е. стандартный SVCHOST это каким-то образом умеет делать.
    Вообще в какую сторону копать?
    Допустим я смогу найти PID Explorer'a залогиневшегося пользователя, затем открыть его и получить Токены, а потом как-то ими манипулировать, чтобы запустить процесс от этого пользователя?
    Inject не предлагать!

    Пробовал использовать ImpersonateLoggedOnUser. Вроде всё нормально. GetUserNameA Возвращает имя нужного пользователя а не SYSTEM, но вот если запустить процесс, то он запустится всё равно от SYSTEM
     
  2. Selah

    Selah New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2007
    Сообщения:
    258
    инжект делай в другой процесс
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Inject не предлагать!
     
  4. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Разобрался!
    OpenProcess + OpenProcessToken + CreateProcessAsUserA дают нужный результат.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    [актуальность поста утрачена]
     
  6. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Кстати, но это не решило проблему!
    Программа хоть и запускается от пользователя другова, но поведение её становится странным.
    К примеру Если запустить FireFox, то он начинает себя вести совершенно по другому, как будто он запущен от другова пользователя (нет вкладок/закладок/истории)
    т.е. переменные окружения остались такие же как и у системного процесса.

    Всё проблема решена, создание блока переменных окружения на основе токина)
     
  7. EOT

    EOT New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2010
    Сообщения:
    181
    > поведение её становится странным.
    LoadUserProfile (http://msdn.microsoft.com/en-us/library/bb762281(v=vs.85).aspx).

    А так вот небольшой код, имперсонацию потока надо заменить запуском процесса:

    Код (Text):
    1. BOOL
    2. SetThreadTokenAsUser()
    3. {
    4.     HKEY                hReg        =   0;;
    5.     CHAR                ShellPath[MAX_PATH];
    6.     DWORD               Temp;
    7.     HANDLE              hSnap       =   0,
    8.                         hProc       =   0,
    9.                         hToken      =   0,
    10.                         hDup        =   0;
    11.     PROCESSENTRY32      Proc        =   {0};
    12.     TOKEN_PRIVILEGES    Token       =   {0};
    13.     BOOL                Result      =   FALSE;
    14.  
    15.     do
    16.     {
    17.  
    18.         if (RegOpenKey(HKEY_LOCAL_MACHINE, "software\\microsoft\\windows nt\\currentversion\\winlogon", &hReg) != ERROR_SUCCESS) {
    19.             break;
    20.         }
    21.  
    22.         Temp = MAX_PATH;
    23.         if (RegQueryValueEx(hReg, "Shell", 0, 0, (LPBYTE)ShellPath, &Temp) != ERROR_SUCCESS) {
    24.             break;
    25.         }
    26.  
    27.         hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    28.         if (hSnap == INVALID_HANDLE_VALUE) {
    29.             break;
    30.         }
    31.  
    32.         Proc.dwSize = sizeof(PROCESSENTRY32);
    33.         if (!Process32First(hSnap, &Proc)) {
    34.             break;
    35.         }
    36.  
    37.         Temp = 0;
    38.  
    39.         do
    40.         {
    41.             if (StrStrI(Proc.szExeFile, ShellPath))
    42.             {
    43.                 Temp = Proc.th32ProcessID;
    44.                 break;
    45.             }
    46.  
    47.         } while (Process32Next(hSnap, &Proc));
    48.  
    49.         if (!Temp) {
    50.             break;
    51.         }
    52.  
    53.         hProc = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, Temp);
    54.         if (!hProc) {
    55.             break;
    56.         }
    57.  
    58.         if (!OpenProcessToken(hProc, TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ADJUST_PRIVILEGES, &hToken)) {
    59.             break;
    60.         }
    61.  
    62.         if (!LookupPrivilegeValue(0, SE_IMPERSONATE_NAME, (PLUID)&Token.Privileges[0].Luid)) {
    63.             break;
    64.         }
    65.  
    66.         Token.PrivilegeCount = 1;
    67.         Token.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    68.         if (!AdjustTokenPrivileges(hToken, FALSE, &Token, 0, 0, 0)) {
    69.             break;
    70.         }
    71.  
    72.         if (!DuplicateToken(hToken, SecurityImpersonation, &hDup)) {
    73.             break;
    74.         }
    75.  
    76.         Result = ImpersonateLoggedOnUser(hDup);
    77.  
    78.     } while (FALSE);
    79.  
    80.     if (hReg) {
    81.         RegCloseKey(hReg);
    82.     }
    83.  
    84.     if (hSnap) {
    85.         CloseHandle(hSnap);
    86.     }
    87.  
    88.     if (hProc) {
    89.         CloseHandle(hProc);
    90.     }
    91.  
    92.     if (hToken) {
    93.         CloseHandle(hToken);
    94.     }
    95.  
    96.     if (hDup) {
    97.         CloseHandle(hDup);
    98.     }
    99.  
    100.     return Result;
    101. }