WordPress-Hack: „transandfiestas.ga“-Malware entfernen und System sichern

Vermutlich seit Dezember 2020 treibt ein mir bisher unbekannter WordPress-Hack sein Unwesen. Betroffene Content-Management-Systeme leiten nach zahlreichen Redirects auf dubiose Downloads wie vermutlich infizierte Versionen des Flash Players. Es scheint als hätten die Angreifer die in Agenturen dünn-besetze Zeit rund um die Weihnachtsfeiertage genutzt um WordPress-Systeme zu kompromittieren und Schäden anzurichten.

Wie äußerte sich der WordPress-Angriff?

Aufrufe der Webseiten und des Dashboards (/wp-admin) wurden x-fach weitergeleitet. Die Systeme waren nicht mehr zugänglich – weder für Besucher, noch für Administratoren.

Ein erster Einblick in die betroffenen WordPress-Systeme zeigte, dass in der Datenbank Einträge manipuliert wurden.

wp_options: Gekaperte siteurl

Hier wurden siteurl und – sofern genutzt – die home-url verändert. Interessanterweise enthielten diese Datendankfelder nicht valide URLs. So starteten diese nicht mit https://, sondern mit http;// – also mit einem Semikolon statt eines Doppelpunkts.

Die URLs hatten folgendes Schema:

https;//main.travelfornamewalking.XX/det.php?id=pnXXXXX-XX-XXX-XXX

Weitere URLs in der Weiterleitungsschleife waren diese: XXXX.helpmart.ga/js.php?s=q, XXX.lovegreenpencils.ga/goto?ad_campaign_id=XXXX, colorsantaname.ga/?p=XXXXXXXXXXX, url-partners.g2afse.XXX/click?pid=XXXX und bestprize-places-here1.XXXX/?u=XXXXX (URLs gekürzt).

wp_posts: Manipulation des post_content

In der wp_posts Tabelle wurden die post_content Felder angepasst und Ihnen wurde ein JavaScript, welches offenbar für die Weiterleitung sorgte, angehangen. Diese hatte folgenden Aufbau:

<script src='https://https://XXXX.transandfiestas.ga/js.php?s=q' type='text/javascript'></script>

Verändertes Admin Passwort

Nach Bereinigung der Datenbankfelder war noch immer kein Login möglich. Das Admin-Passwort wurde offenbar verändert und ein Zugang zum WordPress-Dashboard somit nicht möglich.

„transandfiestas.ga“ WordPress-Hack entfernen

Datenbank und Webspace sichern

Zuerst sollte ein komplettes Backup der gehackten Seite gemacht werden. Alle folgenden Tipps sollten nur von Personen ausgeführt werden, die wissen was sie an der Stelle tun. Ich übernehme keine Gewähr und rate daher dringend: macht bitte vorher ein Backup!

WP-Installation mit einem .htpasswd-Schutz versehen

Wenn Ihr die Datenbank (z.B. via phpmyadmin Export) gesichert habt und Euch auch alle Dateien einmal lokal (oder serverseitig in einem ZIP) gesichert habt, solltet Ihr als erstes das gesamte System mit einem htaccess Schutz sichern. So können während der Reparatur keine Besucher, aber auch keine Bots oder Menschen, die Böses im Schilde führen auf die Seite zugreifen.

Datenbank reparieren (z.B. mit phpmyadmin)

Wechselt zunächst in die wp_options Tabelle und tragt dort für die Optionen siteurl und home wieder die gewünschten URLs ein.

Für die wp_posts Tabelle kann man sich mit folgendem SQL-Befehl helfen. Dieser sucht in dem Feld „post_content“ nach Vorkommnissen von dem Skript-Bestandteil „transandfiestas“ und ersetzt in diesen Zeilen den gesamten Script-Part durch “ – der Script-Block wird also entfernt:

UPDATE wp_posts SET post_content = REPLACE(post_content,"<script src='https://https://port.transandfiestas.ga/js.php?s=q' type='text/javascript'></script>",'') WHERE post_content LIKE '%transandfiestas%'

Wenn ein eigener Tabellenpräfix verwendet wird, muss wp_posts entsprechend angepasst werden. Bevor Ihr die Abfrage ausführt, könnt ihr diese zunächst simulieren. Dann seht Ihr schon mal wie viele Zeilen aktualisiert werden durch die SQL-Abfrage.

Admin-Passwort zurücksetzen

Um das Passwort für den WordPress-Admin zurückzusetzen, gibt es zwei Möglichkeiten:

  1. Nutzung der „Passwort zurücksetzen“-Funktion
    In den mir bekannten Fällen wurden die E-Mailadressen der Administratoren nicht verändert und lediglich ein neues Passwort gesetzt, daher kann die klassische „Passwort vergessen“-Funktion genutzt werden (/wp-login.php?action=lostpassword)
  2. Änderung des Passworts über die Datenbank
    Hier navigiert ihr via phpmyadmin in die wp_users Tabelle, sucht dort euren Admin-User und wechselt in den Bearbeitungsmodus. Wichtig ist, dass Ihr das neue (temporäre) Passwort als md5-String einsetzt. Ihr könnt Euch dann zumindest wieder einloggen. Da WordPress – soweit ich weiß – die Passwörter auch „salted“, würde ich nach erfolgreichem Dashboard-Login erneut ein neues Passwort setzen.

Datenbank-Passwort ändern

Eine Änderung des Datenbank-Passworts ist in jedem Fall anzuraten. Das macht Ihr am besten bei Eurem Webhoster und tragt dann das entsprechende neue Passwort in der wp-config.php ein.

Dateisystem prüfen

In manchen Fällen (siehe Kommentare) wurden im System auch unerwünschte Erweiterungen abgelegt. Prüft daher unbedingt auch das wp-content/plugins-Verzeichnis, ob ein Euch unbekanntes Plugin (wie „wp-sleeps“) dort installiert wurde.   Außerdem sollten die index.php / index.html Files im System gecheckt und eventueller Schadcode entfernt werden.

Nun sollte sowohl die Webseite als auch das Dashboard wieder erwartungsgemäß funktionieren. Die Ursache bzw. die Schwachstelle ist damit aber noch nicht behoben.

WordPress-System absichern

Es gibt viele Möglichkeiten in WordPress-Systeme einzudringen. Der Einsatz von zahlreichen Plugins ist einer davon. Nachfolgend einige Tipps wie WordPress etwas besser abgesichert werden kann.

WordPress aktualisieren

Das System sollte aktuell sein. In beiden mir bekannten Fällen des oben beschriebenen WP-Hacks waren WordPress-Systeme der Version 5.2.9 betroffen. Aktuell ist WP in Version 5.6 verfügbar. Auch hier ist es (wie auch bei den im folgenden beschriebenen Plugin-Updates) sinnvoll Backups im Vorfeld anzufertigen – lieber eine Sicherung zu viel als eine zu wenig.

Plugins aktualisieren und aufräumen

Grundsätzlich sollten nur regelmäßig von den Entwicklern gewartete Plugins mit einer gewissen Reputation eingesetzt werden. Prüft zunächst welche Plugins ihr wirklich (noch) braucht und entfernt nicht mehr benötigte Erweiterungen.

Auch Plugins sollten aktuell gehalten werden. Aktualisiert hier am besten schrittweise und prüft nach jedem Plugin-Update zunächst die Funktion der WordPress-Webseite.

WordPress-Admin: Keinen „admin“ User verwenden

Früher war es Standard, dass der Admin-User von WordPress den Namen „admin“ hatte. Somit öffnet Ihr quasi allen Angreifern schon ein bisschen die Tür, da damit bereits ein Teil des Logins bekannt ist. Denkt Euch etwas anderes aus und wählt einen untypischen Usernamen für den WP-Administrator.

Die Änderung eines bestehenden Admin-Users ist nicht ganz leicht. Über das Dashboard ist dies nicht möglich. Es muss entweder auf eine Pluginlösung zurückgegriffen werden (z.B Username Changer) oder auf Datenbankebene gearbeitet werden. Eine Anleitung hierzu folgt.

API-Zugriff auf die WordPress-User unterbinden

Standardmäßig kann durch die Nutzung der REST-API Schnittstelle bei jedem WordPress-Blog herausgefunden werden wie die User des Systems heißen. Dazu genügt folgender Aufruf:

/wp-json/wp/v2/users

Wie man gezielt diesen Endpunkt deaktivieren kann, habe ich nicht gefunden, daher habe ich das „quick & dirty“ über eine Weiterleitung in der htaccess geregelt. Falls hier jemand eine bessere Lösung hat, gerne rein in die Kommentare:

Redirect 301 /wp-json/wp/v2/users /

