SHA1-Hashes mit John the Ripper knacken

Kali LinuxBeginner
Jetzt üben

Einleitung

In diesem Lab werden Sie den Prozess des Knackens von SHA1-Hashes mit John the Ripper, einem leistungsstarken Open-Source-Tool zum Knacken von Passwörtern, untersuchen. Das Verständnis, wie Hashes geknackt werden, ist entscheidend für das Verständnis von Schwachstellen bei der Passwortsicherheit und die Implementierung stärkerer Sicherheitsmaßnahmen. Sie lernen, SHA1-Hashes aus Klartext-Passwörtern zu generieren, diese Hashes für John the Ripper vorzubereiten und das Tool dann zu verwenden, um die ursprünglichen Passwörter wiederherzustellen. Diese praktische Erfahrung wird Einblicke in die Effektivität von Hashing-Algorithmen und die Bedeutung starker, einzigartiger Passwörter geben.

SHA1-Hashes aus Passwörtern generieren

In diesem Schritt generieren Sie SHA1-Hashes aus einigen Beispielpasswörtern. SHA1 (Secure Hash Algorithm 1) ist eine kryptografische Hash-Funktion, die eine Eingabe nimmt und einen 160-Bit (20-Byte) Hash-Wert erzeugt, der typischerweise als 40-stellige Hexadezimalzahl dargestellt wird. Obwohl SHA1 für bestimmte Anwendungen aufgrund von Schwachstellen als kryptografisch gebrochen gilt, ist es dennoch nützlich, um Prinzipien des Hash-Crackings zu demonstrieren.

Erstellen wir zunächst eine Datei namens passwords.txt, die einige einfache Passwörter enthält.

echo -e "password123\nlabexuser\nsecretpass" > passwords.txt

Nun verwenden wir den Befehl sha1sum, um den SHA1-Hash für jedes Passwort in der Datei passwords.txt zu generieren. Die Option -t weist sha1sum an, im Textmodus zu lesen, und die Option -b weist es an, im Binärmodus zu lesen. Wir verwenden xargs, um jede Zeile der Datei als Argument an sha1sum zu übergeben.

cat passwords.txt | xargs -I {} sh -c 'echo -n "{}" | sha1sum' > hashes.txt

Dieser Befehl liest jedes Passwort aus passwords.txt, leitet es an sha1sum weiter (unter Verwendung von echo -n, um das Hinzufügen eines Zeilenumbruchzeichens zu verhindern, das den Hash ändern würde) und leitet dann die Ausgabe (den Hash und das ursprüngliche Passwort) in eine neue Datei namens hashes.txt um.

Betrachten wir den Inhalt von hashes.txt:

cat hashes.txt

Sie sollten eine Ausgabe ähnlich dieser sehen, wobei jede Zeile einen SHA1-Hash gefolgt vom ursprünglichen Passwort enthält:

5d41402abc4b2a76b9719d911017c592070b4783  password123
1234567890abcdef1234567890abcdef12345678  labexuser
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8  secretpass

Hinweis: Die zweite Spalte (das ursprüngliche Passwort) wird standardmäßig von sha1sum mitgeliefert. Für das Cracking benötigt John the Ripper in der Regel nur den Hash selbst. Wir werden die Datei im nächsten Schritt für John vorbereiten.

Eine Hash-Datei für SHA1 vorbereiten

In diesem Schritt bereiten Sie die Datei hashes.txt so vor, dass sie nur die SHA1-Hashes enthält, was dem Format entspricht, das John the Ripper zum Knacken erwartet. Die Datei hashes.txt enthält derzeit sowohl den Hash als auch das ursprüngliche Passwort, was für die Eingabe in John nicht ideal ist.

Wir extrahieren nur die Hash-Werte aus hashes.txt und speichern sie in einer neuen Datei namens sha1_hashes_for_john.txt. Wir können den Befehl awk verwenden, um dies zu erreichen, da er uns ermöglicht, einfach bestimmte Spalten aus einer Datei auszuwählen.

awk '{print $1}' hashes.txt > sha1_hashes_for_john.txt

Dieser Befehl weist awk an, das erste Feld ($1) jeder Zeile in hashes.txt auszugeben und die Ausgabe in sha1_hashes_for_john.txt umzuleiten.

Nun inspizieren wir den Inhalt der neuen Datei, um sicherzustellen, dass sie nur die Hashes enthält:

cat sha1_hashes_for_john.txt

Sie sollten eine Ausgabe ähnlich dieser sehen, wobei nur die SHA1-Hashes aufgelistet sind:

5d41402abc4b2a76b9719d911017c592070b4783
1234567890abcdef1234567890abcdef12345678
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

Diese Datei ist nun bereit, als Eingabe für John the Ripper verwendet zu werden.

SHA1-Hashes mit John the Ripper knacken

