DLL Hijacking в антивирусахЗдарова! Здесь попиздим о DLL Hijacking (с примерами данной атаки) в контексте антивирусов. Этот текст следует рассматривать только как заметку. Ну и по умолчанию, если эта инфа покажется вам простой, то пусть это будет докой для новичков =) DLL Hijacking - она же подмена DLL. Многие проги при вызове функции LoadLibrary(char *) передают в качестве параметра не полный путь к файлу, а только его имя. Что даёт возможность подменить загружаемую библиотеку на любую другую. Это связано с тем, что поиск данной dll начинается в директории, содержащей вызывающий EXE-файл. При этом, подменённая длл'ка выполняется с теми же привилегиями, что и запущенный процесс. К ав, как и к другому софту, также можно (и нужно) применять данную технику нападения. Ясное дело, что в результате успешной атаки наш код работает в доверенном приложении, имеет те же привилегии, а значит может делать всё, что хочет. Значит, разобьём ав'ы в плане самозащиты на 2 группы:
К первой группе, например, относится Comodo (AV/IS v5.10). (Увы) приложения, не входящие в список доверенных, так просто не смогут нанести урон различным данным в папке авера. Однако, имеется возможность копировать туда свои файлы. Далее, при беглом анализе некоторых компонентов комода, была обнаружена целая куча вызовов LoadLibrary для файлов, отсутствующих в заданной директории (и во всей оси в целом). Нам остаётся только закинуть свою библиотеку с конкретным именем в нужную папку и наслаждаться результатом (возможно, понадобится перезагрузка). Например, имеется такая дира: "C:\Program Files\COMODO\COMODO Internet Security\themes\" (путь по умолчанию) - там comodo хранит цветовые схемы, которые представляют собой ресурсные PE-файлы:
"black.theme" (etc (HIEW)):
+--------------------------------------------------------------------------------------------------+
| Number | Name | VirtSize | RVA | PhysSize | Offset | Flags |
|--------------------------------------------------------------------------------------------------|
| 1 | .rsrc | 0006AB68h | 00001000h | 0006AC00h | 00000200h | 40000040h |
+--------------------------------------------------------------------------------------------------+
Алгоритм их подключения такой:
/*------------------------------------------------------------------------------------------------*\
"cavscan.exe":
0046AA33 |. E8 4D040900 CALL cavscan.004FAE85 ; \ FindFirstFileW
0046AA38 |. 8945 D8 MOV DWORD PTR SS:[EBP-28],EAX
0046AA3B |. C645 FC 01 MOV BYTE PTR SS:[EBP-4],1
0046AA3F |. 8D4D CC LEA ECX,DWORD PTR SS:[EBP-34]
0046AA42 |. E8 E988F9FF CALL cavscan.00403330
0046AA47 | 837D D8 00 /CMP DWORD PTR SS:[EBP-28],0 ; cycle: loadind of themes
0046AA4B |. 74 6B |JE SHORT cavscan.0046AAB8
0046AA4D |. 8D4D DC |LEA ECX,DWORD PTR SS:[EBP-24]
0046AA50 |. E8 EA010900 |CALL cavscan.004FAC3F ; FindNextFileW
0046AA55 |. 8945 D8 |MOV DWORD PTR SS:[EBP-28],EAX
0046AA58 |. 8D4D DC |LEA ECX,DWORD PTR SS:[EBP-24]
0046AA5B |. E8 4E030900 |CALL cavscan.004FADAE
0046AA60 |. 85C0 |TEST EAX,EAX
0046AA62 |. 75 52 |JNZ SHORT cavscan.0046AAB6
0046AA64 |. 8D4D DC |LEA ECX,DWORD PTR SS:[EBP-24]
0046AA67 |. E8 D4ECFEFF |CALL cavscan.00459740
0046AA6C |. 85C0 |TEST EAX,EAX
0046AA6E |. 75 46 |JNZ SHORT cavscan.0046AAB6
0046AA70 |. 8D55 C8 |LEA EDX,DWORD PTR SS:[EBP-38]
0046AA73 |. 52 |PUSH EDX
0046AA74 |. 8D4D DC |LEA ECX,DWORD PTR SS:[EBP-24]
0046AA77 |. E8 08060900 |CALL cavscan.004FB084 ; gluing strings
0046AA7C |. 8945 B4 |MOV DWORD PTR SS:[EBP-4C],EAX
0046AA7F |. 8B45 B4 |MOV EAX,DWORD PTR SS:[EBP-4C]
0046AA82 |. 8945 B0 |MOV DWORD PTR SS:[EBP-50],EAX
0046AA85 |. C645 FC 03 |MOV BYTE PTR SS:[EBP-4],3
0046AA89 |. 8B4D B0 |MOV ECX,DWORD PTR SS:[EBP-50]
0046AA8C |. E8 EFA8FCFF |CALL cavscan.00435380
0046AA91 |. 50 |PUSH EAX ; /Arg2
0046AA92 |. 8B4D 08 |MOV ECX,DWORD PTR SS:[EBP+8] ; |
0046AA95 |. 51 |PUSH ECX ; |Arg1
0046AA96 |. 8B4D C0 |MOV ECX,DWORD PTR SS:[EBP-40] ; |
0046AA99 |. E8 42020000 |CALL cavscan.0046ACE0 ; \ ... LoadLibraryW
0046AA9E |. 0FB6D0 |MOVZX EDX,AL
0046AAA1 |. 0FB645 D7 |MOVZX EAX,BYTE PTR SS:[EBP-29]
0046AAA5 |. 0BC2 |OR EAX,EDX
0046AAA7 |. 8845 D7 |MOV BYTE PTR SS:[EBP-29],AL
0046AAAA |. C645 FC 01 |MOV BYTE PTR SS:[EBP-4],1
0046AAAE |. 8D4D C8 |LEA ECX,DWORD PTR SS:[EBP-38]
0046AAB1 |. E8 7A88F9FF |CALL cavscan.00403330
0046AAB6 | ^ EB 8F \JMP SHORT cavscan.0046AA47
0046AAB8 | 8A4D D7 MOV CL,BYTE PTR SS:[EBP-29]
....
005A7328 \53 PUSH EBX ; /FileName
005A7329 . FF15 FCE46800 CALL DWORD PTR DS:[KERNEL32.LoadLibrar; \LoadLibraryW
005A732F . 8946 28 MOV DWORD PTR DS:[ESI+28],EAX
\*------------------------------------------------------------------------------------------------*/
В течение работы антивируса цветовые схемы могут быть загружены/выгружены несколько раз:
Таким образом, переименовываем свою dll, допустим, в "xuita.theme" и закидываем в папку с темами. Комод сосёт. Ко второй же группе ав можно отнести KIS/NOD32/DrWeb/etc. Рассмотрим NOD32 (AV/SS v5.2). Его директории защищены от записи, перемещения файлов и т.д. Но и у него был обнаружен код динамической загрузки "ppeset.dll" (читай доки "plugin for cisco nac") в сервисе "ekrn.exe":
/*------------------------------------------------------------------------------------------------*\
"ekrn.exe":
0040205F |. 68 ECFA4A00 PUSH ekrn.004AFAEC ; /FileName="ppeset.dll"
00402064 |. FF15 80124A00 CALL DWORD PTR DS:[KERNEL32.LoadLibrar; \LoadLibraryW
0040206A |. 8BF8 MOV EDI,EAX
0040206C |. 85FF TEST EDI,EDI
0040206E |. 74 19 JE SHORT ekrn.00402089
00402070 |. 68 04FB4A00 PUSH ekrn.004AFB04 ; /ProcName="DllRegisterServer"
00402075 |. 57 PUSH EDI ; |hModule
00402076 |. FF15 88124A00 CALL DWORD PTR DS:[KERNEL32.GetProcAdd; \GetProcAddress
0040207C |. 85C0 TEST EAX,EAX
0040207E |. 74 02 JE SHORT ekrn.00402082
00402080 |. FFD0 CALL EAX
00402082 | 57 PUSH EDI ; /hLibModule
00402083 |. FF15 78124A00 CALL DWORD PTR DS:[KERNEL32.FreeLibrar; \FreeLibrary
00402089 | 8B0D 646B4C00 MOV ECX,DWORD PTR DS:[4C6B64]
\*------------------------------------------------------------------------------------------------*/
При дефолтовых настройках установки (и вообше) авера данной библиотеки не было найдено во всей ОС. Тогда поиметь нод32 мы можем так:
При следующей перезагрузке системы наша библиотека подхватится, вызовет функу DllRegisterServer() и выгрузится из адресного пространства (АП) процесcа "ekrn.exe". Есть ещё такая фишка: если какой-либо процесс АВ'a создал, например, диалоговое окно открытия файлов ("Open"/"Save"/etc), то мы можем через это окно перемещать свои файлы даже в защищаемые антивирусом директории ("Action Via Window" attack - пусть будет так, а хуле). Это связано с тем, что подобные окна создаются с помощью фунок GetOpenFileName / GetSaveFileName, которые принадлежат библиотеке "Comdlg32.dll". А она выполняется как раз таки в АП процесса ав, который считается доверенным и может иметь права админа и выше. Алгоритм для реализации данной атаки может быть такой:
Это всё здорово, однако многие из представленных танцев наверняка не будут работать на Windows Vista/7 из-за ёбаного UAC'а. Как известно, при включённом uac'e большинство приложений запускается с правами обычного пользователя (даже если он находится под учётной записью админа). И изменить различные системные параметры нихера не выйдет (копирование/вставка/etc файла в системную директорию, изменение системных переменных окружения, инжекты в процессы и/или передача оконных сообщений им (защита UIPI) с более высоким Integrity Level etc etc - всё это под запретом). Очевидное решение - повышение прав, сводящееся к обходу данного контроля. Итак, обход можно поделить условно на 2 вида: активный (диалоговое окно uac не появляется) и пассивный (появляется). К активному отнесём:
Пассивный:
Понятно, что в общем случае эффективнее будет активная атака - пробили дыру и действуем на полный ход. Но у пассива тоже хорошие шансы - мы никогда не научим юзеров читать =) В общем, возможно всё, действуй! ---
Исходники: sources/pr0mix/dllhijack
|