|
МУ_ЛР_БОС. А. С. Новиковым и обсуждены на заседании кафедры
Лабораторная работа № 10. Методы и средства несанкционированного доступа к ресурсам ОС
1. Цель работы
Получить навыки в исследовании методов несанкционированного доступа к системе, изучить способы его предотвращения и устранения, а также способы сокрытия важной информации. 2. Теоретические сведения
Одним из аспектов сетевой безопасности NT-систем, которому часто уделяется недостаточно внимания, являются совместно используемые ресурсы (shares). Объявление общих ресурсов со слабой защищенностью, позволяющей неавторизированным пользователям просматривать системные файлы, является одной из наиболее распространенных брешей в безопасности. Система не предоставляет средств для просмотра видимых в сети ресурсов машины и их установок безопасности. Однако, используя NetBIOS, можно просмотреть доступные компьютеры внутри домена и изучить доступные дисковые ресурсы, общие принтеры, а также их установки безопасности. Данный способ наиболее эффективен для администратора домена, поскольку именно он имеет возможность просматривать все ресурсы сети.
Для отображения локальных дисков на сетевые каталоги используются функции:
WNetOpenEnum - получение манипулятора перечисления сетевых ресурсов (дисков и принтеров) с заданными параметрами;
WNetEnumResource – заполнение структуры NETRESOURCE информацией о перечисляемом сетевом ресурсе;
WNetCloseEnum – удаление манипулятора перечисления.
Для получения списка совместно используемых ресурсов (включая скрытые), а также количества подключённых к ним пользователей существуют следующие API функции:
NetShareEnum – перечисление совместно используемых ресурсов;
NetShareAdd – добавление совместно используемого ресурса;
NetShareDel – удаление совместно используемого ресурса.
Другой деятельностью, так или иначе связанной с безопасностью системы, являются:
вход в системы/выход из системы; запуск и остановка процессов; создание и удаление токенов (tokens); запуск и остановка сервисов; заимствование прав (Windows NT позволяет одному процессу заимствовать атрибуты безопасности у другого процесса); изменение приложением привилегий безопасности.
Для управления и слежения за этими действиями существуют различные функции Win32 API, в том числе и недокументированные. Так, например, для отслеживания процесса выхода из системы нам понадобится использование недокументированных функций для регистрации callback-процедур, наблюдения за данным процессом:
NTSTATUS SeRegisterLogonSessionTerminatedRoutine(PVOID CallbackRoutine);
NTSTATUS SeUnregisterLogonSessionTerminatedRoutine(PVOID CallbackRoutine);
В то же время процедуру входа системы можно отследить с помощью перехвата (hook) системной функции NtCreateToken из Native API.
С помощью функции PsSetCreateProcessNotifyRoutine, описанной в Windows 2000 DDK, но доступной и в NT 4.0, можно зарегистрировать callback–функцию, отслеживающую запуск и остановку процессов в системе. При этом важно получить информацию и о контексте запуска, что позволяет произвести полный анализ происходящего в системе. Это приобретает особенную актуальность при исследовании машины на наличие программных закладок.
Получение имени родительского процесса демонстрирует следующий участок кода:
PsLookupProcessByProcessId( ParentId, &Parent );
ObDereferenceObject( Parent );
ProcessMonitorGetProcess( Parent, ParentName );
Здесь используется недокументированная функция PsLookupProcessByProcessId, которая может быть описана как:
NTSTATUS PsLookupProcessByProcessId(PVOID ProcessId, PEPROCESS *Process );
Для получения имени исполняемого процесса можно воспользоваться следующей функцией:
// Используется недокументированное смещение в структуре данных
// для получения имени исполняемого в данный момент процесса PWCHAR ProcessMonitorGetProcess(PEPROCESS Process, PWCHAR Name)
{
char *nameptr;
int i; if( ProcessNameOffset ) {
i = 0;
nameptr = (PCHAR) Process + ProcessNameOffset;
while( nameptr[i] && i < NT_PROCNAMELEN-1 ) {
Name[i] = (WCHAR) nameptr[i++];
}
Name[i] = 0;
swprintf( Name + wcslen(Name), L":%d", PsGetCurrentProcessId());
} else {
wcscpy( Name, L"???" );
}
return Name;
}
Для получения значения переменной ProcessNameOffset можно воспользоваться следующей функцией:
// Используется непосредственный разбор Kernel Process
//Environment Block для поиска имени соответствующего системного
// процесса
ULONG TokenmonGetProcessNameOffset(VOID)
{
PEPROCESS curproc;
int i; curproc = PsGetCurrentProcess(); for( i = 0; i < 3*PAGE_SIZE; i++ ) {
if( !strncmp( SYSNAME, (PCHAR) curproc + i, strlen(SYSNAME) )) {
return i;
}
}
// Имя не найдено
return 0;
}
Для получения информации о запущенных в системе процессах необходимо использовать специально предназначенные для этого API функции. С помощью API-функции CreateToolhelp32Snapshot, описанной в tlhelp32.dll сначала делается моментальный снимок системы, после чего функциями Process32First и Process32Next перечисляются все активные процессы. В параметрах этим функциям передается указатель на снимок (SnapShot) и адрес структуры, из которой извлекается вся информация о процессе, включая информацию о запущенных им нитях.
Сервисом или службой называется обычное Windows-приложение, содержащую дополнительную инфраструктуру, которая позволяет рассматривать его особым образом, например, давать возможность администратору запускать и останавливать это приложение с удалённой машины.
Сама ОС Windows включает много служб, например Event Log, Net Logon, Messenger и др. Работа служб обеспечивается взаимодействием компонентов трёх типов:
диспетчер управления службами (Service Control Manager, SCM); приложение-служба; программа управления службой (Service Control Program, SCP).
SCP — это приложение, которое (в отличие от обыкновенной службы) имеет пользовательский интерфейс, позволяющий пользователю запустить, остановить, продолжить работу и выполнить другие функции управления службами, установленными на машине.
Информация о системных сервисах может быть получена непосредственно из реестра, где в разделе HKLM\System\CurrentControlSet\Services располагается информация о каждом из системных сервисов и его параметрах (подробнее об этом можно прочитать в соответствующем разделе книги David A. Solomon, Mark Russinovich Inside Microsoft Windows 2000 ISBN 0-7356-1021-5, где приводится также и таблица с подробным описанием всех параметров), либо с помощью функций Win32 API для работы с сервисами. Например, функция EnumServicesStatus перечисляет сервисы из специальной базы данных сервисов, а функция OpenSCManager устанавливает соединение с базой данных сервисов на удалённом компьютере. 3. Оборудование
Персональный компьютер с установленной операционной системой MSWindows 2000 SP4, XPSP2, Vista или 7 и средами разработки ПО BorlandC++ Builder или MSVisualStudio 2005/2008/2010. 4. Задание на работу
1. Изучить теоретические положения по данной лабораторной работе.
2. Разработать программное обеспечение согласно заданию преподавателя. Варианты заданий: №
| Задание | 1
| Разработать программный модуль, осуществляющий просмотр открытых ресурсов и настроек доступа к ним (тип, путь (локальный и общий), домен и т.п.)
| 2
| Разработать программный модуль для отображения локальных дисков на сетевые каталоги. Оформить в виде таблицы: “Локальный диск – Сетевое имя – Провайдер”
| 3
| Разработать программный модуль, выдающий список установленных в системе сервисов с полной информацией о них
| 4
| Разработать программный модуль, выдающий список работающих процессов в виде древовидной структуры, отражающей связь дочерний – родительский
| 5
| Разработать программный модуль, обеспечивающий журналирование запускаемых процессов с указанием родительских процессов
| 6
| Разработать программный модуль, выдающий информацию о заданном сервисе и зависящих от него сервисах. Построить дерево зависимостей системных сервисов
| 7
| Разработать программный модуль, перечисляющий все открытые файлы в контексте заданного процесса.
| |
|
|