· 

ZIP-Dateien mit Python knacken

Disclaimer

Vorab der obligatorische Hinweis, dass die hier beschriebene Technik zum Knacken von ZIP-Dateien selbstverständlich nur auf ZIP-Archive angewendet werden dürfen, deren Autor man selbst ist. Es ist verboten ZIP-Archive einer anderen Person ohne ihr Einverständnis zu knacken. Im Falle der Zuwiderhandlung macht man sich des Ausspähens von Daten gemäß § 202a schuldig. Ich übernehme keine Haftung für Schäden, die durch eine Missachtung meines Disclaimers entstehen. Don't learn to hack, hack to learn.


Wie kann man ZIP-Archive durch ein Passwort schützen?

Unter Windows kannst du ein ZIP-Archiv mit dem Programm 7zip folgendermaßen schützen:

1. Führe einen Rechtsklick auf der Datei aus, die du schützen willst. 

2. Wähle das Programm 7zip aus.

3. Wähle dort die Option "Zu einem Archiv hinzufügen..." aus.

4. In dem sich öffnenden Fenster vergibst du einen Namen für die ZIP-Datei, wählst als Archivformat "zip" aus und vergibst ein Passwort, das du einmal bestätigen musst. Zudem kannst du das Verschlüsselungsverfahren auswählen. Windows bietet dir hier "ZipCrypto" und "AES256" an. Wir lassen die Einstellungen in diesem Tutorial so, wie sie ist. 

5. Klicke abschließend auf "OK".

Wenn das ZIP-Archiv nun entpackt werden soll, wird ein Passwort benötigt. 

Nur mit dem richtigen Passwort lässt sich die Datei entschlüsseln.


Ansatz

Wie geht man beim Knacken des ZIP-Archivs vor? Nun, der Ansatz ist in vielen Fällen ein einfacher Brute Force Angriff. Was man darunter versteht und wie er funktioniert, erkläre ich in dem folgenden Video:

Eine Brute Force Attacke ist bei ZIP-Archiven, anders als bei z. B. Online-Accounts, sehr erfolgsversprechend, weil sie offline stattfinden, d. h. ein einmal beschafftes Archiv kann so lange man möchte analysiert und zu knacken versucht werden. Es gibt keine Brute Force Protection, die einen Angreifer aussperren könnte. Wie sollte das überhaupt funktionieren? Das ZIP-Archiv müsste sich entweder nach einer zu häufigen Fehleingabe löschen, verschlüsseln oder den Prozess der Eingabe eines neuen Passworts verlangsamen, was ohne weitere Programmlogik nicht umsetzbar ist.

Statt eines Brute Force Angriffs hat sich in der Praxis die Verwendung einer Passwortliste bewährt. Dabei wird nicht blind jede mögliche Zeichenkette im Schlüsselraum ausprobiert, sondern nur eine (sinnvolle) Teilmenge davon. Im Internet gibt es viele solcher Listen, die zum Großteil aus Datenleaks stammen. Auf diesen Daten wurde die Häufigkeit des Auftretens bestimmter Passwörter und deren Abwandlungen analysiert und viele Passwortlisten verwenden dieses Wissen, um eine Auftrittswahrscheinlichkeit für bestimmte Passwörter zu antizipieren. Auf cybernews.com wurden bspw. die 10 meist verwendeten Passwörter veröffentlicht. Die Autoren dieses Beitrags haben das Ranking ebenfalls auf Basis öffentlich einsehbarer Leaks. Die Daten wurden anonymisiert und von den Passwörtern getrennt, um sich die Daten isoliert anzuschauen. Dies resultierte letztendlich in der bereits verlinkten Liste.

Eine sehr umfangreiche Passwortliste stellt rockyou.txt dar. In der aktuellen Fassung sind darin ca. 14.3 Millionen Einträge gespeichert, die aus unterschiedlichen Leaks stammen. Die Wahrscheinlichkeit dafür, in dieser Liste einen Passwort-Treffer zu erzielen, ist schon ziemlich hoch. Deshalb solltest du vor der Wahl eines neuen Passworts überprüfen, ob sich in der rockyou.txt evtl. bereits dein Passwort befindet. Auch wenn sich nur Teile deines Passworts darin befinden, könnte das die Sicherheit gefährden.

 


Implementierung eines ZIP-Crackers in Python

Auf Basis dieses Ansatzes können wir uns nun ein kleines Python-Skript schreiben, das einen Offline-Angriff auf das ZIP-Passwort unter Zuhilfenahme einer Passwortliste durchführt. 

Hierzu benötigen wir die Bibliothek zipfile, die wir uns einfach importieren.

import zipfile 

Zusätzlich benötigen wir von tqdm noch tqdm. Damit lässt sich ein Fortschrittsbalken im Konsolenfenster umsetzen, damit man weiß, wie viele Passwörter noch durchprobiert werden müssen bzw. wie viele Passwörter pro Sekunde ausprobiert werden können.

from tqdm import tqdm

Danach schreiben wir uns eine Funktion crack, die einen Pfad zu einem zu knackenden ZIP-Archiv erhält. Zusätzlich wird noch eine Wordlist benötigt. 

def crack(in_filename, wordlist):

Der darin gespeicherte Inhalt wird dann gegen das ZIP-Archiv gefeuert. Um den Fortschrittsbalken mit tqdm umzusetzen, benötigen wir die Anzahl aller Passwörter, die es durchzuprobieren gilt. 

   n = len(list(open(wordlist, "rb")))

Wir laden uns die ZIP-Datei nun in unser Programm

   zip_file = zipfile.ZipFile(in_filename)

und öffnen die Wordlist. 

   with open(wordlist, "rb") as file:

Wir iterieren nun in einer For-Schleife über alle Passwörter und erzeugen uns parallel mit tqdm eine Fortschrittsanzeige. Dazu übergeben wir den Filehandle, die Anzahl ALLER Einträge und die Units, also die Einheiten, die nach Abarbeitung den Fortschrittsbalken weiter nach rechts verschieben. Die Units sind in unserem Fall die "passwords", die in den einzelnen Iterationsschritten ausprobiert werden. 

      for passwords in tqdm(file, total = n, unit = "passwords"):

Danach versuchen wir, das ZIP-File mit der Methode extractall und der Übergabe des aktuell ausgelesenen Worts aus der Wordlist zu knacken.

         try:
            zip_file.extractall(pwd = passwords.strip())

Schlägt das fehl, wird einfach die For-Schleife weitergeführt. 

         except:
            continue

Wenn es allerdings gelingt, wird das ZIP-Archiv entpackt und das Passwort auf der Konsole ausgegeben. 

         else:
            print("\nPasswort: ", passwords.decode())
            break 

Um unsere Funktion auf das ZIP-Archiv geheim.zip mit der Wordlist rockyou.txt anzuwenden, kann der folgende Code verwendet werden:

crack("geheim.zip", "rockyou.txt")

Quellcode

Hier kannst du dir den gesamten Quellcode des Programms noch einmal kostenfrei herunterladen.

import zipfile 
from tqdm import tqdm

def crack(in_filename, wordlist):
   n = len(list(open(wordlist, "rb")))
   zip_file = zipfile.ZipFile(in_filename)
   with open(wordlist, "rb") as file:
      for passwords in tqdm(file, total = n, unit = "passwords"):
         try:
            zip_file.extractall(pwd = passwords.strip())
         except:
            continue
         else:
            print("\nPasswort: ", passwords.decode())
            break            
    
crack("geheim.zip", "rockyou.txt")

Schutzmaßnahmen

Um sich vor Angriffen auf das Passwort eines ZIP-Archives zu schützen, bleibt einem eigentlich nur die Option, das Passwort so kompliziert und lang wie möglich zu wählen. Möglichkeiten zum Generieren und Merken von sicheren Passwörtern, beschreibe ich in dem folgenden Video:

Grundsätzlich solltest du dir zweimal überlegen, welche Informationen du über das Internet verschicken möchtest. Ein Passwort bringt in einer Welt, in der es noch keine Quantencomputer gibt, nur dann etwas, wenn es lang genug ist. Wie viele Stellen sollte ein solches Passwort deiner Ansicht nach haben? 8 Stellen? 10 Stellen? 15 Stellen? Also unter 20 Stellen fühle ich mich jedenfalls nicht sicher. 

Du solltest auch im Hinterkopf behalten, dass Passwörter, die man heute noch nicht knacken kann, in 10 Jahren evtl. wird knacken können, sobald Quantencomputer auf dem Markt sind bzw. sich die Technologie immer weiter verbessert. Dann gehören mathematische Probleme, die sich heute noch nicht in hinreichend kurzer Zeit lösen lassen, evtl. bald der Vergangenheit an. Wenn dich Quantencomputer interessieren, kannst du dir mit diesem Video alles Wichtige in Kürze aneignen: