Ein kurzer Blick auf eine kompromittierte Windows-Maschine

Mir ist die Tage - mal wieder - eine kompromittierte Maschine unter die Finger gekommen - diesmal eine Windows-Maschine; ich hatte ja schon einmal bei so einem Vorfall ein paar Infos aufgeschrieben, und da ich für den Artikel viel positives Feedback bekommen habe, dachte ich, ich mache das diesmal wieder :-) Allerdings wird's diesmal nicht so umfangreich, da ich dieses mal quasi nur als Berater hinzugezogen wurde, das eigentliche Doing jemand anderem überlassen mußte.

Aufgefallen war die Sache, daß beim Abrufen der darauf gehosteten Webseiten plötzlich Meldungen vom Virenscanner kamen. Das ganze sah nicht nach einem gezielten Hack aus, sondern eher nach der "Standard-Masche":

  • Ein Skript sucht nach bekannten Lücken.
  • Diese werden automatisiert exploitet, um in den Rechner einzudringen.
  • Auf dem Rechner wird nach html-Dateien (und ähnlichem) gesucht und dort entsprechender Schadcode integriert.
  • Optional hinterläßt das Skript noch ein "Kuckucksei" auf dem Rechner, so daß dieser seinerseits beginnt, im Netz nach verwundbaren Rechnern zu suchen.

Der JavaScript-Code (natürlich obfuscated) war schnell gefunden; bei dieser Gelegenheit habe ich zwei sehr hilfreiche Tools im Netz gefunden, um solche Skripte zu analysieren:

  • Ein Converter-Tool zum unescapen der obligatorischen Prozent-Irgendwas-Encodings
  • Ein online JavaScript Code Beautifier (und Entpacker). Der hat mir erfolgreich den häßlich in eine Zeile zusammengezogenen JS-Code sehr hübsch formatiert; zunächst hatte ich vor, das ganze mit einem JS-Debugger auszuführen, da wäre das sehr praktisch gewesen...
  • ...der JSUNPACK hat mir das aber faktisch abgenommen :-) Hier habe ich auch bereits eine fertige Analyse des gefundenen Schadcodes gefunden - betroffene der Rechner war also kein Einzelfall ;-)

Das Skript hat im Endeffekt eine URL zusammengebaut, um von dieser den tatsächlichen Browser-Schadcode zu holen. Allerdings war ich für einen Blick hierauf zu spät 'dran - der DNS-Eintrag der Domäne war bereits gelöscht.
Allgemein blieb die Frage, ob der Rechner tatsächlich frisch kompromittiert wurde - oder ob der Vorfall einfach lange Zeit unbemerkt blieb: Die gefundene Analyse datiert auf den April diesen Jahres...

Erster Schritt war natürlich, den Schadcode für den Moment aus der Webseite zu entfernen. Dabei erlebte der zuständige Admin die erste Überraschung: Der Quelltext auf der Platte war unmodifiziert! Womöglich war der Fall doch spannender gelagert als zunächst angenommen? Ein zweiter Blick offenbarte jedoch, daß ein Verzeichnis mit blankem HTML nicht geprüft wurde; diese Dateien wurden an verschiedenen Stellen inkludiert... und siehe da: Hier wurden wir fündig. Ok, also doch eher klassich :-) Alternative Möglichkeiten zum Einschleusen des Schadcodes wäre z.B. ein zusätzliches Modul für den Webserver gewesen; desweiteren gab es auch schon Schadcode, der sich nur im RAM einnistete - dadurch würde er zwar einen Reboot nicht überleben, dafür war er durch Virenscanner, die lediglich Dateien durchsuchten, nicht zu entdecken.

Logischer zweiter Schritt: Herausfinden, wie der Angreifer auf die Maschine gekommen ist - und dann die Lücken abdichten. Die Kiste lief noch unter Windws 2000 (für welches Microsoft das "End of Life" für Juli 2010 angekündigt hat)... also potentiell reichlich Betätigungsfeld :-) Ein Portscan offenbarte folgendes:

