Hacking mit Python, Teil 3 Linux-Passwörter und Python
Wie man mit Python und einem erlangten MD5-Hash das zugehörige Passwort entschlüsselt, haben wir uns in der Theorie schon angesehen. In diesem Beitrag demonstrieren wir zunächst, wie Linux-Distributionen Passwörter in der Praxis speichern und warum MD5 nicht sicher ist.
Anbieter zum Thema

Wir verwenden für diese Workshop Kali-Linux, da hier alle für den Beitrag benötigten Tools vorinstalliert sind, einschließlich Python 2.7 und Python 3.6. Ziel ist in Teil vier, das Passwort eines existierenden Linux-Nutzers zu knacken. Dazu schauen wir uns in diesem Beitrag zunächst an, wie Linux allgemein Passwörter ablegt. Dazu legen wir zunächst unter Kali-Linux einen neuen Nutzer wahlweise in der Gnome-Nutzerverwaltung oder per CLI an.
Den zugehörigen Hashwert findet man unter Linux dann üblicherweise in der Datei /etc/shadow. Hier ist es der (neuste) Eintrag in der letzten Zeile. Der Hash, also das verschlüsselte Passwort, ist prinzipiell der Teil zwischen dem ersten und zweiten Doppelpunkt.
Wir kopieren nun die komplette Passwortzeile der Einfachheit halber mit der Maus in einen Text-Editor, als Basis für ein kleines Python-Skript, welches diese Zeile analysieren soll. Dazu packen wir die Zeile gleich in eine Variable und speichern das Dokument als Python-Datei. Als Zielpfad wählen wir das Home-Verzeichnis, legen darin aber einen Unterordner „bin“ an, da es sich ja im Prinzip um eine ausführbare Datei handelt.
Werfen wir einen Blick auf die Zeile, ist leicht festzustellen, dass an erster Stelle der Nutzername steht, gefolgt von einem Doppelpunkt. Dahinter steht der eigentliche für uns interessante Hash-Teil, wieder gefolgt von einem Doppelpunkt. Die weiteren durch Doppelpunkte getrennte Angaben stehen für:
- die Anzahl der Tage seit dem 01.01.1970, an denen das Passwortes zuletzt geändert wurde,die Anzahl der Tage, bevor das Passwort geändert werden kann,
- die Anzahl der Tage, nach denen das Passwort geändert werden muss,
- die Anzahl der Tage, nachdem ein Account deaktiviert wird, wenn der angegeben Zeitraum für den Passwortwechsel nicht eingehalten wurde, sowie
- ein finales Reservefeld "::".
Der für uns interessante Teil zwischen dem ersten und zweiten Doppelpunkt ist allerdings nicht der eigentliche Hash, sondern gliedert sich noch einmal wie folgt: Die ersten drei Zeichen (genau genommen die Ziffer zwischen den $-Zeichen) kennzeichnen den verwendeten Hash-Algorithmus, wobei $1$ für md5, $2$ für Blowfish, $5$ für SHA-256 und $6$ für SHA-512 steht. In unserem Beispiel ist also Letzteres der Fall.
Die Sequenz zwischen den nächsten beiden $-Zeichen ist der sogenannten „Salt“-Wert, der verwendet wird, um dem Algorithmus zum Erstellen des Hash Wertes eines Passworts eine zufällige Komponente mitzugeben. Andernfalls würde der Algorithmus bei gleichem Passwort auch immer den gleichen Hash Wert erzeugen, was ebenfalls ein Sicherheitsproblem wäre.
Erst dann folgt der tatsächliche Hash-Wert. Wie in Teil 2 gezeigt, lässt sich dieses Passwort-Format in Python mit Hilfe des crypt-Moduls erzeugen, welches wie daher zunächst importieren.
import crypt
Ein beliebiges Passwort lässt sich dann bekanntlich mit …
crypt.crypt("geheim")
… verschlüsseln. Testweise schreiben wir jetzt diese zwei Befehle in unser vorbereitetes Skript, ergänzen den Shebang in der ersten Zeile und machen die Datei mit „chmod 755“ ausführbar, um das kleine Python-Programm zu testen:
Apropos Shebang: der Pfad zu Python 3 lässt sich unter Linux einfach durch folgende Eingabe ermitteln:
which python
Aber Vorsicht: da unter Kali sowohl Python 2.7 als auch Python 3.6 installiert sind und das which-Kommando nur „usr/bin/python“ liefert, wechselt man zunächst mit …
cd /usr/bin
… ins bin-Verzeichnis und gibt dann …
ls –l python*
… ein, um an den korrekten Pfad für Python3 zu gelangen.
Achtung: Das Programm sollte zwar fehlerfrei ausgeführt werden, gibt aber nichts aus, da wir ja bisher nur das Passwort erzeugen. Wir kapseln die Ausgabe daher nun noch mit …
print(crypt.crypt("geheim"))
… in einen Print-Befehl, sodass unser Code nun so aussieht, wie in der vorangestellten Abbildung. Der Salt-Wert sorgt nun dafür, dass bei erneuter Ausführung mit dem gleichen Passwort immer ein neuer Hash-Wert erzeugt wird.
Das Salt muss aber immer mitgespeichert werden, um ein später eingegebenes Passwort überprüfen zu können. Die Salt-Technik schützt zum Beispiel zuverlässig gegen Angriffe, die auf Rainbow-Tables basieren.
Einem Angreifer würde es jetzt also nichts nützen, käme er in den Besitz dieses Hashes, da er garantiert nicht in irgendeiner Passwortliste auftaucht; eine Technik, die bei MD5-Hashes durchaus klappen könnte, wie im letzten Beitrag erläutert. MD5-Hashes nicht zu komplexer Passwörter lassen sich oft sogar googlen. Im nächsten Teil werfen wir einen konkreten Blick auf den angekündigten Crack-Vorgang.
(ID:45966183)