Morgens klingelte der Wecker… ich quälte mich aus dem Bett, denn an diesem Tag stand viel im Kalender. Wir haben unsere Sauna und die dazugehörige Gartenhütte abgerissen, so etwas verursacht eine Menge Müll. Müll, der nicht einfach in den Restmüll geworfen werden kann, sondern Bitumen, Styropor, Glaswolle und eine Menge Holz, also wirklich eine Menge Holz! An diesem Tag wollte ich möglichst viel Holz mit dem Anhänger zum Wertstoffhof bringen, weil auch Verbrennen keine adäquate Lösung darstellt… wir sprechen hier immerhin von über einer Tonne Holz, dass ist schon ordentlich Material. Ich stand also auf, haute mir Wasser ins Gesicht, schrubberte die Zähne und sprang raus um den Hänger zu beladen. Es war irgendwie kurz nach 7 Uhr als ich losfuhr. Und während der Autofahrt erhielt ich eine Nachricht, von der ich in diesem Moment noch nicht ahnte, was sie mir für Arbeit machen würde.

Ein kurzes Wort zum Setup

Ich besitze eine Hand voll VDS und VPS, oder anders ausgedrückt: Virtuelle Server. Auf allen liegen unterschiedliche Dinge. Ich habe einen Server, der läuft schon seit 2016, auf diesen liegen alle meine WordPress und Joomla Instanzen, Shopsysteme, Rocketchat, Nextcloud und so ein paar andere Tools. Was man eben alles so braucht. Damit all das reibungslos läuft braucht es zum einen natürlich einen Webserver, PHP, SQL Datenbanken und einen SFTP – letzterer ist zwar nicht zwingend erforderlich, erhöht jedoch das Level an Komfort. In jungen Jahren habe ich schmerzlich gelernt, was es bedeutet Admin eines Servers zu sein, welcher am Netz angeklemmt ist. Viel gelernt über die Jahre sind all meine Server unglaublich gehärtet – ich kann hier nicht ins Detail gehen, weil wir wollen es Angreifern ja nicht einfacher machen als es sein muss – aber glaubt mir wenn ich sage, ich ziehe bei der Server Sicherheit alle Register und verhalte mich überdurchschnittlich paranoid. 🙂 Alle Sicherheitssysteme sind auch redundant, sodass selbst bei einem Ausfall eines Angriffsvektors, zusätzliche Maßnahmen eine Kompromittierung erschweren.

PHPNuke war vor unzähligen Jahren der Funke zum Content-Management System Feuer. Joomla (damals noch Mambo) löste das System irgendwann ab, aber es war träge, unnötig komplex und für reines Schreiben definitiv nicht die richtige Wahl. Irgendwann erschien dann WordPress und ich war relativ schnell verliebt und es ist völlig klar warum: Schneller Installationsprozess, super „leicht“ und damit super schnell, einfach in der Handhabung und trotzdem dank Theme-System und Plugins sehr flexibel. Könnte man den bums nicht auch einfach selbst programmieren? Klar und in aktuellen Zeiten geht es vermutlich auch richtig schnell, wenn man einfach kurz ChatGPT, oder besser, Claude damit beauftragt, aber warum das Rad neu erfinden? Außerdem nimmt dir WordPress und das eine oder andere Plugin noch zusätzlich die SEO ab – hilfreich! Und an diesem Punkt muss ich dann kurz an Spider-Man denken und Onkel Bens berühmten, jetzt abgewandelten, Satz: Mit großem Funktionsumfang, wächst große Angriffsfläche!

Was war passiert?

