Heute habe ich meine monatliche Rechnung von meinem Internetanbieter erhalten und etwas kam mir seltsam vor.
Die Rechnung, die in der E-Mail enthalten war, befand sich in einer ZIP-Datei mit Passwort.
Ganz zu schweigen davon, wie merkwürdig es in der heutigen Zeit ist, einen Anhang als ZIP-Datei zu erhalten (Spam, Malware, Phishing usw.), kam mir das gewählte Passwort ziemlich schwach vor.
Es ist der Geburtstag des Kontoinhabers im Format YYMMDD.
Ich habe im Fitnessstudio eine sehr grobe Berechnung im Kopf angestellt und bin auf sehr wenige mögliche Kombinationen gekommen. Nachdem ich mit einem Online-Tool berechnet habe, wie viele Tage seit dem 1900-01-01 vergangen sind (da nicht alle Kombinationen ein gültiges Datum ergeben würden), stellte sich heraus, dass es nur 44.075 Kombinationen sind (bis 2020-09-14).
Da ich weiß, dass optimierte Tools, die GPU-Leistung zum Knacken von Hashes nutzen, Millionen von Versuchen pro Sekunde durchführen können, wollte ich sehen, wie schnell das Passwort ohne solche Tools geraten werden kann, nur mit der Linux/macOS-Kommandozeile (da ich im Fitnessstudio nur Zugriff auf einen VPS hatte).
Ich habe folgenden Code entwickelt, der unter macOS funktioniert:
echo {1..44000} | xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" | xargs -P 16 -I{} sh -c 'unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255'
Der Befehl ist von seiner Funktionsweise her ziemlich einfach, auch wenn er kompliziert erscheint.
echo {1..44000} erzeugt die Zahlen von 1 bis 44.000 und gibt sie an den nächsten Schritt weiter.
xargs -P 16 -n 1 -I{} date -v "-{}d" +"%y%m%d" – nimmt die Eingabe aus dem ersten Schritt und erzeugt Daten im Format YYMMDD, indem die Funktionalität von date genutzt wird, ein Datum um einen bestimmten Betrag zu „ergänzen“. In diesem Fall würde es X Tage vom aktuellen Datum abziehen, wobei X die im ersten Schritt erzeugte Zahl ist. Auf diese Weise können wir Daten vom heutigen Tag zurück bis in die 1900er Jahre erzeugen.
Der dritte Schritt ist der interessantere, daher werde ich ihn in zwei Teile aufteilen:
xargs -P 16 -I{} sh -c '...'
Dies nimmt die in Schritt 2 erzeugten Daten und führt für jedes dieser Daten einen Befehl aus. -P 16 bedeutet hier, dass dies in 16 parallelen Prozessen ausgeführt wird, um das Durchsuchen der Daten zu beschleunigen. Derselbe Trick wird auch in Schritt 2 angewendet, um die Datumserzeugung zu beschleunigen.
Der zweite Teil ist der Ort, an dem die Rateversuche stattfinden:
unzip -qqoP "{}" 0417160508.zip && echo "{}" && exit 255
Dabei wird zunächst versucht, die ZIP-Datei mit dem in Schritt 2 erzeugten Passwort zu entpacken. Wenn es erfolgreich ist, wird das erratene Passwort ausgegeben (echo), und dann erzwingt exit 255, dass xargs die Ausführung stoppt. Wir wollen nicht weiter raten, wenn das Passwort bereits gefunden wurde.
Alles in allem war es eine ziemlich schlechte Entscheidung, dies als Passwort für die Datei zu wählen, denn das Ausführen des obigen Befehls dauert nur etwa 10 Sekunden, um das richtige Passwort für meine Rechnung zu erraten. Für jeden anderen auch nicht viel länger.