Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Процесс, 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.036 c
14-1099068698
aga
2004-10-29 20:51
2004.11.14
как можно найти ключ?


14-1098695957
Debugger
2004-10-25 13:19
2004.11.14
LOL


4-1096770782
Sergeika
2004-10-03 06:33
2004.11.14
Как изменить яркость монитора и контрастность


1-1099320334
Kat
2004-11-01 17:45
2004.11.14
Как узнать сколько дней в январе например?


14-1098977679
Silla
2004-10-28 19:34
2004.11.14
Visual C++ 6&amp;7 Forum





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский