Cryptage et CryptoLocker
Introduction
Ce chapitre va nous permettre de démontrer qu’il est simple de crypter les fichiers locaux ou en réseau d’un utilisateur sans son consentement. Si un utilisateur a le droit de modifier un document, il a, en tout état de cause, le droit de le crypter. Le cryptage est normalement utilisé pour protéger un fichier, mais il permet également d’empêcher un utilisateur d’ouvrir ou de lire correctement celui-ci s’il n’a pas la clé permettant de le décrypter. Un cryptoware est la variante la plus redoutable des ransomwares. Un ransomware classique va empêcher l’accès au système et aux fichiers, mais sans les crypter. Il est donc relativement simple de récupérer ses données, voire de retrouver l’accès au système sans le réinstaller.
Deux principes de cryptage
Il existe deux principes de base. Le premier, appelé cryptage symétrique, utilise une clé unique qui sert à crypter et à décrypter. Le second, appelé cryptage asymétrique, utilise une clé pour crypter et une autre clé pour décrypter. Ces principes sont régulièrement utilisés en combinaison, le cryptage/décryptage étant plus rapide en utilisant une clé symétrique et le cryptage asymétrique étant plus sûr.
Ci-dessous quelques exemples de produits et de leur manière de sécuriser :
-
EFS (Encrypted File System) : asymétrique et symétrique.
-
RMS (Rights Management) : asymétrique et symétrique.
-
Protection des mots de passe dans le gestionnaire d’identifications : symétrique (DPAPI)
-
SSL/TLS : asymétrique avec des certificats (puis symétrique).
-
Keepass : la fonction de protection par utilisateur utilise DPAPI.
-
NextDay.Vision (module OTP) : symétrique (DPAPI et AES256).
Utilisation du cryptage symétrique avec DPAPI
Microsoft propose plusieurs méthodes de cryptage des données. Une des manières les plus utilisées, parce qu’elle est très simple et confortable, est DPAPI (Data Protection Application Programming Interface). Les autres méthodes de cryptage symétrique sont simplement la mise en œuvre d’algorithmes de cryptage via .NET (System.Security.Cryptography).
Dans un cas normal de cryptage symétrique, il est nécessaire d’avoir une clé qui servira à crypter et décrypter. Cela signifie que pour crypter le mot de passe d’une application, il faut avoir une clé de cryptage.
Pour crypter :
Mot de passe > clé de cryptage 1 > mot de passe crypté
Pour décrypter, c’est le même principe :
Mot de passe crypté > clé de cryptage 1 > mot de passe en clair
Ceci induit la difficulté d’enregistrer un mot de passe pour un service, une tâche ou une application qui voudrait pouvoir accéder au mot de passe de manière réversible. Il faudrait cacher cette clé de cryptage/décryptage en clair dans le code, dans un fichier, dans le registre, ou, pourquoi pas, la couper en morceaux et stocker les parties à différents endroits. Mais ce n’est pas une bonne solution, cela revient à laisser la clé sous le paillasson.
Une manière plus sûre serait de faire dériver la clé de cryptage depuis des éléments particuliers de la machine ou de l’utilisateur, comme créer un hash de l’adresse MAC de la carte réseau, du SID de l’utilisateur et du numéro de série de la machine, pour l’utiliser comme clé symétrique. Cela permet de ne pas avoir de clé en clair, mais de la construire dynamiquement. Dans ce cas, l’algorithme de construction de la clé doit être secret, et si un des éléments devait changer, la clé ne serait donc plus valide et ne pourrait pas être restaurée.
1. Comment fonctionne DPAPI ?
DPAPI ne nécessite pas de clé de cryptage pour crypter ou décrypter des données. Il permet de protéger un contenu au niveau d’un utilisateur ou au niveau d’une machine....
Utilisation du cryptage asymétrique avec des certificats
Le cryptage asymétrique permet de donner la clé de cryptage à tout le monde tout en conservant à l’abri la clé permettant le décryptage. C’est le principe d’une infrastructure à clé publique qui est expliqué un peu plus en détail dans la section Contre-mesures traitant de la mise en place d’une autorité de certification.
Pour simplifier, nous avons une clé unique ouvrant les cadenas d’une même série. Si vous voulez recevoir un colis de manière sécurisée, vous envoyez le cadenas à l’expéditeur, qui enfermera vos éléments dans une boîte qu’il verrouillera avec votre cadenas. Vous serez le seul à pouvoir ouvrir le colis, puisque vous êtes le seul à avoir la clé. Vous avez l’immense avantage de pouvoir demander à n’importe qui de sécuriser quelque chose pour vous, sans qu’il puisse ouvrir d’autres colis qui vous sont destinés. Cela n’est pas le cas en utilisant une clé symétrique.
EFS crypte un fichier en utilisant une clé symétrique. La clé symétrique est ensuite protégée en utilisant le certificat de l’utilisateur ainsi que le certificat d’un agent de recouvrement, s’il existe.
1. Crypter un fichier en utilisant EFS
Il est possible d’utiliser l’interface graphique pour crypter un fichier en utilisant EFS. Cela n’a pas de sens pour créer un cryptoware.
Pour crypter un fichier en ligne de commande :
cipher.exe C:\temp\test.txt /e
Pour crypter un dossier (seuls les nouveaux fichiers seront cryptés) :
cipher.exe C:\temp /e
Pour crypter un fichier avec .NET :
FileInfo f = new FileInfo(@"c:\temp\test.txt");
f.Encrypt();
Pour crypter tous...
Cryptoware
Un cryptoware doit crypter l’ensemble des documents et des fichiers sensibles, y compris les fichiers en réseau et ceux de disques amovibles. L’idéal est de crypter les fichiers tout en permettant à l’utilisateur d’y accéder normalement comme le fait EFS. Cela permet d’infecter également les éventuels backups. Toutefois, cela laisse la clé de décryptage provisoirement accessible à l’utilisateur.
1. Les bases d’un cryptoware utilisant EFS
Comme sous-entendu, un moyen de créer un cryptoware est d’utiliser EFS. Le processus est simple :
Cryptez les fichiers de l’utilisateur sans lui demander son avis en ligne de commande ou avec .NET.
S’il n’a pas de certificat, il devrait s’en créer automatiquement lors du premier cryptage. Vous pouvez aussi lui en fournir un :
certutil -f -user -p "pass" -importpfx c:\cert.pfx NoRoot
Au bout d’un certain temps, ou lorsque tous les fichiers accessibles sont cryptés, exportez la clé privée (.pfx) et cachez-la (vu précédemment).
Cryptez la clé privée avec un cryptage symétrique inclus dans le code, dérivant du système ou en utilisant DPAPI.
Supprimez le certificat du magasin de l’utilisateur en utilisant le code vu précédemment.
Informez l’utilisateur qu’il doit vous donner une contrepartie pour obtenir l’accès à ses fichiers.
Créez un deuxième exécutable capable de décrypter la clé privée (.pfx) et de restaurer les fichiers à leur état initial en utilisant le certificat ainsi décrypté.
Envoyez l’exécutable à l’utilisateur dès qu’il vous aura fourni la contrepartie demandée.
2. Les bases d’un cryptoware utilisant DPAPI
Un autre moyen est de remplacer l’exécutable de l’utilisateur par un logiciel capable de crypter et de décrypter à la volée puis d’ouvrir l’application standard. Cependant, cela se fait dans le cas présent par extension de fichiers. Nous allons voir dans l’exemple...
Exemple de cryptage avec EFS, certificat et DPAPI
Le code suivant permet de tester le cryptage et le décryptage en utilisant EFS, les certificats et DPAPI. La compilation peut se faire en utilisant Visual Studio ou la ligne de commande.
Les prérequis sont les suivants :
-
Créer ou avoir déjà un dossier c:\temp ou changer la variable Folder.
-
Créer deux fichiers test1.txt et test2.txt.
-
Ajouter du texte à l’intérieur de ces fichiers.
Chaque étape de ce code va crypter puis décrypter un ou les deux fichiers prérequis. Prenez le temps de contrôler le contenu des fichiers à chaque étape. Le code est également téléchargeable depuis la page Informations générales.
Créons maintenant l’application :
Créez un nouveau projet console C# dans Visual Studio.
Une fois le projet ouvert, ajoutez une référence, puis sélectionnez System.Security.
Ajoutez le code ci-dessous.
Si vous ne créez pas votre application avec Visual Studio, vous pouvez faire une référence $ System.Security à la compilation :
csc -r:System.Security.dll -out:c:\test.exe c:\cryptage.cs
Le code :
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace testCryptage
{
class Program
{
static void Main(string[] args)
{
String Folder = @"c:\temp";
String pfxPass = "password"
Console.WriteLine("Avant de continuer, veuillez vous assurer
qu'il existe le dossier "+Folder);
Console.WriteLine("et qu'il contient un fichier test1.txt et
test2.txt");
Console.WriteLine("Un certificat cert.cer et un cert.pfx doivent
exister dans le dossier " + Folder);
Console.WriteLine("Chaque étape crypte puis décrypte...
Contre-mesures
Il n’est pas possible de bloquer DPAPI parce que Windows lui-même l’utilise dans beaucoup de fonctions système.
L’utilisation d’un certificat dans un fichier est également difficile à bloquer, il suffit d’intégrer la clé publique directement dans le code pour qu’elle soit totalement invisible. Il faut bloquer et filtrer toutes les applications, les scripts et les macros en amont, si on veut réduire le risque.
Pour empêcher un utilisateur de crypter avec EFS, il est possible de définir des stratégies de groupe.
Ouvrez la console de gestion des stratégies de groupe, GPedit.msc.
Allez dans Configuration ordinateur, Paramètres Windows, Paramètres de sécurité, Stratégies de clé publique.
Cliquez avec le bouton droit sur Propriétés de Système de fichiers EFS.
Sélectionnez Ne pas autoriser.