Антивирус — крайне полезная штука, но только не тогда, когда тебе нужно остаться незамеченным в атакуемой сети. Сегодня мы поговорим о том, как при пентесте можно обмануть антивирусные программы и избежать обнаружения в скомпрометированной системе.
info
Эта статья — продолжение цикла публикаций, посвященных постэксплуатации. В предыдущих сериях:
- Шпаргалка по persistence. Как надежно прописаться на хосте или выявить факт компрометации;
- Кунг‑фу pivoting. Выжимаем максимум из постэксплуатации;
- Гид по Lateral. Изучаем удаленное исполнение кода в Windows со всех сторон.
Наверняка тебе знакома ситуация, когда доступ к атакуемой сети получен и до цели остался один шаг. Но антивирус не дает выполнить нужное действие, запустить ту или иную программу. В моей практике были случаи, когда имелась лишь одна попытка, которая проваливалась из‑за поднятой антивирусом тревоги. Антивирусы иногда могут удалить и совсем безобидные файлы, причем не только исполняемые. Поэтому скрыть настоящую угрозу — крайне непростая задача.
КАК ПРОДЛИТЬ ЛИЦЕНЗИЮ АНТИВИРУСА AVAST PREMIER ДО 2033 ГОДА БЕСПЛАТНО! | ВЗЛОМ
warning
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный с использованием информации из данной статьи.
Вообще, задача обхода антивируса может возникнуть в двух случаях:
- при атаке. Тут полезную нагрузку запускает либо уязвимое приложение, либо, что чаще, пользователь (социальная инженерия). Главным образом это будет некое средство закрепления и обеспечения постоянного присутствия. Самое важное — не спалиться;
- при постэксплуатации. В этом случае мы сами запускаем программу на скомпрометированной системе. Это может быть сниффер, средство повышения привилегий или просто какой‑то хакерский софт, используемый для продвижения по сети. И при этом для нас важнее запустить программу, даже если это получилось не с первой попытки и антивирус выкинул несколько алертов.
В первом случае достаточно лишь применить известную технику — полиморфизм. Изменяем код, не меняя его функциональность. Хорошая тактика — написать код самому. Например, с помощью двадцати строк кода на VBS можно реализовать простой reverse shell и успешно обойти любой антивирус. Нас же больше будет интересовать второй случай, и именно это и будет темой данной статьи.
Многие полезные инструменты для обхода антивируса можно сделать с помощью того же Meterpreter, но для начала его следует как минимум запустить. В каждом рассматриваемом способе именно запуск Meterpreter и будет для нас конечной целью. Ведь данное средство обладает всеми необходимыми возможностями, а при желании может использоваться и для запуска другого специализированного ПО прямо в оперативной памяти. А все, что происходит в оперативной памяти, почти недостижимо для средств защиты, поскольку детальный и постоянный анализ памяти влечет за собой колоссальные накладные расходы, на которые антивирусы пойти не могут.
Как взломать программу
Для того чтобы эффективно обойти антивирус, нам потребуется мыслить как антивирус, пытаться предугадать его логику. Антивирус для нас, безусловно, будет черным ящиком. Мы не знаем в подробностях, как он устроен, но, опираясь на его поведение в разных ситуациях, можем заключить, что он тщательно отслеживает источник загрузки исполняемого файла, а также следит, запускался ли он до этого, и если запускался, то сколько раз. Повторные запуски будут происходить уже под меньшим «надзором».
По большому счету мы имеем дело с двумя механизмами защиты:
- сигнатурным;
- эвристическим (поведенческим).
При сигнатурном анализе антивирус учитывает множество факторов, в частности большое влияние на результат оказывает компилятор. Вот достаточно забавные результаты VirusTotal для безобидного helloworld-приложения, написанного на С:
- i686-w64-mingw32-gcc — 11/68 детектов;
- msvc — 2/64 детекта;
- win-gcc — 0 детектов.
Что же касается анализа поведения программы, тут нужно понимать, что, даже если тебе удалось обойти сигнатуры, ты все еще можешь спалиться, поскольку всякий migrate PID или sekurlsa:: logonPasswords может быть перехвачен по причине использования характерных сочетаний WinAPI-функций, которые антивирусы очень внимательно мониторят.
Я предлагаю сосредоточиться именно на сигнатурном движке, обхода которого для большинства случаев достаточно. В статье не будет прямых упоминаний конкретных названий антивирусов, чтобы не создавать никому рекламы или антирекламы. В то же время мы не станем «затачиваться» под конкретный антивирус. Результаты будем проверять именно на работающем антивирусе, при этом попробуем использовать некий универсальный способ, чтобы каждый раз не придумывать все новые методы обхода. В каждом случае целью будет тайком протащить на скомпрометированную машину Meterpreter, который позволит нам исполнить в памяти что угодно, запустить весь имеющийся в нашем распоряжении хакерский арсенал.
Legal
Лучший бой — это тот, которого удалось избежать. Поэтому в борьбе с антивирусами часто используются легальные средства. Да, они не могут предоставить многие «продвинутые штуки», но необходимый минимум в виде reverse shell при persistence и lateral movement, а также встроенный прокси‑сервер и гибкую систему редиректа трафика при pivoting они реализовать могут.
И это замечательные, всем известные утилиты — nc.exe, ncat.exe, socat.exe, plink.exe. Примеры их использования были описаны в моих прошлых статьях. Блеки же и Wowсе порою используют обычные средства облачного удаленного администрирования вроде RMS.
Если же в скомпрометированной системе требуется развернуть целый «плацдарм» в виде Metasploit и аналогичных хакерских тулз, то можно укрыться за виртуализацией. Пошаговый гайд описан еще в одной моей статье.
Shellcode injecting
Техника встраивания кода в уже запущенные, а значит, прошедшие проверку процессы широко известна. Идея состоит в том, что мы имеем отдельную программу shellcode_inject. exe и сам shellcode в разных файлах. Антивирусу сложнее распознать угрозу, если она раскидана по нескольким файлам, тем более по отдельности эти файлы не представляют угрозы.
В свою очередь, наш shellcode выглядит еще более безобидно, если мы преобразуем его в печатные символы.
Глядя на содержимое meter. txt , я бы скорее решил, что это строка в Base64, чем шелл‑код.
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
s0i37
Lead cybersecurity analyst at USSC t.me/s0i37_channel
Источник: xakep.ru
Как обойти антивирус за 5 минут
Бумажная безопасность порядком надоела, поэтому я решил немного отвлечься на практику. Не так давно мне представился случай лично убедиться, с какой легкостью злоумышленник, обладающий самой минимальной квалификацией, способен обойти популярные «топовые» антивирусы. Сегодняшний пост посвящен короткой истории поединка скрипт-кидди с одним популярным антивирусом.
Но, сперва, disclaimer:
1) Многое из написанного ниже, для экспертов, несомненно — боян. Но автор и не претендует на «срыв покровов». Статья призвана предостеречь тех пользователей, которые полагаются на антивирус как на панацею, при этом забывая о необходимости комплексного подхода к безопасности.
2) Статья написана исключительно в образовательных целях. Не нужно использовать эту информацию для совершения противоправных действий.
3) Статья не пытается бросить тень на производителей антивирусов. Уверен, что они делают все возможное, чтобы совершенствовать свои продукты.
Как-то раз нелегкая судьба безопасника (от которого часто требуют уметь все) занесла меня в пентесты. Была поставлена задача проверить уязвимость организации к вирусной атаке.
В компании использовалось антивирусное ПО от одного из топ-вендоров. Антивирусы были развернуты и на серверах (включая почтовые и прокси-серверы) и на компьютерах пользователей. Централизованное управление и обновление тоже было.
Неплохая защищенность и небольшой опыт в проведении пентестов не сулили затее особого успеха.
Однако, практическая реализация показала другое: злоумышленник может организовать атаку и обойти средства антивирусной защиты даже при помощи стандартных общеизвестных средств, доступных практически любому специалисту. Каким образом — описано ниже.
Стандартные инструменты
Как уже говорилось, злоумышленнику не нужно обладать высокой квалификацией. Достаточно навыков скрипт-кидди — найти подходящий инструмент.
Причем искать долго не придется — все необходимое есть в Metasploit Framework.
Хотя многие специалисты по ИБ наверняка о нем слышали, на всякий случай напомню: Metasploit представляет собой средство автоматизации пентестов от компании Rapid7 и содержащее большое количество готовых эксплойтов.
Помимо эксплойтов, Metasploit содержит набор готовых «полезных» нагрузок (payloads), проще говоря — вредоносного ПО.
А среди готовых «начинок» выделяется одна из самых популярных – Meterpreter. Meterpreter обладает широким функционалом: кейлоггер, запись фото и видео с веб-камеры, копирование куки и истории браузера, сбор учетных данных множества сервисов, включение RDP, заведение и удаление пользователей… Короче говоря, Meterpreter позволяет сделать с зараженной машиной практически все, что угодно. Meterpreter поддерживает различные варианты взаимодействие с сервером управления (включая TCP, HTTPS, соединение с шифрованием RC4). На роль инструмента для пентеста Meterpreter подходит прекрасно.
Таким образом, злоумышленнику не нужно ничего разрабатывать, достаточно «выгрузить» Meterpreter в подходящем формате (кстати, делается это одной командой).
Но для пользователей есть хорошая новость: Meterpreter обнаруживается практически всеми антивирусами. Если выгрузить его в exe-файл и «скормить» VirusTotal, то получим такой результат:
Как видим, антивирусы, в подавляющем большинстве, детектировали Meterpreterкак вредоносное ПО. Это и не удивительно: ему уже много лет.
Означает ли это победу антивируса над скрипт-кидди? Не совсем.
Антивирусы выходят из игры
После 5 минут поиска в Google находится сразу несколько готовых решений для обхода антивирусов. Познакомимся поближе с инструментом под названием Shellter ( сайт ).
Shellter используется для сокрытия вредоносного кода в исполняемых файлах Windows. Проще говоря, Shellter «вставляет» в нативное 32-разряднное приложение код вредоносной программы, который автоматически начинает выполняться при его запуске. Среди особенностей Shellter можно отметить минимальные изменения, вносимые в структуру исполняемого файла, использование «мусорного» кода и возможность кодирования «нагрузки». Все это затрудняет детектирование итогового файла антивирусами.
В автоматическом режиме работы Shellter требует минимального участия пользователя: Next, Next, Next и готово. Сначала выбирается PE-файл приложения, затем – нужный payload (причем Meterpreter в Shellter уже предусмотрительно встроен).
На выходе получается исполняемый файл, в котором скрыта «полезная» нагрузка в виде Meterpreter (или любого другого кода).
Если создать зараженный файл при помощи Shellter и попытаться проверить его через VirusTotal, то увидим следующее:
Показатель детектирования просто катастрофически упал. Это означает, что большинство антивирусов, установленных на рабочих местах и серверах не определят данный файл как опасный! На все про все, включая установку Shellter, ушло от силы 5 минут.
Таким образом, хотя сигнатура трояна известна уже много лет (Metasploit и Meterpreter входят в стандартную сборку Kali Linux), благодаря Shellter популярные антивирусы ничего не могут с ним поделать.
А как на практике?
Но тест на VirusTotal без испытаний «в поле» не показатель. Может быть при работе троян будет обнаружен по поведенческим признакам? Чтобы проверить это, протестируем файл на двух популярных антивирусах: Eset (5.0.21.26) и Kaspersky Internet Securiy (17.0.0.611).
Беглое тестирование показывает следующее:
1) Копирование и запуск файла не детектируется.
2) При запуске инфециорованного файла сессия до сервера управления (Metasploit) успешно открывается.
3) При выполнении некоторых действий (например, при попытке «миграции» Meterpreter в другие процессы), процесс Meterpreter’а детектируется как угроза.
4) При попытке использования веб-камеры, KIS запрашивает разрешение пользователя.
5) Большое количество функций Meterpreter’а все равно работает без обнаружения. В частности, прекрасно работает кейлоггер, скрипты сбора учетных данных, выгрузка информации из браузеров, скриншоты рабочего стола, копирование файлов. В принципе, этого достаточно для решения злоумышленником своих задач.
Таким образом, антивирусы конечно ограничивают функционал Meterpreter, но все равно оставляют широкий простор для злоумышленника.
Выводы и рекомендации
Тест еще раз показывает, что антивирус не является сам по себе панацеей. Средства обхода антивирусного ПО весьма популярны и находятся в свободном доступе. Разумеется, после загрузки части зараженных файлов на Virustotal, антивирусные базы будут пополняться, и возможности таких средств будут сокращаться. Но для защиты от таргетированных атак это не поможет.
Это не означает, что антивирусное ПО бесполезно. Просто без должной работы с персоналом его эффективность может быть сведена на нет.
История закончилась для пользователей легким «троллингом»: на рабочем столе появилось приглашение на корпоративный тренинг по ИБ. На тренинге им было рекомендовано:
- не открывать подозрительные и рекламные почтовые вложения;
- не включать без особой надобности макросы в документах;
- подключать к компьютеру только проверенные носители информации;
- устанавливать программы только с официальных сайтов;
- не посещать подозрительные сайты;
- проверять, куда ведет та или иная ссылка;
- регулярно обновлять ПО (включая офисные программы и браузеры).
На этом, пожалуй, все.
Если эта статья будет полезной — напишите в комментариях. Возможно, стоит сместить акцент блога с нормативки на практическую ИБ.
Источник: www.securitylab.ru
Обход антивируса в Meterpreter
Здорова народ! В сегодняшней статье я покажу, как обойти антивирус при пентесте используя фреймворк Metasploit.
Обход антивируса в Meterpreter
Техника встраивания кода в уже запущенные, а значит, прошедшие проверку процессы широко известна. Идея состоит в том, что мы имеем отдельную программу shellcode_inject.exe и сам shellcode в разных файлах. Антивирусу сложнее распознать угрозу, если она раскидана по нескольким файлам, тем более по отдельности эти файлы не представляют угрозы.
В свою очередь, наш shellcode выглядит еще более безобидно, если мы преобразуем его в печатные символы.
Глядя на содержимое meter.txt, я бы скорее решил, что это строка в Base64, чем шелл‑код.
Стоит отметить, что мы использовали шелл‑код meterpreter_reverse_tcp, а не meterpreter/reverse_tcp. Это автономный код, который содержит в себе все функции Meterpreter, он ничего не будет скачивать по сети, следовательно, шансов спалиться у нас будет меньше. Но вот связка shellcode_inject.exe и meter.txt уже представляет опасность. Давай посмотрим, сможет ли антивирус распознать угрозу?
Обрати внимание: мы использовали для инжекта кода системный процесс, он сразу работает в контексте System. И похоже, что наш подопытный антивирус хоть в конце и ругнулся на shellcode_inject.exe, но все же пропустил данный трюк.
Запустив что‑то вроде Meterpreter, атакующий получит возможность выполнить полезную нагрузку прямо в памяти, минуя тем самым HDD.
Много лет этот простой трюк выручал меня. Сработал он и на этот раз.
Code caves
Каждый exe-файл (PE-формат) содержит код. При этом весь код оформлен в виде набора функций. В свою очередь, функции при компиляции размещаются не одна за другой вплотную, а с некоторым выравниванием (16 байт). Еще большие пустоты возникают из‑за выравнивания между секциями (4096 байт).
И благодаря всем этим выравниваниям создается множество небольших «кодовых пустот» (code caves), которые доступны для записи в них кода. Тут все очень сильно зависит от компилятора. Но для большинства PE-файлов, а нас главным образом интересует ОС Windows, картина может выглядеть примерно так, как показано на следующем скриншоте.
Что представляет собой каждая такая «пустота»?
Так, если мы более точно (сигнатурно) определим расположение всех пустот, то получим примерно следующую картину в исполняемом файле.
В этом примере мы поискали только 12-байтные пустоты, так что реальное их количество будет гораздо большим. Пустот хоть и немало, но их явно недостаточно для размещения полноценной программы. Поэтому данный способ годится только для вставки шелл‑кодов, размер которых редко превышает 1 Кбайт.
Давай посмотрим, сможем ли мы разложить небольшой многоступенчатый Windows/Meterpreter/reverse_tcp шелл‑код по этим пустотам. Размер code cave редко превышает 16 байт, так что нам потребуется разбивать шелл‑код сильнее, чем по базовым блокам. Следовательно, придется вставлять еще и дополнительные jmp-инструкции для их связи и корректировать адреса условных переходов. На деле это достаточно рутинная операция.
В результате наш шелл‑код размером в 354 байта был разбит на 62 кусочка и помещен в рандомные пустоты между функциями.
По идее, такой подход должен дать нам полиморфизм, так как каждый раз шелл‑код будет помещаться в случайные пустоты по две‑три инструкции (это называется умным словом «пермутация»). Даже на уровне трассы исполнения код будет обфусцирован из‑за достаточно большого количества инструкций jmp между фрагментами.
C помощью этого способа мы можем обойти таким образом много «простых» антивирусов.
Однако серьезные антивирусные продукты таким трюком все же не проведешь.
Crypt
Как ни странно, классический xor исполняемого файла с динамическим ключом все еще успешно работает против даже самых грозных антивирусов. Для примера возьмем какой‑нибудь очень палевный исполняемый файл и закриптуем простым xor все, что только можно. Крипт секций .text и .data выглядит примерно так.
Теперь спрячем информацию о версии.
Секция .rdata содержит практически все палевные строки. Но вот беда, на нее проецируются директории таблиц импорта и отложенного импорта, которые трогать нельзя, иначе файл не запустится. Поэтому просто найдем в данной секции область, где главным образом содержатся строки, и зашифруем ее.
Поскольку мы все зашифровали в исполняемом файле, то в момент запуска его смещения в коде не будут правильно скорректированы в соответствии с адресом размещения. Поэтому еще придется отключить ASLR:
PE — > NT headers — > Optional header — > DllCharacteristics | = 0x40
Теперь самое время проверить, что мы все спрятали, и наш mimikatz больше не вызывает подозрений.
Отлично. Только пока наш файл неработоспособен, так как в нем все зашифровано. Перед дальнейшими действиями рекомендую попробовать запустить файл в отладчике, чтобы убедиться, что структуры PE-формата не повреждены и файл валиден.
Теперь нам потребуется написать небольшой машинный код для расшифровки. И, что важно, ключ будет задаваться во время исполнения, то есть нигде в коде он не будет сохранен. Следовательно, запуск приложения в песочнице антивируса не должен выявить угрозы.
Наш xor_stub.asm будет сохранять начальное состояние и добавлять права на запись в зашифрованные секции.
Здесь и далее не забудь изменить адреса WinAPI-функций на свои значения. Теперь мы скорректируем точку входа, так как в нее чуть позже будет вставлен jump на данный код.
Запросим у пользователя ключ для расшифровки и выполним де-xor всех зашифрованных областей.
Наконец мы восстанавливаем начальное состояние, корректируем стек и перемещаемся в entry point.
Самое время добавить пустую секцию r-x в mimikatz, куда мы разместим наш xor_stub.
Теперь скомпилируем данный ассемблерный код и вставим его в только что созданную секцию.
В конце не забудем из entry point сделать jump на наш код.
Готово. Запускаем и вводим ключ, которым мы шифровали, — в моем случае это символ w (0x77).
Вот и все. Немного автоматизировав данный процесс, попробуем запустить Meterpreter.
Запускаем и вводим ключ w.
И получаем тот же эффект.
Vuln inject (spawn)
Мне хорошо запомнился один давний случай. Я никак не мог открыть сессию Meterpreter на victim из‑за антивируса, и вместо этого мне каждый раз приходилось заново эксплуатировать старую добрую MS08-067, запуская Meterpreter сразу в памяти. Антивирус почему‑то не мог помешать этому.
Думаю, антивирус главным образом заточен на отлов программ (на HDD) и шелл‑кодов (по сети) с известными сигнатурами или на эксплуатацию популярных уязвимостей. Но что, если уязвимость еще неизвестна для антивируса?
В этом случае используется достаточно необычная техника, которая строится на принципе внедрения уязвимости (buffer overflow) и, тем самым, неочевидном исполнении произвольного кода. По сути, это еще один вариант рефлективного исполнения кода, то есть когда код присутствует исключительно в RAM, минуя HDD. Но в нашем случае мы еще и скрываем точку входа во вредоносный код.
Антивирус, как и любое другое ПО, вряд ли способен определить статическим анализатором, что в программе содержится уязвимость и будет исполнен произвольный код. Машины пока плохо справляются с этим, и не думаю, что ситуация сильно изменится в ближайшем будущем. Но сможет ли антивирус увидеть процесс в динамике и успеть среагировать?
Чтобы проверить это, нам нужно написать и запустить простенький сетевой сервис, содержащий придуманную нами 0-day-уязвимость (buffer overflow на стеке) и проэксплуатировать ее. Чтобы все работало еще и в новых версиях Windows, придется обойти DEP. Но это не проблема, если мы можем добавить нужные нам ROP-gadgets в программу.
Не будем глубоко вдаваться в детали buffer overflow и ROP-chains, так как это выходит за рамки данной статьи. Вместо этого возьмем готовое решение. Компилируем сервис обязательно без поддержки ASLR (и можно без DEP):
cl . exe / c vuln_rop . c
link . exe / out : vuln_rop . exe vuln_rop . obj / nxcompat : no / fixed
Наш сетевой сервис будет работать в режимах listen и reverse connect. А все данные будут передаваться в зашифрованном виде, чтобы не спалиться на сигнатурном анализаторе. И это очень важно, поскольку некоторые антивирусы настолько «не любят» Meterpreter, что даже простая его отправка в любой открытый порт спровоцирует неминуемый алерт и последующий бан IP-адреса атакующего.
Полученный исполняемый файл технически не является вредоносным, ведь он содержит в себе лишь ошибку при работе с памятью. В противном случае любая программа может считаться вредоносной, поскольку потенциально она тоже может включать ошибки.
Наш уязвимый сервис успешно запущен и ждет входящих данных. Создаем payload и запускаем эксплоит с ним.
В итоге уязвимый сервис принимает наши данные и в результате заложенной ошибки при работе с памятью непроизвольно запускает код payload.
Эта полезная нагрузка открывает нам сессию Meterpreter.
И все это безобразие происходит при работающем антивирусе. Однако было замечено, что при использовании некоторых антивирусов все еще срабатывает защита. Давай порассуждаем, почему. Мы вроде бы смогли внедрить код крайне неожиданным способом — через buffer overflow.
И в то же самое время по сети мы не передавали код в открытом виде, так что сигнатурные движки не сработали бы. Но перед непосредственным исполнением мы получаем в памяти тот самый машинный код. И тут, по‑видимому, антивирус и ловит нас, узнавая до боли знакомый Meterpreter.
Антивирус не доверяет exe-файлу, скачанному неизвестно откуда и запущенному первый раз. Он эмулирует выполнение кода и достаточно глубоко анализирует его, возможно даже на каждой инструкции. За это приходится платить производительностью, и антивирус не может позволить себе делать так для всех процессов. Поэтому процессы, уже прошедшие проверку на этапе запуска (например, системные компоненты или программы с известной контрольной суммой), работают под меньшим надзором. Именно в них мы и внедрим нашу уязвимость.
Vuln inject (attach)
Самый простой и удобный способ выполнить код в чужом адресном пространстве (процессе) — инжект библиотеки. Благо DLL мало чем отличается от EXE и мы можем перекомпилировать наш уязвимый сервис в форм‑фактор библиотеки, просто изменив main() на DllMain():
Источник: spy-soft.net