Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как поменять права процасса 
:(
    Опции темы
Riply
Дата 24.11.2007, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Вот что дала проверка:   smile 
 Этим способом можно из под Админа получить права SYSTEM.
Как жертва использовался Winlogon
 Повысить права в других случаях - не получается (во всяком случае у меня  smile )
Вот примерный код:
(там используется пара простеньких функций. 
Я думаю, написать их самостоятельно, заинтересованным лицам не составит труда).

Код

type
 PFunctTable = ^TFunctTable;
 TFunctTable = packed record
  hKernel32: HMODULE;
  _GetLastError: function: DWORD; stdcall;
  _CloseHandle: function(hObject: THandle): BOOL; stdcall;
  _CreateProcessW: function(lpApplicationName: PWideChar; lpCommandLine: PWideChar; 
                                              lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
                                              bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer; lpCurrentDirectory: PWideChar;
                                              const lpStartupInfo: TStartupInfoW; var lpProcessInformation: TProcessInformation): BOOL; stdcall;
  function InitSelf: DWord;
 end;

type
 PInjectInfo = ^TInjectInfo;
 TInjectInfo = packed record
  ProcessNameW: array[0..Pred(MAX_PATH)] of WideChar;
  FuntionsTable: TFunctTable;
  LastErr: DWord;
  function pInjectTreadCode: Pointer;
  function InitSelf(const pwLibName: PWideChar; const cbParam: DWord): DWord;
 end;

function TFunctTable.InitSelf: DWord;
begin
 Result := ERROR_CALL_NOT_IMPLEMENTED;
 FillChar(Self, SizeOf(TFunctTable), 0);
 hKernel32 := GetModuleHandle(kernel32);
 if hKernel32 <> 0 then
  try
   @_GetLastError := GetProcAddress(hKernel32, 'GetLastError');
   if not Assigned(@_GetLastError) then Exit;
   @_CloseHandle := GetProcAddress(hKernel32, 'CloseHandle');
   if not Assigned(@_CloseHandle) then Exit;
   @_CreateProcessW := GetProcAddress(hKernel32, 'CreateProcessW');
   if not Assigned(@_CreateProcessW) then Exit;
   Result := ERROR_SUCCESS;
  finally
   if Result <> ERROR_SUCCESS then
    begin
     Result := GetLastError;
     FillChar(Self, SizeOf(TFunctTable), 0);
    end;
  end
 else Result := GetLastError;
end;

function TInjectInfo.InitSelf(const pwLibName: PWideChar; const cbParam: DWord): DWord;
begin
 FillChar(Self, SizeOf(TInjectInfo), 0);
 Result := FuntionsTable.InitSelf;
 if Result = ERROR_SUCCESS then
  if pwLibName <> nil then lstrcpyw(ProcessNameW, pwLibName);
end;

function TInjectInfo.pInjectTreadCode: Pointer;
begin
 Result := Pointer(DWord(@Self) + SizeOf(TInjectInfo));
end;

function InjectInfo_AllocMem(var pInjInfo: PInjectInfo; const pRemoteThread: Pointer; const cbCodeSize: DWord): DWord;
begin
 Result := cbCodeSize + SizeOf(TInjectInfo);
 ReallocMem(pInjInfo, Result);
 Move(pRemoteThread^, pInjInfo.pInjectTreadCode^, cbCodeSize);
end;

procedure InjectInfo_Dispose(var pInjInfo: PInjectInfo);
begin
 ReallocMem(pInjInfo, 0);
end;

function RPC_Proc(pInjInfo: PInjectInfo): DWord; stdcall;
var
 SiW: _STARTUPINFOW;
 Proc_Info: _PROCESS_INFORMATION;
begin
 Result := ERROR_SUCCESS;
 with SiW do
  begin
   cb := SizeOf(STARTUPINFOW);
   dwFlags := startf_UseShowWindow;
   wShowWindow := SW_SHOWNORMAL;
   lpReserved := nil;
   lpDesktop := nil;
   lpTitle := nil;
   dwX := 0;
   dwY := 0;
   dwXSize := 0;
   dwYSize := 0;
   dwXCountChars := 0;
   dwYCountChars := 0;
   dwFillAttribute := 0;
   cbReserved2 := 0;
   lpReserved2 := nil;
   hStdInput := 0;
   hStdOutput := 0;
   hStdError := 0;
  end;
 with pInjInfo^, FuntionsTable do
  if  _CreateProcessW(nil, @ProcessNameW,
                      nil, nil, False,
                      CREATE_DEFAULT_ERROR_MODE,
                      nil, nil, SiW, Proc_Info) then
   begin
    _CloseHandle(Proc_Info.hThread);
    _CloseHandle(Proc_Info.hProcess);
    LastErr := ERROR_SUCCESS;
   end
 else LastErr := _GetLastError;
end;

function RPC_CodeSize: DWord;
begin
 Result := DWord(@RPC_CodeSize) - DWord(@RPC_Proc);
end;

function Proc_CreateRemote(const hVictim: THandle; const pwProcessName: PWideChar; var RemoteError: DWord): DWord;
var
 pInjInfo: PInjectInfo;
 WaitArr: Int64;
 ThreadID, WaitResult, cbWritten, TmpSize: DWord;
 pRemoteData: Pointer;
 hThread: THandle;
begin
 pInjInfo := nil;
 pRemoteData := nil;
 WaitResult := WAIT_OBJECT_0;
 TmpSize := InjectInfo_AllocMem(pInjInfo, @RPC_Proc, RPC_CodeSize);
 try
  Result := pInjInfo.InitSelf(pwProcessName, ERROR_SUCCESS);
  if Result = ERROR_SUCCESS then
   if Proc_AllocAndWriteMemory(hVictim, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE, pInjInfo, TmpSize, pRemoteData) then
    try
     hThread := CreateRemoteThread(hVictim, nil, 0, PInjectInfo(pRemoteData).pInjectTreadCode, pRemoteData, 0, ThreadID);
     if hThread <> 0 then
      try
       WaitArr := Make_Int64(hVictim, hThread);
       WaitResult := WaitForMultipleObjects(2, @WaitArr, False, INFINITE);
       case WaitResult of
        WAIT_OBJECT_0:
         begin
          if ReadProcessMemory(hVictim, pRemoteData, pInjInfo, SizeOf(TInjectInfo), cbWritten) then
           begin
            RemoteError := pInjInfo.LastErr;
            Result := ERROR_SUCCESS;
           end
          else Result := GetLastError;
         end;
        WAIT_OBJECT_0 + 1: Result := ERROR_WAIT_NO_CHILDREN;
        WAIT_FAILED: Result := GetLastError;
        else Result := ERROR_WAIT_NO_CHILDREN;
       end;
      finally
       CloseHandle(hThread);
      end
     else Result := GetLastError;
    finally
     if (WaitResult <> WAIT_OBJECT_0 + 1) and (WaitResult <> WAIT_TIMEOUT)
      then VirtualFreeEx(hVictim, pRemoteData, 0, MEM_RELEASE);
    end
   else Result := GetLastError;
 finally
  InjectInfo_Dispose(pInjInfo);
 end;
end;


P.S.
 При работе не забываем дать себе Debud-привилегии, 
 и внимательно относимся к параметрам при открытии целевого процесса

P.S.S
 Можно было бы обойтись без ожидания и чтения (PROCESS_VM_READ и SYNCHRONIZE), 
 но они дают нам возможность получить код ошибки и убрать за собой мусор  smile 

PM MAIL   Вверх
_sten_
Дата 24.11.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: нет
Всего: 3



Я наверное покажусь ужасно наглым, но все же можно исходник;)
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
Riply
Дата 24.11.2007, 22:17 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



