611

Маркеры доступа

Лабораторная работа

Информатика, кибернетика и программирование

В результате данной работы были изучены основные возможности мониторинга и управления маркерами доступа Windows. Так же были получены навыки реализации взаимодействия созданной программы с процессами и их настройками безопасности.

Русский

2013-01-06

71.5 KB

16 чел.

Министерство образования и науки Российской Федерации

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра «Информационная безопасность компьютерных систем»

ЛАБОРАТОРНАЯ РАБОТА № 4

Маркеры доступа

по дисциплине «Безопасность современных информационных технологий»

Выполнил

студент гр. 3088/2  В.Б. Вагисаров

 <подпись>

Руководитель

доцент, к.т.н.  Д.А. Москвин

 <подпись>

Санкт-Петербург

2012

1. ЗАДАЧИ

Цель:

Изучить механизмы управления полномочиями пользователей Windows на основе маркеров доступа.

Задача:

  1.  Научиться создавать и формировать маркеры доступа.
  2.  Реализовать управление маркерами доступа.

Требования:

  •  Программа должна иметь консольный интерфейс.
  •  Программа должна иметь возможность создавать новые маркеры доступа для заданного пользователя.
  •  Необходимо реализовать добавление и удаление следующих компонентов маркера доступа:
    •  token privileges;
    •  token owner;
    •  token primary group.
  •  Необходимо продемонстрировать работоспособность сформированного маркера доступа, назначив его некоторому процессу.
  •  Необходимо реализовать функцию удаления маркера доступа.
  •  Все входные данные программы должны задаваться в качестве входных параметров.
  •  Должна быть реализована функция справки/помощи для выдачи информации о поддерживаемых параметрах и синтаксисе их задания.
  •  Выходные данные программы должны включать в себя протокол её работы и статусы выполненных операций.
  •  При реализации программы запрещается использовать сторонние готовые утилиты.

2. ВЫПОЛНЕНИЕ РАБОТЫ

В процессе выполнения работы была разработана программа, реализующая требования указанные в задании. Получившаяся утилита имеет консольный интерфейс, и все управляющие команды вводятся в качестве входных параметров.

При реализации не были использованы сторонние готовые утилиты. Вместо этого, всё взаимодействие с процессами и маркерами доступа производится стандартными средствами (функциями) WinAPI, такими как

  •  OpenProcess
  •  TerminateProcess
  •  OpenProcessToken
  •  GetTokenInformation
  •  SetTokenInformation
  •  LookupAccountSid
  •  LookupAccountName
  •  LookupPrivilegeValue
  •  AdjustTokenPrivileges
  •  LogonUser
  •  CreateProcessWithTokenW

3. ВЫВОДЫ

В результате данной работы были изучены основные возможности мониторинга и управления маркерами доступа Windows. Так же были получены навыки реализации взаимодействия созданной программы с процессами и их настройками безопасности.

Приложение

#include <windows.h>

#include <stdio.h>

#include <locale.h>

#include <string.h>

#include <conio.h>

#include <iostream>

#include <tchar.h>

#include <sddl.h>

#include <Winnt.h>

#pragma comment(lib, "advapi32.lib")

void changeOwner(DWORD processPid, char *ownerName)

{

HANDLE hProcess;

HANDLE hToken;

TOKEN_OWNER ptg;

SID_NAME_USE eUse = SidTypeUnknown;

DWORD dwAcctName = 1, dwDomainName = 1;

LPTSTR DomainName = NULL;

ptg.Owner = NULL;

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION , FALSE, processPid);

if(!hProcess)

{

 printf("OpenProcess error: %d\n", GetLastError());

 return;

}

OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);

LookupAccountName(NULL, ownerName, NULL, &dwAcctName, NULL,  &dwDomainName, &eUse);

ptg.Owner = (PSID) GlobalAlloc(GPTR, dwAcctName);    

DomainName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwDomainName);

if(!LookupAccountName(NULL, ownerName, ptg.Owner, &dwAcctName, DomainName, &dwDomainName, &eUse))

{

 printf("LookupAccountName error: %d\n", GetLastError());

 return;

}

if (!SetTokenInformation(hToken, TokenOwner, (LPVOID)&ptg, sizeof(ptg)))

{

 printf("SetTokenInformation error: %d\n", GetLastError());

 return;

}

printf("changeOwner was completed successfully\n");

}

void changeGroup(DWORD processPid, char *groupName)

{

HANDLE hProcess;

HANDLE hToken;

TOKEN_PRIMARY_GROUP ptg;

SID_NAME_USE eUse = SidTypeUnknown;

DWORD dwAcctName = 1, dwDomainName = 1;

LPTSTR DomainName = NULL;

ptg.PrimaryGroup = NULL;

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION , FALSE, processPid);

