Здарова! Здесь попиздим о DLL Hijacking (с примерами данной атаки) в контексте антивирусов. Этот текст следует рассматривать только как заметку. Ну и по умолчанию, если эта инфа покажется вам простой, то пусть это будет докой для новичков =)
---------------------------------------------------------------------------------------------------------------------------------
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x x
x Несколько слов о DLL Hijacking x
x x
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Здарова!
Здесь попиздим о DLL Hijacking (с примерами данной атаки) в контексте антивирусов. Этот текст
следует рассматривать только как заметку. Ну и по умолчанию, если эта инфа покажется вам простой, то
пусть это будет докой для новичков =)
DLL Hijacking - она же подмена DLL. Многие проги при вызове функции LoadLibrary(char *) передают в
качестве параметра не полный путь к файлу, а только его имя. Что даёт возможность подменить загружаемую
библиотеку на любую другую. Это связано с тем, что поиск данной dll начинается в директории, содержащей
вызывающий EXE-файл. При этом, подменённая длл'ка выполняется с теми же привилегиями, что и запущенный
процесс.
К ав, как и к другому софту, также можно (и нужно) применять данную технику нападения. Ясное дело,
что в результате успешной атаки наш код работает в доверенном приложении, имеет те же привилегии, а
значит может делать всё, что хочет.
Значит, разобьём ав'ы в плане самозащиты на 2 группы:
[1] нихуя себя не защищающие (директории/файлы/процессы/окна/реестр/атрибуты/etc - частичная защита
(например, протекция файлов или только реестра итп) не считается);
[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
\*------------------------------------------------------------------------------------------------*/
[1] поиск папки "themes";
[2] поиск всех файлов в данной папке по маске "*.theme" (FindFirstFile/FindNextFile);
[3] загрузка очередного найденного файла с помощью функи 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"). Другой путь - переименовываем свой файл в имя нового процесса и
запускаем его с повышением привилегий;
[+] использование буфера обмена в надежде на то, что файл попадёт в нужное место;
[+] и т.д.;
Понятно, что в общем случае эффективнее будет активная атака - пробили дыру и действуем на полный
ход. Но у пассива тоже хорошие шансы - мы никогда не научим юзеров читать =)
В общем, возможно всё, действуй!
х1ъ: существуют готовые утилиты для поиска уязвимых приложений в системе (например,
"DllHijackAuditKit"). Плюс к этому можно наваять ещё пару дополнительных тулз для более
точного, качественного анализа конкретных файлов/процессов/etc (поиск по строкам, коду etc);
х1ъ: сорцы примеров находятся в папке "src" (перед запуском прог читай комменты в исходниках);
х1ъ: все тесты проводились на Win XP/Vista/7 x86 с дефолтовыми настройками всех ав;
m1x / EOF
pr0mix@mail.ru / vxrulez@gmail.com
вирмэйкинг для себя...искусство вечно
2012
---------------------------------------------------------------------------------------------------------------------------------
Исходники: https://www.dropbox.com/s/344lrbc8e0qn2rm/src.zip
|