SSH-Privatschlüssel mit John the Ripper knacken

Kali LinuxBeginner
Jetzt üben

Einleitung

SSH (Secure Shell)-Schlüssel sind eine sichere Methode zur Authentifizierung bei Remote-Servern und bieten eine robustere Alternative zu passwortbasierten Anmeldungen. Zur Erhöhung der Sicherheit kann ein privater SSH-Schlüssel mit einer Passphrase verschlüsselt werden. Wenn ein Angreifer Zugriff auf Ihre private Schlüsseldatei erhält, benötigt er immer noch die Passphrase, um sie zu verwenden.

Eine schwache Passphrase kann jedoch eine erhebliche Schwachstelle darstellen. In diesem Lab schlüpfen Sie in die Rolle eines Sicherheitsanalysten, um dieses Risiko zu verstehen. Sie lernen, wie Sie John the Ripper, ein leistungsstarkes Open-Source-Tool zum Knacken von Passwörtern, verwenden, um die Passphrase eines privaten SSH-Schlüssels zu knacken. Diese Übung dient zu Bildungszwecken, um die Bedeutung der Verwendung starker Passphrasen hervorzuheben.

Erstellen eines passwortgeschützten privaten SSH-Schlüssels

In diesem Schritt generieren Sie ein neues SSH-Schlüsselpaar. Der private Schlüssel wird mit einer einfachen, leicht zu erratenden Passphrase geschützt. Dieser Schlüssel dient als Ziel für unsere Knackübung in den folgenden Schritten.

Wir verwenden den Befehl ssh-keygen, um den Schlüssel zu erstellen. Wir geben den Schlüsseltyp, die Bitgröße und den Dateinamen an, um sicherzustellen, dass er in unserem Projektverzeichnis erstellt wird.

Führen Sie den folgenden Befehl aus, um ein RSA-SSH-Schlüsselpaar zu generieren. Wenn Sie zur Eingabe einer Passphrase aufgefordert werden, geben Sie labex ein.

ssh-keygen -t rsa -b 2048 -f ./my_ssh_key -C "labex@labex.io"

Sie werden aufgefordert, eine Passphrase einzugeben und zu bestätigen. Geben Sie für beide Aufforderungen labex ein und drücken Sie Enter.

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): labex
Enter same passphrase again: labex
Your identification has been saved in ./my_ssh_key
Your public key has been saved in ./my_ssh_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx labex@labex.io
The key's randomart image is:
+---[RSA 2048]----+
|        .        |
|       . .       |
|      .   .      |
|     . . . .     |
|    . . S .      |
|   . . . o       |
|  . . . + .      |
| . . . =.o.o     |
|..  .oo*+E+      |
+----[SHA256]-----+

Listen Sie nun die Dateien im aktuellen Verzeichnis auf, um das neu erstellte Schlüsselpaar anzuzeigen: den privaten Schlüssel my_ssh_key und den öffentlichen Schlüssel my_ssh_key.pub.

ls -l
total 12
-rw------- 1 labex labex 1823 Jan 01 12:00 my_ssh_key
-rw-r--r-- 1 labex labex  401 Jan 01 12:00 my_ssh_key.pub
-rw-r--r-- 1 labex labex   48 Jan 01 12:00 wordlist.txt

Sie haben erfolgreich einen passwortgeschützten privaten SSH-Schlüssel erstellt.

Extrahieren des Hashs aus dem SSH-Schlüssel mit ssh2john

John the Ripper kann nicht direkt mit dem Dateiformat von SSH-Schlüsseln arbeiten. Es benötigt ein spezifisches Hash-Format, das die verschlüsselte Passphrase darstellt. Um diesen Hash zu erhalten, verwenden wir ein Dienstprogramm namens ssh2john, das Teil der John the Ripper-Suite ist.

In diesem Schritt führen Sie ssh2john auf dem von Ihnen erstellten privaten Schlüssel (my_ssh_key) aus und speichern dessen Ausgabe in einer neuen Datei. Diese Datei enthält den Hash, den john dann zu knacken versuchen kann.

Führen Sie den folgenden Befehl aus, um den Hash zu extrahieren und in einer Datei namens ssh_hash.txt zu speichern:

ssh2john my_ssh_key > ssh_hash.txt

Dieser Befehl erzeugt keine Ausgabe im Terminal, da wir sie mit dem Operator > in die Datei ssh_hash.txt umgeleitet haben.