if(!hProcess)

{

 printf("OpenProcess error: %d\n", GetLastError());

 return;

}

OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);

LookupAccountName(NULL, groupName, NULL, &dwAcctName, NULL,  &dwDomainName, &eUse);

ptg.PrimaryGroup = (PSID) GlobalAlloc(GPTR, dwAcctName);    

DomainName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwDomainName);

if(!LookupAccountName(NULL, groupName, ptg.PrimaryGroup, &dwAcctName, DomainName, &dwDomainName, &eUse))

{

 printf("LookupAccountName error: %d\n", GetLastError());

 return;

}

if (!SetTokenInformation(hToken, TokenPrimaryGroup, (LPVOID)&ptg, sizeof(ptg)))

{

 printf("SetTokenInformation error: %d\n", GetLastError());

 return;

}

printf("changeGroup was completed successfully\n");

}

void SetPrivilege(DWORD processPid, BOOL bEnablePrivilege, LPCSTR lpszPrivilege)

{

HANDLE hProcess;

HANDLE hToken;

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION , FALSE, processPid);

if(!hProcess)

{

 printf("OpenProcess error: %d\n", GetLastError());

 return;

}

if(!OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken))

{

 printf("OpenProcessToken() error %u\n", GetLastError());

 return ;

}

TOKEN_PRIVILEGES tp;

LUID luid;

if(!LookupPrivilegeValue( NULL, lpszPrivilege, &luid))

{

 if (GetLastError() == 1313) printf("Error! Name of the privilege is not correct!\n");

 else printf("LookupPrivilegeValue() error: %u\n", GetLastError());

 return ;

}

tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

if(bEnablePrivilege) tp.Privileges[0].Attributes = 3;//SE_PRIVILEGE_ENABLED;

else tp.Privileges[0].Attributes = 0;

if(!AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL))

{

 printf("AdjustTokenPrivileges() error: %u\n", GetLastError());

 return ;

}

printf("SetPrivilege was completed successfully\n");

}

void showPrivelege(HANDLE hProcess)

{

HANDLE hToken;

PTOKEN_PRIVILEGES ptg = NULL;

DWORD dwLength;;

int i;

OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);

if (!GetTokenInformation(hToken, TokenPrivileges, (LPVOID) ptg, 0, &dwLength))

 ptg = (PTOKEN_PRIVILEGES)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, dwLength);

if (!GetTokenInformation(hToken, TokenPrivileges,(LPVOID) ptg, dwLength,&dwLength ))

{

 printf("GetTokenInformation error: %d\n", GetLastError());

 return;

}

char attrNames[5][20] = {"Disable", "", "Enable", "Enable default"};

for (ULONG i = 0; i < ptg->PrivilegeCount; i++)

   {

   TCHAR szName[256];

   TCHAR szDisplayName[256];

   ULONG cbName;

   ULONG dwLangId;

       

   cbName = sizeof(szName) / sizeof(szName[0]);

   if (!LookupPrivilegeName(NULL, &ptg->Privileges[i].Luid,

                szName, &cbName))

   {

       _tprintf(_T("LookupPrivilegeName failed\n"));

       return;

   }

   cbName = sizeof(szDisplayName) / sizeof(szDisplayName[0]);

   if (!LookupPrivilegeDisplayName(NULL, szName, szDisplayName,

                   &cbName, &dwLangId))

   {

       _tprintf(_T("LookupPrivilegeDisplayName failed\n"));

       return;

   }

_tprintf(_T("%s ( %s )\n"), szName, attrNames[ptg->Privileges[i].Attributes]);

   }

}

void showOwner(HANDLE hProcess)

{

HANDLE hToken;

PTOKEN_OWNER ptg = NULL;

DWORD dwLength;

BOOL bRtnBool = TRUE;

LPTSTR AcctName = NULL;

LPTSTR DomainName = NULL;

DWORD dwAcctName = 1, dwDomainName = 1;

SID_NAME_USE eUse = SidTypeUnknown;

OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);

if (!GetTokenInformation(hToken, TokenOwner, (LPVOID) ptg, 0, &dwLength))

 ptg = (PTOKEN_OWNER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, dwLength);

if (!GetTokenInformation(hToken, TokenOwner,(LPVOID) ptg, dwLength,&dwLength ))

{

 printf("GetTokenInformation error: %d\n", GetLastError());

 return;

}

bRtnBool = LookupAccountSid(NULL, ptg->Owner, AcctName,(LPDWORD)&dwAcctName,DomainName,(LPDWORD)&dwDomainName,&eUse);

AcctName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwAcctName);

if (AcctName == NULL)

