WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Advanced WinNT security question

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Advanced WinNT security question
Dubovik опубликован 04-02-2002 11:38 MSK   Click Here to See the Profile for Dubovik   Click Here to Email Dubovik  
Можно отвечать на русском. Мессага на английском только потому, что я ее задавал на англоязычном форуме и лень переводить.
I have 2 users under Win2000 with NTFS partitions: for example Admin (has full access to the registry key and to the directory), and User (has "assess denied" for that registry key and directory). I run my program under User. Program knows Admin user name and password, and it programmatically takes Admin access rights (as described is "HOWTO: Validate User Credentials on Microsoft WinNT and Win95" MSDN article). So, my program takes a full access to the key and directory, and there's no problems (I tested it many times; my program have all configuration data in that registry key, and it can delete and rename files in that directory).
Than, I need to save .reg-file of that registry key to that directory. I run regedit programmatically with corresponding command-line to do it. I use ShellExecuteEx function do run regedit. As described in MSDN, regedit in this case should have the same access rights, as of the parent process (Admin's rights). But regedit shows message box that it can't write to file or read from file.
Actually Admin isn't administrator - it's user with very small rights, but he has an access to the key and directory. I named that user "Admin" in this message only for better understanding.
Any suggestions? Or may be you know another simple way of saving a registry key to .reg-file and of restoring it from .reg?
server_mouse опубликован 05-02-2002 11:00 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Может стоит попробовать запускать Regedit не ShellExecute а CreateProcessAsUser.
Dubovik опубликован 05-02-2002 11:23 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
Дело в том, что для этого надо сначала вызвать OpenProcessToken, для чего надо иметь какую-то привилегию (я так и не определил), которая по умолчанию есть у админов, но нет у юзеров. А у меня юзер с именем Admin должен иметь очень мало привилегий и отличаться от обычных юзеров только доступом к нужным мне ключу реестра и директории. Кроме того, для собственно запуска CreateProcessAtUser надо иметь привилегию SE_ASSIGNPRIMARYTOKEN_NAME (Replace a process level token), которая даже админам по умолчанию не дается. Ну и самое главное - при этом почему-то все равно Regedit не получает нужных прав доступа :-(
Кстати, при ShellExecuteEx Regedit тоже должен унаследовать access token, а в нем, судя по MSDN, содержатся в том числе права доступа. Странно как-то это все.
server_mouse опубликован 05-02-2002 00:38 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Попробуй такую простую вещь. runas.exe называется. Ежели из под него ничего не выйдет, то
IMHO It's impossible mister Karabasov! (c)
server_mouse опубликован 05-02-2002 00:40 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Как вариант может делай сервис -- он SYSTEM (в танке)
Dubovik опубликован 05-02-2002 15:56 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
Плиз поподробнее про runas.exe. Сервис делать - совсем не катит.
server_mouse опубликован 05-02-2002 16:07 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Так. runas.exe -- стандартная для NT/2000 прога, позволяющая запускать лубую программу под указаным тобой экаунтом. Если она запускает Regedit под админом и тот нормально делает свои делишки, значит это ТОЧНО возможно и ты ТОЧНО ничего не напутал с доступами и т.п. Проверить стоит. Просто из консоли запусти runas и она тебе всё раскажет.
Далее. Такой вопрос уже неоднократно обсуждался на RSDN. Возможный выход -- CreateProcessWithLogonW().

Вообще же посмотри http://www.rsdn.ru/?forum/?gid=9&mid=14728&tid=14638

и

http://www.rsdn.ru/forum/message.asp?mid=26110

Dubovik опубликован 05-02-2002 16:23 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
Во-первых, CreateProcessWithLogonW есть только в 2000 - это не есть рулез. Во-вторых, ему по-моему тоже нужны привилегии. И вообще, в MSDN есть статья "HOWTO: Validate User Credentials on Microsoft WinNT and Win95" (ID: Q180548). Там описаны 2 способа получения моей прогой прав другого юзера, и способ, который я выбрал, более сложный, но не требует привилегий. И теперь получается, что мне надо отступиться от выбранного пути и эти же привилегии дать сейчас.
Dubovik опубликован 05-02-2002 17:17 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
Кстати, в моем VisualStudio нет функции CreateProcessWithLogonW. У меня VS6.0. Поможет ли накатить на него Sp5 for VisualStudio?
frostbitten опубликован 05-02-2002 17:32 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
1. Накатить СП не поможет надо сосать и ставить PlatformSDK с мягких мелочников.

2. RunAs ну всем хорошь, но а) Он и есть сервис, a runas.exe к этому сервису коннектиться... б) (Как же я хочу ошибаться!) runas.exe - консольное приложение, кот в наглую запрашивает пароль с клавы (конвееры не пробывал, но даже если, это выход).
Если конечно знаешь как подрубиться к сервису RunAs (как это explorer делает по Shift-RightMouse), то в срочном порядке напиши сюда.

