HSC
 

SSH und FTP Brute-Force Attacken

Von Oli Kessler, ncode solutions gmbh, ncode.ch

Einführung

Wer einen Service im Internet zur Verfügung stellt, der durch Authentisierungsverfahren zwar vor unberechtigtem Zugang geschützt, aber eben gerade für die Authentisierung für alle offensteht, wird früher oder später zahlreiche Versuche bemerken, in offenbar zufälliger Manier Zugang zu dem geschützten Dienst zu erhalten.

Die Log-Dateien füllen sich mit Einträgen wie "Invalid user XXX from Y.Y.Y.Y" oder "User xxx: Login incorrect", die oftmals in Wellen auftreten und vom gleichen Rechner ausgehen. Offenbar wird gezielt versucht, ein gültiger Benutzer und dessen Passwort zu finden um Zugang zu erhalten.

Die so angegriffenen Dienste sind wahrscheinlich auch gar nie publiziert worden sonden nur einem kleinen Kreis von Leuten bekannt - offenbar wird vor dem eigentlichen Angriff gezielt nach möglichen Opfern (in diesem Fall spezifische Dienste auf gewissen Rechnern) gesucht: Port-Scanning und andere Discovery-Technologien werden dabei eingesetzt.

Der wesentliche Aspekt unserer Betrachtung ist die verwendete Technologie der Authentisierung: Es sind herkömmliche Passwort-Verfahren, wo der Benutzer seinen Benutzernamen (aka. Login) und sein Passwort präsentiert und nach erfolgreicher Prüfung zugelassen wird. Der Benutzer kann durchaus ein Programm sein, wie etwa ein automatisierter Datei-Transfer oder eine Backup-Software.

Die Brute-Force Methode

Eine Brute-Force Attacke ist der Angriff auf einen Dienst mittels roher Gewalt (brute force), gerichtet auf die unterliegende Authentisierungs-Methode. Durch zahllose Versuche mit Login/Passwort-Kombinationen wird versucht, ein gültiges Paar zu finden - die Verifizierung erfolgt dabei direkt am System und dieses wird deshalb in der Regel diese massierten Anmelde-Versuche problemlos bemerken und auch in Log-Dateien verzeichnen.

Während früher entsprechende Attacken innerhalb kurzer Zeiträume mit möglichst vielen Versuchen durchgeführt wurden, was zu Denial-Of-Service ähnlichen Auswirkungen führte, sind sie heute wesentlich subtiler und die Versuche erfolgen in moderateren Zeitabständen - die Zugriffskurve wird deutlich flacher.

Die benutzten Passwörter für diese Art von Attacke werden meist mithilfe eines Wörterbuchs generiert, das die Grundlage für eine Vielzahl von Permutationen bietet - eine Wörterbuch-Attacke (Dictionnary Attack). Daher rührt auch die Warnung etlicher Betriebssysteme bei der Qualitätsprüfung von neuen Passworten, dass das neue Passwörter oder Teile davon in einem Wörterbuch vorkommen und daher nicht empfehlenswert seien.

Ebenfalls benötigt wird ein Mechanismus zum Erstellen möglicher Benutzernamen, diese sind ja in der Regel nicht bekannt. Hier wird einerseits ebenfalls auf ein Wörterbuch zurückgegriffen (Liste häufig benutzter Vor- und Nachnamen), andererseits auch auf die Standart-Benutzer des Betriebssystems zurückgegriffen, die ja bereits konfiguriert und meist auch aktiviert sind. Beliebte Namen sind auch häufig verwendete Test-Akronyme (test, test1, debug) und administrative Kontos (root,admin,.).

Zeitverhalten und Quellen

Auch das Zeitverhalten von Attacken ist ein interessantes Phänomen. Ist man geneigt, auf den ersten Blick eine möglichst schnell abfolgende, sequenzielle Reihe von Login-Versuchen zu vermuten, zeigt die Analyse von Log-Daten teilweise ein anderes Bild: Die Versuche erfolgen zwar regelmässig, aber mit Abständen von einigen Sekunden und ohne genaues Timing.

Das beschriebene Verhalten lässt mehrere Schlüsse zu: Einerseits kann dahinter vermutet werden, dass eine Massierung der Verbindungen verhindert werden soll um einer Firewall keinen Anlass zu geben, eine DOS-Attacke zu vermuten oder eine unüblich hohe Anzahl von Verbindungs-Versuchen zu detektieren - andererseits kann es aber auch sein, dass mehrere verschiedene Ziele quasi-parallel attackiert werden und die generierten Kombinationen Login/Passwort nicht nur für ein Zielsystem probiert werden.

Dies führt im weiteren zur Frage nach koordinierten Attacken und verteilten Systemen, wie man sie bereits aus dem Bereich SPAM mithilfe von Bot-Netzen kennt. Es wäre ein leichtes, entsprechenden Code in einem Botnetz zu verteilen. Aufgrund fehlender Daten kann aber keine Aussage gemacht werden, ob dies bereits geschieht.

Praxisfall: SSH und FTP