{

         DWORD dwErrorCode = 0;

         dwErrorCode = GetLastError();

         printf("GlobalAlloc error = %d\n", dwErrorCode);

         return ;

}

   DomainName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwDomainName);

   if (DomainName == NULL)

{

         DWORD dwErrorCode = 0;

         dwErrorCode = GetLastError();

         printf("GlobalAlloc error = %d\n", dwErrorCode);

         return ;

   }

// Second call to LookupAccountSid to get the account name.

   bRtnBool = LookupAccountSid(NULL, ptg->Owner, AcctName,(LPDWORD)&dwAcctName, DomainName,(LPDWORD)&dwDomainName, &eUse);                 // SID type

   // Check GetLastError for LookupAccountSid error condition.

   if (bRtnBool == FALSE) {

         DWORD dwErrorCode = 0;

         dwErrorCode = GetLastError();

         if (dwErrorCode == ERROR_NONE_MAPPED)

             printf("Account owner not found for specified SID.\n");

         else

             printf("Error in LookupAccountSid %d.\n", dwErrorCode);

         return ;

   } else if (bRtnBool == TRUE)

       printf("Token owner = %s\n", AcctName);

}

void showGroup(HANDLE hProcess)

{

HANDLE hToken;

PTOKEN_PRIMARY_GROUP ptg = NULL;

DWORD dwLength;

BOOL bRtnBool = TRUE;

LPTSTR AcctName = NULL;

LPTSTR DomainName = NULL;

DWORD dwAcctName = 1, dwDomainName = 1;

SID_NAME_USE eUse = SidTypeUnknown;

OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken);

if (!GetTokenInformation(hToken, TokenPrimaryGroup, (LPVOID) ptg, 0, &dwLength))

 ptg = (PTOKEN_PRIMARY_GROUP)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, dwLength);

if (!GetTokenInformation(hToken, TokenPrimaryGroup,(LPVOID) ptg, dwLength,&dwLength ))

{

 printf("GetTokenInformation error: %d\n", GetLastError());

 return;

}

bRtnBool = LookupAccountSid(NULL, ptg->PrimaryGroup, AcctName,(LPDWORD)&dwAcctName,DomainName,(LPDWORD)&dwDomainName,&eUse);

AcctName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwAcctName);

if (AcctName == NULL)

{

         DWORD dwErrorCode = 0;

         dwErrorCode = GetLastError();

         printf("GlobalAlloc error = %d\n", dwErrorCode);

         return ;

}

   DomainName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwDomainName);

   if (DomainName == NULL)

{

         DWORD dwErrorCode = 0;

         dwErrorCode = GetLastError();

         printf("GlobalAlloc error = %d\n", dwErrorCode);

         return ;

   }

// Second call to LookupAccountSid to get the account name.

   bRtnBool = LookupAccountSid(NULL, ptg->PrimaryGroup, AcctName,(LPDWORD)&dwAcctName, DomainName,(LPDWORD)&dwDomainName, &eUse);                 // SID type

   // Check GetLastError for LookupAccountSid error condition.

   if (bRtnBool == FALSE) {

         DWORD dwErrorCode = 0;

         dwErrorCode = GetLastError();

         if (dwErrorCode == ERROR_NONE_MAPPED)

             printf("Group not found for specified SID.\n");

         else

             printf("Error in LookupAccountSid %d.\n", dwErrorCode);

         return ;

   } else if (bRtnBool == TRUE)

       printf("Token Primary Group = %s\n", AcctName);

}

void show(DWORD pid, DWORD mode) // mode 0 - owner, 1 - group, 2 - priv

{

HANDLE hProcess;

hProcess = OpenProcess( PROCESS_QUERY_INFORMATION , FALSE, pid);

if(!hProcess)

{

 printf("OpenProcess error: %d\n", GetLastError());

 return;

}

switch(mode)

{

case 0:

 showOwner(hProcess);

 break;

case 1:

 showGroup(hProcess);

 break;

case 2:

 showPrivelege(hProcess);

 break;

}

}

void newToken(char *userName, char *userPass, LPCWSTR path)

{

HANDLE hToken;

PROCESS_INFORMATION prInfo;

if(!LogonUser(userName, NULL, userPass, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &hToken))

{

 printf("LogonUser error %d", GetLastError());

 return;

}

if(!CreateProcessWithTokenW(hToken, LOGON_WITH_PROFILE, path, NULL, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, NULL, &prInfo))

{

 printf("CreateProcessWithTokenW error %d", GetLastError());

 return;

}

printf("New token was created successfully.\nPress any key to destroy it...\n");

getch();

CloseHandle(hToken);

TerminateProcess(prInfo.hProcess, 0);

printf("New token was destroyed successfully\n");

}

void Menu(void)

