611

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

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

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

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

Русский

2013-01-06

71.5 KB

17 чел.

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

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

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

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

ЛАБОРАТОРНАЯ РАБОТА № 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");

 

}


 

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

79286. Профориентация и трудовая адаптация персонала 13.38 KB
  Профориентация и трудовая адаптация персонала Профессиональная ориентация и адаптация выступают важным составным элементом системы подготовки кадров и являются регулятором связи между системой образования и производством. Профессиональная ориентация представляет собой систему мер по профинформации профконсультации профподбору и профадаптации которая помогает человеку выбирать профессию наиболее соответствующую потребностям общества и его личным способностям и особенностям. Сложились следующие формы профориентационной работы: ...
79287. Основы организации труда персонала 15 KB
  Основы организации труда персонала Модель организации труда как и модель любой организации может быть представлена в трех основных аспектах. Вопервых организация труда как структура. Она определенным образом располагает соединяет моменты труда орудия груда предметы труда и сам труд. Вовторых организация труда как динамическая система т.
79288. Высвобождение персонала 55.85 KB
  Высвобождение персонала Высвобождение персонала это вид управленческой деятельности предусматривающий комплекс мероприятий по соблюдению правовых норм и организационно-психологической поддержки со стороны администрации при увольнении работников. Виды высвобождения персонала из организации приведены на рис. тот вид высвобождения который практически не прогнозируется администрацией и как правило происходит для нее неожиданно. Однако с точки зрения работника это наиболее мягкий вид высвобождения: работник готов покинуть организацию и...
79289. Управление социальным развитием организации 11.87 KB
  Управление социальным развитием организации Говоря об управлении социальным развитием организации можно использовать термин Социальная политика организации которая характеризуется как часть политики управления персоналом и включающая в себя все цели и мероприятия связанные с добровольными социальными услугами организации. Социальная политика организации означает уважение признание заслуг и поощрение людей. Соответственно этому система дополнительных социальных льгот должна быть не только привлекательной для сотрудника но и...
79290. Организация обучения персонала 19.09 KB
  Организация обучения персонала. Следует различать три вида обучения. Отечественный и зарубежный опыт выработал три концепции обучения квалифицированных кадров: Концепция специализированного обучения ориентирована на сегодняшний день или ближайшее будущее и имеет отношение к соответствующему рабочему месту. Концепция многопрофильного обучения является эффективной с экономической точки зрения так как повышает внутрипроизводственную и внепроизводственную мобильность работника.
79291. Аттестация персонала 13.3 KB
  Аттестация персонала организаций основного звена управления процедура определения квалификации уровня знаний практических навыков деловых и личностных качеств работников качества труда и его результатов и установления их соответствия несоответствия занимаемой должности. Аттестация персонала служит юридической основой для переводов продвижения по службе награждения определения размера заработной платы а также понижения в должности и увольнения. Аттестация направлена на улучшение качественного состава персонала определение степени...
79292. Управление деловой карьерой, служебно-профессиональным продвижением 353.73 KB
  Деловая карьера поступательное продвижение личности в какойлибо сфере деятельности изменение навыков способностей квалификационных возможностей и размеров вознаграждения связанных с деятельностью; продвижение вперед по однажды выбранному пути деятельности достижение известности славы обогащения. Планирование и контроль деловой карьеры заключаются в том что с момента принятия работника в организацию и до предполагаемого увольнения с работы необходимо организовать планомерное горизонтальное и вертикальное продвижение работника по...
79293. Работа с кадровым резервом 17.89 KB
  Работа с кадровым резервом Принципы формирования и источники кадрового резерва Формирование кадрового резерва основывается на следующих принципах: актуальность резерва потребность в замещении должностей должна быть реальной; соответствие кандидата должности и типу резерва требования к квалификации кандидата при работе в определенной должности; перспективность кандидата ориентация на профессиональный рост требования к образованию возрастной ценз стаж работы в должности и динамичность карьеры в целом состояние здоровья. Источниками...
79294. Теории мотивации трудовой деятельности 43.01 KB
  Различают первичные и вторичные потребности. Потребности можно удовлетворить вознаграждениями. Маслоу существует пять основных типов потребностей: физиологические потребности уровень 1; потребность в безопасности уровень 2; социальные потребности уровень 3; потребность в уважении и самоутверждении уровень 4; потребность в самовыражении уровень 5. Маслоу Эти потребности образуют иерархическую структуру которая определяет поведение человека причем потребности высшего уровня не мотивируют человека пока хотя бы частично не...