здесь, сейчас, этот момент - DLL Hijacking в антивирусах [entries|archive|friends|userinfo]
pr0mix

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

DLL Hijacking в антивирусах [Oct. 19th, 2013|10:15 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|, , ]

Здарова!

Здесь попиздим о 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

LinkLeave a comment