Einleitung
Als Erstes untersuchst du die Möglichkeit, über einen Brute-Force-Angriff Zugangsdaten zu ermitteln.
Ein Brute-Force-Angriff ist eine Methode, bei der ein Angreifer systematisch alle möglichen Kombinationen von Anmeldedaten wie Benutzernamen und Passwörtern ausprobiert, um unbefugten Zugriff auf ein System oder eine Anwendung zu erlangen.
Der Aufwand für einen Brute-Force-Angriff hängt von mehreren Faktoren ab:
- Länge und Komplexität von Benutzername und des Passwort
- Implementierung von Sicherheitsmaßnahmen, z. B. Begrenzen der Anmeldeversuche
- Verfügbarkeit von Rechenressourcen
Die ersten beiden Faktoren kann die Webapplikation steuern, während der letzte Faktor vom Angreifer abhängt.
Über die Passwortanforderungen und die Implementierung von Sicherheitsmaßnahmen ist uns nichts bekannt. Die Passwortanforderungen kannst du auch nicht unmittelbar ermitteln. Die Bedienungsanleitung macht keine Angaben zu Passwortvorgaben. Außerdem ist es nicht vorgesehen, dass sich ein neuer Benutzer registriert.
Testen auf Sicherheitsmaßnahmen
Ob Sicherheitsmaßnahmen implementiert sind, kannst du dagegen durch Ausprobieren starten.
Durch Ausprobieren konntest du keine Sicherheitsmaßnahmen feststellen. Es spricht also nichts dagegen, einen Brute-Force-Angriff auf die Webapplikation zu testen.
Brute-Force-Angriff
Es gibt verschiedene Softwaretools, um Brute-Force-Angriffe auszuführen. Eines davon ist Hydra. Damit wirst du einen sogenannten Wörterbuchangriff auf die Webapplikation starten.
Ein Wörterbuch-Angriff ist eine Art des Brute-Force-Angriffs, bei dem anstelle aller möglichen Kombinationen gezielt eine Liste häufig verwendeter Passwörter oder Phrasen (ein "Wörterbuch") ausprobiert wird, um Zugang zu einem System zu erlangen. Er ist damit weniger ressourcenintensiv als ein reiner Brute-Force-Angriff.
Mit folgendem Befehl wird ein Wörterbuchangriff mit hydra gestartet, das :
hydra -L '<path/to/username_list>' -P '<path/to/password_list>' <target> [-s <port>] <protocol> [<options>]
Listen möglicher Benutzernamen und Passwörter sind auf dem Webserver vorhanden.
Sie heißen usernames.txt und passwords.txt.
Die IP-Adresse 172.19.0.2 der Webapplikation und die Portnummer 80, über die die Webapplikation erreichbar ist, sind dir auch bekannt.
Ansonsten findest du sie auch in den Anfragedetails unter dem Tab Headers:
Die Zugangsdaten werden über eine HTTP-POST-Anfrage versendet.
Daher musst du in hydra als Protokoll HTTP-FORM-POST angeben.
Dieses Protokoll erfordert weitere Informationen für <options>:
<page>:<POST request body>[:<HTTP header>]:<condition string>
Für page wird die angeforderte Ressource angegeben.
Das ist in unserem Fall also /login.
Der POST request body, also der Anfragekörper enthält die übersendeten Daten.
Diesen kannst du aus den Anfragedetails kopieren, wenn du sie dir als Rohdaten anzeigen lässt:
Nun musst du noch ^USER^ und ^PASS^ als Platzhalter für den Benutzernamen und das Passwort ergänzen.
Während des Wörterbuchangriffs ersetzt hydra die Platzhalter mit den Einträgen aus den Wortlisten.
Der POST request body sieht damit so aus:
csrf_token=<value>&username=^USER^&password=^PASS^&submit=Login
Das CSRF-Token hat einen zufälligen Wert.
Hier musst du also für value den Wert eintragen, den er bei dir tatsächlich hat.
Mit der Anfrage wird noch ein Session-Cookie übertragen.
Auch der muss von hydra an den Webserver gesendet werden.
Für die optionalen HTTP header gibt es damit den Eintrag:
H=Cookie:session=<value>
Mit H=Cookie wird ein Cookie HTTP request header übertragen, der den Cookie session enthält.
Der Session-Cookie wird bei jedem Aufruf der Webapplikation gesetzt und bleibt bis zum Ende der Sitzung oder 20 Minuten lang gültig.
Du musst also für value den Wert eintragen, den der Cookie bei dir tatsächlich hat.
Als Letztes muss hydra noch wissen, wann ein Login erfolgreich oder nicht erfolgreich war.
Hierfür musst du eine Zeichenfolge angeben, die in der Antwort enthalten ist, um den Status des Logins zu kennzeichnen. Eine ungültige Login-Bedingung wird durch F= und eine gültige Login-Bedingung durch S= dargestellt.
Da du nur die Antwort bei einem fehlgeschlagenen Login-Versuch kennst, musst du eine Zeichenfolge auswählen, von der du annimmst, dass sie ausschließlich bei einem fehlgeschlagenen Login zurückgegeben wird und nicht bei einem erfolgreichen.
Um die unmittelbare Antwort des Webservers zu erhalten, kannst du das Kommandozeilentool cURL nutzen.
Dafür musst du in den Dev Tools eine Anfrage an den Webserver kopieren.
Das Vorgehen ist dabei:
- Öffne die Netzwerkanalyse in den Dev Tools.
- Gib falsche Zugangsdaten in das Formular ein (z. B.
Username=aundPassword=a). - Klicke in der Netzwerkanalyse mit der rechten Maustaste auf die POST-Anfrage an
loginund wähle unterCopy valueden PunktCopy as cURLaus.
Kopieren einer Anfrage für cURL - Kopiere den Befehl in ein Terminal.
Diese Antwort von cURL zeigt an, dass die angeforderte URL eine Weiterleitung (Redirect) zurückgibt.
Der HTML-Code weist darauf hin, dass der Benutzer automatisch zu einer Ziel-URL, in diesem Fall /login, weitergeleitet werden sollte.
Du kannst annehmen, dass du nach einer erfolgreichen Anmeldung nicht wieder auf der Login-Seite landen.
Aus diesem Grund wählst du als folgende ungültige Login-Bedingung
F=<a href="/login">/login</a>
Damit ist nun der hydra-Befehl vollständig:
hydra -L 'usernames.txt' -P 'passwords.txt' 172.19.0.2 -s 80 http-post-form '/login:csrf_token=<value>&username=^USER^&password=^PASS^&submit=Login:H=Cookie:session=<value>:F=<a href="/login">/login</a>'
Wenn du den Wörterbuchangriff startest, vergiss nicht, dass sich der Session-Cookie und das Token zwischenzeitlich geändert haben können.
Hinweis: Kopiere den Befehl und füge ihn mit der Tastenkombination Strg+C ein.
Der Wörterbuchangriff ergibt, dass es einen Benutzer user gibt.
Exploitation
Im nächsten Schritt, der Exploitation, geht es darum, das gefundene Sicherheitsrisiko zu verifizieren.
Das ist also die erste ausnutzbare Schwachstelle. Nun kannst du dich hier ein wenig umsehen und erneut die Reconnaissance durchführen. Du wirst dich im nächsten Abschnitt aber noch um ein weiteres mögliches Sicherheitsrisiko beim Login kümmern.