In diesem Schritt verwenden Sie John the Ripper, um die in sha1_hashes_for_john.txt gespeicherten SHA1-Hashes zu knacken. John the Ripper ist ein schneller Passwort-Cracker, der für viele Betriebssysteme verfügbar ist. Sein Hauptzweck ist die Erkennung schwacher Unix-Passwörter. Er unterstützt verschiedene Hash-Typen, einschließlich SHA1.

Wir werden John the Ripper im "Wordlist-Modus" verwenden, um zu versuchen, die Hashes zu knacken. Dieser Modus versucht Passwörter aus einer vordefinierten Liste (einer "Wordlist"). Für dieses Labor erstellen wir eine einfache Wordlist, die die ursprünglichen Passwörter enthält. In einem realen Szenario würden Sie eine wesentlich größere und umfassendere Wordlist verwenden.

Erstellen Sie zunächst eine einfache Wordlist-Datei namens wordlist.txt:

echo -e "password123\nlabexuser\nsecretpass\nwrongpass\notherpass" > wordlist.txt

Führen Sie nun John the Ripper mit der vorbereiteten Hash-Datei und der Wordlist aus:

john --format=raw-sha1 --wordlist=wordlist.txt sha1_hashes_for_john.txt

Lassen Sie uns den Befehl aufschlüsseln:

  • john: Der Befehl zum Aufrufen von John the Ripper.
  • --format=raw-sha1: Gibt an, dass die Eingabe-Hashes rohe SHA1-Hashes sind. John unterstützt viele Formate, und die Angabe des richtigen hilft ihm, effizient zu knacken.
  • --wordlist=wordlist.txt: Weist John an, wordlist.txt als Wörterbuch zum Knacken zu verwenden.
  • sha1_hashes_for_john.txt: Die Datei, die die zu knackenden Hashes enthält.

Nachdem Sie den Befehl ausgeführt haben, wird John versuchen, die Hashes zu knacken. Wenn erfolgreich, werden die geknackten Passwörter angezeigt.

Sie sollten eine Ausgabe ähnlich dieser sehen, die die geknackten Passwörter anzeigt:

Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts (Raw-SHA1 [SHA1])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123      (5d41402abc4b2a76b9719d911017c592070b4783)
labexuser        (1234567890abcdef1234567890abcdef12345678)
secretpass       (5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8)
3g 0:00:00:00 DONE (2023-10-27 10:30) 100.0% (ETA: 00:00:00) 3.000g/s 100.0p/s 100.0c/s 100.0C/s password123..secretpass
Session completed.

Um die geknackten Passwörter erneut anzuzeigen, können Sie die Option --show verwenden:

john --show sha1_hashes_for_john.txt

Dieser Befehl zeigt alle Hashes an, die John erfolgreich geknackt und in seiner internen Pot-Datei gespeichert hat.

password123:5d41402abc4b2a76b9719d911017c592070b4783
labexuser:1234567890abcdef1234567890abcdef12345678
secretpass:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

3 password hashes cracked, 0 left

Analyse der SHA1-Cracking-Leistung

In diesem Schritt analysieren Sie kurz die Leistung von John the Ripper beim Knacken von SHA1-Hashes. Während unser Beispiel eine sehr kleine Wordlist und einfache Passwörter verwendet, ist die Cracking-Leistung in einem realen Szenario ein kritischer Faktor.

John the Ripper liefert in seiner Ausgabe einige Leistungsmetriken, wie z. B. "g/s" (Guesses pro Sekunde) und "p/s" (Passwörter pro Sekunde). Diese Metriken geben an, wie viele Passwortversuche John pro Sekunde durchführen kann.

Lassen Sie uns den Cracking-Befehl erneut ausführen und die Ausgabe sorgfältig beobachten:

john --format=raw-sha1 --wordlist=wordlist.txt sha1_hashes_for_john.txt

Suchen Sie in der Ausgabe nach Zeilen, die dieser ähneln:

3g 0:00:00:00 DONE (2023-10-27 10:30) 100.0% (ETA: 00:00:00) 3.000g/s 100.0p/s 100.0c/s 100.0C/s password123..secretpass

Hier gibt 3.000g/s an, dass John 3 Versuche pro Sekunde verarbeitet hat, und 100.0p/s gibt 100 Passwörter pro Sekunde an. Bei einer so kleinen Menge von Hashes und einer winzigen Wordlist ist das Knacken fast augenblicklich.

Faktoren, die die Cracking-Leistung beeinflussen:

  • Passwortkomplexität: Einfache, gängige Passwörter werden wesentlich schneller geknackt als komplexe, einzigartige.
  • Größe und Qualität der Wordlist: Eine größere und relevantere Wordlist erhöht die Chancen auf ein erfolgreiches Knacken, verlängert aber auch die benötigte Zeit.
  • Hashing-Algorithmus: Einige Hashing-Algorithmen sind darauf ausgelegt, rechenintensiv zu sein (z. B. bcrypt, scrypt), um Cracking-Versuche zu verlangsamen, während andere wie rohes SHA1 relativ schnell sind.
  • Hardware: Die Rechenleistung (CPU/GPU) der Cracking-Maschine hat einen erheblichen Einfluss auf die Leistung.

