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
|