
Malas cosas de malos tipos
La muestra de Hive analizada y referenciada en este documento fue elegida aleatoriamente de esta lista creada por @rivitna, a quien agradezco enormemente. Los artefactos están disponibles en la plataforma VirusTotal.
En este documento, se ha tomado como referencia el archivo a0h2uih3d2.exe
MD5: 15CF5E0DA094ACDD751A513402A8C941
SHA-1: 72E15AC4473903C814E65E3C06F54EB0399580AA
SHA-256: 335D2E4A743D059955760ECF2EC25EE86D36AA60B096C9180E860C64EF78EE55
Para hacerse una idea de la complejidad de este ransomware, por favor eche un vistazo a este análisis publicado por el Microsoft Threat Intelligence Center (MSTIC).
¡Por favor, lea atentamente todo el documento antes de empezar a jugar con el código!
En los últimos meses, he canalizado la mayor parte de mis esfuerzos en el estudio e ingeniería inversa del algoritmo de cifrado de Hive v5. Tuve el placer de colaborar con un gran analista de malware e ingeniero inverso, @rivitna, quien en el pasado ha analizado versiones anteriores de Hive y ha publicado código y PoCs sobre sus mecanismos de cifrado. Él ha contribuido (no poco) a identificar los componentes involucrados en las operaciones de cifrado de Hive v5, que al estar escrito en RUST se ha vuelto más difícil de analizar. Encontré algo en común con Babuk, otro ransomware muy importante cuyas fuentes fueron divulgadas en junio de 2021:
El ransomware Hive v5 que se ejecuta en un sistema de la víctima genera dos claves en texto claro, utilizando el algoritmo que se muestra en la siguiente evidencia, basado en las API de Windows QueryPerformanceCounter y QueryPerformanceFrequency.
Por favor, eche un vistazo a esta página de Microsoft para más información sobre las API QueryPerformanceCounter, aquí para QueryPerformanceFrequency.
QueryPerformanceCounter es un contador de tiempo muy preciso. Cuando se invoca, devuelve el tiempo transcurrido desde la última vez que se encendió el PC.
QueryPerformanceFrequency devuelve el valor (frecuencia) del contador de rendimiento. Tiene un valor fijo de 0x989680. Esto significa que el valor de QueryPerformanceCounter se actualiza 0x989680 veces por segundo, es decir, 10.000.000 veces.
Las dos claves en texto claro tienen un tamaño de 0xCFFF00 bytes y se generan una a la vez, byte a byte. A continuación se muestra el fragmento que permite la creación de un array de 0xA00000 bytes, que es la mayor parte de la denominada clave en texto claro con la que Hive cifra los archivos en el PC de la víctima.

Cada byte de la clave se obtiene tomando el valor del registro AL. El registro EAX contiene el resultado de la función 0044ADE0, renombrada con la etiqueta createByte, que implementa la diferencia entre el instante de tiempo actual y el valor de la semilla inicial, calculada en la primera llamada de la función 0044A850, renombrada con la etiqueta call_to_QueryPerformanceCounter.
A continuación se muestra el código escrito en C++ para generar una clave en texto claro:

El algoritmo es muy simple, aunque dentro de la función 0044ADE0 se han insertado instrucciones que realizan operaciones redundantes y varios saltos condicionales para intentar retrasar el tiempo de ejecución del código durante la generación de la clave en texto claro:

En la carpeta HiveRansomwareV5_custom_keygen_PoC encontrará el código crudo obtenido mediante ingeniería inversa de la muestra de Hive v5 analizada. No es código optimizado como el que se encuentra en el malware, porque necesitaba no perder ni una sola línea de código de la versión compilada.
En la carpeta HiveRansomwareV5_custom_keygen_PoC-optimized encontrará el código optimizado derivado del código crudo antes mencionado. En esta versión, el código es mucho más fácil de leer que el crudo, para poder entender la funcionalidad que implementa.
Ambas versiones deben personalizarse con su nombre de usuario antes de ejecutarlas para poder guardar la clave en texto claro generada en su Escritorio.
Ambas claves en texto claro se generan utilizando el mismo algoritmo.
Una clave en texto claro está compuesta por 0xA00000 bytes generados aleatoriamente de forma segura. Luego, los primeros 0x2FFF00 bytes se copian al final, creando una clave en texto claro final de 0xCFFF00 bytes.

Luego, Hive utiliza las dos claves generadas para cifrar archivos, pero antes de eso, el ransomware Hive v5 cifra las claves generadas en una estructura personalizada (de ahora en adelante llamada keystreams o flujos de claves) y las coloca en la raíz de cada unidad que cifra, utilizando la extensión .key. Por ejemplo, si tiene tanto la unidad C como la D instaladas en su sistema, los keystreams cifrados estarán presentes en la raíz de cada unidad.

El ransomware Hive v5 utiliza las claves en texto claro generadas para cifrar archivos mediante la instrucción XOR, por lo que nos enfrentamos a un cifrado simétrico muy rápido en las CPU x86/x64 modernas.
El ransomware Hive v5 necesita proteger la clave en texto claro generada, cifrándola dos veces; de ahora en adelante llamaremos a estas rondas. Se necesitan dos rondas de cifrado para obtener el keystream final.
Para lograrlo, en cada ronda se realizan los siguientes pasos:
El paso 3 garantiza la creación de un keystream que puede abrirse con un doble par de claves privadas: las generadas por Hive durante el cifrado y las que el afiliado de Hive generó cuando compiló el ransomware para nosotros.