{

printf("===========================================================================\n");

printf("show owner [PID]\t\t\tshows owner of PID process\n");

printf("show group [PID]\t\t\tshows group of PID process\n");

printf("show priv [PID]\t\t\t\tshows privileges of PID process\n");

printf("set owner [PID] [OWNER]\t\t\tsets OWNER to PID process\n");

printf("set group [PID] [GROUP]\t\t\tsets primary GROUP to PID process\n");

printf("set priv [PID] [PRIV_NAME] [1/0]\tenable or disable PRIV_NAME privilege of\t\t\t\t\tPID process\n");

printf("create [USER] [PASS]\t\t\tcreates new token and executes process\n");

printf("help\t\t\t\t\tshows this help\n");

printf("============================================================================\n");

}

int main (int argc, char *argv[])

{

setlocale(LC_ALL,"rus");

DWORD pid;

if(strcmp("show", argv[1]) == 0)

{

 if(strcmp("owner", argv[2]) == 0)

 {

  pid = atoi(argv[3]);

  show(pid, 0);

 }

 else if(strcmp("group", argv[2]) == 0)

 {

  pid = atoi(argv[3]);

  show(pid, 1);

 }

 else if(strcmp("priv", argv[2]) == 0)

 {

  pid = atoi(argv[3]);

  show(pid, 2);

 }

}

else if(strcmp("set", argv[1]) == 0)

{

 if(strcmp("owner", argv[2]) == 0)

 {

  pid = atoi(argv[3]);

  changeOwner(pid, argv[4]);

 }

 else if(strcmp("group", argv[2]) == 0)

 {

  pid = atoi(argv[3]);

  changeGroup(pid, argv[4]);

 }

 else if(strcmp("priv", argv[2]) == 0)

 {

  pid = atoi(argv[3]);

  BOOL enable = atoi(argv[5]);

  SetPrivilege(pid, enable, argv[4]);

 }

}

else if(strcmp("create", argv[1]) == 0)

{

 LPCWSTR test = L"C:\\Windows\\System32\\cmd.exe";

 newToken(argv[2], argv[3], test);

}

else if(strcmp("help", argv[1]) == 0)

 Menu();

else

 printf("Nothing to do\n");

 

}


 

А также другие работы, которые могут Вас заинтересовать

78088. РОДЖЕРС КАРЛ РЭНСОМ (1902 - 1987) 47.5 KB
  Как представителю гуманистической психологии идея ценности и уникальности человеческой личности является центральной для Роджерса. Степень тождественности этого поля реальной действительности Роджерс называл конгруэнтностью. К невротизации приводит и отказ от самоактуализации которую Роджерс как и Маслоу считал одной из важнейших потребностей личности.
78089. Социально-политическая философия и правовое учение Руссо 179 KB
  Возникнув в XVII веке в Англии Локк просветительская идеология получает широкое распространение во Франции XVIII века Монтескье Гельвеций Вольтер Гольбах Руссо. Критика феодализма привела деистов к отрицанию теологического объяснения исторического процесса и утверждению...
78090. Рыбоводно-биологическое обоснование на организацию форелевого хозяйства в губе Лахта Онежского озера 1.54 MB
  Форелевое хозяйство садки озеро гидрология посадочный материал товарная рыба корма охрана водной среды. Характеристика радужной форели и условий ее выращивания Радужная форель как объект выращивания характеризуется пластичностью быстрым ростом высокой степенью конверсии...
78091. Вайшнавская философия 93 KB
  Это особенно относится к таким феноменам как сознание жизнь личность и судьба Ведическая концепция говорит что случайностей не существует. Жизнь и сознание они говорят является комбинацией атомов в рамках физических законов основанных на причинности.
78092. Смазки при обработке металлов давлением 32.5 KB
  При обработке давлением широко применяют смазки. Основное значение смазки снижение коэффициентов трения. Активность смазки способность образовывать на поверхности трения прочный защитный слой из ее полярных молекул.
78093. Нефтегазовая промышленность и загрязнение атмосферы 300 KB
  Не случайно высказывание о том что обеспеченность запасами нефти более весомый аргумент в международной политике чем наличие ядерного оружия. Добыча нефти и связанного с ней газа составляющая единую нефтегазовую отрасль является не только основой мощного...
78094. Медные сплавы 89 KB
  Медные сплавы кроме бериллиевой бронзы и некоторых алюминиевых бронз не принимают термической обработки и их механические свойства и износостойкость определяются химическим составом и его влиянием на структуру.
78095. Стали и ставы с особыми физическими свойствами 46 KB
  Прецизионные сплавы металлические сплавы с особыми физическими свойствами магнитными электрическими тепловыми упругими или редким сочетанием свойств уровень которых в значительной степени обусловлен точностью химического состава отсутствием примесей тщательностью изготовления и обработки.