Форум: "Потрепаться";
Текущий архив: 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.032 c