Um den Inhalt der generierten Hash-Datei anzuzeigen, verwenden Sie den Befehl cat:

cat ssh_hash.txt

Sie sehen eine lange Zeichenkette, die die Hash-Darstellung der Passphrase Ihres Schlüssels ist. Sie wird ungefähr so aussehen:

my_ssh_key:$ssh2$0$16$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$1040$xxxxxxxx...

Nun haben Sie die Hash-Datei für den Knackvorgang bereit.

SSH-Schlüssel-Hash mit John the Ripper knacken

Nachdem der Hash extrahiert wurde, ist es an der Zeit, John the Ripper zum Knacken zu verwenden. Wir werden einen "Dictionary-Angriff" durchführen, bei dem john jedes Wort aus einer gegebenen Liste als potenzielle Passphrase ausprobiert. Für dieses Labor verwenden wir die Datei wordlist.txt, die in Ihrer Umgebung vorab erstellt wurde.

In einem realen Szenario verwenden Angreifer riesige Wortlisten, die Millionen von gängigen Passwörtern, Namen und Wörterbuchwörtern enthalten. Unsere einfache Wortliste enthält die korrekte Passphrase, labex, was sicherstellt, dass der Knackvorgang für diese Demonstration erfolgreich ist.

Führen Sie den Befehl john aus und geben Sie die Wortliste und die Hash-Datei an:

john --wordlist=wordlist.txt ssh_hash.txt

John beginnt mit dem Knackvorgang. Da sich die Passphrase in unserer kurzen Wortliste befindet, wird sie fast sofort gefunden.

Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH private keys ssh2john])
Cost 1 (KDF/cipher) is 0 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
labex            (my_ssh_key)
1g 0:00:00:00 DONE (2023-01-01 12:05) 12.50g/s 12.50p/s 12.50c/s 12.50C/s sunshine..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Erfolg! Die Ausgabelinie labex (my_ssh_key) zeigt an, dass die Passphrase labex für den Schlüssel my_ssh_key erfolgreich wiederhergestellt wurde.

John the Ripper speichert geknackte Passwörter in einer Datei namens "pot file" (standardmäßig ~/.john/john.pot). Um das geknackte Passwort erneut anzuzeigen, ohne den Angriff erneut auszuführen, können Sie die Option --show verwenden:

john --show ssh_hash.txt
my_ssh_key:labex

1 password hash cracked, 0 left

Dies bestätigt die geknackte Passphrase. Sie haben nun erfolgreich die schwache Passphrase eines SSH-Schlüssels geknackt.

SSH-Schlüsselsicherheit verstehen

Dieses Labor demonstriert einen kritischen Punkt: Die Sicherheit eines mit einer Passphrase geschützten SSH-Schlüssels ist nur so stark wie die Passphrase selbst. Lassen Sie uns die Komponenten der SSH-Schlüsselsicherheit aufschlüsseln.

  • Schlüsselstärke (Kryptographie): Dies bezieht sich auf den Algorithmus (z. B. RSA, ECDSA, Ed25519) und die Schlüsselgröße (z. B. 2048, 4096 Bit), die zur Generierung des Schlüssels verwendet werden. Eine größere Schlüsselgröße macht es für einen Angreifer exponentiell schwieriger, die zugrunde liegende Kryptographie durch Brute-Force zu brechen. Dies schützt vor Angriffen, die versuchen, den privaten Schlüssel aus dem öffentlichen Schlüssel abzuleiten.

  • Passphrase-Stärke (Verschlüsselung): Dies schützt die private Schlüsseldatei selbst. Wenn Sie eine Passphrase festlegen, wird die private Schlüsseldatei verschlüsselt. Wenn jemand diese Datei stiehlt, kann er sie nicht verwenden, ohne sie zuerst zu entschlüsseln. Wie Sie gesehen haben, kann eine schwache, gängige oder auf Wörterbüchern basierende Passphrase leicht geknackt werden. Eine starke Passphrase sollte lang, komplex und einzigartig sein, was einen Wörterbuch- oder Brute-Force-Angriff rechnerisch unmöglich macht.

  • Dateiberechtigungen (Zugriffskontrolle): Die Dateiberechtigungen Ihres Betriebssystems bieten die erste Verteidigungslinie. Eine private Schlüsseldatei sollte immer Berechtigungen haben, die den Zugriff auf den Eigentümer beschränken (z. B. 600 oder -rw-------). Dies verhindert, dass andere Benutzer auf demselben System die Schlüsseldatei lesen können.