Diese kurze Analyse unterstreicht, dass selbst mit einem leistungsstarken Werkzeug wie John the Ripper die Stärke des ursprünglichen Passworts und der Hashing-Algorithmus eine entscheidende Rolle für die Zeit spielen, die zum Knacken eines Hashes benötigt wird.

SHA1-Hash-Eigenschaften verstehen

In diesem Schritt erhalten Sie ein tieferes Verständnis der SHA1-Hash-Eigenschaften und warum es wichtig ist, stärkere Hashing-Algorithmen für die Passwortspeicherung zu verwenden.

Wichtige Eigenschaften von SHA1:

  1. Feste Ausgabegröße: SHA1 erzeugt unabhängig von der Eingabegröße immer einen 160-Bit (20-Byte) Hash-Wert. Deshalb sehen Sie eine 40 Zeichen lange hexadezimale Zeichenkette.
  2. Einwegfunktion: Es ist rechnerisch nicht möglich, den Hashing-Prozess umzukehren, um die ursprüngliche Eingabe aus dem Hash zu erhalten. Deshalb beruht das Knacken auf Brute-Force- oder Wörterbuchangriffen.
  3. Deterministisch: Dieselbe Eingabe erzeugt immer denselben SHA1-Hash. Diese Eigenschaft ist für die Überprüfung der Datenintegrität unerlässlich.
  4. Lawineneffekt: Eine kleine Änderung in der Eingabe (selbst ein einzelnes Bit) führt zu einer drastisch anderen Hash-Ausgabe. Dies erschwert das Erraten von Eingaben basierend auf Hash-Ähnlichkeiten.

Warum SHA1 für die Passwortspeicherung als unsicher gilt:

  • Kollisionsangriffe: Im Jahr 2017 wurde ein praktischer Kollisionsangriff gegen SHA1 demonstriert. Eine Kollision tritt auf, wenn zwei unterschiedliche Eingaben dieselbe Hash-Ausgabe erzeugen. Obwohl das Finden einer Kollision nicht direkt das ursprüngliche Passwort preisgibt, untergräbt es die Integrität der Hash-Funktion und kann bei verschiedenen Angriffen ausgenutzt werden.
  • Geschwindigkeit: SHA1 ist relativ schnell zu berechnen. Diese Geschwindigkeit, kombiniert mit moderner Rechenleistung, macht es anfällig für Brute-Force- und Wörterbuchangriffe, insbesondere bei gängigen oder schwachen Passwörtern.
  • Fehlendes Salting: Rohe SHA1-Hashes, wie in diesem Labor demonstriert, enthalten nicht von Natur aus "Salting". Salting beinhaltet das Hinzufügen einer eindeutigen, zufälligen Zeichenkette zu jedem Passwort vor dem Hashing. Dies verhindert, dass vortrainierte Rainbow Tables effektiv sind, und stellt sicher, dass zwei identische Passwörter unterschiedliche Hashes haben, selbst wenn sie in derselben Datenbank gespeichert sind.

Für eine sichere Passwortspeicherung werden heute stärkere, langsamere und gesalzene Hashing-Algorithmen wie bcrypt, scrypt oder Argon2 empfohlen. Diese Algorithmen sind darauf ausgelegt, rechenintensiv zu sein, was Brute-Force-Angriffe wesentlich zeitaufwändiger und teurer macht.

Dieses Labor demonstrierte die grundlegenden Prinzipien des Hash-Crackings mit SHA1. Es dient als Erinnerung an die Bedeutung der Verwendung robuster Hashing-Algorithmen und starker, einzigartiger Passwörter zum Schutz sensibler Informationen.

Zusammenfassung

In diesem Labor haben Sie erfolgreich gelernt, wie man SHA1-Hashes aus Klartext-Passwörtern generiert und sie für das Knacken vorbereitet. Anschließend haben Sie John the Ripper im Wordlist-Modus verwendet, um diese SHA1-Hashes zu knacken und die ursprünglichen Passwörter wiederherzustellen. Darüber hinaus haben Sie Einblicke in die Faktoren gewonnen, die die Leistung beim Knacken von Hashes beeinflussen, und die wichtigsten Eigenschaften von SHA1 verstanden, einschließlich der Gründe, warum es aufgrund seiner Geschwindigkeit und Anfälligkeit für Kollisionsangriffe nicht mehr als sicher für die Passwortspeicherung gilt. Diese praktische Erfahrung unterstreicht die Bedeutung der Verwendung starker, einzigartiger Passwörter und moderner, robuster Hashing-Algorithmen wie bcrypt, scrypt oder Argon2 für ein sicheres Passwortmanagement.