Поиск «Шелов» при помощи консоли на *nix серверах

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

Начал с того, что подбирал способы вычисления этих самых проклятущих Shell-ов. Ни для кого не секрет в общем-то это некие команды на PHP основой которых является функция eval и иже с ней. В её параметрах стоит функция base64_decode которая раскодирует уже свой параметр и передает его eval-у, который и делает своё чёрное дело. Так вот у последней в параметре стоит, как я уже намекнул, кодированная строка на вид просто «мусор», что-то типа «GJokiuhjbGRFTdvBnfjilk,,mn» (это я так прогулялся пальцами по клавиатуре, а не привёл реальный пример, но помоем похоже). Так вот переходя к основной теме повествования ставим перед собой вопрос: «как эту дрянь найти?» и «как это сделать из консоли, например, Linux?» Для этого есть множество способов, и первое что напрашивается в данном случае это использование команды вида:

grep -rl ‘eval(base64_decode’ ./

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

grep -rl ‘eval(base64_decode’ ./ > base64.txt

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

На самом деле команда вроде бы и всем хороша но есть одно «НО»: «не очень хорошие жители сети» легко прячут свои творения от такого поиска, например, использованием массивов. Но не буду вдаваться в PHP программирование, а просто скажу, что такой поиск частенько оказывается не эффективным. Продолжая дальше свои изыскания в этом направлении я пришёл к выводу, что искать нужно не по «функциональному сочетанию», а по упомянутому мною «мусору». Но как это сделать ведь он не однороден и единственный критерий по которому его можно отличить от прочего содержания файла это именно то, что он похож на «мусор» (извиняюсь за повторения)? И тут мне на помощь пришла команда:

find ./ -name ‘*.php’ | xargs grep -E ‘[0-9a-zA-Z]{80}’ > base64.txt

которая ищет в каталоге запуска (и всех его подкаталогах) файлы с расширением *.php и содержащие разного рода нелепые наборы читабельных символов из множеств 0-9, a-z и A-Z (т.е. цифр, маленьких и больших латинских букв), причём эта сочетание должно быть не менее 80 символов (цифру выбирал эмпирическим путём, потому советую тоже с ней поэкспериментировать), ну и сохраняет всё это дело в файл base64.txt, причём в результаты выводит не только имя файла и путь к нему но и найденное в нём сочетание. Очень удобно, согласитесь.

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

В конце приведу словесный пример: если в результатах такого поиска у вас есть файл в котором всего одна строка но оооооооооооочень длинная и содержащая «мусорные» последовательности то это 95 процентов Shell-скрипт.

Да вот ещё что забыл упомянуть: эта «дрянь» может содержаться не только в файлах *.php, но и во многих других (например *.js), потому при поиске советую менять в параметре -name его значение на друге маски. Так, поверьте, будет надёжнее.

За сим желаю Вам удачи в борьбе и «пусть дрогнет рука врага поднявшего свой клинок на Вас»…

Запись опубликована в рубрике Linux с метками , , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий