Encriptado y CryptoLocker
Introducción
Este capítulo nos permitirá demostrar que es sencillo encriptar los archivos del equipo local o de red de un usuario sin su consentimiento. Si un usuario tiene el permiso de modificar un documento, tiene, en cualquier caso, el permiso de encriptarlo. El encriptado se utiliza normalmente para proteger un archivo, pero permite así mismo impedir que un usuario pueda abrir o leer correctamente el archivo si no posee la clave que permite desencriptarlo. Un cryptoware es la variante más temible de los ransomwares. Un ransomware clásico impedirá el acceso al sistema operativo y a los archivos, pero sin encriptarlos. Es por lo tanto relativamente simple recuperar sus datos, hasta recuperar el acceso al sistema operativo sin tener que reinstalarlo.
Dos principios del encriptado
Existen dos principios básicos. El primero, llamado encriptado simétrico, utiliza una clave única que sirve para encriptar y desencriptar. El segundo llamado encriptado asimétrico, utiliza una clave para encriptar y otra clave para desencriptar. Estos principios son regularmente utilizados en combinación, el encriptado/desencriptado resulta más rápido utilizando una clave simétrica y el encriptado asimétrico resulta más seguro.
Seguidamente algunos ejemplos de productos y el principio elegido para encriptar:
-
EFS (Encrypted File System): asimétrico y simétrico.
-
RMS (Rights Management): asimétrico y simétrico.
-
Protección de las contraseñas en el administrador de identificaciones: simétrico (DPAPI).
-
SSL/TLS: asimétrico con certificados (después simétrico).
-
Keepass: la función de protección para usuarios utiliza DPAPI.
-
NextDay.Vision (módulo OTP): simétrico (DPAPI y AES256).
Utilización del encriptado simétrico con DPAPI
Microsoft propone varios métodos de encriptado de datos. Una de las maneras más utilizadas, ya que es muy sencilla y confortables, es DPAPI (Data Protection Application Programming Interface). Los otros métodos de encriptado simétrico son simplemente la puesta en marcha de algoritmos de encriptado por .NET (System.Security.Cryptography).
En un caso normal de encriptado simétrico, es necesario tener una clave que servirá para encriptar y desencriptar. Esto significa que para encriptar una contraseña de una aplicación, hay que disponer de una clave de encriptado.
Para encriptar:
Contraseña > clave de encriptado 1 > contraseña encriptada
Para desencriptar, es el mismo principio:
Contraseña encriptada > clave de encriptado 1 > contraseña desencriptada
Esto induce la dificultad para almacenar una contraseña para un departamento, una tarea o una aplicación que desearía poder acceder a la contraseña de manera reversible. Se debe esconder esta clave de encriptado/desencriptado en claro en el código, en un archivo, en el registro o porque no cortarla en trozos y almacenar las partes en distintos lugares. Pero no es una solución adecuada ya que se asimila a dejar la llave debajo del felpudo.
Una manera más segura sería derivar la clave de encriptado desde variable particulares del equipo o del usuario, como crear un hash de la dirección MAC de la tarjeta de red, del SID del usuario y del número de serie del equipo, para utilizarla como clave simétrica. Esto permite no tener la clave desencriptada, pero poder reconstruirla dinámicamente. En este caso el algoritmo de construcción debe ser secreto, y si uno de los elementos cambiase, la clave no sería por lo tanto válida y no podría restaurarse.
1. ¿Cómo funciona DPAPI?
DPAPI no necesita de una clave de encriptado para encriptar o desencriptar los datos. Permite proteger un contenido a nivel de un usuario o de un equipo. Permite añadir una entropía, también llamada entropía secundaria ya que no es obligatoria. Microsoft prevé también un sistema de backup y de rotación de la clave automático. La clave deriva de un hash SHA1 de la contraseña de usuario y/o de la contraseña...
Utilización del encriptado asimétrico con certificados
El encriptado asimétrico permite dar la clave de encriptado a todo el mundo conservando bien protegida la clave que permite el desencriptado. Es el principio de una infraestructura de clave pública que explicamos un poco más en detalle en la sección Contramedidas tratando de poner en marcha una autoridad de certificación.
Para simplificar, tenemos una clave única que abre los candados de una misma serie. Si desea recibir un paquete de manera segura, envía el candado al expedidor, que guardará sus elementos en una caja que cerrará con su candado. Será por lo tanto el único que pueda abrir el paquete, ya que es el único que dispone de la llave del candado. Dispone de la enorme ventaja de poder pedir a cualquiera que securice algo por usted, sin que pueda abrir otros paquetes destinados a usted. Este no es el caso al usar una clave simétrica.
EFS encripta un archivo usando una clave simétrica. La clave simétrica se protege después utilizando un certificado de usuario así como el certificado de un agente de certificación, si existe.
1. Encriptar un archivo usando EFS
Se puede utilizar la interfaz gráfica para encriptar un archivo usando EFS. Esto no va en el sentido de crear un cryptoware.
Para encriptar un archivo en línea de comandos:
cipher.exe C:\temp\test.txt /e
Para encriptar una carpeta (sólo los archivos nuevos serán encriptados):
cipher.exe C:\temp /e
Para encriptar un archivo con .NET:
FileInfo f = new FileInfo(@"c:\temp\test.txt");
f.Encrypt();
Para encriptar todos los archivos de una carpeta y sus subcarpetas con PowerShell:
$fs = Get-ChildItem c:\temp -rec;
foreach($f in $fs)
{
...
Cryptoware
Un cryptoware debe encriptar el conjunto de documentos y archivos sensibles, incluyendo los archivos en red y los presentes en medios extraíbles. Lo ideal es encriptar los archivos permitiendo al usuario acceder normalmente como lo hace EF. Esto permite infectar también las eventuales copias de seguridad. Sin embargo, esto deja la clave para desencriptar provisionalmente accesible al usuario.
1. Las bases de un cryptoware utilizando EFS
Como se sobreentiende, un medio para crear un cryptoware es usar EFS. El proceso es simple:
Encripte los archivos del usuario sin preguntarle su opinión en línea de comandos o con .NET.
Si no tiene certificado, debería crearse automáticamente en el primer encriptado. Puede también indicar uno existente:
certutil -f -user -p "pass" -importpfx c:\cert.pfx NoRoot
Al cabo de un tiempo, o cuando todos los archivos accesibles están encriptados, exporte la clave privada (.pfx) y escóndala (visto anteriormente).
Encripte la clave privada con encriptado simétrico incluido en el código, derivándola del sistema operativo o utilizando DPAPI.
Elimine el certificado del almacén del usuario usando el código visto anteriormente.
Informe al usuario que debe darle algo en contrapartida para obtener acceso a sus archivos.
Cree un segundo ejecutable capaz de desencriptar la clave privada (.pfx) y restaurar los archivos a su estado inicial usando el certificado así desencriptado.
Envíe el ejecutable al usuario en cuanto le entregue la contrapartida pedida.
2. Las bases de un cryptoware utilizando DPAPI
Otro medio de reemplazar el ejecutable del usuario por un programa capaz de encriptar y desencriptar al vuelo y después abrir la aplicación estándar. Sin embargo, esto de hace en el caso presente por la extensión de archivos. Vamos a ver en el siguiente ejemplo cómo encriptar y desencriptar al vuelo archivos con extensión .log, usando las funciones crypte/decrypte DPAPI vistas anteriormente.
El proceso básico sigue los pasos expuestas a continuación:
Modifique la acción por defecto...
Ejemplo de encriptado con EFS, certificado y DPAPI
El siguiente código permite probar el encriptado y desencriptado usando EFS, certificados y DPAPI. La compilación puede realizarse usando Visual Studio o la línea de comandos.
Los prerrequisitos son los siguientes:
-
Crear o disponer de una carpeta c:\temp o cambiar la variable Folder.
-
Crear dos archivos test1.txt y test2.txt.
-
Añadir texto en el interior de estos archivos.
Cada etapa de este código encripta y desencripta uno o los dos archivos anteriores. Tome tiempo de controlar el contenido de los archivos en cada etapa. El código se puede descargar desde la página Información.
Creemos ahora la aplicación:
Cree un nuevo proyecto de consola C# en Visual Studio.
Una vez abierto el proyecto, añada una referencia y seleccione System.Security.
Añada el código de debajo.
Si no realiza su aplicación con Visual Studio, puede indicar una referencia $System.Security en la compilación:
csc -r:System.Security.dll -out:c:\test.exe c:\cifrado.cs
El código:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace TestEncriptado
{
class Program
{
static void Main(string[] args)
{
String Folder = @"c:\temp";
String pfxPass = "password";
Console.WriteLine("Antes de continuar, asegúrese
que existe la carpeta "+Folder);
Console.WriteLine("y que contiene un archivo test1.txt y
test2.txt");
Console.WriteLine("Un certificado cert.cer y un cert.pfx deben
existir en la carpeta " + Folder);
Console.WriteLine("Cada etapa encripta y desencripta uno
o el conjunto de estos archivos de la carpeta"); ...
Contramedidas
No es posible bloquear DPAPI ya que Windows lo utiliza él mismo en muchas funciones del sistema.
El uso de un certificado en un archivo es también complicado de bloquear. Basta con integrar la clave pública directamente en el código para que sea totalmente invisible. Hay que bloquear y filtrar todas las aplicaciones, los scripts y las macros antes si queremos reducir el riesgo.
Para impedir que un usuario encripte con EFS, se pueden definir las directivas de grupo.
Abra una consola de administración de directivas de grupo, GPedit.msc.
Vaya al menú Configuración equipo, Parámetros Windows, Parámetros de seguridad, Estrategias de clave pública.
Haga clic con el botón derecho en Propiedades del Sistema de archivos EFS.
Seleccione No autorizar.