Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Процесс, Dll и учётные записи пользователей ...   Найти похожие ветки 

 
kaZaNoVa ©   (2004-10-23 16:44) [0]

Сегодня я исследовал работу одной своей программы на предмет корректности работы от различных учётных записей ...
И столкнулся с интересным явлением:
- если внедрить Dll в системный процесс с помощью CreateRemoteThread, то код из длл начинает выполняться с правами System, а если хуком - то с правами пользователя, установившего хук ..

- всвязи с этим у меня появился интересный вопрос - исполнение кода Dll с правами системы при загрузке через CreateRemoteThread - это нормальный режим работы системы ("баг или фича?" (с) кто-то ) - или это недостаток системы безопасности Windows ?

- то есть любой пользователь (c Debug привелегиями) может фактически работать от имени любого другого ! - и от имени системы .. ?

Загрузчик:

program loader;
uses
 Windows,Tlhelp32;

function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
 if LookupPrivilegeValue(nil, PChar("SeDebugPrivilege"), tkp.Privileges[0].Luid) then
 begin
   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
   Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
 end;
end;
end;

function Start(ProcessID: Cardinal; DllFileName: string): Boolean;
var
hProcess, hTh: THandle;
BytesWritten, ThreadID, DllNameLen: Cardinal;
LoadLibraryProc, MemPtr: Pointer;
ExitCode: DWord;
begin
Result := false;

SetDebugPriv();

hProcess := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE,true, ProcessID);

if hProcess <> 0 then
begin
 DllNameLen := Length(DllFileName) + 1;
 
 MemPtr := VirtualAllocEx(hProcess, nil, DllNameLen, MEM_COMMIT, PAGE_READWRITE);

 if MemPtr <> nil then
 begin
   if WriteProcessMemory(hProcess, MemPtr, PChar(DllFileName), DllNameLen, BytesWritten) then
   begin
     LoadLibraryProc := GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");

     hTh := CreateRemoteThread(hProcess, nil, 0, LoadLibraryProc, MemPtr, 0, ThreadID);

     if hTh <> 0 then
     begin
       if (WaitForSingleObject(hTh, INFINITE) = WAIT_OBJECT_0) and
         GetExitCodeThread(hTh, ExitCode) then
         Result := ExitCode <> 0;

       CloseHandle(hTh);
     end;
   end;

   VirtualFreeEx(hProcess, MemPtr, 0, MEM_RELEASE);
 end;

 CloseHandle(hProcess);
end;

end;

function UpperCase(const S: string): string;
var I : Integer;
begin
 Result := S;
 for I := 1 to Length( S ) do
   if Result[ I ] in [ "a".."z" ] then
      Dec( Result[ I ], 32 );
end;
               

var
ProcessID: Cardinal;
DllName,ppp: string;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ProcessID:=0;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
 begin
ppp:=FProcessEntry32.szExeFile;
if (pos("WINLOGON",UpperCase(ppp))>0) then  ProcessID:=FProcessEntry32.th32ProcessID;
ContinueLoop := Process32Next(FSnapshotHandle,  FProcessEntry32);
 end;
CloseHandle(FSnapshotHandle);

DllName:="A:\Test.dll";

if ProcessID <> 0 then Start(ProcessID, DllName);

end.


Тестовая Dll: (с автоматической вырузкой)

library TestDll;
uses SysUtils,Windows;

Var
f:TextFile;
ThreadID,id,HThread:cardinal;

Const FName="A:\log.txt";

Function GetUserFromWindows: string;
Var
 UserName    : string;
 UserNameLen : Dword;
Begin
 UserNameLen := 255;
 SetLength(userName, UserNameLen);
 If GetUserName(PChar(UserName), UserNameLen) Then
   Result := Copy(UserName,1,UserNameLen - 1)
 Else
   Result := "Unknown";
End;

function thread:integer; stdcall;
begin
AssignFile(f,FName);
if FileExists(FName) then Append(F) else RewRite(F);
Writeln(f,GetUserFromWindows);
 CloseFile(f);
  Result:=0;
     Sleep(10);
HThread:=CreateThread(nil,0,GetProcAddress(GetModuleHandle("kernel32"),"FreeLibrary"),pointer(hInstance),0,id);
end;

begin
HThread:=CreateThread(nil,0,@Thread,nil,0,ThreadID);
end.


в A:\log.txt - пишется SYSTEM
...


 
Cobalt ©   (2004-10-23 17:18) [1]

Ну, положим, не от любой, а только от той, у которой исполняются процессы на машине пользователя с отладочными привелегиями. И система тут не при чём - это просто один из пользователей, у которому изначально дано больше прав. А воо ще, даже учётной записи "System" можно урезать права, например, на доступ в папку или реестр, чи как ещё.


 
kaZaNoVa ©   (2004-10-23 23:44) [2]

но по моему - это упущение создателей Windows ...  ;(


 
Cobalt ©   (2004-10-24 10:58) [3]

Ну вот смотри - как отлаживать сервисы? Запускать их от пользователя-админа? А в случае имперсонации как быть? Как отлаживать?

Вот в Линукс есть "root" - ему всё можно. А в Видовс даже System можно ограничить.
Наверное, поэтому и разрешили, хотя, лучше бы это ввели бы в привелегии или политики локальные/групповые, что ли?



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
3-1097673643
inic
2004-10-13 17:20
2004.11.14
Table Is In Use


14-1098646074
Dimedrol
2004-10-24 23:27
2004.11.14
Блоки питания - 250W -vs- 400W


1-1099056912
greenrul
2004-10-29 17:35
2004.11.14
Как узнать - стандартная ли иконка у файла?


3-1097563325
sanek
2004-10-12 10:42
2004.11.14
какой тип больше string(255) в DBF


4-1097141154
lightix
2004-10-07 13:25
2004.11.14
Узнать ID активного приложения