Die beiden Services SSH und FTP bieten sich als gutes Praxisbeispiel an, da sie häufig in produktiven Umgebungen und auch bei Webhostern anzutreffen sind, die sowohl administrativen Zugang via SSH als auch File-Transfer mittels FTP anbieten.

Das eigentliche Ziel der Attacke, der Authentisierungs-Mechanismus, wird über diese Services angegriffen, da sie durch das Design des Anmeldevorgangs quasi direkten Zugriff auf die Prüfung von Benutzername und Passwort erlauben

Beide Services kennen in der Mehrheit der Implementationen zwar Beschränkungen im Verbrauch der Ressourcen (wie zum Beispiel ein maximale Anzahl Verbindungen bzw Sessions pro Remote Host), eine Einschränkung der möglichen Benutzer, die den Service überhaupt ansprechen dürfen (beispielsweise AllowUsers bei OpenSSH) oder Limits bei der Anzahl möglicher Loginversuche (nach denen die aktuelle Verbindung terminiert wird, eine Neuverbindung ist aber jederzeit möglich), können jedoch nicht die Grundproblematik der verwendeten Authentisierung lösen.

SSH

OpenSSH erlaubt die Einschränkung möglicher Login-Versuche und damit Brute-Force-Versuche durch folgende Parameter (in sshd_config):

  • AllowUsers: Einschränkung der Benutzer
  • AllowGroups: Einschränkung der Benutzergruppen
  • DenyUsers: Einschränkung der Benutzer (Ausschluss)
  • DenyGroups: Einschränkung der Benutzergruppen (Ausschluss)
  • LoginGraceTime: Maximale Zeit einer Authentisierungs-Session, innerhalb derer sich der Benutzer erfolgreich angemeldet haben muss, andernfalls wird die Verbindung geschlossen
  • MaxAuthTries: Maximale Anzahl Authentisierungs-Versuche per Verbindung, wird die Anzahl überschritten, so beendet der Server die Verbindung
  • MaxStartups: Maximale Anzahl unauthentisierter Verbindungen, wird sie erreicht, so nimmt der Server keine Verbindungen mehr an.

Als eigentliche Authentisierungs-Schicht kommt das Betriebssytem bzw. dessen Module (PAM) zum Einsatz. Es ist auch anzumerken, dass eine Anmeldung per Benutzername und Passwort durch die Einschränkung möglicher Authentisierungsarten ganz verhindert werden kann.

FTP

Der verbreitete FTP-Server proftp erlaubt ebenfalls Einschränkungen im Bereich der Authentisierung (Limiten, nach denen in Normalfall die Verbindung beendet wird):

  • AllowUser: Einschränkung der Benutzer
  • AllowGroup: Einschränkung der Benutzergruppen
  • MaxClientsPerHost: Die max. Anzahl Verbindungen pro Host, weitere werden gar nicht angenommen
  • MaxClientsPerUser: Die max. Anzahl Verbindungen pro Benutzername, weitere werden bei der Authentisierung beendet (sobald der Benutzername feststeht)
  • MaxHostsPerUser: Die max. Anzahl Verbindungen pro Benutzername und Host
  • MaxLoginAttempts: Die max. Anzahl Login-Versuche pro Verbindung
  • TimeoutLogin: Maximale Zeit, die eine Session für die Authentisierung benutzen kann

Ebenfalls ist eine separate Benutzerverwaltung möglich, die unabhängig vom Betriebssystem funktioniert.

Strategien

Eines gleich vorne hinweg: Das grundsätzliche Problem der Authentisierungsmethode Benutzername/Passwort kann nicht gelöst werden, da es system-inherent und vom Design vorgegeben ist. Vielmehr können Strategien zur Eindämmung des Problems im Bereich möglicher Zugriffe auf das System, strikte Limits und Überwachung des Datenflusses und dynamisches Aussperren von Kommunikationspartnern, die durch fehlgeschlagene Logins auffallen.

Eine grobe Klassifizierung möglicher Strategien ergibt folgende Einteilungen:

  • Ändern der Authentisierung
  • Einschränkung der Kommunikationspartner aufgrund von Netzwerk-Attributen
  • Beschränkung möglicher Benutzer pro Applikation
  • Anpassung der Services und Einführung von Limits bezüglich Timing, Anzahl Besucher und mögliche Authentisierungsversuche
  • Detektion und dynamische Firewall-Regeln

Ändern der Authentisierung

Dies ist ganz klar die favorisierte Lösung, aber in der Praxis oft nicht anwendbar, da den Benutzern keine andere Technologie zugemutet werden soll. OpenSSH bietet beispielsweise die elegante Authentisierung mittels eines Schlüsselpaares (Public/Private Key), bei FTP kann als Alternative SSL und die Benutzung von Zertifikaten eingesetzt werden.

Neben Schlüsselpaaren und Signaturen können aber auch Tokens (SecureID als Beispiel) oder Einmal-Passwörter sowie zentralisierte Systeme (wie etwa Kerberos) zum Einsatz kommen. Erhöhte Sicherheit kann mit einer 2-Faktor-Authentisierung garantiert werden, die zum Beispiel ein Passwort und ein Token beeinhaltet.

