C++ PE инъекция - EXE-файл из удаленного местоположения (например, HTTP)
Я - начинающий исследователь безопасности, пытающийся узнать об инъекциях PE с помощью капельниц / накопителей, очень похоже на работу криптолокера.
Мы настраиваем пожарную тренировку для нашей синей команды, которая работает с нашей QRadar SIEM, и мы хотели бы запустить на нее несколько пользовательских вредоносных программ.
Так что теперь, на мой вопрос:). Я понимаю общую концепцию внедрения PE PE, но почти все учебники, которые я нашел, вводят текущий EXE-файл (как правило, вызывая GetModuleHandle(NULL))
Мне было интересно, как вы будете внедрять EXE из удаленного ресурса (например, HTTP-загрузки). В основном моя цель заключается в следующем:
- STAGER файл загружает EXE в память
- STAGER файл внедрить EXE с использованием метода PE в процессе X
Я не ожидаю полного ответа здесь, но если бы вы могли указать мне правильное направление, это было бы здорово:).
Обратите внимание, что этот код не будет использоваться в злонамеренных целях.
С наилучшими пожеланиями!
1 ответ
Очень просто на самом деле. Все, что вам нужно сделать, это загрузить удаленный EXE/DLL в буфер (т.е. из памяти), с этого момента у вас есть несколько вариантов.
Изначально вам нужно проверить подпись MZ и убедиться, что это действительный PE-файл. Вы можете сделать это с PIMAGE_NT_HEADERS
, проверка на Optional.Signature (если допустимый PE-файл) и e_magic в PIMAGE_DOS_HEADER
(Подпись МЗ)
Теперь вопрос заключается в том, хотите ли вы внедрить dll, загрузить ее из памяти, найти в таблице экспорта заданную функцию, получить код и выполнить i в удаленном процессе или выполнить EXE из памяти.
Предполагая, что вы просто хотите получить ImageBase изображения, как вы сказали, вы читали некоторые онлайн-уроки, которые говорили об этом через GetModuleHandle
Сначала вам нужно отобразить загруженный буфер.
Вы можете сделать это через
CreateFileW
(для чтения), CreateFileMapping
(передать дескриптор из createfile), MapViewOfFile
(передать возвращенный дескриптор из createfilemapping).
После этого вы получите адрес базового изображения от MapViewOfFile
, Теперь вы можете многое сделать с файлом, вы можете вставить его из памяти или выполнить из памяти.
Вам необходимо изучить исправления PE (функции экспорта и импорта таблицы адресов) и перемещение базы через каталог прямого изображения, RVA -> base.
Обратите внимание: если вы выполняете образ в удаленном процессе после сопоставления файла, используйте ZwQueueApcThread
метод инъекций вместо более скучных, таких как RtlCreateUserThread/CreateRemoteThread
,
Если вы выполняете код из памяти. После исправления смещений путем перемещения убедитесь, что код выполняется VirtualProtectEx
, по выбору ZwAllocateVirtualMemory
(прохождение PAGE_WRITECOPY
вместо PAGE_EXECUTE_READWRITE
) вместо ZwWriteVirtualMemory
- WriteProcessMemory
как это гораздо хитрее!
Кроме того, я уверен, что вы можете выяснить некоторые другие подходы, это только из головы.