Данный документ дает понимание обычных веб-бэкдоров, а также того, как простые манипуляции могут сделать их необнаружимыми для антивирусов и прочих средств безопасности. Документ раскрывает несколько техник, которые могут быть использованы для вставки необнаружимых и незаметных бэкдоров в веб-приложения.
Обзор документа. Данный документ дает понимание обычных веб-бэкдоров, а также того, как простые манипуляции могут сделать их необнаружимыми для антивирусов и прочих средств безопасности. Документ раскрывает несколько техник, которые могут быть использованы для вставки необнаружимых и незаметных бэкдоров в веб-приложения.
Данный документ прежде всего представляет собой обновленую версию нашего старого документа "Эффективность антивирусов в обнаружении бэкдоров веб-приложений", в котором были рассмотрены главным образом вопросы эффективности антивирусов в отношении веб-шеллов и проанализирована пара веб-шеллов. Текущий документ развивает эту тему и раскрывает пару методик, которые позволяют создавать хорошо скрытые бэкдоры уровня приложения с помощью скриптовых языков. Также здесь объясняются различные атаки бэкдоров и техники обхода сканеров, препятствующие обнаружению.
Это простые скрипты, построенные с помощью программ для создания веб-приложений и служащие для атакующего бэкдором в среде хостинга приложения.
Методы обнаружения (сигнатурное обнаружение)
Метод предполагает наличие у антивируса сигнатуры бэкдора. В этом случае у соответствующей компании должна иметься копия бэкдора для анализа.
Обход сигнатурного обнаружения:
В предыдущем документе мы уже показали как легко обойти сигнатурное обнаружение. На основании дальнейшего анализа мы смогли заключить, что практически все антивирусы используют в качестве сигнатуры обычный md5-хэш или простые фрагменты текста. Впрочем, использование антивирусом MD5 или иных контрольных сумм для обнаружения вредоносных компонент не является новостью. Это может обернуться кошмаром для многих системных администраторов.
Очень распространенный бэкдор cybershell.php был проверен сканером Total Av. Вот результаты сканирования:
Обойти этот сканер очень просто: нужно лишь добавить в код строчку с комментарием или, напротив, вырезать из кода несколько строк:
Мы уже рассматривали ранее как легко обойти обнаружение бэкдоров антивирусами, поэтому создавать еще один документ на эту тему бессмысленно. Вместе с тем, более продвинутые способы обнаружения возможно являются обширной областью для исследований.
Поскольку мы уже знаем, что антивирусы бесполезны в обнаружении веб-бэкдоров, нет смысла искать способы их обхода. Однако, существует несколько хороших инструментов и скриптов, которые могут сканировать и обнаруживать подобные бэкдоры. Кроме того, администратор, просматривающий код сервера, может легко выявить уродливо выглядящие бэкдоры. Данный документ посвящен прежде всего тому, как избежать обнаружения в этих ситуациях (примеры будут на php).
Здесь перечислены несколько эффективных инструментов для обнаружения веб-бэкдоров на сервереЛогика, используемая большинством этих сканеров, сводится к поиску обращений к нижеперечисленным функциям, которые используются для управления файлами и запуска команд ОС, а потому их вызовы являются неотъемлимыми частями веб-шеллов.
NeoPI
NeoPI – скрипт на Питоне, который использует множество статистических методов для обнаружения обфусцированного и зашифрованного контента в текстовых и скриптовых файлах. Исходное назначение NeoPI – помошь в распознавании скрытого кода веб-шеллов. Основной целью разработки NeoPI было создание инструмента, который можно использовать в совокупности с прочими признанными методами обнаружения вроде Linux Malware Detect или традиционного поиска по сигнатурам/ключевым словам.
Мы сконцентрируем внимание на NeoPI, поскольку он показывает лучший результат, чем прочие инструменты из списка. С этими инструментами существует проблема, состоящая в необходимости ручной оценки, поскольку велико количество ложных положительных срабатываний.
Несколько образцов кода бэкдоров, которые обнаруживают вышеупомянутые сканеры.
Метод обратной кавычки (PHP)
Любой код, содержащий одну из вышеупомянутых функций из черного списка, будет пойман
Следующий код будет отмечен, поскольку содержит читаемую строку (закодированную в base64), а NeoPI обладает механизмом сканирования на предмет наличия естественных языков.
Техника 1:
Ситуация: администратор может сканировать свой сервер с помощью одного из перечисленных выше инструментов
Обход: PHP позволяет использовать значение переменной в качестве имени вызываемой функции
Обход сканирования (выявляющего использование функции base64_decode) осуществляется следующим образом:
Вскоре мы укажем альтернативу для eval.
Техника 2:
Ситуация: самостоятельно просматривая код, администратор может заметить подозрительную строку, закодированную в base64 и т. д. Он может отследить большие закодированные строки в файлах своего веб-приложения.Обход: простой способ обхода заключается в том, что код бэкдора делается максимально коротким, чтобы он мог быть включен в другой код и остаться незамеченным.
Показанный выше код можно уплотнить следующим образом.
Эта маленькая строчка кода позволяет запустить команду на выполнение. Она может быть совершенно незаметной для любых ранее рассмотренных инструментов и труднообнаружимой при ручном аудите. Если заменить в коде GET на POST, можно избежать еще и появления нежелательной информации в логах.
Техника 3:
Ситуация: аудит приложений производится с помощью сканеров исходного кода, которые обнаруживают все возможные пользовательские поля ввода и отслеживают атаки по внедрению кода. Таким образом, возможно обнаружение получения данных через методы _GET и _POST.
Обход: Можно помещать данные в EXIF-заголовки JPEG-картинок, поэтому мы поместим все вызовы функций и данные в картинку и соберем их во время выполнения. В этом случае входные данные будут идти не от пользователя, а из локального источника.
image.jpeg из показанного выше кода может содержать весь наш php- и шелл-код, а массив, возвращаемый функцией exif_read_data, можно использовать для получения значений отдельных метатэгов. Это позволяет конструировать вызовы функций во время выполнения.
Подобным образом мы можем спрятать обратный шелл в картинке и поместить его на главную страницу. Наш бэкдор будет срабатывать каждый раз, когда происходит запрос главной страницы с определенным http-заголовком. В этом случае он будет менее заметен и необнаружим антивирусами, средствами аудита кода и скриптами для поиска бэкдоров.
Замечание: вместо eval можно использовать функцию preg_replace() с ключом /e.
Демонстрация:
Преимущества:
Вот как это выглядит:
Невинная с виду страница
Запрос
Полученный шелл:
Улучшения:
POC код/демо будет содержать PHP-код, который может загружать шелл-коды и предоставлять шелл с обратным подключением (обратный шелл).
Спасибо за внимание
Fb1h2s @ gmail.com
http://www.Garage4Hackers.com
[Этот документ вместе с демонстрационными материалами был представлен на конференции C0C0N Sec Conference 9 октября 2011 года.]
Собираем и анализируем опыт профессионалов ИБ