Student опубликован 05-02-2002 21:55 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
Надо круче: запускать прогу под экаунтом System (ID 8). Тогда будет работать все и везде.
bin опубликован 06-02-2002 14:47 MSK     Click Here to See the Profile for bin  Click Here to Email bin     
Проверено электроникой! В задаче запуска проги из-под сервиса с пользовательским окружением (и сетью) использовались такие функции:
1.EnablePrivilege("SeTcbPrivilege",...)
2.LogonUser
3.DuplicateToken(от логона)
4.CreateProcessAsUser
Другого способа запустить что-то из-под другого аккаунта я не знаю.
bin опубликован 06-02-2002 15:08 MSK     Click Here to See the Profile for bin  Click Here to Email bin     
В догонку:
Статью "Validate User Credentials on Microsoft WinNT and Win95" не читал, но по назвнанию, кажеться, это только Validate, а не Apply ;)
Dubovik опубликован 06-02-2002 15:32 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
А вот в том и дело, что "Validate User Credentials on Microsoft WinNT and Win95" - это не только validate, но и еще полноценное получение прав. Иначе у меня прога вообще не работала бы.
А как запустить прогу под аккаунтом system?
Dubovik опубликован 06-02-2002 15:35 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
2 frostbitten: плиз кинь линк на Platform SDK или подробно опиши, как его на сайте мелкомягких найти, а то там черт ногу сломит.
Dubovik опубликован 06-02-2002 15:42 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
2 frostbitten: Ух ты! Нашел некий Platform SDK весом 342,000,000. Это оно?
Student опубликован 06-02-2002 15:54 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
2Dubovik:
Для запуска проги под аккаунтом System нужны права администратора. Получаешь их а затем так (это консольное приложение, вырежи что надо):

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#pragma pack(1)

typedef struct
{
BYTE mov_eax;
LPVOID address;
WORD jump_eax;

} ASMJUMP, *PASMJUMP;


BOOL SetPrivileges(HANDLE hprocess, LPTSTR privilege, BOOL bSwitch);

HANDLE hParentProc;
DWORD dwFunc;


// Haked NtCreateProcess
void __declspec(naked)HackedNtCreateProcess()
{
_asm
{
// Change parent process handle
mov eax,hParentProc
mov dword ptr [esp+16],eax
// NtCreateProcess value depends on version
mov eax,dwFunc
// Load parameters table
lea edx,dword ptr [esp+4]
// Call the interrupt
int 2Eh
// return
retn 20h
}
}

void PrintWin32Error( char *message, DWORD error )
{
char *errMsg;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &errMsg, 0, NULL );
printf("%s: %s\n", message, errMsg );
LocalFree( errMsg );
}

