Zur Abwechslung mal wieder etwas aus der Praxis. Heute geht es um die mittlerweile verbreiteten DLC-Container. Für die Leute, die damit nichts anfangen können, zunächst eine Zusammenfassung.
Dieses System wurde entwickelt, um Links zu verschlüsseln bzw zu verdecken. Die Benutzer sollen fähig sein, Daten von Servern herunter zu laden, ohne sehen zu können wo diese nun genau liegen. Also eine Containerdatei die Text (Linklisten) enthält, aber nicht von dem Benutzer – zumindest nicht auf einfache Art und Weise – eingesehen werden soll. Der Sinn bzw. Zeck kann von jedem selbst nachgeforscht werden.
Etwas nicht sehen dürfen? Also eine Verschlüsselung. Die Frage ist allerdings, wie hält man etwas vor dem Benutzer geheim, welcher den Inhalt allerdings selbst benötigt. Kurz gesagt: das geht natürlich in der elektronischen Welt nicht. Es ist z.B. durch einen modifizierten Proxy oder das Mitschneiden des Netzwerkverkehrs trotzdem möglich die Links zu erhalten. Die Frage, die allerdings nun hier beantwortet werden soll: „ergibt das Ganze dann noch Sinn?“. Und die Antwort darauf ist erstaunlicherweise: Ja.
Zunächst wollen wir uns Schritt für Schritt dem System nähern. An dieser Stelle muss ich sagen, das obwohl dieses eigentlich Open Source und „Dokumentiert“ ist, es keine wirklich brauchbaren Informationen darüber gibt wie es umgesetzt wurde. Wahrscheinlich um zu verhindern das jemand Schwachstellen findet, wie es bei ähnlichen Systemen geschehen ist. So musste ich ziemlich alles selbst erarbeiten, allerdings denke ich, das meine Argumentation schlüssig ist.
Zuerst war das Wort.. oder die Datei. In diesem Fall der DLC-Container, welchen ich über ein Webinterface der Herstellerseite erstellt habe. Im Cryptool betrachte ich den Inhalt:
Nun, dies ist offensichtlich kodiert. Ja – kodiert und nein, das ist (bisher) keine Verschlüsselung. Es handelt sich um die Base64 Kodierung, welche häufig in Protokollen oder beim Übertragen chiffrierter Daten verwendet wird. Informationen darüber finden sich an jeder Ecke; an dieser Stelle genügt es zu sagen, das wir diese verlustfrei dekodieren können:
Auf den ersten Blick sieht es tatsächlich so aus, als ob es uns nichts Neues gebracht hätte. Dann betrachten wir das Ende dieser Datei etwas genauer:
Was ist hier zu sehen? Zunächst unlesbarer Text bei welchem es sich offensichtlich um verschlüsselten Inhalt handelt, dann ein Nullbyte (0000 0000), und dann, sehr unerwartet, erneut ein Base64. Dieser kann nun erneut dekodiert werden, wobei sich daraus (ähnlich wie oben) lediglich unlesbarer Inhalt ergibt.
Was ist das alles nun? Naja, im oberen Teil befinden sich offensichtlich die Hauptinformationen. Wie eine Signatur liegt dort nun eingebettet eine Zeichenkette, die Besonders zu sein scheint. Nun ist die Frage was man damit machen kann. Zuerst war die Vermutung das es sich dabei um ein asymmetrisch verschlüsseltes Passwort handelt. Allerdings müssten dann die Informationen zum dechiffrieren hartkodiert im Quelltext vorliegen womit das System (insbesondere bei einer Java Anwendung) sehr schnell geknackt wäre.
Nach längerem überlegen kam ich zu dem Entschluss, das es also nur 2 Möglichkeiten gibt: die Sache ist einfach nur sehr oberflächlich und daher „simpel“, oder wirklich clever. Vorweg, ich musste erfahren das letzteres zutrifft.
Um diesem Problem nun gegenüber zu treten, habe ich den verursachten Traffic der Anwendung mitgeschnitten: also mir angeschaut was das Programm von meinem Computer aus ins Internet sendet. Und siehe da, dort war die Lösung. Und zwar gibt es beim Verarbeiten der DLC-Datei einen Datenaustausch zwischen einem Server und der Anwendung. Zuerst schickt das Programm eine Anfrage an den Server, welcher wiederrum antwortet. Und was dort uA gesendet wird ist hier zu sehen:
Erneut wird im Base64 eine Zeichenkette über den Äther geschickt. An dieser Stelle war ich der Verzweiflung nahe, da es sich hierbei erneut um einen String handelt, den ich vorher noch nicht gesehen hatte. Wieder stand ich vor einem Problem, dessen Lösung allerdings recht einfach war:
Und zwar ist das die Base64 Zeichenkette aus der DLC-Datei, erneut in einen Base64 eingepackt. Dies ergibt eigentlich keinen Sinn und scheint eher ein „Fehler“ zu sein bzw. Faulheit der Programmierer. Egal, es ist nun nachgewiesen das diese „besondere“ Signatur zum Server gesendet wird. Nach dieser Anfrage, antwortet der Server mit einer Base64 Zeichenkette (FVZ+8D1u+4Tey+5pSkwNP+SgUTaGXGlRt8kMywjdEkM=), die ich schonmal für uns im Cryptool ausgepackt habe:
Damit ist der Beweis erbracht. In der Datei ist eine Zeichkette enthalten, die nur vom Server entschlüsselt werden kann und das Passwort enthält, mit welchem die Datei vom Programm nutzbar gemacht werden kann. Wieso? Nunja, wir betrachten das letzte Bild, also die Antwort vom Server nach unserer Anfrage. Es handelt sich dabei um ganz exakt 256 Bit. Die typische Länge für z.B. einen AES256. Es kann an dieser Stelle kein asymmetrischen Verfahren verwendet worden sein, da dieses niemals unter 1024 Bit lang wäre. Es ist also sehr wahrscheinlich das hier der Schlüssel dirkt oder zumindest teilweise enthalten ist.
Nach dem was hier zu sehen war, funktioniert das System meiner Meinung nach so: möchte der Benutzer eine DLC-Datei auswerten, läd er diese in das entsprechende Programm. Da der Inhalt verschlüsselt ist, kann die Anwendung damit zunächst nichts anfangen. Innerhalb der Datei befindet sich allerdings das (verschlüsselte) Passwort zum entschlüsseln der Daten, welches jedoch nur vom Betreiber entschlüsselt werden kann. Die Applikation sendet also dieses verschlüsselte Passwort zum DLC-Server, welches die entschlüsselte Version zurückliefert. Damit kann der Inhalt dechiffriert werden kann. Nochmal zusammengefasst:
- das Öffnen der DLC-Datei mit dem Programm,
- die Anwendung sendet das verschlüsselte Passwort zum Server des Betreibers,
- der Betreiber dechiffriert dieses und sendet das entschlüsselte Passwort zurück,
- mit diesem Passwort kann der Inhalt dechiffriert werden und die Links „liegen offen“.
Wofür das Ganze? Der Betreiber kann auf diese Art und Weise kontrollieren, wer (von welcher IP-Adresse) wie häufig eine Datei entschlüsseln möchte. Der Sinn ist zu verhindern, das jemand große Mengen dieser Container entschlüsselt und damit die Links alle freilegt. Ohne Zusammenarbeit mit dem Server ist das entschlüsseln dieser Dateien bzw.der dort enthaltenen Links nicht möglich.
Insgesamt halte ich dieses System für ganz gelungen. Unter Umständen werde ich in einem separaten Eintrag noch einige Anmerkungen dazu machen.