Ich war also auf dem Weg zum Wertstoffhof als ich Meldung eines meiner Monitoringsysteme bekam: Eine Website war offline! Kurz darauf kam dann auch schon die nächste Meldung, dass eine weitere Website offline sei… und kurz darauf die nächste. Das war erst mal nicht ungewöhnlich, da ich einige Cronjobs laufen habe, welche Wartungsarbeiten automatisiert übernehmen, dabei werden Dienste auch mal neugestartet, was dann zu einem kurzen „Ausfall“ führt. Auch bei der Installation von Updates werden Prozesse beendet – soweit so richtig. Ich wunderte mich also im ersten Atemzug nicht darüber. Als ich am Wertstoffhof dann all das Holz ausgeladen hatte, fragte ich mich, ob meine Websites wieder online sind, denn normalerweise erhalte ich ebenso eine Meldung, sobald die jeweilige Seite wieder erreichbar ist. Diese Meldung kam aber nicht und das empfand ich als ungewöhnlich. Ich checkte also, während ich auf das Wiegen wartete, schnell 1-2 Websites und bekam nur eine weiße Seite. Da ich mich nun auf der Waage befand, konnte ich hier keine Analyse durchführen, immerhin muss ich meine Kiste da ja auch wieder wegbewegen. Unterwegs grübelte ich dann, woran es liegen konnte… es betraf zwei Websites, möglicherweise aber noch mehr, da mehrere Offline gegangen sind. Gab es ein automatisches Update seitens WordPress oder eines meiner Plugins, welches ich überall verwende und hat dieses ggf. einen Fehler geworfen? Vielleicht klemmt aber auch irgendwas am Webserver oder ein PHP Update hat den FPM geschrottet, vielleicht klemmt auch nur eine config. Ich rechnete kurz durch wie lang ich für jeden Fehler brauchen würde, da ich ja an diesem Tag noch viel zu erledigen hatte und konnte es kaum erwarten Zuhause anzukommen, schnell ein bisschen in die Tastatur hauen und weiterzumachen.

Zuhause angekommen wollte ich mich schnell ins Admin Backend einloggen… Ich gab also den Pfad ein und… Nichts! Weiße Seite. Ich startete den Webserver manuell neu. Nichts. Ich startet PHP manuell neu. Nichts. Ich wechselte schnell auf eine kleinere PHP Version um Inkompatibilitäten auszuschließen. Nichts. Ich deaktivierte mittels SSH schnell mein Theme und wechselte auf das Standard Theme, nicht das hier was klemmt. Nichts. Ich schob den Plugin Ordner aus dem Verzeichnis damit WordPress keine Plugins laden muss, welche evtl. beschädigt sind. Nichts. Das war ungewöhnlich. Wenn der Webserver keinen Fehler wirft, der PHP FPM ebenso nicht, es keine Plugins gibt und auch kein Theme welches quer schießt, wo soll dann noch der Fehler sein? Auf dem Weg in die Logs, fiel mir dann auf, dass die Index.php an diesem Tag um 05:05 Uhr geändert worden ist. Ein Update könnte das zwar verursacht haben (auch wenn die Index.php nahezu nie angerührt wird), aber mir viel zusätzlich auf, dass um diese Uhrzeit viele Dateien geändert worden sind. Schnell mittels Befehl mir Dateien auf dem Webserver anzeigen lassen, welche um 05:05 Uhr verändert worden sind – und das betraf so ziemlich jede Datei mit einer .php Endung. Spannend auch, selbst Ordner wurden um diese Uhrzeit geändert. Während ich mittels ls -lah in die Ordner schaute, merkte ich auch, dass viele Dateien und Ordner plötzlich chmoddet worden sind, ich war umzingelt von -rwx-rwx-rwx – und damit erhärtete sich der Verdacht, den ich bekam als ich sah, dass viele Dateien zur selben Uhrzeit geändert worden waren: Ich wurde gehackt!

Ein erfolgreicher Angriff mittels SSH hielt ich für ausgeschlossen – Fail2Ban blockt die IP Adresse nach zwei Fehlerhaften Loginversuchen. Um mein Kennwort zu erraten, braucht es definitiv mehr Versuche. Zeitgleich ist das PW ja nur der erste Step, ohne meine sicher verwahrten RSA Keys ist ein Zugriff immerhin trotz Kennwort nicht möglich – und der Webserver läuft dann noch über einen User, welcher mittels SSH gar keinen Zugriff hat – und all das, während ich nicht mal den Standard Port für SSH verwende. Ich war mir also relativ sicher, dass der Angriff über WordPress erfolgt sein muss. Ich fuhr also den Webserver runter und deaktivierte PHP, damit keine Skripte mehr ausgeführt werden können. Ich warf erst mal einen Blick in die veränderte Index.php und da offenbarten sich mir chinesische Schriftzeichen – ich hab die da bestimmt nicht hingetan. 😀 Als ich mir weitere Dateien ansah, fand ich eine ganze Menge. Stark obfuskierten Code, eigene Entschlüsselungsroutinen, verschleierte Strings.. da hat sich jemand eine Webshell gebastelt. In unzähligen Dateien stolperte ich über Payloads, in einer Instanz sogar einen PHPMailer. Offenbar sollte mein Server zur Spamschleuder umfunktioniert werden. Ich suchte also gezielt nach den bekannten Payloads und schaute mir explizit jede Datei an, welche um 05:05 Uhr geändert worden war… und löschte sie bzw. ersetzte sie durch das Original. Den WP Core hab ich prüfen und mit Originaldateien wiederherstellen lassen. Ein Malware Scan hab ich ebenso durchlaufen lassen. Und anschließend änderte ich jedes Kennwort, da ich davon ausgehen muss, dass diese Daten abgegriffen worden sind. Etwas, das ich sonst immer tue, aber hier bisher noch nicht getan habe: 2FA für den Admin. Nun, seit heute tue ich es auch bei meinen Websites. 😀

Erwischt hatte es vier Blogs… Tekkie.eu, TeslaTime.de, das Blog meines Bruders und dieses hier. Stand jetzt ist TeslaTime.de und offensichtlich dieses Blog wieder online, Tekkie.eu ist erst mal offline – hier sind viele Dateien umgeschrieben worden, da brauch ich etwas mehr Zeit. Ich hör schon den Satz „Spiel doch einfach ein Backup wieder ein!“… ja ja ja.. ich erzähl ja auch jedem immer wieder dass er Backups machen soll, aber zuletzt bin ich hier selbst etwas schludrig geworden. Automatische Backups haben den Speicherplatz immer mehr gefressen und ich hatte sie erst mal deaktiviert. Ich mein… 10 Jahre lang ist nichts passiert.. wird schon nichts schief gehen. 😛
Ich hab hier also ein zwei Monate altes Backup und in der Zwischenzeit ist viel passiert. Also nein danke. 😀

Wie konnte das eigentlich passieren?

Nachdem ich alles weitestgehend bereinigt hatte, fragte ich mich, wie das eigentlich passieren konnte. Die Systeme sind immer recht aktuell, ich verwende auch grundsätzlich keine unbekannten oder veraltete Plugins und auch sonst hab ich es lieber Rock-Solid als Fancy. Nun.. ich habe vor gut zwei Jahren meinem kleinen Bruder ein Blog aufgesetzt. Ich sagte zwar, dass ich mich um die Serverwartung kümmere, damit meinte ich aber nicht, dass ich seine WordPress Instanz, oder gar seine Plugins, update. Er war hier mit einem uralten System unterwegs, dass nur darauf gewartet hat gefunden zu werden. Nachdem sich über seine Instanz Zugriff auf den Webserver verschafft worden ist, fingen die Chinesen an ein Blog nach dem anderen zu infizieren. Offenbar haben sie ja mit einem Script gearbeitet, warum sie nur diese vier Blogs erwischt haben, entzieht sich dann meiner Kenntnis. Womöglich, weil all die anderen Blogs in anderen Ordnern verteilt liegen und deren Script primitiv gewesen zu sein scheint. Auch spannend: Nicht jede Instanz wies die selbe Art und Weise auf, wie die Dateien verändert worden sind. In einer Instanz wurden zusätzliche .php Dateien erzeugt, in einer anderen wurden Dateien überschrieben und verändert und in der nächsten wurden ganze Ordnerstrukturen umbenannt.

Beim nächsten mal, sollte ich meinen Bruder mit in die Forensik nehmen, damit er sieht, was passieren kann. Ich denke zusätzlich, nachdem ich sein Blog wieder online nehme, dass ich dort ein wachsameres Auge drauf werfen werde – und mindestens automatische Updates aktiviere. 😀 Was soll ich sagen? Gegen Layer 8 Probleme hilft kein Tool der Welt!

Was nehm ich mir für die Zukunft mit?
Neben 2FA für jedes Blog, installiere ich zusätzlich ein Monitoring welches mich bei veränderten Dateien benachrichtigt. Das ist sicher richtig nervig, weil ständig was in Bewegung ist, aber meistens weiß ich ja davon. Zusätzlich kommt Wordfence auf jedes Blog – einfach nur um einen explizit auf WordPress abgestimmten Malwarescanner und eine Firewall für jede Instanz zu haben. Gut ist, dass nichts weiter passiert ist, weil ich recht schnell reagiert habe. In China war man noch damit beschäftigt eine Redundanz aufzubauen, damit ich sie nicht mehr aussperren kann, da nahm ich ihnen bereits sämtlichen Handlungsspielraum und habe das Tor (vorerst) für immer versiegelt. Auch wenn ich den Trubel nicht gebraucht hätte: Es hat Spaß gemacht. 🙂

Unterm Strich bleibt eines aber noch zu sagen: Trotz allem.. obwohl es mich eine Menge Zeit gekostet hat: Jedes Stückchen Holz hat es noch bis zum Wertstoffhof geschafft, sodass mein Garten nun frei von Latten und Balken ist – bis zum nächsten Umstyling-Projekt. 😛

Kategorisiert als: