Hacking mit Python, Teil 4 Passwort-Hacking in der Praxis

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten |

Im vierten Teil unserer Python-Hacking-Serie machen wir uns an die eigentliche Entschlüsselung von Passwörtern. Als Grundlage hierfür haben wir bereits gelernt, wie Linux Passwörter speichert und warum MD5 schon lange nicht mehr als sicher gilt.

Anbieter zum Thema

Unser kleines Hacking-Programm.
Unser kleines Hacking-Programm.
(Bild: Drilling / Python)

Im vorangegangenen Beitrag haben wir folgendes Python-Skript als Basis für die nächsten Schritte erarbeitet:

#!/usr/bin/python3
eintrag="tdrilling:$6$QDYFIade7h42pi2$f.KongwrtqV55CJctRgDTyRGTPLt1VTBJ8.U7cpHxyiMPOfcdT6I7AeUwhHpPoyHug9y7pOn8WQ3voId3LU1J/:18026:0:99999:7:::"
import crypt
print(crypt.crypt("geheim"))

Die Herausforderung besteht nun darin, dafür zu sorgen, dass „geheim“ bei der Hashwert-Berechnung stets mit dem gleichen Salt angereichert wird. Wir müssen nämlich unterscheiden zwischen dem gezeigten Vorgang einer einfachen Passworterstellung mit crypt.crypt, bei dem die Funktion den Salt-Wert zufällig bestimmt, und einem Überprüfungsvorgang.

Den Salt-Teil der crypt-Funktion übergeben wir explizit als Parameter.
Den Salt-Teil der crypt-Funktion übergeben wir explizit als Parameter.
(Bild: Drilling / Python)

Haben wir nämlich ein Passwort (welches wir überprüfen wollen und das z. B. aus einer Passwort-Liste stammt), übergeben wir den Salt-Teil der crypt-Funktion explizit als Parameter, also:

print(crypt.crypt("geheim","QDYFIade7h42pi2"))

Dies garantiert uns, dass für das Passwort „geheim“ immer der gleiche Hashwert erzeugt wird. Dies erlaubt es uns wiederum, ein gegebenes Passwort zu überprüfen. Möchte man also verifizieren, dass das Passwort von tdrilling (dessen Hash wir ja aus der /etc/shadow haben) tatsächlich "geheim" ist, muss der Aufruf der crypt-Funktion mit Passwort und Salt-Wert als Parameter dem gesamten gegeben Hash-Wert entsprechen.

Jetzt steht uns wie im letzten Teil wieder der Weg frei, eine Dictionary-Attacke zu programmieren und in einer Programmschleife jeden einzelnen Eintrag (der ja einem Passwort entspricht) mit dem gegebenen Hash-Wert aus unserer /etc/shadow zu vergleichen. Dazu benötigen wir wieder ein passendes Wörterbuch.

Als Wörterbuch-Quelle für unseren Demo-Angriff nutzen wir die Rockyou-Wordlist von Github. Da das Projekt auf englischen Wörtern basiert, ändern wir das Passwort unseres Linux-Nutzens auf "doodie24". Den zugehörigen Hash entnehmen wie der Datei /etc/shadow. Er lautet in diesem Fall:

"$6$yjaUMo9VycT7u2ph$Bskiv9pfXO6vrFlcBpDk045FdJgCAuJLf9nJ1vc57AJg8oRzVwYrvEeQuinnQM/T/r8H33oe8rh8UUEZ87i5J0:18026:0:99999:7:::", wobei der Salt-Wert "yjaUMo9VycT7u2ph" ist. Die Wortliste speichern wir ebenfalls im /<home>/bin-Verzeichnis.

Nun müssen wie die Dictionary-Datei Zeile für Zeile einlesen und die entsprechenden Hashes berechnen. Dazu packen wir zunächst den eigentlichen Hashwert und das Salt in je eine Variable.

Beginnen wir mit dem Öffnen der Datei in Python, die dann Zeile für Zeile durchgegangen wird. Dabei müssen wir noch etwaige Whitespaces und/oder Zeilenumbrüche mit …

line.strip

… entfernen und jeden einzelnen Eintrag in der Variablen „wort“ speichern, die dann wie beschreiben unter Hinzufügung des Salts in der Schleife mit dem gegebenen Hash-Wert verglichen wird:

Unser kleines Hacking-Programm.
Unser kleines Hacking-Programm.
(Bild: Drilling / Python)

#!/usr/bin/python3
password_hash="$6$yjaUMo9VycT7u2ph$Bskiv9pfXO6vrFlcBpDk045FdJgCAuJLf9nJ1vc57AJg8oRzVwYrvEeQuinnQM/T/r8H33oe8rh8UUEZ87i5J0"
salt="yjaUMo9VycT7u2ph"
import crypt
with open("./dictionary") as file:
   for line in file
      wort = line.strip()
      print(crypt.crypt("wort","yjaUMo9VycT7u2ph"))

Das Passwort wurde in der Dictionary-Datei gefunden.
Das Passwort wurde in der Dictionary-Datei gefunden.
(Bild: Drilling / Python)

Bis hierher listet die Funktion nur sämtliche Hashes, einschließlich des hoffentlich richtigen Hashwertes auf. Fehlt nur noch eine If-Abfrage (anstelle der print-Funktion), die jedes Ergebnis explizit auf den gegebenen Hash überprüft und dann das Passwort selbst ausgibt.

(ID:45963705)