DLL Hijacking в антивирусах


Здарова!

Здесь попиздим о DLL Hijacking (с примерами данной атаки) в контексте антивирусов. Этот текст следует рассматривать только как заметку. Ну и по умолчанию, если эта инфа покажется вам простой, то пусть это будет докой для новичков =)

DLL Hijacking - она же подмена DLL. Многие проги при вызове функции LoadLibrary(char *) передают в качестве параметра не полный путь к файлу, а только его имя. Что даёт возможность подменить загружаемую библиотеку на любую другую. Это связано с тем, что поиск данной dll начинается в директории, содержащей вызывающий EXE-файл. При этом, подменённая длл'ка выполняется с теми же привилегиями, что и запущенный процесс.

К ав, как и к другому софту, также можно (и нужно) применять данную технику нападения. Ясное дело, что в результате успешной атаки наш код работает в доверенном приложении, имеет те же привилегии, а значит может делать всё, что хочет.

Значит, разобьём ав'ы в плане самозащиты на 2 группы:

  • нихуя себя не защищающие (директории/файлы/процессы/окна/реестр/атрибуты/etc - частичная защита (например, протекция файлов или только реестра итп) не считается);
  • те, кто старается это делать.

К первой группе, например, относится 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
    \*------------------------------------------------------------------------------------------------*/
  • поиск папки "themes";
  • поиск всех файлов в данной папке по маске "*.theme" (FindFirstFile/FindNextFile);
  • загрузка очередного найденного файла с помощью функи LoadLibrary;

В течение работы антивируса цветовые схемы могут быть загружены/выгружены несколько раз:

  • при загрузке оси (темы загружает "C:\Program Files\COMODO\COMODO Internet Security\cfp.exe");
  • при очередном скане папок (через "cavscan.exe");
  • при открытии окна: COMODO -> Разное -> настройки -> внешний вид (темы грузит "cfp.exe");
  • etc;

Таким образом, переименовываем свою 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 мы можем так:

  • [1] задаём имя своей dll "ppeset.dll" и кидаем её в папку %TEMP%;
  • [2] в системной переменной окружения "Path" добавляем директорию %TEMP%;
  • [x] или же забросить либу в системную папку и не париться с реестром;

При следующей перезагрузке системы наша библиотека подхватится, вызовет функу DllRegisterServer() и выгрузится из адресного пространства (АП) процесcа "ekrn.exe".

Есть ещё такая фишка: если какой-либо процесс АВ'a создал, например, диалоговое окно открытия файлов ("Open"/"Save"/etc), то мы можем через это окно перемещать свои файлы даже в защищаемые антивирусом директории ("Action Via Window" attack - пусть будет так, а хуле). Это связано с тем, что подобные окна создаются с помощью фунок GetOpenFileName / GetSaveFileName, которые принадлежат библиотеке "Comdlg32.dll". А она выполняется как раз таки в АП процесса ав, который считается доверенным и может иметь права админа и выше.

Алгоритм для реализации данной атаки может быть такой:

  • [1] запуск нашего процесса;
  • [2] мониторинг окон на наличие диалогового окна открытия файлов;
  • [3] при появлении такого окна мы узнаём, какому процессу оно принадлежит, и получаем его текущую папку;
  • [4] если текущая директория - та, что нам нужна (защищённая папка авера) - тогда ещё проверим, имеется ли в ней (наш) файл (с определённым именем). Нашли? - Оке, прыгаем на пункт [6]. Иначе [5]. Если же текущая дира - другая, тогда [2];
  • [5] копируем/перемещаем файл в буфер обмена (БО), активизируем найденное окно, и отправляем ему комбинацию клавиш "Ctrl + V";
  • [6] завершение работы нашей проги;

Это всё здорово, однако многие из представленных танцев наверняка не будут работать на Windows Vista/7 из-за ёбаного UAC'а.

Как известно, при включённом uac'e большинство приложений запускается с правами обычного пользователя (даже если он находится под учётной записью админа). И изменить различные системные параметры нихера не выйдет (копирование/вставка/etc файла в системную директорию, изменение системных переменных окружения, инжекты в процессы и/или передача оконных сообщений им (защита UIPI) с более высоким Integrity Level etc etc - всё это под запретом).

Очевидное решение - повышение прав, сводящееся к обходу данного контроля.

Итак, обход можно поделить условно на 2 вида: активный (диалоговое окно uac не появляется) и пассивный (появляется).

К активному отнесём:

  • эксплоиты;
  • (возможные) инжекты в процессы;
  • некоторые другие специфические фишки (например, известная манипуляция c интерфейсом "IFileOperation");

Пассивный:

  • имя нашего приложения должно содержать любую из следующих строк: "install", "setup", "update", "patch" (сработает эвристик загрузчика приложений, и наша прога при запуске попросит повышение привилегий);
  • клепаем в приложении специальный манифест (etc + доки по манифесту для повышения прав);
  • заёб юзера: проверка своих привилегий, и если они низкие - запускаем себя с повышенными правами (ShellExecute(Ex) с командой "runas") до тех пор, пока юзер не охуеет от диалоговых окон (и, наконец-то, блядь, разрешит выполнение с нужными нам привилегиями);
  • после старта наша прога скачивает какой-нибудь подписанный инсталлятор/апдейт/etc (обычно такой апдейт заранее анализируется для атаки dll hijack), кладёт рядом с ним заранее подготовленную, нашенкованную всякими прелестями dll с определённым именем и запускает скачанный файл. (Обычно) если юзер подтверждает запуск такого апдейта, он будет выполняться с повышенными правами, а вместе с ним и наша dll;
  • после старта наша прога мониторит появление новых процессов. Если таковой найден, то выходим на его файл, анализируем и стараемся провести dll hijack (как вариант, перед новым процессом мониторинг "Consent.exe"). Другой путь - переименовываем свой файл в имя нового процесса и запускаем его с повышением привилегий;
  • использование буфера обмена в надежде на то, что файл попадёт в нужное место;
  • и т.д.;

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

В общем, возможно всё, действуй!

---

  • существуют готовые утилиты для поиска уязвимых приложений в системе (например, "DllHijackAuditKit"). Плюс к этому можно наваять ещё пару дополнительных тулз для более точного, качественного анализа конкретных файлов/процессов/etc (поиск по строкам, коду etc);
  • сорцы примеров находятся в папке dllhijack (перед запуском прог читай комменты в исходниках);
  • все тесты проводились на Win XP/Vista/7 x86 с дефолтовыми настройками всех ав;

Исходники: sources/pr0mix/dllhijack


______________________________
m1x
[email protected] / [email protected]
2012

Inception E-Zine