Zugang zu erlangen ist die halbe Arbeit; die andere Hälfte besteht darin, ihn nicht zu verlieren. Deshalb sorgt fast jede automatisierte Schadsoftware zuallererst dafür, erneut gestartet zu werden: nach einem Neustart, nach dem Löschen der Datei, nach einem Passwortwechsel. Daher die bekannte Geschichte — „wir haben aufgeräumt, und zwei Tage später war es wieder da“.
So viele Orte, an denen das eingerichtet wird, gibt es nicht, und alle lassen sich in wenigen Minuten prüfen. Nachfolgend der vollständige Rundgang der Reihe nach.
1. SSH-Schlüssel
Der einfachste Rückweg: Eine Zeile in authorized_keys überlebt einen Passwortwechsel, ein Systemupdate und einen Neustart.
sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;
Jede Zeile ist der dauerhafte Zugang von jemandem. Wenn Sie nicht sagen können, von wem, betrachten Sie ihn als fremd. Achten Sie auch auf den Kommentar am Zeilenende: Er ist beliebiger Text, und eine Übereinstimmung mit Ihrem eigenen Namen beweist nichts.
2. Cron-Aufträge aller Benutzer
Zu prüfen ist nicht nur Ihre eigene crontab:
for u in $(cut -f1 -d: /etc/passwd); do echo "== $u"; sudo crontab -u "$u" -l 2>/dev/null; done
sudo ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/
sudo cat /etc/crontab
Worauf zu achten ist: Zeilen mit @reboot, lange kodierte Befehle, Aufrufe von curl oder wget mit Weiterleitung in eine Shell, alles, was aus /tmp, /dev/shm oder /var/tmp gestartet wird. Aus diesen Verzeichnissen läuft nichts Reguläres.
3. systemd-Timer und -Dienste
Das moderne Gegenstück zu cron — und merklich seltener geprüft:
systemctl list-timers --all
systemctl list-units --type=service --state=running
sudo ls -la /etc/systemd/system/ /run/systemd/system/
Gesondert die Benutzerdienste, die ohne Root-Rechte laufen und in der allgemeinen Liste nicht auftauchen:
systemctl --user list-units --type=service
sudo ls -la /home/*/.config/systemd/user/
Noch ein Detail: Ist für einen Benutzer das Verweilen aktiviert (loginctl enable-linger), laufen seine Dienste auch ohne aktive Sitzung. Zu prüfen mit loginctl list-users.
4. Startdateien der Shell
Code, der ans Ende einer Shell-Startdatei angehängt wurde, läuft bei jeder Anmeldung:
sudo tail -5 /root/.bashrc /root/.profile /home/*/.bashrc /home/*/.profile
sudo ls -la /etc/profile.d/
Sehen Sie sich gezielt das Dateiende an — dorthin wird angehängt, damit es beim flüchtigen Blick nicht auffällt.
5. ld.so.preload
Eine Datei, die das System veranlasst, eine angegebene Bibliothek in jeden gestarteten Prozess zu laden. Regulär entsteht sie unter keinen Umständen:
ls -l /etc/ld.so.preload
Ihr Vorhandensein ist praktisch ein eindeutiges Zeichen schwerer Kompromittierung, und eine solche Bibliothek verbirgt üblicherweise Dateien, Prozesse und Netzwerkverbindungen gleichermaßen. Nichts, was Sie auf dieser Maschine danach sehen, verdient Vertrauen.
6. Hooks des Paketmanagers
Eine selten bedachte Methode: apt kann vor und nach jeder Paketoperation Befehle ausführen.
sudo ls -la /etc/apt/apt.conf.d/
sudo grep -r 'DPkg::Pre-Invoke\|DPkg::Post-Invoke\|APT::Update' /etc/apt/apt.conf.d/
Ein solcher Hook läuft bei jeder Update-Installation — also regelmäßig und als root.
7. Die Nachricht des Tages unter Ubuntu
Das Verzeichnis /etc/update-motd.d/ enthält ausführbare Skripte, die bei jeder SSH-Anmeldung laufen und den Begrüßungstext erzeugen. Der Ort ist gerade deshalb bequem, weil er nach Systembestandteil aussieht:
sudo ls -la /etc/update-motd.d/
8. Zurückgestellte at-Aufträge
sudo atq
sudo ls -la /var/spool/cron/atjobs/ 2>/dev/null
Ein alter und selten genutzter Mechanismus — und deshalb der am seltensten geprüfte.
Was tun, wenn sich etwas findet
Der erste Impuls ist, den Fund sofort zu löschen. Das ist ein Fehler: Mit ihm verschwindet die Information darüber, wie er dorthin kam, und ohne Antwort auf diese Frage wiederholt sich alles.
- Eine Kopie der Datei oder des Auftrags samt Änderungszeit sichern.
- Anhand dieser Zeit in den Webserver-Protokollen und in
auth.lognachsehen, was in derselben Minute geschah. Dort liegt meist der Einstiegspunkt. - Alle acht Orte der Liste prüfen, nicht nur den, an dem sich etwas fand. Eine Hintertür wird fast nie in einem einzigen Exemplar hinterlassen.
- Erst danach aufräumen und die Schwachstelle selbst schließen.
Wissen, wie der Normalzustand aussieht
Die Hauptschwierigkeit dieser Prüfung sind nicht die Befehle, sondern der Umstand, dass eine unbekannte Zeile in einer Auftragsliste nicht verdächtig wirkt, wenn Sie nicht mehr wissen, wie die Liste vorher aussah. Auf einem Server, den jemand anderes oder den Sie vor einem Jahr eingerichtet haben, ist Eigenes von Fremdem kaum zu unterscheiden.
Daraus der praktische Schluss: Ein Schnappschuss des Ist-Zustands lohnt sich heute, solange der Server in Ordnung ist. Die Liste der Cron-Aufträge, Timer, Schlüssel und Dienste einer gesunden Maschine ist die Referenz, mit der später verglichen wird. Gesammelt und mit Verlauf aufbewahrt, macht sie aus der Suche nach einer Hintertür statt einer mehrstündigen Übung einen Vergleich zweier Listen. Wie das aussieht, zeigen die Demo-Seiten unten.