Website-Infektionen automatisch mit Git finden und isolieren

Die Website einer Kund:in scheint mit einer Backdoor infiziert zu sein. Das Problem: Die Logs auf dem managed Wald-Und-Wiesen-Webserver sind nur wenige Monate alt. Sie geben keinen Aufschluss darüber wann und wie ein bestimmtes Backdoor initial auf den Server gelangt ist. Was also nun? Die Website zu bereinigen wird nicht viel bringen, da die initiale Sicherheitslücke nicht bekannt ist.

Bau dir ein einfaches Alarmsystem

Eine mögliche Lösung: Bau dir einen Filewatcher. Wenn du die initiale Lücke nicht finden kannst musst du die Installation bereinigen und warten bis die Website erneut infiziert wird. Dann hast du frische Logs und kannst die Schwachstelle identifizieren. Aber beim nächste mal sollte das System vorbereitet sein. Idealerweise solltest du sofort informiert werden und alle Änderungen sollten automatisch erfasst werden, damit du die Installation sofort wieder bereinigen kannst. Folgendes sollte bei einer erneuten Infektion automatisch passieren:

  • Sofortiges sperren der Website
  • Isolieren der veränderten Dateien
  • Senden von E-Mails

Ein simples *.sh Skript, welches via Cron regelmäßig ausgeführt wird kann die Website automatisch überwachen. Sollten Dateiänderungen bemerkt werden wird es automatisch deine Website sperren und die Dateiänderungen in einem neuen Git-Branch isolieren. Über Services wie UpDown.io oder UptimeRobot kannst du dir im Fall einer Sperrung eine Mail senden lassen. So erhälst du im Fall einer Kompromittierung frische Logs und kannst so die initiale Sicherheitslücken schnell finden.

Installation des Skripts

#!/bin/bash

WEBROOT_PATH=/var/www/html
HTACCESS_PATH=/var/www/html/.htaccess

# Run 'git status' to detect changes
if [ `git -C $WEBROOT_PATH status | grep -c "working directory clean"` -ne 1 ]; then

    echo "Unexpected file changes"
    
    # Take down the website
    echo 'Order Allow,Deny' | cat - $HTACCESS_PATH > temp && mv temp $HTACCESS_PATH
    echo 'Deny from All' | cat - $HTACCESS_PATH > temp && mv temp $HTACCESS_PATH
    
    # Create a new git branch and move the infection to there
    git -C $WEBROOT_PATH checkout -b $(date +"%d-%m-%y"-infection-"%I")
    git -C $WEBROOT_PATH add .
    git -C $WEBROOT_PATH commit -m "Auto commited unexpected file changes"
    
    # Move back to the master branch to auto remove the unwanted files
    git checkout master
    
else
    echo "Files are clean" 
fi

  • Kopiere dieses Skript auf deinen Server. Wenn du die Möglichkeit hast lege es außerhalb des Webroots ab. Nenne es zum Beispiel watch.sh
  • Mache die watch.sh ausfürbar mit "chmod a+x watch.sh"
  • Erstelle eine ".gitignore" in deinem Webroot. Passe einzelne Pfade an oder füge neue Pfade hinzu, die von der Versionierung ausgeschlossen werden sollen. Sinnvoll sind hier zum Beispiel Caching- oder Medien-Ordner. Auch die zu manipulierende .htaccess-Datei muss darin richtig eingestellt werden!
  • Stelle den Pfad in der Datei watch.sh zur .htaccess und zum Webroot richtig ein.
  • Initiiere das Git-Repository mit dem Befehl "git init" in deinem Webroot. Vermutlich macht es Sinn das komplette Web-Root einzuchecken.
  • Füge alle Dateien der Installation zu dem Repository hinzu mit "git add ."
  • Führe einen Initialen Commit durch: git commit -m "Initial commit".
  • Vergewissere dich, dass Git nun clean ist mit: git status
  • Aktiviere den Cronjob und starte watch.sh jede Minute.
  • Teste das System indem du eine Datei veränderst.

