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");

 

}


 

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

12345. Құқық әлеуметтануы. Құқық әлеуметтануындағы әлеуметтанулық зерттеулер 56.5 KB
  9дәріс. Құқық әлеуметтануы. 1сағат. Құқық әлеуметтік институт ретінде Құқық әлеуметтануының объектісі мен пәні 3.Құқық әлеуметтануындағы әлеуметтанулық зерттеулер 1. Жалпы әлеуметтанудың негізгі айналысатыны қоғамдық жүйенің әлеуметтік қырларын қоғам
12346. Дін әлеуметтануы 58.5 KB
  5дәріс. Дін әлеуметтануы. сағат. Дін әлеуметтік өмірдің феномені. Дін әлеуметтануының объектісі мен пәні. Діннің әлеуметтік құрылымы. Діннің әлеуметтік функциялары. 5. Қазіргі Қазақстандағы діни ахуал. 1. Дәріске кі
12347. Мәдениет әлеуметтануы. Мәдениет әлеуметтануының басым бағыттары 54 KB
  4дәріс. Мәдениет әлеуметтануы. 1 сағат. 1. Мәдениеттің әлеуметтік құбылыс ретінде түсінігі. 2. Мәдениеттің құрылымы мен типтері. 3. Мәдениет әлеуметтануының басым бағыттары. 4. Мәдениеттің негізгі әлеуметтік функциялары. 1. Студенттерге мәдениет деген ...
12348. Қоғам әлеуметтік жүйе ретінде. Қазіргі Қазақстан қоғамының әлеуметтік құрылымы 59 KB
  3дәріс. Қоғам әлеуметтік жүйе ретінде. 2 сағат. Қоғамның әлеуметтік жүйе ретіндегі мәні. Әлеуметтік жүйе оның элементтері. Қоғамның әлеуметтік құрылымы. Қазіргі Қазақстан қоғамының әлеуметтік құрылымы. Адамзаттың қауымдастығы ретінде қоғ
12349. Әлеуметтану ғылымының классикалық кезеңі 54 KB
  2сабақ. Әлеуметтану ғылымының классикалық кезеңі. 1. Огюст Конт әлеуметтану ғылымының негізін салушы. 2. Герберт Спенсердің әлеуметтану ғылымына қосқан үлесі. 3. К.Маркстің негізгі әлеуметтанулық ілімдері. 4. Э.Дюркгейм мен М.Вебердің әлеуметтанулық т...
12350. Әлеуметтану – ғылыми пән. Әлеуметтанудың құрылымы мен функциялары 64.5 KB
  1 дәріс. Әлеуметтану ғылыми пән 1. Қоғам және әлеумет ұғымдарының мәні. 2. Әлеуметтанудың объектісі мен пәні. 3. Әлеуметтанудың категориялары мен заңдары. 4. Әлеуметтанудың құрылымы мен функциялары.
12351. Әлеуметтану ғылыми пән ретінде. Әлеуметтанудың құрылымы мен функциялары 58 KB
  Әлеуметтану ғылыми пән ретінде 1. Қоғам және әлеумет ұғымдарының мәні. 2. Әлеуметтанудың объектісі мен пәні. 3. Әлеуметтанудың категориялары мен заңдары. 4. Әлеуметтанудың құрылымы мен функциялары. 5. Әле
12352. Исследование затухающих колебаний в колебательном контуре 458 KB
  Лабораторная работа № 25 Исследование затухающих колебаний в колебательном контуре 1. Цель работы: Изучение параметров и характеристик реального колебательного контура. 2. Затухающие колебания. Если диссипативную систему находящуюся в колебательном движении пр...
12353. Изучение электрических колебаний в связанных контурах 252 KB
  Лабораторная работа № 24 Изучение электрических колебаний в связанных контурах 1. Цель работы: Изучение обмена энергии в системе электрических контуров слабо связанных между собой. 2. Колебательные системы со слабой связью. Рассмотрим систему двух одинаковых мая