Цитата(_sten_ @  24.11.2007,  21:27 Найти цитируемый пост)
Я наверное покажусь ужасно наглым, но все же можно исходник;) 


А в чем проблеммы ?
Если я не ошибаюсь, там не хватает двух ф-ий. 
Я умышленно их не привела. Своего рода страховка.
Тому кто понимает, что делает их написать не сложно.
А если не понимаешь, то надо идти в Help. (Эта методика и у Рихтера хорошо описана)

Дело в том, что скорее всего тестирование будет на "жизненно важных" процессах.
Иначе смысла в этом никакого нет. 
 Ошибка, очень вероятно, приведет к падению системы. Или к чему по-хуже. 
 Например, если ты попробуешь освободить память в целевом процессе раньше, чем отработает нить.
Я не хочу оказаться виновной в подобных казусах. smile 
Sorry.

P.S.
 Будут конкретные вопросы - постараюсь ответить.
PM MAIL   Вверх
_sten_
Дата 26.11.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: нет
Всего: 3



Вот нашол замечатильную сатейку про переход в 0-е кольцо безопасности, в нем полний доступ к памяти, и примеры как сделать такое безобразие как помениять PID и имя процеса. Так вот может можно подобним образом поменять права или поменять родителя, а значит и права... 
Возможно ли такое? И если можно то как? 
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
dumb
Дата 27.11.2007, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



Цитата(_sten_ @  26.11.2007,  11:00 Найти цитируемый пост)
нашол замечатильную сатейку про переход в 0-е кольцо безопасности, в нем полний доступ к памяти
все легитимные способы входа в ring0 требуют наличия административных прав. нелегитимные же способы проникновения в 0-ое кольцо или получения адм.прав основаны на уязвимостях, причем приватных. ибо если они попадают "на публику", их довольно резво исправляют.
так что можешь остыть.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.