611

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

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

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

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

Русский

2013-01-06

71.5 KB

18 чел.

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

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

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

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

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

 

}


 

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

5627. Единый налог на вмененный доход для отдельных видов деятельности (ЕНВД) 40 KB
  Единый налог на вмененный доход для отдельных видов деятельности (ЕНВД) ЕНВД - это налог на хозяйственную деятельность в виде промысла, приносящего доход. Он предусматривает уплату единого налога вместо налога на прибыль организаций (для индиви...
5628. Упрощенная система налогообложения (УСН) 39 KB
  Упрощенная система налогообложения (УСН) УСН предусматривает уплату единого налога вместо уплаты нескольких налогов. Единый налог заменяет: налог на прибыль организаций (для индивидуальных предпринимателей - НДФЛ) НДС налог на имущество ЕСН....
5629. Система налогообложения для сельскохозяйственных товаропроизводителей (единый сельскохозяйственный налог - ЕСХН) 30 KB
  Система налогообложения для сельскохозяйственных товаропроизводителей (единый сельскохозяйственный налог - ЕСХН) Сельскохозяйственные товаропроизводители - это организации и индивидуальные предприниматели, производящие сельскохозяйственную...
5630. Ответственность за нарушение налогового законодательства. Административная и уголовная ответственность в налоговой сфере 78.5 KB
  Ответственность за нарушение налогового законодательства Понятие налоговой ответственности. Составы налоговых правонарушений. Ответственность в соответствии с НК РФ. Административная и уголовная ответственность в налоговой...
5631. Налоговый контроль. Камеральная и выездная налоговые проверки 76 KB
  Налоговый контроль Понятие и виды налогового контроля. Камеральная и выездная налоговые проверки. Порядок оформления результатов проверок. Административная и судебная защита прав налогоплательщиков. Налоговый контроль
5632. Федеральная налоговая служба. Государственные органы как участники отношений в налоговой сфере 76.5 KB
  Государственные органы как участники отношений в налоговой сфере Федеральная налоговая служба. Таможенные органы. Федеральная служба по борьбе с налоговыми и экономическими преступлениями. Другие участники отношений в налогов...
5633. Налоговое производство. Порядок исчисления и уплаты налога 75 KB
  Налоговое производство Понятие налогового производства. Бухгалтерский и налоговый учет при исчислении налога. Порядок исчисления налога. Порядок уплаты налога. Юридической обязанностью налогоплательщика является уплата нал...
5634. Система налогов. Направления развития системы налогообложения в РФ 76 KB
  Система налогов Направления развития системы налогообложения в РФ. Перечень налогов, взимаемых на территории РФ. Общие сведения о налогах. Реформирование налоговой системы - это ее преобразование, исходя из направлений...
5635. Основы российской налоговой системы. Принципы налогообложения 68 KB
  Основы российской налоговой системы Понятие налоговой системы и налоговой политики. Принципы налогообложения в РФ. Система налогового законодательства. Бюджетный процесс и налогообложение. Основные характеристики налого...