XML-RPC Schnittstelle deaktivieren

Die XML-basierte Schnittstelle ermöglicht es externen Tools und Apps (wie z.B. der offiziellen WordPress-App) auf den WordPress-Blog zuzugreifen. Angreifer können die XML-RPC-Schnittstelle dagegen nutzen um sich x-fach in Sekundenschnelle mit unterschiedlichen Zugangsdaten in das System einzuloggen.

Es gibt drei Möglichkeiten die Schnittstelle zu deaktivieren: per functions.php, per htaccess oder per Plugin. Die einfachste Variante dürfte der Einzeiler in der functions.php sein:

add_filter('xmlrpc_enabled', '__return_false');

Alternativ können in der .htaccess folgende Zeilen eintragen und ggf. eine feste, eigene IP-Adresse für die Verwendung von XML-RPC erlauben:

<Files xmlrpc.php>
order deny,allow
deny from all
#allow from xxx.xxx.xxx.xxx
</Files>

Theme-Editor deaktivieren

Standardmäßig können Administratoren im Dashboard über Design > Theme-Editor die einzelnen Templates und Files des Themes verändern. Das ist zum einen nicht wirklich praktisch, da einem Code-Editor-Funktionen fehlen und zum anderen ein großes Sicherheitsrisiko. Den Theme-Editor kann man über die wp-config.php im WordPress-Root deaktivieren:

define( 'DISALLOW_FILE_EDIT', true );

Auto-Updates auch für Plugins aktivieren

Mit der neuesten WP-Versionen sind Auto-Updates auch für Plugins möglich und können easy per Pluginübersicht im Dashboard aktiviert werden. Ich empfehle dies zumindest für unkritische Plugins zu tun. Unkritisch meint in diesem Fall Plugins, die keine essentielle Funktion für die Webseite liefern – also z.B. Backend-Tools für Bild-Beschnitt oder dergleichen.

Nach Absicherung des Systems sollte der htpasswd-Schutz wieder entfernt werden.

Wie sicher ist WordPress?

Diese Frage ist nicht leicht zu beantworten. Es gibt wahrscheinliche keine unknackbaren Content-Management-Systeme. WordPress ist sicherlich attraktiver als viele andere Systeme, da es einfach am weitesten verbreitet ist. Man kann es zumindest versuchen potentiellen Angreifern möglichst schwer zu machen.


3 Gedanken zu „WordPress-Hack: „transandfiestas.ga“-Malware entfernen und System sichern

  1. Hallo Kai,
    danke für deinen Beitrag hier! In unserem Fall wurde beim Kunden auch ein Plugin „wp-sleeps“ installiert und viele Dateien auf dem Filesystem infiziert. Meistens wurden in die index.php/html- Dateien das Script eingefügt. In unserem Fall waren es:

    Also auf jeden Fall auch das Filesystem scannen.

  2. Hey knuspermedia!
    Danke für Euer Feedback zu dem Thema. Während meiner Recherchen bin ich auch über das wp-sleeps Plugin gestolpert. In unserem Fall wurde dieses nicht im Pluginverzeichnis abgelegt. Entweder das ist ein Random-Verhalten oder aber irgendeine Einstellung serverseitig hat hier Schlimmeres verhindert.

    Eure Dateiauflistung ist leider abhanden gekommen.

    Habt Ihr denn die Ursache herausfinden können? Die einzige Gemeinsamkeit, die wir bei beiden Projekten feststellen konnten, war die WP Version 5.2.9 und der Einsatz von Contact Form 7, welches Ende Dezember eine Sicherheitslücke bekannt gab: https://www.heise.de/news/Angreifer-koennten-Schadcode-auf-Millionen-WordPress-Websites-hochladen-4993717.html

    Beste Grüße,
    Kai

  3. Hallo Kai,
    hier noch mal die Dateiauflistung:

    … src=’https;//port.transandfiestas.ga/stat.js?n=jo1′ type=’text/javascript‘ …
    … src=’https;//fort.transandfiestas.ga/stat.js?n=jo1′ type=’text/javascript’…
    … src=’https;//main.travelfornamewalking.ga/stat.js?n=jo1′ type=’text/javascript‘ …

    Die Ursache konnten wir noch nicht finden. Vermuten aber auch das es an der WordPress Version oder einer veralteten Plugin- Version lag.

Kommentare sind geschlossen.