Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода лр2 СПЗ.doc
Скачиваний:
1
Добавлен:
14.11.2019
Размер:
64.51 Кб
Скачать

Привелегии ( Privileges )

 Когда вы заходите на компьютер под определенным аккаунтом , вы получаете определенные привилегии .  Таблица наиболее важных привилегий для ОС WINDOWS:

Название

Внутреннее имя

#define (winnt.h)

1.Backup Files              

SeBackupPrivilege  

SE_BACKUP_NAME

2.Restore files              

SeRestorePrivilege   

SE_RESTORE_NAME

3.Act Operation System      

SeTcbPrivilege       

SE_TCB_NAME        

4.Debug Programs            

SeDebugPrivilege     

SE_DEBUG_NAME

5.Replace ProcessLevelToken 

SeAssignPrimaryToken 

SE_ASSIGNPRIMARYTOKEN_NAME

6.Load Device Drivers       

SeLoadDriverPrivilege

SE_LOAD_DRIVER_NAME

7.Take Ownership of Files

SeTakeOwnershipPrivrlege

SE_TAKE_OWNERSHIP_NAME

Например , чтобы назначить привилегию 1. Backup Files , нужно выполнить код :     OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)     TOKEN_PRIVILEGES newPrivs;     LookupPrivilegeValue (NULL, SE_BACKUP_NAME,&newPrivs.Privileges[0].Luid)     newPrivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;     newPrivs.PrivilegeCount = 1;     AdjustTokenPrivileges(hToken, FALSE, &newPrivs , 0, NULL, NULL)  Когда пользователь получает аккаунт к машине , ОС создает структуру , называемую token , в которой хранится информация о SID пользователя , SID группы , к которой он принадлежит , и этот token применим к каждому процессу,выполняемому пользователем.  Получить информацию о пользователе : EXTENDED_NAME_FORMAT enf[] = {NameDisplay,NameSamCompatible,NameUserPrincipal}; for (int i=0; i < sizeof(enf) / sizeof(enf[0]); i++) {  char szName[128];  DWORD cbName = sizeof(szName);  if (GetUserNameEx(enf[i],szName,&cbName))  printf("Name (format %d): %s\n",enf[i],szName);} Получить информацию о привилегиях :      DWORD dwSize = 0;      TOKEN_PRIVILEGES *pPrivileges = (PTOKEN_PRIVILEGES)         AllocateTokenInfoBuffer(hToken,         TokenPrivileges, &dwSize);     BOOL bRes = GetTokenInformation(hToken,TokenPrivileges,pPrivileges, dwSize, &dwSize);     for (DWORD i=0; i < pPrivileges- >PrivilegeCount; i++)     {         char szPrivilegeName[128];         DWORD dwPrivilegeNameLength=sizeof(szPrivilegeName);         if (LookupPrivilegeName(NULL,             &pPrivileges->Privileges[i].Luid,             szPrivilegeName,             &dwPrivilegeNameLength))             printf("\t%s (%lu)\n",                    szPrivilegeName,     }  Начиная с windows 2000 , token-ы можно модифицировать "на лету" , задавая ограничения на выполнение определенных операций и модифицируя его привилегии . В следующем примере берется token с правами администратора и на него накладываются ограничения : SID_AND_ATTRIBUTES SidToDisable[1]; SidToDisable[0].Sid = pAdminSID; SidToDisable[0].Attributes = 0; // Get the current process token. HANDLE hOldToken = NULL; OpenProcessToken(GetCurrentProcess(),TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE |                  TOKEN_QUERY | TOKEN_ADJUST_DEFAULT,    &hOldToken); // Create restricted token from the process token. HANDLE hNewToken = NULL; CreateRestrictedToken(hOldToken,DISABLE_MAX_PRIVILEGE,1,SidToDisable, 0, NULL,     0, NULL, &hNewToken); Windows XP включает в себя встроенный механизм,позволяющий модифицировать token , который еще называется Safer . Cледующий пример показывает его использование :   if (SaferCreateLevel(SAFER_SCOPEID_USER,SAFER_LEVELID_NORMALUSER,0, &hAuthzLevel, NULL)) {         //  Generate the restricted token that we will use.         HANDLE hToken = NULL;         if (SaferComputeTokenFromLevel( hAuthzLevel,NULL,&hToken,0,NULL))          {  // Build the path to Cmd.exe to make sure             // we're not running a Trojaned Cmd.exe.             char szPath[MAX_PATH+1], szSysDir[MAX_PATH+1];             if (GetSystemDirectory(szSysDir, sizeof szSysDir)) {                 _StringCbPrintf(szPath,sizeof szPath,"%s\\cmd.exe",szSysDir);                 STARTUPINFO si;                 ZeroMemory(&si, sizeof(STARTUPINFO));                 si.cb = sizeof(STARTUPINFO);                 si.lpDesktop = NULL;                 PROCESS_INFORMATION pi;                 if (!CreateProcessAsUser(hToken,szPath, NULL,NULL, NULL,                     FALSE, CREATE_NEW_CONSOLE,NULL, NULL, &si, &pi))                     printf("CreateProcessAsUser failed (%lu)\n", GetLastError() );             }         } } В 2003-сервере добавлена функция , с помощью которой для конкретного приложения можно удалять какие-то привилегии , которые не используются в нем конкретно , не трогая при этом привилегии самого аккаунта . Для этого используется api-функция AdjustTokenPrivileges . В XP появились 2 новых типа аккаунта :  1. local service account  2. network service account  Они похожи тем , что получают доступ лишь к сетевым ресурсам .