int main(int argc, char* argv[])
{
printf("\nSysProc for Windows NT/2000 FREEWARE\n");
printf("Creates a process in the context of the SYSTEM\n");
printf("(c)2000 SmartLine Inc. http://www.protect-me.com\n\n");

if (argc<2)
{
_tprintf(TEXT("Usage:\n\t sysproc.exe <program name>\n"));
return -1;
}

if (!SetPrivileges((HANDLE)-1,SE_DEBUG_NAME,TRUE))
{
PrintWin32Error("SetPrivileges failed",GetLastError());
return -1;
}

UINT uSysProcId;
switch(LOBYTE(LOWORD(GetVersion())))
{
case 3:
uSysProcId = 0x02;
dwFunc = 0x1E;
break;
case 4:
uSysProcId = 0x02;
dwFunc = 0x1F;
break;
case 5:
uSysProcId = 0x08;
dwFunc = 0x29; // 0x2A - for W2K beta;
break;
}

// Trying to get a handle to the system process
hParentProc = OpenProcess(PROCESS_CREATE_PROCESS,TRUE,uSysProcId);
if (!hParentProc)
{
PrintWin32Error("Could not open system process",GetLastError());
return -1;
}

PASMJUMP NtCreateProcessHook = (PASMJUMP)
GetProcAddress(
GetModuleHandle(TEXT("ntdll.dll")),
"NtCreateProcess");
if (NtCreateProcessHook==NULL)
{
PrintWin32Error("Could not get procedure address",GetLastError());
return -1;
}

// Enable write acess to VM
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(NtCreateProcessHook,&mbi,sizeof(MEMORY_BASIC_INFORMATION));

DWORD dw;
VirtualProtect(mbi.AllocationBase,mbi.RegionSize,
PAGE_EXECUTE_READWRITE,&dw);

// Redirect call to HackedNtCreateProcess :
//
// mov eax,HackedNtCreateProcess
// jmp eax
NtCreateProcessHook->mov_eax = 0xB8;
NtCreateProcessHook->address = HackedNtCreateProcess;
NtCreateProcessHook->jump_eax = 0xE0FF;

// Call modified CreateProcess
PROCESS_INFORMATION pi;
STARTUPINFO si;

ZeroMemory(&pi,sizeof (PROCESS_INFORMATION));
ZeroMemory(&si,sizeof (STARTUPINFO));
si.cb = sizeof(STARTUPINFO);

if (!CreateProcess(NULL,argv[1],
NULL, NULL,
FALSE,
0,NULL,NULL,
&si,
&pi))
{
PrintWin32Error("Could not create process",GetLastError());
return -1;
}

CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

return 0;
}


BOOL SetPrivileges(HANDLE hprocess, LPTSTR privilege, BOOL bSwitch)
{
HANDLE hToken;
LUID DebugValue;
TOKEN_PRIVILEGES tkp;

if (!OpenProcessToken(hprocess,
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken))
goto err;

if (!LookupPrivilegeValue((LPTSTR) NULL,
privilege,
&DebugValue))
goto err;

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = DebugValue;

if (bSwitch)
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED |
SE_PRIVILEGE_ENABLED_BY_DEFAULT |
SE_PRIVILEGE_USED_FOR_ACCESS;
else
tkp.Privileges[0].Attributes = NULL;

AdjustTokenPrivileges(hToken,
FALSE,
&tkp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
NULL);

if (GetLastError() != ERROR_SUCCESS)
goto err;

return TRUE;

err:
return FALSE;
}
Из проги, запущенной под аккаунтом System можно например изучать файл подкачки (или даже удалить его) и т.д.

Dubovik опубликован 06-02-2002 16:40 MSK     Click Here to See the Profile for Dubovik  Click Here to Email Dubovik     
2 Student: спасибо, но мне не подходит запуск проги под админом. Она будет работать из-под юзера с которкими руками.
server_mouse опубликован 07-02-2002 13:12 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Попробуй заюзать не ShellExecute, а CreateProcess, явно укажи LPSECURITY_ATTRIBUTES и возможно даже запусти его в своей группе процессов. Короче почитай хорошенько про его параметры в MSDN.
frostbitten опубликован 09-02-2002 04:33 MSK     Click Here to See the Profile for frostbitten  Click Here to Email frostbitten     
2Dubovik: Да это оно. Но я качал 460мб. Но для начала, можно напр. достать Builder4.5+ в нем w2k заголовки прописаны, а там ::LoadLibrary...

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.