Web/API-PentestFabian Gold6 min Lesezeit

Time-based User Enumeration

Da das klassische Enumerieren von Benutzernamen oft nicht mehr möglich ist, muss man einen Time-based-Ansatz wählen, um an diese Informationen zu kommen.

Einführung

Einer der wichtigsten Schritte beim Pentest einer Webanwendung besteht darin, gültige Benutzerdaten zu ermitteln und anschließend mithilfe von Brute-Force- oder Wörterbuchattacken den zweiten Faktor -- das Passwort -- herauszufinden. Heutzutage wird das Enumerieren von Benutzernamen für Angreifer jedoch zu einer immer größeren Herausforderung. Das ist ein gutes Zeichen, denn es bedeutet, dass Entwickler die Sicherheit ihrer Anwendungen ernst nehmen. Die meisten Anwendungen geben bei einem fehlgeschlagenen Login inzwischen nur noch generische Meldungen wie „E-Mail-Adresse oder Passwort ist falsch” zurück.

Da das einfache Enumerieren von Benutzernamen nicht mehr möglich ist, braucht es einen tiefergehenden Ansatz, um an diese wertvollen Informationen zu gelangen. Hier kommt die zeitbasierte User Enumeration ins Spiel.

Klassischer Ansatz vs. Zeitbasierter Ansatz

Beim klassischen Ansatz der User Enumeration sucht man nach einer spezifischen Rückmeldung des Systems. Das kann so offensichtlich sein wie eine Fehlermeldung ("Dieses Konto existiert nicht.") oder eine leichte Abweichung bei den Fehlercodes der Antwort. In beiden Fällen lässt sich dies missbrauchen, um automatisiert eine Liste gültiger Benutzernamen zu erstellen, die anschließend für Passwortangriffe genutzt werden kann. Da dieser Fall bei heutigen Systemen immer seltener auftritt, ist ein tiefergehender Ansatz erforderlich.

Der zeitbasierte Aspekt dieser Schwachstelle kommt dann zum Tragen, wenn die Anwendung zwar keine offensichtliche Möglichkeit bietet, die Gültigkeit eines Benutzernamens zu bestimmen, sich aber die Antwortzeit des Webservers messbar verändert. In der Regel wird dies durch Unterschiede im Verarbeitungscode der Anmeldung verursacht, die bei gültigen Benutzernamen einen längeren Ausführungspfad erzeugen und so zu einer spürbaren Zeitverzögerung führen.

Unabhängig davon, wie ein Angreifer an gültige Benutzerdaten gelangt -- es stellt ein erhebliches Risiko für Ihr Unternehmen dar. Eine solche Liste enthält bereits die Hälfte der für die Anmeldung erforderlichen Daten und erhöht die Wahrscheinlichkeit eines unbefugten Zugriffs deutlich. Das Einzige, was dann noch zwischen Ihrem Unternehmen und einer Kompromittierung steht, ist die Stärke der Passwörter Ihrer Benutzer -- und die ist erfahrungsgemäß oft unzureichend.

Was ist beim Testen zu beachten?

Beim Testen gibt es einige wichtige Punkte zu beachten. Zunächst sollten Sie den Server nicht übermäßig belasten, da dies die Ergebnisse verzerren könnte. Daher empfiehlt es sich, zwischen den Requests eine kleine Verzögerung einzubauen.

Zusätzlich ist es ratsam, die gültigen Benutzernamen im Payload aufzuteilen, sodass sie nicht in aufeinanderfolgenden Requests gesendet werden. Durch die zufällige Verteilung im Datensatz lässt sich das Risiko von False Positives verringern.

Darüber hinaus sollten Sie den Test mehrfach durchführen und anschließend die durchschnittliche Antwortzeit pro Benutzer berechnen. Dadurch werden die Daten normalisiert und das Risiko von False Positives weiter reduziert.

Selbstverständlich hängt der Erfolg des Angriffs trotz all dieser Maßnahmen stark von der Stabilität des Servers und der Internetverbindung zwischen Server und Client ab.

Wie verhindere ich Time-based User Enumeration?

Nachdem wir gezeigt haben, wie die zeitbasierte User Enumeration funktioniert, stellt sich die Frage, wie Sie Ihre Systeme dagegen absichern können. Bei eigenentwickelten Anwendungen sollten die Entwickler gezielt auf dieses Problem hingewiesen werden, um große Zeitunterschiede bei Anmeldevorgängen zu vermeiden. Handelt es sich hingegen um kommerzielle Standardsoftware, deren Code Sie nicht kontrollieren, wird die Absicherung komplizierter.

Neben der Behebung der eigentlichen Ursache sollten Sie zusätzliche Schutzmaßnahmen implementieren, um das Risiko eines unbefugten Zugriffs zu minimieren. Die wirksamste Maßnahme ist die Einführung einer Multi-Faktor-Authentifizierung (MFA) für alle öffentlich zugänglichen Anmeldeschnittstellen. Selbst wenn ein Angreifer über die enumerierten Benutzernamen gültige Anmeldedaten ermitteln sollte, benötigt er dann immer noch den zweiten Faktor, um Zugang zu erhalten.

Ergänzend dazu erhöhen konsequente Kontosperren und eine strenge Passwortrichtlinie die Widerstandsfähigkeit gegen Passwortangriffe. Eine Richtlinie mit Mindestlänge sowie eine Disallowlist, die das Setzen besonders schwacher Passwörter verhindert, trägt wesentlich dazu bei, unbefugten Zugriff zu erschweren.

Falls sich die Angriffe nicht vollständig verhindern lassen, sollten Sie sie zumindest überwachen. Stellen Sie sicher, dass Ihre Monitoring-Umgebung so konfiguriert ist, dass sie mehrere ungültige Authentifizierungsversuche aus einer einzelnen Quelle unabhängig vom Benutzernamen erkennt und Anfragen von dieser IP-Adresse für eine bestimmte Zeit sperrt.

Fazit

In diesem Beitrag haben wir gezeigt, wie ein solcher Angriff abläuft, worauf Sie beim Testen achten sollten und welche Gegenmaßnahmen möglich sind.

Die User Enumeration ist eine weit verbreitete Schwachstelle, die sich nicht immer einfach dadurch beheben lässt, dass die Anwendung bei existierenden und nicht existierenden Benutzernamen identisch reagiert. Die naheliegendste Lösung besteht darin, auch für nicht existierende Konten eine vollständige Passwortvalidierung durchzuführen.

Das tatsächliche Risiko dieser Schwachstelle hängt jedoch stark von den eingesetzten Authentifizierungsmethoden und der geltenden Passwortrichtlinie ab.