611
Маркеры доступа
Лабораторная работа
Информатика, кибернетика и программирование
В результате данной работы были изучены основные возможности мониторинга и управления маркерами доступа Windows. Так же были получены навыки реализации взаимодействия созданной программы с процессами и их настройками безопасности.
Русский
2013-01-06
71.5 KB
18 чел.
Министерство образования и науки Российской Федерации
Санкт-Петербургский государственный политехнический университет
Факультет технической кибернетики
Кафедра «Информационная безопасность компьютерных систем»
ЛАБОРАТОРНАЯ РАБОТА № 4
Маркеры доступа
по дисциплине «Безопасность современных информационных технологий»
Выполнил
студент гр. 3088/2 В.Б. Вагисаров
<подпись>
Руководитель
доцент, к.т.н. Д.А. Москвин
<подпись>
Санкт-Петербург
2012
1. ЗАДАЧИ
Цель:
Изучить механизмы управления полномочиями пользователей Windows на основе маркеров доступа.
Задача:
Требования:
2. ВЫПОЛНЕНИЕ РАБОТЫ
В процессе выполнения работы была разработана программа, реализующая требования указанные в задании. Получившаяся утилита имеет консольный интерфейс, и все управляющие команды вводятся в качестве входных параметров.
При реализации не были использованы сторонние готовые утилиты. Вместо этого, всё взаимодействие с процессами и маркерами доступа производится стандартными средствами (функциями) WinAPI, такими как
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");
}
А также другие работы, которые могут Вас заинтересовать | |||
8058. | Закономерности и функции процесса обучения | 23.44 KB | |
Закономерности и функции процесса обучения Процесс обучения может быть представлен следующими основными функциями: образовательная, воспитательная и развивающая. К функции образования относится овладение учащимися научными знаниями и умениями, а так... | |||
8059. | Принципы обучения. Характеристика принципа обучения | 25.22 KB | |
Принципы обучения. Характеристика принципа обучения Для организации учебного процесса необходимы конкретные указания, которые не содержаться в закономерностях обучения. Практические указания содержатся в принципах и правилах обучения. Дидактические ... | |||
8060. | Понятие метод обучения. Различные подходы к классификации | 24.46 KB | |
Понятие метод обучения. Различные подходы к классификации Сущность обучения состоит во взаимодействии учителя и учащихся с целью усвоения, учениками содержания социального опыта, их воспитания, формирования научного мировоззрения. Успех воспитания и... | |||
8061. | Истории возникновения и развития форм обучения | 29.59 KB | |
Истории возникновения и развития форм обучения Формы организации обучения имеют долгую историю. На заре человечества опыт и знания передавали детям в процессе разнообразной трудовой деятельности. Трудовая деятельность выступала универсальной формой ... | |||
8062. | Формы организации обучения и их характеристика | 25.25 KB | |
Формы организации обучения и их характеристика Форма организации обучения - это внешнее выражение согласованной деятельности учителя и учеников, упаковка для содержания обучения. Они возникают и совершенствуются в связи с развитием дидактичес... | |||
8063. | Классно-урочная система обучения и её признаки | 24 KB | |
Классно-урочная система обучения и её признаки Классно-урочная система обучения, возникшая еще в XVII веке, образовалась и развивалась благодаря деятельности великих деятелей педагогической науки И. Лойолы, И. Штурма, Я. А. Коменского. Классно-урочн... | |||
8064. | Понятие урок. Типология и структура урока | 25.14 KB | |
Понятие урок. Типология и структура урока Урок - это законченный в смысловом, временном и организационном отношении отрезок (этап, звено, элемент) учебного процесса. На каждом уроке решается триединая цель: обучить, воспитать, развить. Урок явл... | |||
8065. | Контроль и оценка знаний учащихся | 25.97 KB | |
Контроль и оценка знаний учащихся. Одним из важнейших звеньев процесса обучения является контроль усвоения знаний. Он показывает, насколько полно и глубоко усвоены знания как на уроке, так и в системе уроков, а также вносит коррективы в организацию ... | |||
8066. | Подготовка учителя к уроку. Анализ и самооценка урока | 21.66 KB | |
Подготовка учителя к уроку. Анализ и самооценка урока. Подготовку учителя к уроку можно разделить на два больших этапа. Планирование урока. Составляется тематический план - отражение единства и взаимосвязи всех форм организации по данному пр... | |||