Hacking mit Python, Teil 3

Linux-Passwörter und Python

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Unter Linux wird der aus dem Benutzerpasswort generierte Hash-Wert üblicherweise in der Datei /etc/shadow hinterlegt.
Unter Linux wird der aus dem Benutzerpasswort generierte Hash-Wert üblicherweise in der Datei /etc/shadow hinterlegt. (Bild: Drilling / Kali Linux)

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.

Für unser Hacking-Beispiel legen wir einen neuen Nutzer in der Gnome-Nutzerverwaltung an.
Für unser Hacking-Beispiel legen wir einen neuen Nutzer in der Gnome-Nutzerverwaltung an. (Bild: Drilling / Gnome)

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.

Unter Linux wird der aus dem Benutzerpasswort generierte Hash-Wert üblicherweise in der Datei /etc/shadow hinterlegt.
Unter Linux wird der aus dem Benutzerpasswort generierte Hash-Wert üblicherweise in der Datei /etc/shadow hinterlegt. (Bild: Drilling / Kali Linux)

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:

Der Pfad zu Python 3 lässt sich unter Linux recht einfach ermitteln.
Der Pfad zu Python 3 lässt sich unter Linux recht einfach ermitteln. (Bild: Drilling / Kali Linux)

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.

Print-Ausgabe unserer Beispieldatei.
Print-Ausgabe unserer Beispieldatei. (Bild: Drilling / Kali Linux)

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.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Infos finden Sie unter www.mycontentfactory.de (ID: 45966183 / Security-Testing)