Wird ein generischer Authentisierungs-Mechanismus wie etwa PAM (pluggable authentication module) verwendet, so kann unter Umständen ohne Wissen der Services auch der bestehende Mechanismus von Benutzername/Passwort so erweitert werden, dass im Hintergrund eine stärkere Authentisierung zur Anwendung kommt: Der Benutzer gibt dann im Feld Passwort zum Beispiel die Kombination von Passwort und Token ein - die Eingabe wird vom Authentisierungs-Modul wieder aufgesplittet und separat verwendet. Die Einschr&auml;nkung ist aber unter Umständen gross: Challenge-Response Systeme sind so nicht machbar.</p>

Einschränkung der Kommunikationspartner

Die möglichen Benutzer der Services werden aufgrund netzwerk-technischer Merkmale eingeschränkt und nicht zugelassene Partner erhalten gar keine Möglichkeiten zur Interaktion mit dem System. Die IP-Adresse bietet sich hier exemplarisch an, je nach Netz-Topologie sind aber auch weitere Attribute vorstellbar. Analogien sind im Bereich ACL (access control list) zu finden.

TCP-Wrapper ist eine Implementation dieses Schemas. Basierend auf der Konfiguration (meist /etc/hosts.allow und /etc/hostss.deny) erlaubt es den Zugriff auf einen Netzwerk-Dienst basierend auf IP-Adressen. Während inetd beziehungsweise xinetd diese Funktion von sich aus direkt unterstützen (und damit alle Dienste, die damit gestartet werden), lässt sich die Bibliothek für weitere Services meist optional einbinden - OpenSSH nutzt dies via libwrap.

Firewall-Technologien sind eine weitere Möglichkeit (iptables, pf, ..) und bieten grundsätzlich dieselbe Funktionalität. Diese können sowohl auf dem Host selbst als auch auf einem Gateway aktiv sein und ebenfalls mögliche Kommunikations-partner nach Kriterien beurteilen und zulassen oder blockieren.

Auch dieser Ansatz ist oft wenig praktikabel, da der Zugriff auf die Dienste gerade eben von überall her garantiert werden soll und die möglichen Kommunikationspartner durchaus auch mit dynamischen IP-Adressen ausgestattet sind, man denke an Breitbandanschlüsse von zuhause (ADSL, Kabel) und sogenannte Dial-Up Benutzer.

Programm sshwatch

Eine vollkommen andere Strategie verfolgen Programme wie etwa sshwatch: Statt nach fixen Zugangs-Listen zu arbeiten, reagieren sie dynamisch auf fehlgeschlagene Authentisierungs-Versuche und sperren die Kommunikationspartner für eine gewisse Zeit mit einer dynamischen Firewall-Regel aus.

Dabei werden die Log-Informationen der Services laufend ausgewertet und nach Patterns durchforscht, die Fehlversuche aufzeigen. Die IP-Adresse des Verbindungspartners wird extrahiert und eine neue Firewall-Regel erstellt, die alle Kommunikationsversuche von dieser Adresse unterdrücken. Ist eine gewisse Zeitspanne verstrichen, so wird die Regel wieder gestrichen und weitere Kommunikation ist möglich.

Diese reaktive Lösung zeigt schnelle Erfolge und hat den Nebeneffekt, dass die dyanmischen Regeln für alle Services gelten und somit identifizierte Angreifer komplett blockieren, nicht nur für den einen Service. Es sind keine Anpassungen an den beteiligten Services nötig, da nur deren Log-Informationen ausgewertet werden und die erstellten Regeln auf tiefer Ebene greifen.

Um das Blockieren von "unschuldigen" Partnern zu verhindern, die effektiv auf fehlerhafte interaktive Eingabe von Login oder Passwort zurückzuführen sind, wird zusätzlich ein Zeitintervall verwendet, innerhalb dem eine gewisse Anzahl fehlgeschlagener Versuche detektiert werden müssen, um den Verbindungspartner zu blockieren. Ist die Attacke aber über einen grossen Zeitraum verteilt (siehe oben unter Zeitverhalten), so führt gerade dieses Intervall wieder dazu, dass der Angriff nicht gesehen wird: Hier ist also ein klassischer Kompromiss zwischen Sicherheit und Funktionalität nötig.

Es sei hier nicht verschwiegen, dass die Strategie dieser Methode eine potentielle Gefahr birgt: Jedwelche dynamisch erstellten Regeln erlauben im Prinzip einen Denial-of-Service Angriff, dann nämlich, wenn die Identifikation des vermeintlichen Angreifers fingiert werden kann. Für TCP-Verbindungen ist dies allerdings sehr unwahrscheinlich und die Software greift nur dann, wenn ein fehlgeschlagener Authentisierungs-Versuch diagnostiziert wurde, ein Vorgang, der einen kompletten Hand-Shake sowohl auf der TCP-Ebene als auch auf der Ebene der Applikation benötigt und ein sogenanntes Spoofing quasi verunmöglicht.

Last Modified: 20.01.2008 17:18 | Copyright © 2003-2024 by tor.ch | Top