Was passiert bei einer Dateiänderung?

  • Die Website wird gesperrt, indem die angegebene .htaccess-Datei verändert wird.
  • Dadurch können Dienste wie Updown.io oder UptimeRobot einen Alarm auslösen und dich informieren.
  • Die ungewollten Änderungen werden in einem separaten Git Branch automatisch isoliert.

Was muss ich tun, wenn ungewollt Dateien verändert wurden?

  • Schalte den Cronjob ab
  • Wechsle in den Git-Branch mit dem entsprechenden Datum und lass dir die Änderung dort anzeigen: "git checkout xxx-infection-xxx". Du kannst dir alle Branches vorher anzeigen lassen mit "git branch -a".
  • Suche in den Webserver-Logs nach Zugriffen auf die geänderten Dateien.
  • Suche die IP zu dieser Datei.
  • Suche in allen Logs den ersten Zugriff dieser IP und schaue, was diese noch gemacht hat um die Sicherheitslücke zu finden.
  • Beseitige die Sicherheitslücke und commite wenn nötig in den Master Branch.
  • Schalte zuletzt den Cronjob wieder ein.
  • Lasse den Cron weiter laufen, wenn du dir nicht sicher bist, ob das bereits das initiale Einfallstor war. Womöglich wurde nur ein weiteres unentdecktes Backdoor genutzt.

Wie kann ich die Website wieder freischalten?

Entferne einfach die Sperre aus der .htaccess-Datei. Ganz oben in der Datei solltest du die Zeilen "Order Allow,Deny" und "Deny from All" finden und löschen.

Was, wenn ich selbst Änderungen am Code vorgenommen habe?

  • Schalte zunächst den Cronjob aus, damit die Website nicht automatisch down geht.
  • Lade dann deine Änderungen über SCP oder FTP hoch.
  • Wechsle dann auf den Git master: 'git checkout master'
  • Füge deine Änderungen in Git hizu: 'git add .'
  • Kommentiere deine Änderungen in einem Commit: git commit -m "Meine Änderungen aus Grund XYZ..."
  • Prüfe, ob Git wieder clean ist mit: git status
  • Aktiviere den Cron wieder

Was, wenn du die Lücke so nicht findest?

Es könnte sein, dass die Dateiänderungen nicht mit HTTP-Logs in Zusammenhang stehen. Du solltest dann überlegen welche Wege es noch gibt, um Dateien zu verändern:

  • Gibt es nach außen offene Datenbanken? Wenn ja bitte die Ports dicht machen und die Kennwörter ändern.
  • Gibt es im Backend des Hostinganbieters einen Filemanager? Dieses Kennwort sollte schnell geändert werden!
  • Gibt es Zugänge via SSH oder FTP?
  • Gibt es Upload-Möglichkeiten auf der Website?
  • Liegen mehrere Websites auf dem Server und sind diese alle über den gleichen Linux User oder die gleiche Gruppe schreibbar? Wenn ja wäre es nicht unwahrscheinlich, dass die initiale Lücke auf einer anderen Website befindet. So kann eine Angreifer:in über eine Website Dateien einer anderen verändern. Prüfe daher die Datei-Berechtigungen und auch die Logs dieser Website.

Nachteile

  • Du musst für die Dauer der Überwachung vermutlich automatische Software-Updates deaktivieren.
  • Eventuell werden nicht alle Infektionen gefunden. Es gibt Techniken bei denen Malware nur kurzzeitig nachgeladen und ins Filesystem geschrieben wird, um einen bestimmten Task auszuführen. Nach ein paar Millisekunden ist das File dann wieder verschwunden und wird daher von dem hier gezeigten System nicht erkannt.

Nützliche Tipps

Wenn dein Git in einer anderen Sprache läuft musst du das Suchkriterium im Skript natürlich anpassen. Aus "working directory clean" wird in der deutschen Version zum Beispiel "nichts zu committen".

Titelbild: https://pixabay.com/de/photos/mouse-trap-käse-gerät-fangen-maus-2846147/