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

 

}


 

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

72055. ФОРМУВАННЯ КОМУНІКАТИВНОЇ КОМПЕТЕНТНОСТІ МАЙБУТНІХ ІНЖЕНЕРІВ У ПРОЦЕСІ ВИВЧЕННЯ ПСИХОЛОГО-ПЕДАГОГІЧНИХ ДИСЦИПЛІН 181 KB
  Професійному спілкуванню нині приділяється значна частина робочого часу сучасних фахівців зокрема встановлення ділових контактів наради бесіди переговори вимагають комунікативної компетентності що сприятиме ефективному діловому та професійному взаєморозумінню.
72056. РОЗВИТОК ОСВІТИ І ПЕДАГОГІЧНОЇ ДУМКИ НА ПЕРЕЯСЛАВЩИНІ (ПОЧАТОК XVIII – ПЕРША ЧВЕРТЬ ХХ СТОЛІТТЯ) 506 KB
  Актуальність теми дослідження. Становлення нової освітньої системи в Україні відбувається в умовах розбудови державності, відродження культурних і духовних цінностей українського народу. Державна програма “Освіта” (Україна ХХІ століття), Національна доктрина розвитку освіти України у ХХІ ст.
72057. СОЦІАЛЬНО-ПОЛІТИЧНИЙ КОНФЛІКТ В УКРАЇНСЬКОМУ СУСПІЛЬСТВІ ПЕРІОДУ ТРАНСФОРМАЦІЇ: ФАКТОРИ ВИНИКНЕННЯ І ОСОБЛИВОСТІ ПРОЯВУ 140.5 KB
  Актуальність теми дослідження визначається в першу чергу системною трансформацією сучасного українського суспільства яка зумовила високий динамізм і конфліктогенність соціально-політичних процесів що потребують свого вивчення. Зміни політичного режиму балансу соціальних і політичних сил...
72058. Тактика ведення лактації при інтраамніальному інфікуванні 168 KB
  Мета та завдання дослідження. Метою дослідження було розробка тактики ведення лактації у жінок з різними формами і термінами перенесеної вірусної інфекції на основі вивчення в них медико-соціальних, мікробіологічних, біохімічних і функціональних особливостей...
72059. Методика навчання інформаційних технологій у позашкільних навчальних закладах 254.5 KB
  Вивчення наукових і методичних джерел засвідчило наявність широкого спектру досліджень з різних напрямів розвитку і застосування інформаційних технологій. Зокрема педагогічному потенціалу психологопедагогічним аспектам інформаційних...
72060. Роль блокування ренін-ангіотензин-альдостеронової системи в попередженні ремоделювання лівого шлуночка у хворих, що перенесли інфаркт міокарда з патологічним зубцем Q 446.5 KB
  В країнах що розвиваються у хворих які перенесли інфаркт міокарда ІМ з патологічним зубцем Q зміни структури і функції лівого шлуночка ЛШ серця що позначаються терміном постінфарктне ремоделювання ЛШ складають основу розвитку хронічної серцевої недостатності ХСН...
72061. ЛІНГВОКУЛЬТУРНИЙ КОНЦЕПТ MINNE/КОХАННЯ В НІМЕЦЬКІЙ ПОЕЗІЇ МІНЕЗАНГУ XII–XIV СТОЛІТЬ: СТРУКТУРНИЙ ТА СЕМАНТИЧНИЙ АСПЕКТИ 258 KB
  Сучасним є також залучення лінгвокультурологічного підходу до встановлення вербальних репрезентантів лінгвокультурного концепту minne кохання. Це дає можливість дослідити національно-культурну специфіку фрагмента концептуальної картини світу людини доби Середньовіччя установити...
72062. ЗМІСТ І ФОРМА ПРАВОЧИНУ В ЦИВІЛЬНОМУ ПРАВІ 160.5 KB
  Зміст і форма правочинів межує з численними аспектами які теж мають суттєве значення для правочинів: воля й волевиявлення субєктний склад правочину його мета та ін. Усі вони становлять собою суцільну єдність необхідну й достатню для її кваліфікації як правочину.
72063. ПРОГНОЗУВАННЯ ЗАЛИШКОВОЇ МІЦНОСТІ ТА ДОВГОВІЧНОСТІ ДІЛЯНОК НАФТОГАЗОПРОВОДІВ З ДЕФЕКТАМИ ЗА ЕКСПЛУАТАЦІЙНИХ УМОВ 13.42 MB
  Мета і задачі дослідження – розробка наукових основ визначення напруженого стану і прогнозування залишкової міцності та довговічності труб і зварних з’єднань з тріщиноподібними дефектами на базі розвитку існуючих і створення нових методів оцінки їх роботоздатності.