Chiffrement bitlocker sans protecteur

Chiffrement bitlocker sans protecteur

Dans l'une de mes récentes investigations numériques, j'ai été confronté à un cas bizarre. Une partition était chiffrée avec bitlocker :

X-FVE-FS

Normalement, dans ce genre de cas, je lance bitlocker2john.exe (issu de John the Ripper) ou bitcracker_hash (issu de bitcracker) pour récupérer les hash et les passer ensuite à hashcat. Je l'exécute sur une machine que je loue dans le cloud. Si tout va bien, au bout d'un mois et une bonne dizaine de milliers d'euros pour la location du serveur, j'ai pu essayer un beau dictionnaire (créé notamment à partir d'informations personnelles et éventuellement de l'indexation d'un autre support) et toutes les possibilités de 6 caractères alphanumériques.

Sauf que cette fois-ci, bitlocker2john.exe m'indiquait qu'il trouvait bien la signature bitlocker (-FVE-FS-), des entrées VMK (0x02000800) mais qu'elles ne sont pas protégées :

[...]
Signature found at 0x30b00003
Version: 8
Invalid version, looking for a signature with valid version...

Signature found at 0xfb24a000
Version: 2 (Windows 7 or later)

VMK entry found at 0xfb24a0c3
VMK not encrypted.. stored clear! (0xfb24a0e4)

Signature found at 0xfb25a000
Version: 2 (Windows 7 or later)

VMK entry found at 0xfb25a0c3
VMK not encrypted.. stored clear! (0xfb25a0e4)

Signature found at 0xfb26a000
Version: 2 (Windows 7 or later)

VMK entry found at 0xfb26a0c3
VMK not encrypted.. stored clear! (0xfb26a0e4)

[...]

Je suis allé vérifier le code source de bitcracker_hash (ici) et on trouve ceci :

if (i == VMK_ENTRY_SIZE) {
    fprintf(stderr, "\n=====> VMK entry found at 0x%lx\n", (ftell(encryptedImage) - i));
[...]
    if ((c == key_protection_clear[0]) && (d == key_protection_clear[1])) 
        fprintf(stdout, "VMK not encrypted.. stored clear! (0x%lx)\n", fp_before_salt);
    else if ((c == key_protection_tpm[0]) && (d == key_protection_tpm[1])) 
        fprintf(stdout, "VMK encrypted with TPM...not supported! (0x%lx)\n", fp_before_salt);
    else if ((c == key_protection_start_key[0]) && (d == key_protection_start_key[1])) 
        fprintf(stdout, "VMK encrypted with Startup Key...not supported! (0x%lx)\n", fp_before_salt);
[...]

J'ai aussi vérifié le "Technical Details Report" de X-Ways Forensics et j'ai obtenu quelque chose comme ça :

[D:\nvme.dd], Partition 3
File system: unknown
Creation time: 24/11/2019  07:13:54  -8
Encryption method: AES-XTS 128
Protection type: Clear key! (24/11/2019  07:13:55  -8)

Total capacity: 494 167 654 400 bytes = 460 GB

Après quelques recherches, je découvre, entre autres, cette documentation Microsoft. Elle indique que bitlocker peut s'activer automatiquement à la première configuration de l'ordinateur. Les données sont donc bien chiffrées mais avec une clé qui n'est protégée par rien (pas de protector).

Comme lorsque j'ai trouvé le mot de passe avec hashcat, j'ai donc tenté de monter l'image avec Mount Image Pro. Il a monté l'image et la partition chiffrée sans rien me demander :

Mount Image Pro

Je n'avais plus qu'a faire une nouvelle image de la partition déchiffrée.

Des données cachées dans une image jpeg - mini challenge forensique

Des données cachées dans une image jpeg - mini challenge forensique

Mi-aout, j'ai publié le tweet suivant :

J'ai caché des données (un flag au format FLAG{[MD5]}) dans ce fichier : https://lemnet.fr/img/lena_std.jpg

lena

Il s'agit d'une photo de Lena Söderberg, très utilisée comme image de test dans le traitement d'images.

L'idée étant de retrouver le flag.

Indice n°1
 Structure d'un fichier JPG et commentaire Les fichiers jpg sont toujours structurés de la même manière. Ils contiennent une suite de segments. Chaque segment commence par un marqueur. Les marqueurs commencent tous par l'octet 0xFF suivi d'un autre octet qui indique le type de marqueur. Certains marqueurs ne contiennent que ces deux octets. Les autres sont suivis de deux octets qui indiquent la taille des données qui suivent (taille comprise).
Voici un tableau reprenant les principaux marqueurs :

Nom courtMarqueurDonnéesNomCommentaires
SOI0xFF 0xD8-Start Of ImageDébut du fichier
SOF00xFF 0xC0variableStart Of Frame (baseline DCT)Début d’une image codée par progressive DCT
SOF20xFF 0xC2variableStart Of Frame (progressive DCT)Début d’une image codée par progressive DCT
DHT0xFF 0xC4variableDefine Huffman Table(s)Table(s) de Huffman
DQT0xFF 0xDBvariableDefine Quantization Table(s)Table(s) de quantification
SOS0xFF 0xDAvariableStart Of ScanCommence un parcours de haut en bas de l’image
APPn0xFF 0xEnvariableApplication-specificInformations complémentaires (EXIF par exemple)
COM0xFF 0xFEvariableCommentCommentaire
EOI0xFF 0xD9-End Of ImageFin du fichier

On remarque un commentaire dont le marqueur est 0xFF 0xFE. Dans mon image, il est présent dès le début du fichier à l'offset 2:

ff d8 ff fe 00 3c 1f 8b 08 00 6d a4 52 5d 00 ff
05 40 b1 0d 80 00 0c 7a 09 16 9a 3e e1 a2 8b 4f
58 61 35 fe de 9c f7 71 7d 30 4b 80 e8 f7 69 76
14 8b 13 a1 ac 8c f0 2f 76 4f 48 eb 26 00 00 00
ff db 00 43 00 08 06 06 07 06 05 08 07 07 07 09
...
Les octets 0x00 0x3C, à l'offset 4, indiquent une taille de 60 octets. En retirant les deux octets de la taille, on obtient 58 octets et on peut extraire le commentaire :

1f 8b 08 00 6d a4 52 5d 00 ff 05 40 b1 0d 80 00 0c 7a 09 16 9a 3e e1 a2 8b 4f 58 61 35 fe de 9c f7 71 7d 30 4b 80 e8 f7 69 76 14 8b 13 a1 ac 8c f0 2f 76 4f 48 eb 26 00 00 00

Indice n°2
 Gzip C'est un algorithme de compression très largement rependu, notamment dans les échanges de données entre les navigateurs et les serveurs Web. On remarque que le commentaire commence par les octets 1f 8b. Il s'agit de la signature d'un fichier Gzip.
On peut donc tenter de décompresser le commentaire avec cet algorithme et on obtient :

SYNT{0q1760061qpn919r6rq61or607q6ro60}

Cela commence à ressembler au format du flag que l'on recherche.

Indice n°3
 ROT13 Le ROT13 est un cas particulier du chiffre de César. Il s’agit d’un décalage de 13 caractères de chaque lettre. Son principal avantage réside dans le fait que le codage et le décodage se font exactement de la même manière. En appliquant un ROT13 sur la chaine précédente on obtient le flag :

FLAG{0d1760061dca919e6ed61be607d6eb60}

Qu'est-ce que l'investigation numérique ?

Qu'est-ce que l'investigation numérique ?

L'investigation numérique ou l'informatique légale (ou computer forensics en anglais) prend de plus en plus de place dans les enquêtes de police ou judiciaires mais aussi dans des affaires privées. Elle trouve ses sources à la fin des années 70 lorsque les premiers crimes impliquant des ordinateurs apparaissent. Elle évolue dans les années 80 et 90 pour se transformer en industrie dans les années 2000.

Aujourd'hui, on peut dire que c'est l'art et la science de collecter, préserver, identifier, analyser et présenter des preuves issues de supports numériques.

  1. "L'art et la science"

L'investigation numérique est une science, d'une part, parce que l'informatique répond aux lois de la physique et d'autre part, parce qu'une grande partie des processus sont encadrés par des procédures scientifiques de manière à les rendre reproductibles.

C'est également un art car chaque investigation est différente du fait que chaque organisation et chaque utilisateur est différent. De plus, elle nécessite un certain savoir faire qui s'acquiert avec l'expérience et deux investigateurs peuvent travailler différemment sur un cas pour obtenir les même résultats.

  1. "Preuves issues de supports numériques"

Lorsque l'on parle de supports numériques, la première chose qui vient à l'esprit est l'ordinateur ou le smartphone. Mais il s'agit également de cartes mémoires, de clés USB, d'appareils photo numériques, de GPS, de consoles de jeux, de box ADSL, de composants réseau, d'imprimantes, etc. Tout ce qui contient de la mémoire peut ou devrait être étudié.

Les preuves peuvent être des éléments de trois types. En premier lieu, il s'agit des fichiers générés par l'utilisateur (documents, messageries, carnet d'adresses, favoris Internet, etc.). Ensuite, il s'agit des fichiers générés par le système d'exploitation (sauvegarde, fichiers de configuration, historique des fichiers ouverts ou Internet, etc.). Enfin, il s'agit de tout ce qui n'est pas stocké sous forme de fichiers (métadonnées, RAM, espace non alloué, etc.). Ainsi les preuves peuvent donc se situer dans tout le contenu de la mémoire. Il faut cependant noter que la saisie a lieu à un moment donné et que l'absence de preuve n'est pas la preuve de l'absence.

  1. "Collecter"

La collecte correspond généralement à une copie dite bit-à-bit qu'on appelle image. Elle doit être pure et parfaite. Cela signifie que, d'une part, elle doit être une copie exacte du support original donc son empreinte numérique (MD5 et/ou SHA1) doit être identique à celle de l'original. Et d'autre part, l'opération de copie ne doit pas modifier l'original. En cas d'impossibilité de faire une copie "pure" et "parfaite", il est important de le documenter. Par exemple, lorsqu'on est confronté à des secteurs défectueux ou illisibles, il faut les consigner et indiquer par quoi leur contenu a été remplacé dans l'image.

  1. "Préserver"

Il s'agit essentiellement de se demander comment manipuler, transporter et stocker les images et de mettre en place les procédures liées à ces questions. Ainsi, pour manipuler un disque dur, ou tout autre matériel électronique possédant des composants apparents, afin d'éviter des décharges électrostatiques, il est d'usage de porter un bracelet antistatique (ou ESD). Pour le transport et le stockage, il existe des sacs de protection antistatique dans tous les formats. Pour un téléphone ou un smartphone, on ne l'allume que lorsqu'il est dans une cage de Faraday. Il s'agit également de ne pas modifier le contenu de l'image lors des phases d'identification et d'analyse.

  1. "Identifier" et "analyser"

Cela consiste en la recherche de fichiers ou d'éléments en relation avec la demande. On peut commencer par s'imprégner rapidement de l'organisation de l'utilisateur, pour regarder les fichiers existants, notamment sur son bureau ou dans le/les dossiers contenant ses documents. Il n'est pas impossible de trouver rapidement des données intéressantes mais on ne peut pas se contenter de ça. Il faut tenter de récupérer des fichiers effacés ou des fragments de fichiers. Puis la recherche peut se faire d'un grand nombre de manières. Je ne les détaillerai pas ici, mais on peut notamment effectuer des recherches par extensions, par signatures ou par empreintes. Il est également possible d'effectuer des recherches par mots clés ou expression régulières sur l'ensemble de l'image. Si l'on est intéressé par une période précise, on peut généralement utiliser une vue calendaire ou filtrer les éléments par date.

Qu'ils appartiennent encore au système de fichiers ou non, les éléments que l'on a identifiés sont majoritairement encodés, et ce d'une manière différente pour chaque type de fichiers. De plus, le contenu d'un fichier peut ne pas être pertinent ou l'être moins sans les propriétés liées au système de fichiers (dates, chemin, etc.), sans les métadonnées qu'il contient (dates, auteur, etc.) ou sans son origine (réseau, clé USB, Internet, etc.). Ainsi, il ne suffit pas de trouver et d'extraire des données, il faut aussi les interpréter, y compris celles qui ne sont pas directement visibles par l'utilisateur.

Il s'agit de la partie la plus longue et la plus délicate. On craint toujours d'être passé à coté d'éléments qui pourraient être pertinents.

  1. "Présenter"

La présentation des résultats est finalement la phase la plus importante. En effet, c'est tout ce qu'il restera à l'issue des opérations. Elle prend généralement la forme d'un rapport qui doit rester accessible à tous. Il doit donc être assez détaillé pour inclure tous les éléments pertinents que l'on a trouvés, tout en restant compréhensible par une personne qui n'est pas spécialiste de l'informatique. Et c'est la toute là difficulté.

C'est bien de savoir ce que c'est, mais comment fait-on ?

Toutes ces étapes se font à l'aide d'outils spécialisés. Pour la phase de collecte, il existe des logiciels qui permettent de faire des images sans modifier l'original mais il est préférable d'utiliser des matériels dédiés. On trouve des duplicateurs autonomes ou de simples bloqueurs. Les plus connus sont ceux de la gamme Tableau.

Pour les autres phases, les logiciels d'investigation numérique généralistes, qu'ils soient commerciaux (X-Ways Forensics, EnCase, FTK entre autres) ou libres (DFF et The Sleuth Kit), sont primordiaux. Cependant, ils nécessitent d'une part une connaissance de l'informatique en général et des concepts liés à l'investigation numérique et d'autre part, une certaine expérience qui permet de les prendre en main.

Même s'il s'agit d'un domaine d'activité réservé à des spécialistes, la possibilité d'une investigation numérique doit être prise en compte dans la gestion informatique quotidienne d'une entreprise.