CCF 3.0 entschlüsselt

Über den Aufbau und die Funktionsweise des neuesten CryptLoad-Containers (CCF)

Update (25.10.2008):

Lustiger Weise sind Gerüchte aufgetaucht, dass wir in Verbindung mit dem JDownloader-Team stünden, was aber nicht der Wahrheit entspricht. Wir haben und hatten noch nie Kontakt mit den Entwicklern und dieser Artikel soll auch keineswegs eine Werbeaktion für DLC sein. Wir wollten nur betonen, dass das JD-Team immer schon kooperativer war und ihr Container zwar ebenfalls kein Allheilmittel ist, gegen öffentliche Decrypter aber einen kleinen Schutz bietet.
Mitunter ein Grund für die Offenlegung war, dass bei einem Teil der Container gar keine Kodierung ("Verschlüsselung") stattfindet.

Einleitung

DeCCF

Seit CryptLoad 1.1.3 verwendet der auf Microsoft .NET basierende, proprietäre Downloader für bekannte One-Click-Hoster ein neues Format für die Verschlüsselung von Links. CCF Version 3.0 soll "genau so sicher wie das DLC Format" sein, heißt es im offiziellen Wiki. Dieser wagemutigen Behauptung wollen wir auf den Grund gehen. Wer sich einen fertigen CCF-Decrypter erwartet, ist hier aber falsch.
Fertige Entschlüsselungsprogramme wird es von uns auch niemals geben. Wir möchten aber im Dienste der Wissenschaft das grundlegend fehlerhafte Designkonzept dieser Kinderzimmer-Crypto offenlegen, um Uploadern zu verdeutlichen, wie unsicher CCFs wirklich sind.

Welchen Container sollte man stattdessen verwenden?

Am besten natürlich gar keinen. Da dies in der Praxis aber unrealistisch ist, sollte man zumindest auf DLC zurückgreifen. DLC verwendet für die Entschlüsselung einen eigenen Server, wodurch der Entschlüsselungsprozess kurzfristig ausgesetzt werden kann, falls ein öffentlicher Decrypter im Netz auftaucht. Der Nachteil solch eines zentralistischen Systems ist natürlich, dass man sich auf Gedeih und Verderb den Administratoren von JDownloader.org ausliefert. Schmeißen die das Handtuch, sind theoretisch alle Container unbrauchbar. Natürlich ist auch DLC kein Heilmittel und ein Decrypter schnell geschrieben; nur falls dieser eben ver&oouml;ffentlicht wird, kann er sehr schnell unbrauchbar gemacht werden.

Warum behaltet ihr den ganzen Kram nicht für euch?

Das hat mehrere Gründe. Zum einen natürlich unser Geltungsbedarf, zum anderen die restriktiven Lizenzbedingungen von CryptLoad. Im Gegensatz zu JDownloader gibt es CL nur für Windows. Der Source-Code ist außerdem nicht einsehbar und man kann die Software getrost in die Kategorie Adware einordnen. In den Kategorien Usability und Zuverlässigkeit macht es Windows Vista den letzten Platz strittig; User alternativer Betriebssysteme wie Mac OS X oder Linux werden außerdem einfach außen vor gelassen.

Geschichte

Von CCF 0.7 …

Mit CryptLoad 0.7 wurde der erste Container überhaupt eingeführt. Damals setzte man auf einen 256 Bit starken Key in Verbindung mit einem 128 Bit IV und auf das als besonders sicher geltende, symmetrische Verschlüsselungsverfahren Rijndael (Wikipedia). Schon damals waren die Entwickler nicht bereit, mit Schneewiesel, dem Programmierer der Konkurrenzsoftware RSD (Schneewiesel) zu kooperieren (schon wieder ein Grund …). Schneewiesel gelang es aber mittels Reverse Engineering an den Key zu gelangen und konnte die Entschlüsselungsmethode in sein eigenes Programm einbauen, woraufhin mit CryptLoad 0.8 der Key geändert wurde. Zwischendurch kam es zur Entwicklung eines eigenen Containerformats für den RSD – RSDF war geboren.
Es baut ebenfalls auf Rijndael auf, verwendete zur Speicherung aber kein XML. Der Key wurde bald, eingebettet in einen in Python geschriebenen Decrypter von DrHansen (rsd_decrypter_04.rar), publik gemacht und seit dem nicht mehr geändert. CryptLoad änderte einmal noch den Key mit Version 1.0, gab das Katz-und-Maus-Spiel dann aber auf.

… zu 3.0.

Es musste ein völlig neues Konzept her, dachten sich die Entwickler, und führten mit CryptLoad 1.1.3 CCF 3.0 ein. Anstatt auf ein bekanntes, quelloffenes Verfahren zu setzen, entwickelten sie ihr eigenes. Mit weitreichenden Folgen: CCF3.0 ist "broken by design" und verschlüsselt unter bestimmten Umständen die Links nicht einmal.

Google Search 'CCF3.0 rapidshare.com' Auszug eines CCF3.0 im vi

Aufbau

Ein CCF besteht aus drei Teilen:

  1. Header: Beinhaltet Signatur ("CCF3.0", 6 Bytes), 4 "Magic-Bytes" (CRC32), Anzahl der aufgepaddeten Bytes am Ende (Ergänzung auf 64; 1 Byte)
  2. Daten: eingeteilt in 64-Bit-Blöcke, gespeichert im XML-Format und "verschlüsselt" durch Bitverschiebungen
  3. Padding: Nutzlose, zufallsgenerierte Bytes damit die Daten in 64-Bit-Blöcken eingeteilt werden können

Der Header als C-Struktur

struct header {
    char header[6];
    uint32 magic;
    unsigned char padding;
};

Entschlüsselung

Die Entschlüsselung soll anhand eines Containers (Download test.ccf) gezeigt werden.

Analyse der Datei

CCF3 Header

Die Werte aus der Datei benötigen wir später.

Entschlüsselung der Daten

Für die Entschlüsselung nehmen wir den Datenblock inklusive des Paddings (0x9A3F … 851B; hier orange und schwarz umrandet) heran. Durch die blockweise Verschlüsselung muss die Anzahl der ausgewählten Bytes durch 64 ohne Rest dividierbar sein. Fürs Erste reicht es, wenn wir den ersten 64-Byte-Block decrypten. Die restlichen Blocks gehen analog dazu.

Nehmen wir uns den ersten Block vor (erste Grafik).

Erster 64-Byte-Block Erster 64-Byte-Block (nach 1. Operation)

Der Magic-Wert von weiter oben kommt wieder ins Spiel. Die folgenden Operationen werden auf jedes Byte aus dem Block angewendet:

  1. Ist Magic gerade?
    1. Wenn ja, dann rotiere die Bits in Magic um (magic & 0xff) % 9 Bits nach links. → Da das unterste Byte von Magic 0x07 ist, wird in diesem Fall immer um 7 Bit nach rechts rotiert.
    2. Wenn nein, dann rotiere die Bits in Magic um (magic & 0xff) % 12 Bits nach rechts.
  2. Nimm das unterste Byte von Magic (magic & 0xff) und verknüpfe es mit XOR mit dem jeweiligen Byte aus dem Block.
  3. Vertausche die Zeilen und Spalten der Matrix miteinander.

Durch das Vertauschen werden kurioserweise manche Bytes im Block mehrmals modifiziert, manche dafür überhaupt nicht.

Zur besseren Erleuterung noch einmal in C-Code:

for (i = 0; i < 64; i++) {
    if ((magic & 1) != 0) {
        rotateright(&magic, (magic & 0xff) % 12);
    } else {
        rotateleft(&magic, (magic & 0xff) % 9);
    }
    buffer[i] = (unsigned char)(buffer[i] ^ ((unsigned char)(magic & 0xff)));
    bigmatr(buffer);
}

Als nächstes nehmen wir uns die Zeilen einzeln vor. Jetzt geht es noch eine Stufe tiefer, nämlich auf die Bit-Ebene. Die folgenden Anweisungen gelten für alle 8 Zeilen je 64-Byte-Block.

  1. Jedes Byte in der Zeile wird mit magic & 0xff verknüpft.
  2. Die Vertauschung von Zeilen und Spalten der 8-Byte-Zeile (vorstellbar als 64-Bit-Matrix) findet nun auf Bit-Ebene statt.
  3. Ist Magic gerade?
    1. Wenn ja, dann rotiere die Bits in Magic um magic & 9 Bits nach links. → Da das unterste Byte von Magic 0x07 ist, wird hier immer um 1 Bit nach links rotiert.
    2. Wenn nein, dann rotiere die Bits in Magic um magic & 12 Bits nach rechts.

Und noch einmal der C-Code:

for (j = 0; j < 8; j++) {
    for (k = 0; k < 8; k++) {
        x[k] = buffer[(j * 8) + k];
    }
    for (m = 0; m < 8; m++) {
        x[m] = (unsigned char)(x[m] ^ ((unsigned char)(magic & 0xff)));
        smallmatr(x);
        if ((magic & 1) != 0) {
            rotateright(&magic, magic & 12);
        } else {
            rotateleft(&magic, magic & 9);
        }
    }
    for (n = 0; n < 8; n++) {
        buffer[(j * 8) + n] = x[n];
    }
}

Wie auf dem ersten Bild zu sehen, kann man dann wenn man alles richtig gemacht hat, den ersten Block des unverschlüsselten CCFs erkennen.

Dritter 64-Byte-Block Vierter 64-Byte-Block

Die Sache mit dem Padding

Das eingesetzte "Kryptographie-Verfahren" funktioniert nur, wenn sich die zu verschlüsselnden Daten in 64-Byte-Blöcke einteilen lassen. Dies ist aber praktisch nie der Fall. Deshalb fügt man oft mit dem Zufallsgenerator erzeugte Bytes hinzu, bis der Block voll ist (Screenshot rechts, markierte Bytes). Diese Bytes nennt man Padding (dt. "Polsterung").
CryptLoad speichert, wie weiter oben ja bereits analysiert wurde, die Anzahl der Padding-Bytes als Ergänzung auf 64 im 10. Byte des CCF. In diesem Bespiel war das Padding 0x11 = 17 Bytes lang.

Fehler im Design der Verschlüsselung

Der Magic-Wert stellt sozusagen den Key für die Entschlüsselung dar. Dem Verfahren liegt CRC zugrunde, jedoch ist es abgewandelt worden und nicht kompatibel. Berechnet wird der Wert aus dem zu verschüsselendem XML-File.
Was ist aber, wenn das niedrigste Byte des CRC z. B. 0x00 ist? Dann findet nur eine gewöhnliche XOR-Kodierung statt, die peinlicherweise auch noch im zweiten Schritt wieder aufgehoben wird. Dies ist aber nicht nur beim Wert 0x00 so. Es gibt mehrere Werte, die die Verschlüsselung außer Kraft setzen.