PORT      STATE    SERVICE       VERSION
21/tcp    open     ftp           Microsoft ftpd 5.0
25/tcp    open     smtp          Cisco PIX sanitized smtpd
53/tcp    open     domain        Microsoft DNS
80/tcp    open     http          Microsoft IIS webserver 5.0
106/tcp   open     pop3pw        Atrium Software's Mercur pop3pw
110/tcp   open     pop3?
135/tcp   open     msrpc         Microsoft Windows RPC
143/tcp   open     imap?
443/tcp   open     ssl/http      Microsoft IIS webserver 5.0
445/tcp   open     microsoft-ds  Microsoft Windows 2000 microsoft-ds
1025/tcp  open     msrpc         Microsoft Windows RPC
1026/tcp  open     msrpc         Microsoft Windows RPC
1027/tcp  open     msrpc         Microsoft Windows RPC
1080/tcp  open     http          3Ware web interface 1.0 (RAID storage)
1433/tcp  open     ms-sql-s      Microsoft SQL Server 2000 8.00.766; SP3a
1720/tcp  filtered H.323/Q.931
1723/tcp  open     pptp?
2000/tcp  filtered cisco-sccp
2525/tcp  open     smtp          Microsoft ESMTP 5.0.2195.7381
3389/tcp  open     microsoft-rdp Microsoft Terminal Service
5060/tcp  filtered sip
50300/tcp open     unknown

Na prima. Mindestens einer der vermeintlichen SMTP-Server meldete sich zwar nach dem Aufbau der Verbindung mit einem SMTP-Hello, reagierte aber nicht auf weitere SMTP-Kommandos. Ein Lauf eines frischen Virenscanners auf dem infizierten System (merke: Solche Scans sind mit großer Wahrscheinlichkeit unvollständig; zum einen hinken signaturbasierte Scans den aktuellen Entwicklungen immer mindestens einen Schritt hinterher, zum anderen kann laufende Schadsoftware die Ausführung des Virenscanners sabotieren) offenbarte auch mindestens zwei Backdoors. Da sich diese nicht so ohne weiteres entfernen ließen, und unser Admin nicht herausfinden konnte, was die tatsächliche Einfallsschneise gewesen war, entschied man sich schließlich für eine komplette Neuinstallation - diesmal auf Basis von Software mit noch aktivem Support ;-) Aus diesem Grund verzichtete man auch auf tiefergehende Analysen - als Tools für weitere Untersuchungen hätten sich die Sysinternals Suite oder das Sleuth Kit angeboten.

Lessons learned:

  • Updates, updates, updates. Und zwar zeitnah. Insbesondere, wenn es sich um eine Windows-Maschine handelt
  • Wird der Support für eine Software eingestellt, so ist zeitnah auf eine andere umzuziehen.
  • Die Zahl der exponierten Dienste so klein wie möglich halten. Was nicht gebraucht wird, sollte nicht laufen... und wenn manche Programme lokal benötigt werden, der Port aber für die weite Welt offen ist, so muß man sich eben mit einem Paketfilter behelfen.
  • Der Job des Webservers ist es, die Dateien der Webseite zu lesen (ggf. zu interpretieren) und anschließend auszuliefern. Es besteht kein Grund, dem Webserver Schreibrechte auf die Dateien zu gewähren. Ohne Schreibrechte hätte im vorliegenden Fall kein Schadcode so einfach in die Webseiten eingefügt werden können (ich sage nicht, daß es unmöglich ist: Beispielsweise könnte der Webserver durch ein dynamisch dazugeladenes Modul dazu gebracht werden, den Schadcode in jede ausgelieferte Seite zu packen; aber das wäre schon ein gutes Stück kniffliger als primitives Suchen und Modifizieren von HTML-Dateien).

Für Security-Beleckte eher Binsenweisheiten - die in der Praxis doch allzu oft vernachlässigt werden.