Payload von VeraCrypt entschlüsseln

Die VeraCrypt-Software ermöglicht, das Kennwort eines VeraCrypt-Containers zu ändern (und nur das).

Dazu ist die Angabe des aktuellen und die neuen Kennworts notwendig. Diese Funktionalität kann mit der GUI oder in einer Terminalsitzung abgerufen werden. Wie hier erläutert, wird der Header durch das Kennwort geschützt, der Payload hingegen durch die im Header abgelegten AES Keys. Technisch gesehen muß somit bei einer Kennwortänderung der Header neu verschlüsselt geschrieben werden, also der Header komplett einmalig entschüsselt werden - um eben die AES Keys des Payloads im neuen Header ablegen zu können.

Also muß es für diese Situation im Quellcode eine Stelle geben, an der der Header ausgelesen, entschlüsselt und die AES Keys des Payloads im Klartext vorliegen.

Daher wird beim Debugging eine Situation abgebildet, die eine Header-Kennwortänderung durchführt. Dies wird unter Visual Studio Code durch eine angepaßte "launch.json" abgebildet, die VeraCrypt mit dem Parameter "--change" startet. Die diversen notwendigen Eingaben (z.B. Pfad und Name des VeraCrypt-Containers, bisheriges Kennwort u.a.) werden getätigt und dabei nach Augenschein verfolgt, welche Quellcodes involviert sind.

Daraus ergibt sich die Erkenntnis, daß der Code aus "./VeraCrypt-master/src/Volume/VolumeHeader.cpp" von Belang ist, er führt u.a. das Erstellen eines neuen Headers aus.

Bei Statement 152 (vgl. Bild unten) wird auf den String "VERA" geprüft, der zu diesem Zeitpunkt gültige Pointer "DataPtr:" verweist auf den Hauptspeicherbereich, in dem der gegenwärtig entschlüsselte Header beginnt.

Dabei gilt gemäß Herstellerangaben:

    • das Offset des Strings "VERA" ist 64;
    • das Offset der AES-Keys des Payloads ist 256;
    • somit liegen die AES-Keys des Payloads jetzt im Hauptspeicher an der Adresse des Pointers "DataPtr:" zuzüglich 256 Stellen abzüglich 64 Stellen relativ zur Position des Strings "VERA".

Breakpoint bei Statement 152

Dieser Hauptspeicherbereich kann im GDB mittels folgender Befehlseingabe in der Debugkonsole sichtbar gemacht werden:

  • -exec x/256xb Startadresse_in_hex + 256 - 64

Zum Ergebnis vgl. die folgende Abbildung.

AES Key im Hauptspeicher

Erwartungsgemäß finden sich an Adresse 0x555555a44440 dieselben AES Keys wie hier in der Abbildung "Gefundene Strings, die AES Keys sein können" gezeigt. Damit ist ein Weg gefunden, im Programmfluß "eigene" AES Keys einzuschleusen.

Folgendes ist jetzt zu tun: Den Einsprungpunkt für die Keyinjection zu finden, dann den Source zu modifizeren. Dort gibt es dann zwei Lösungwege:

  • gefundene AES Keys werden hardcoded eingebaut: eine quick & dirty Lösung, um genau einen Payload mit ermittelten AES Keys entschlüsseln zu können;
  • Einbau eines ifstream mit Casting von ASCII-AES-Keys: das hat der Verfasser implementiert, um beliebige aus einer Hauptspeicheraquise gewonnene AES Keys aus einer Datei auszulesen und der VeraCrypt-Software "unterzuschieben".

 

© 2021 Peter Sopka - IT Forensik