Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запуск от имени другого пользователя  (Прочитано 30957 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Helium
Гость
« : 24-06-2003 23:22 » 

:?:  Люди, подскажте, как программе запустить саму себя от имени другого пользователя?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 25-06-2003 00:06 » 

Упс - по моему никак.
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 25-06-2003 12:12 » 

Цитата: Helium
:?:  Люди, подскажте, как программе запустить саму себя от имени другого пользователя?


Да легко, надо имперсонификацию сделать. Как скажу позже.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 25-06-2003 12:25 » 

А права доступа откуда возьмутся пароль и отзыв  :?:
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 25-06-2003 12:37 » 

Цитата: Helium
:?:  Люди, подскажте, как программе запустить саму себя от имени другого пользователя?


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

Есть такие ф-ции-

ImpersonateLoggedOnUser - приписывает токен вызвавшему потоку(не процессу!)

RevertToSelf- отменяет имперсонификацию. сделанную ф-цией ImpersonateLoggedOnUser

SetThreadToken- устанавливает токен потока

LogonUser - используется для получения токена другого юзера

Также есть вот такие ф-ции:
OpenProcessToken
OpenThreadToken
GetTokenInformation
DuplicateTokenEx
CreateProcessAsUser- не очень подходит если процесс уже запущен.

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

Или запустить приложение и из него сразу вызвать CreateProcessAsUser, запустив себя второй раз но под другим юзером, а первоначальный процесс завершить, только надо как-то сообщить, что он уже сам себя перезапустил, а то цикл выйдет, но имперсонификация даст тот-же эффект.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 25-06-2003 12:49 » 

И при этом не требуется знания скажем пароля у пользователя???
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 25-06-2003 12:50 » 

Цитата: Гром
А права доступа откуда возьмутся пароль и отзыв  :?:


Тут несколько вариантов-или они известны, или надо открыть какой-нибудь процесс, идущий под этим юзером и получить его token, кстати я уже в старом форуме приводил полный код того, как запустить поток под юзером System, просто открыв системный процесс и получив оттуда токен. Естественно для открытия процесса нужны соответствующие права, обычно они только у админа и системы.
Также можно спросить у юзера.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 25-06-2003 12:52 » 

Цитата: Гром
И при этом не требуется знания скажем пароля у пользователя???


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

ru
Offline Offline

« Ответ #8 : 25-06-2003 12:56 » 

Цитата: Гром
И при этом не требуется знания скажем пароля у пользователя???


Знание пароля не требуется если юзер обратился к процессу через именованный канал или известен поток из которого идет обращение- тогда через DuplicateTokenEx дублируется токен и имперсонифицируется поток. Так сервера делают.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 25-06-2003 13:01 » 

Таким образом - это дыра, которая вполне может быть использована при знании только имени юзера при засылке троянов, имперсонификация в администратора и вперед.   Здесь была моя ладья...
Записан

А птичку нашу прошу не обижать!!!
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 25-06-2003 13:06 » 

Думаю что нет для того чтобы захватить  токен юзера, админа или системы нужны права  а у обычного юзера их нет.
Записан

Да да нет нет все остальное от лукавого.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 25-06-2003 13:24 » 

Тогда проблема - как их получить? Не запускать же процесс каждый раз от админа...
Смысл вопроса видимо перевод процесса из под обычного юзера в другого обычного юзера - а где права?
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #12 : 25-06-2003 13:31 » 

Цитата: Гром
Таким образом - это дыра, которая вполне может быть использована при знании только имени юзера при засылке троянов, имперсонификация в администратора и вперед.   Здесь была моя ладья...


Ну вы блин даете! Имея права юзера нельзя открыть процесс админа и получить его токен. Сервисы меняют токен на токен юзера, так как обычно работают под LocalSystem, а у него офигенные права. Изменить токен юзерского потока на админский нельзя не зная пароль. OpehThread просто провалится при попытки открыть поток с более крутым токеном.
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 25-06-2003 13:33 » 

Логин + пароль=токен
или
Права+ чужой поток = токен.
В общем если нужно запустить поток от чужого имени нужны логин и пароль
или права.
Игра с токенами предназначена не для расширения прав а на оборот для их ограничения. Философия NT
Записан

Да да нет нет все остальное от лукавого.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #14 : 25-06-2003 13:37 » 

Цитата: PSD
Логин + пароль=токен
или
Права+ чужой поток = токен.
В общем если нужно запустить поток от чужого имени нужны логин и пароль
или права.
Игра с токенами предназначена не для расширения прав а на оборот для их ограничения. Философия NT


Вот, другое дело. Или права админа, или знай пароль. Но имея права админа и не имея ни одного потока юзера, все равно нужен пароль- токен брать неоткуда, только из LogonUser.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #15 : 25-06-2003 14:00 » 

Ясно теперь....
Вот уж никогда не занимался подобными вещами.
Записан

А птичку нашу прошу не обижать!!!
Dmi
Гость
« Ответ #16 : 03-09-2004 06:27 » 

Исход с экзамплом, тока корявый могу вывесить, но лучше б это сделал кто еще!
 var
 a,b,c: PANSICHAR;
 token: Cardinal;
 r : boolean;
begin
 a := 'user';
 b := 'domain';
 c := 'pwd';
 r := LogonUser(a,b,c,0,0,token);
 a := 'cmd.exe'
 CreateProcessAsUser(token,b,a,SECURITY_ANONYMOUS,S_NORMAL,false,0,0,nil,)
end;
Записан
ixania
Гость
« Ответ #17 : 06-09-2004 15:57 » 

unit ProcessWithLogon;

interface

uses Windows, SysUtils;

const
  LOGON_WITH_PROFILE         = $1;
  LOGON_NETCREDENTIALS_ONLY  = $2;

function CreateProcessWithLogonW(
  UserName,
  Domain,
  Password: PWideChar;
  dwLogonFlags: DWORD;
  lpApplicationName,
  lpCommandLine: PWideChar;
  dwCreationFlags: DWORD;
  lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar;
  const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;

function StartProcessWithLogon(
       const  strUsername,     // Логин
              strDomain,       // Домен
              strPassword,     // Пароль
              strCommandLine: WideString  // запускаемая программа с путем к ней
 ): Boolean;



implementation

function CreateProcessWithLogonW; external advapi32 name 'CreateProcessWithLogonW';

function StartProcessWithLogon(
       const  strUsername,     // Логин
              strDomain,       // Домен
              strPassword,     // Пароль
              strCommandLine: WideString  // запускаемая программа с путем к ней
 ): Boolean;
var
  pi: TProcessInformation;
  si:TStartupInfo;
  bResult: boolean;
  St: string;

begin
  Result := False;

  ZeroMemory(@si,sizeof(TSTARTUPINFO));
  si.cb:= sizeof(TSTARTUPINFO);
  si.lpDesktop:=nil;

  bResult := CreateProcessWithLogonW(
    PWideChar(strUsername),
    PWideChar(strDomain),
    PWideChar(strPassword),
    LOGON_WITH_PROFILE,
    PWideChar(strCommandLine),
    nil,
    0,
    nil,
    nil,
    si,
    pi
  );
  if not bResult then
  begin
    St := SysErrorMessage(Windows.GetLastError);
    MessageBox(0, PAnsiChar(St), 'Ошибка!', MB_OK or MB_ICONERROR)
  end
  else
  begin
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
  end;

  Result:=bResult;
end;

end.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines