Malware in WordPress entfernen
Wenn eine WordPress-Site gehacked wurde, ist das in aller Regel sehr ärgerlich. Die Website funktioniert dann oft nicht mehr richtig und im schlimmsten Fall wird der eigene Webserver als Virenschleuder verwendet. WordPress Plugins zur Entfernung von Malware helfen leider oft nicht weiter. In diesem Howto beschreibe ich daher einen manuellen Weg, wie man Schad-Software oder Malware aus WordPress entfernen kann.
Für alles Folgende braucht man den Zugriff auf den Webserver. In unserem Fall ist das Linux.
Hinweis: Wer keinen direkten Shell-Zugriff auf seinen Webserver hat, der sollte sich den kompletten Dateipfad bzw. Ast mit den WordPress-Dateien herunterladen und anschließend die Schritte am eigenen PC durchführen.
Inhalt
Ausgangs-Situation
In unserem Fall war die betroffene Website für kurze Zeit weiß, d.h. ohne Inhalt. Eine komplette De-Aktivierung und anschließende Aktivierung aller WordPress-Plugins brachte den Content, d.h. die Blog-Beiträge wieder zurück. Allerdings traten immer wieder sporadische Warnungen von Viren-Scannern auf und die Zugriffszahlen halbierten sich innerhalb von wenigen Tagen. Hier stimmte offenbar etwas nicht.
Die Vermutung lag also nahe, daß auf der Website irgendwo eine Malware bzw. Schadcode von einem Hacker platziert worden war.
Wie Haker (hier) Schad-Software platziert haben:
Um die Malware zu finden, muss man sich ein wenig in den Hacker hinein versetzen.
Er will in der Regel seinen Code möglichst lange unentdeckt wissen. Dabei gibt er sich (mehr oder weniger) Mühe, seinen Hack unentdeckt zu lassen. Sein Quell-Code wird also eher schlecht zu lesen und eher kryptisch aussehen.
Im Gegensatz dazu ist der Quell-Code eines WordPress-Entwicklers in der Regel so geschrieben, daß ihn ein fachkundiger PHP-Entwickler gut lesen kann. Das ist exakt das Gegenteil von der Intention eines Hackers.
Wie sieht Malware in WordPress aus?
In unserem Fall sah der fragliche Code so aus:
index.php im Root-Verzeichnis:
/*48365*/ @include "\057var\057www\057vho\163ts/\142ite\156o.c\157m/h\164tpd\157cs/\167p-c\157nte\156t/.\061c4c\063535\056ico"; /*48365*/
Die Zeile würde im Klartext lauten
@include \var\www\vhosts\domain.tld\httpdocs\wp-content\.irgendwas.ico
Der eigentliche Schadcode liegt dann in eben dieser Datei \var\www\vhosts\domain.tld\httpdocs\wp-content\.irgendwas.ico
Der Inhalt dieser Schadcode-Datei sieht dann bspw. so aus:
<?php $_89elm2n = basename/*d*/(/*hn4mp*/trim/*ab4wn*/(/*9ujf*/preg_replace/*lqwxr*/(/*5xf*/rawurldecode/*kzjbg*/(/*e6*/"%2F%5C%28.%2A%24%2F
oder so
<?php $_19gi0c = basename/*qv*/(/*l2*/trim/*vqjr*/(/*i9*/preg_replace/*i4o*/(/*4zx*/rawurldecode/*4*/(/*roi2*/"%2F%5C%28.%2A%24%2F"/*72as*/)/*5p*/, '', __FILE__/*ihz*/)…….
Der Mechanismus der Malware
Der Entwickler der Malware legt also seine kryptische Datei an irgendeiner bestimmten Stelle im Dateisystem des Webservers ab. Diese Datei beginnt in der Regel mit einer Variablen-Zuweisung und dem Schlüsselwort „basename“ oder „base64“.
Diese kryptische Datei wiederum soll von möglichst vielen Stellen im PHP-Quell-Code aufgerufen werdeb. Dazu wird vom Eindringling ein „Einzeiler“ mit Hilfe eines @include-Statements in eine bestehende PHP-Datei von WordPress eingefügt. Diese Zeile kommt also etwa in eine oder mehrere bestehende index.php Datei in der betroffenen WordPress-Installation.
Auffinden der Malware in WordPress:
Bei der weiteren Suche geht es erst einmal darum, diese schadhaften Dateien zu finden. Außerdem müssen wir den Ort in der vorhandenen Anwendung (hier WordPress) finden, von wo aus die Schadsoftware ausgeführt bzw. aufgerufen wird. Dies erfolgt in der Regel über eine @include Anweisung in php.
Vorgehen: Wir suchen zuerst nach der eigentlichen Datei mit dem Schadcode. Dies sind in der Regel wenige Dateien, manchmal sogar nur eine einzige Datei. Danach machen wir uns auf die Suche nach den Orten im PHP-Quell-Code, in dem diese zuvor entfernte Schadsoftware-Datei aufgerufen wird. Das sind häufig mehrere Stellen, oft sogar viele.
Konkretes Vorgehen zur Entfernung der Malware
Eigentliche Schadsoftware entfernen
Zuerst suchen und entfernen wir also die eigentliche Schadsoftware:
Um die schadhafte Datei zu finden sichen wir rekursiv durch die Inhalte der lesbaren Dateien und suchen mit grep nach den PHP-Schlüsselwörtern, die der Hacker in seinem Quell-Code nutzt:
Das sind der Reihe nach: basename, preg_replace, rawurlencode und später noch „__FILE__“
Wir suchen deshalb rekursiv nach diesen Begriffen. Wichtig dabei ist, daß wir uns nicht auf einen Dateitypen festlegen. Der Angreifer verwendet hier in unserem Beispiel absichtlich die Endung .ico (Datei-Endung für Icon-Grafiken) und einen Punkte am Anfang des Dateinamens, was die Datei unter Linux ein weniger schwerer zu finden macht. Die Datei wird dann mit einem „ls -la“ nicht angezeigt.
grep -iR basename *| grep -i replace | grep -i rawurldecode
Hinweis: Den “*” kann man bei grep im Zusammenspiel mit der Option “-R” (für rekursiv) weg lassen.
oder etwas ausführlicher noch mit der Suche nach dem Schlüsselwort „__FILE__“
grep -iR basename | grep -i replace | grep -i rawurldecode | grep -i "__FILE__"
Die so ermittelten Treffer löschen wir oder noch besser: Wir verschieben die Datei(en) in einer separates Verzeichnis, um sie ggf. später noch weiter zu untersuchen.
@include-Anweisungen finden und entfernen
Im zweiten Schritt machen wir uns nun an das Suchen und Entfernen der Aufrufe der Schadsoftware in WordPress. Wir suchen also die @include-Anweisungen in PHP:
Die Anweisung @include kommt in PHP in legitimer Software sehr häufig vor. Allerdings hat ein normaler Programmierer selten das Problem, daß er in seinem Quellcode lange Dateinamen aufruft. Das würde ein Entwickler eher über eine Variable in PHP lösen. Um also die @Include Anweisungen zu finden, schauen wir uns nochmal die Zeile an, die der Angreifer in unserem Code platziert hat:
@include "\057var\057www\057vho\163ts/\142ite\156o.c\157m/h\164tpd\157cs/\167p-c\157nte\156t/.\061c4c\063535\056ico";
Das liest sich schon wesentlich schlechter und ist für einen Laien kaum verständlich. Letzteres ist hier selbstverständlich vom Angreifer beabsichtigt.
So kann man die Dateien finden von der aus die Malware aufgerufen wird:
Wir suchen nach dem Begriff „@include“ und danach nach dem „\“, der in dem Include-Statement häufiger vorkommt.
cd /var/www/domain.tld grep -iR "@include" * | grep -iF '\'
Hinweis: Die ‚ am Ende statt “ sind richtig und wichtig
Man wird so noch die eine oder andere CSS Datei finden, die uns hier nicht interessiert.
Daher könnte man die Suche auf *.php Dateien einschränken:
grep -iR "@include" *.php | grep -iF '\' # die ' am Ende statt " sind richtig und wichtig
In allen Dateien die hier gefunden werden, muss nun die Zeile bzw. die Zeilen mit den @include Statement entfernt werden.
Sofern das immer der gleiche Eintrag ist, dann geht das z.T. automatisch mit awk oder sed. In aller Regel wird der Hacker aber das so genannte Encoding (hier das Ersetzen der Zeichen und Buchstaben durch ASCII Code) variieren, so daß man häufig dazu gezwungen ist, den Schadcode bzw. die Malware von Hand zu entfernen.
Wir müssen also die gefundenen php-Dateien von Hand editieren, die betroffene Zeile löschen und die Datei anschließend speichern. Das erledigen wir mit „vim“ oder nano.
Tipp: Sofern möglich sollte man anschließend die Datei mit dem folgenden Kommando für generelle Schreibzugriffe sperren:
chmod 555 index.php ls – la index.php
Alternativen zur manuellen Entfernung:
Wer sich sicher ist, daß in seinen Blog-Einträgen bzw. in der WordPress-Datenbank selbst kein Schadcode enthalten ist, der kann die WordPress-Dateien sowie das WordPress-Theme und die Plugins komplett neu installieren bzw. über die bestehenden Dateien kopieren und damit überschreiben. Damit wird dann in der Regel auch die schadhafte @include Anweisung entfernt.
Achtung: Die eigentliche Schad-Software wird man so aber nicht 100% los. Die Malware-Datei – in unserem Fall die Datei „.irgendwas.ico“ sollte man unbedingt vorher entfernen.
Plugins zur Schadensbegrenzung und Entfernung
Der Vollständigkeit halber sind hier noch zwei Plugins, die WordPress-Administratoren helfen, Schadcode zu finden. – In den Fällen, die wir hier gezeigt haben, konnten die Security-Plugins allerdings die Malware in WordPress nicht finden.
Wie kam die Malware dorthin?
Wir haben uns in diesem Tutorial darauf konzentriert, die Malware möglichst sicher zu entfernen. Als Website-Betreiber möchte man dieses aufwändige Unterfangen allerdings nicht noch mal machen müssen. Daher sollte man im zweiten Schritt unbedingt herausfinden, wie die Malware auf den Server gekommen ist.
Dabei hilft es sehr, wenn man seine WordPress-Installation mit einem oder mehreren Security-Plugins – wie etwa Better-WP-Security schützt.
Fazit zum Thema Malware entfernen
Der beste Schutz für WordPress ist meistens ein gut gepflegtes und aktuelles WordPress, in dem ein passendes Security-Plugin installiert und aktiv ist. Wer aber den sprichwörtlichen Schaden schon hat, der kann mit etwas Fleiß, Zeit und Mühe manuell mit der obigen Anleitung seine WordPress-Website von Malware befreien.
- Über den Autor
- Aktuelle Beiträge
Matthias Böhmichen ist der Gründer der Website howto-do.it . Linux nutzt er seit 1991 um kurz danach Windows zu entdecken. Er entdeckt gerne neue Technologien und verbringt seine Zeit damit, sie für Kunden nutzbar zu machen. Im Hauptberuf ist er CEO der Biteno GmbH