In unserem Labor war die kryptographische Stärke des Schlüssels irrelevant, da der Angriffsvektor nicht die Kryptographie selbst war, sondern die schwache Passphrase, die zur Verschlüsselung der Datei verwendet wurde.

Best Practices für die SSH-Schlüsselverwaltung

Das Verständnis der Risiken ist der erste Schritt. Die Anwendung von Best Practices ist der Weg, um sie zu mindern. Hier sind wesentliche Regeln für die sichere Verwaltung Ihrer SSH-Schlüssel in einer realen Umgebung.

  • Verwenden Sie starke, einzigartige Passphrasen:

    • Verwenden Sie niemals gängige Wörter, Namen oder einfache Muster.
    • Eine starke Passphrase sollte lang (15+ Zeichen) sein und eine Mischung aus Großbuchstaben, Kleinbuchstaben, Zahlen und Symbolen enthalten.
    • Erwägen Sie die Verwendung eines Passwort-Managers, um hochkomplexe Passphrasen zu generieren und zu speichern.
  • Verwenden Sie moderne Algorithmen und angemessene Schlüsselgrößen:

    • Bevorzugen Sie moderne Algorithmen wie Ed25519 oder ECDSA gegenüber dem älteren RSA. Sie bieten bessere Sicherheit und Leistung.
    • Wenn Sie RSA verwenden, stellen Sie eine Schlüsselgröße von mindestens 2048 Bit sicher, wobei 4096 Bit für langfristige Sicherheit empfohlen werden.
  • Sichern Sie private Schlüsseldateien:

    • Stellen Sie immer sicher, dass Ihre privaten Schlüsseldateien (z. B. ~/.ssh/id_rsa) strenge Dateiberechtigungen haben. Verwenden Sie chmod 600, um nur Ihrem Benutzer Lese-/Schreibzugriff zu gewähren.
  • Verwenden Sie einen SSH-Agenten:

    • Ein SSH-Agent (ssh-agent) ist ein Hintergrundprogramm, das Ihre entschlüsselten privaten Schlüssel im Speicher zwischenspeichert. Sie geben Ihre Passphrase einmal ein, wenn Sie den Schlüssel zum Agenten hinzufügen, und müssen ihn während Ihrer Sitzung nicht erneut eingeben. Dies ist sowohl praktisch als auch sicher, da die Passphrase nicht wiederholt eingegeben oder auf der Festplatte gespeichert wird.
  • Rotieren Sie Schlüssel regelmäßig:

    • Generieren Sie periodisch neue SSH-Schlüsselpaare und stellen Sie alte außer Betrieb. Dies begrenzt das Zeitfenster für einen Angreifer, falls ein alter Schlüssel jemals kompromittiert wird.
  • Teilen Sie niemals private Schlüssel:

    • Ein privater Schlüssel ist privat. Er ist Ihre eindeutige Identität. Senden Sie ihn niemals per E-Mail, Chat oder über ein anderes Medium. Wenn eine andere Person Zugriff benötigt, sollte sie ihr eigenes Schlüsselpaar generieren und Ihnen ihren öffentlichen Schlüssel zur Verfügung stellen.

Zusammenfassung

In diesem Labor haben Sie praktische Erfahrungen mit einer gängigen Aufgabe der Sicherheitsüberprüfung gesammelt. Sie haben erfolgreich:

  • Ein neues SSH-Schlüsselpaar generiert, das durch eine Passphrase geschützt ist.
  • Das Dienstprogramm ssh2john verwendet, um einen knackbarbaren Hash aus der privaten Schlüsseldatei zu extrahieren.
  • Einen Wörterbuchangriff mit John the Ripper durchgeführt, um die schwache Passphrase zu knacken.
  • Die grundlegenden Prinzipien der SSH-Schlüsselsicherheit gelernt, einschließlich der unterschiedlichen Rollen von kryptographischer Stärke und Passphrase-Stärke.
  • Die wesentlichen Best Practices für eine sichere SSH-Schlüsselverwaltung überprüft.

Diese Übung zeigt, dass selbst starke kryptographische Werkzeuge durch schwache menschliche Praktiken untergraben werden können. Schützen Sie Ihre SSH-Schlüssel immer mit starken, einzigartigen Passphrasen, um die Integrität Ihrer digitalen Identität zu gewährleisten.