Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
HiveV5_keystream_decryptor — bad stuffs by bad guys | Kitploit
Herramientas/GitHubGitHub/reecdeep/hivev5_keystream_decryptor
Encryption/Decryption ToolsReverse EngineeringData RecoveryMalware AnalysisDigital ForensicsCryptographyBinary Analysis
GitHubreecdeep/hivev5_keystream_decryptor

HiveV5_keystream_decryptor

bad stuffs by bad guys

Ver Repositorio
499hace 4 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

PoC de descifrado de flujo de claves (keystream) de HiveV5

Introducción

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!

Una breve descripción general de Hive v5

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:

  • algoritmo de intercambio de claves;
  • lista de procesos que deben cerrarse antes de iniciar los 1256 hilos de cifrado.

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.

snippetGenKeyCleartext

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:

c++GenKeyCleartext

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:

useless-conditions

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.

memcpy2FFF00

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.

keysAtRoot

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.

Cómo se protege Hive v5, cómo una clave en texto claro se convierte en un keystream

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:

  1. Generación de una clave privada de 32 bytes, utilizando el mismo algoritmo para crear cada byte de la clave;
  2. Utilizando el algoritmo de curva elíptica Curve25519 para el intercambio de claves Diffie-Hellman, Hive deriva una clave pública a partir de la clave privada recién generada;
  3. Usando Curve25519 nuevamente, Hive genera una clave compartida a partir de la clave privada recién generada y la clave pública del afiliado de Hive (cambia en cada artefacto de Hive v5);
  4. Generación de un nonce de 24 bytes, como una especie de IV, utilizando el mismo algoritmo para la clave privada y la clave en texto claro;
  5. Utilizando el algoritmo HChaCha20, se deriva la clave para cifrar la clave en texto claro generada;
  6. Utilizando la clave creada en el paso 5 y el nonce creado en el paso 4, Hive cifra la clave en texto claro utilizando el algoritmo XChaCha20. Esta operación produce también un MAC (Message Authentication Code) de 16 bytes para garantizar la integridad del proceso de cifrado.

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.

keystreamCreation

La idea detrás de la fuerza bruta

Al final de esta descripción, un punto en particular es evidente: la clave en texto claro, la clave privada y el nonce utilizados en ambas rondas de cifrado se generan con la misma función mencionada anteriormente (0044ADE0, también conocida como createByte). La función 0044ADE0 está condicionada por el tiempo que tarda la CPU en ejecutar el código llamado dentro del bucle for.

Si observamos la figura anterior que resalta la estructura del keystream después de las dos rondas de cifrado, es evidente que solo tenemos acceso libre al nonce (de lo contrario, los afiliados de Hive no sabrían cómo descifrar los archivos).

Así que centrémonos en el NONCE, que tiene 24 bytes de longitud:

NONCE: 40 A4 08 6C D0 D0 34 98 FC 60 C4 28 8C F0 F0 54 B8 1C 80 E4 48 AC AC 10

La diferencia entre un byte del nonce y el siguiente (en valor absoluto) representa el tiempo transcurrido entre una iteración y la siguiente. Introducimos el concepto de huella (fingerprint) con esta definición.

HUELLA DEL NONCE: 64 9c 64 64 00 9c 64 64 9c 64 9c 64 64 00 9c 64 9c 64 64 9c 64 00 9c

Si analizamos los valores obtenidos, encontramos que el tiempo de ejecución del código es casi idéntico, con ligeras variaciones debidas principalmente a la tecnología utilizada por el procesador en uso (para mis pruebas utilicé un procesador i7 de 10ª generación y un i5 de 5ª generación; en otros sistemas esta huella puede diferir).

Este hallazgo es muy importante si pensamos que el nonce se genera con la misma función que genera la clave en texto claro y, sobre todo, la clave privada. Dado que estos valores mencionados también seguirán este principio, es decir, la diferencia entre los bytes individuales del nonce es predecible, entonces los valores de la clave privada y de la clave en texto claro también serán predecibles.

Sin embargo, los análisis han demostrado que generar un array de 0xA00000 caracteres con la esperanza de obtener los mismos bytes originales de la clave en texto claro calculada por Hive es muy difícil: las variaciones en las cargas de CPU y memoria afectan la velocidad de ejecución del código y, a menudo, la clave en texto claro original calculada por el PE de Hive es diferente (aunque sea solo en unos pocos bytes) de la clave calculada por nosotros.

Usamos esta huella del nonce para compararla con la huella obtenida de la generación de un posible diccionario de 0xA00000 bytes de longitud (este número se ha fijado empíricamente; después de una serie de pruebas, se ha visto que estadísticamente en este número de bytes se encuentran las dos claves privadas de 32 bytes cada una, necesarias en las dos rondas de cifrado). Si la huella del nonce está contenida en la huella del diccionario, hemos encontrado el diccionario correcto para comenzar a aplicar fuerza bruta a ambas claves privadas.

No termina aquí, porque a partir de los análisis dinámicos realizados sobre la generación del nonce, de la clave en texto claro y también de la clave privada, se ha verificado que el primer byte tiene una distancia promedio diferente del segundo byte, en comparación con todos los demás bytes que tienen valores casi homogéneos. Veamos en detalle:

hivePrivateKeyFingerprint

Como puede ver, los valores de la huella posteriores al primero sufren variaciones mínimas, es decir, la distancia en valor absoluto entre el primer y el segundo byte de la clave privada la mayoría de las veces tiene valores fuera de los valores presentes en el resto de la huella.

Probablemente esto se deba a algunos algoritmos de optimización presentes en la CPU que aceleran la ejecución del código después de la primera iteración del bucle for.

Una posible solución

El código propuesto lee el nonce de cada ronda de cifrado del keystream, determina su huella y genera una lista de posibles diccionarios de claves que contienen la posible clave privada.

Para resolver el problema relacionado con el primer byte de la huella, que siempre es diferente del resto de la clave, pensé en hacer lo siguiente:

  1. creamos un diccionario de posibles bytes iniciales, tomando los valores únicos de los primeros 0x110 bytes del diccionario generado;
  2. creamos una lista de 31 bytes tomando todas las combinaciones posibles a partir del segundo byte del diccionario generado;
  3. creamos combinaciones de los primeros bytes y los 31 bytes restantes generados para crear las posibles combinaciones de clave privada de 32 bytes, a partir de las cuales derivar la clave pública comparándola con la que tenemos en nuestro poder, presente en el keystream.

Cuando las dos claves públicas coincidan, habremos encontrado la clave privada con la que se cifró la segunda (última) ronda de cifrado. Al iterar las operaciones descritas hasta ahora nuevamente, tendremos la clave privada para descifrar la primera ronda del keystream cifrado y, finalmente, extraer la clave en texto claro original.

Uso

En la carpeta HiveRansomwareV5-keystream_decryptor encontrará la solución de VS 2017 y una librería personalizada de monocypher. El programa le permite elegir qué operación realizar.

programOptions

La opción "1" es la primera que debe elegirse porque le permite crear un diccionario de bytes "a medida" para el procesador de su PC, por lo tanto, debe realizarse en la máquina cifrada, ya que es mucho más probable que obtenga valores iguales a los presentes en su keystream.

programOption1

O, alternativamente, si la primera opción no funciona, genere su propio diccionario ejecutando el malware en el depurador (en el mismo PC ya infectado) hasta el final de la generación de la clave en texto claro (justo fuera del bucle for) y guarde el contenido de la memoria que contiene la clave en texto claro. En este caso, puede validar su diccionario utilizando la opción "3":

programOption3

Una vez que tenga el diccionario correcto para su keystream, la opción "2" también puede realizarse en computadoras más potentes, ya que esto reduciría el tiempo necesario para probar las combinaciones de bytes, sin afectar de ninguna manera los valores de los bytes de las claves privadas.

programOption2_1 programOption2_2 programOption2_3

Para realizar correctamente la funcionalidad presente en la opción 2, debe extraerse la clave pública. Dado que no todas las muestras de Hive son iguales, no es muy fácil crear un extractor de claves públicas universal. Sin embargo, una forma que se sabe que funciona es establecer un punto de interrupción en esta porción del código desensamblado, después de la creación del nonce. En la evidencia a continuación, la clave pública se pasa a la función 44E3D8 para derivar la clave compartida utilizando curve25519. Es el único lugar donde se revela la clave pública durante toda la ejecución del malware.

wherePublicKeyIsUsed

Preste atención cuando trabaje con las opciones de Visual Studio. La salida del programa, como los bytes del diccionario generado, puede verse alterada si cambia de depuración a versión final (release) y viceversa.

Si desea acelerar el procedimiento de fuerza bruta, puede editar el valor de dictionary_dimension en el código, pero tenga en cuenta que disminuir el tamaño del diccionario también puede disminuir las posibilidades de encontrar las claves privadas.

Además, si decide utilizar un array de bytes en texto claro generado ejecutando Hive y volcándolo desde la memoria, recuerde establecer el tamaño de su volcado en la variable dictionary_dimension.

Para probar la herramienta de descifrado, he puesto a disposición algunos archivos para usar en la carpeta dummy_data_PoC:

  • BumAU1Ky.key (primer keystream)
  • UMvObens.key (segundo keystream)
  • a0h2uih3d2_01058000.bin (clave en texto claro volcada de la ejecución de Hive para usar como diccionario)
  • dictionary.bin (diccionario de ejemplo)
  • public_key.txt (contiene las claves públicas de los afiliados de Hive)

¡Buena suerte!

Referencias

https://github.com/rivitna/Malware/blob/main/Hive/Hive_samples.txt

https://www.virustotal.com/gui/file/335d2e4a743d059955760ecf2ec25ee86d36aa60b096c9180e860c64ef78ee55

https://www.microsoft.com/security/blog/2022/07/05/hive-ransomware-gets-upgrades-in-rust/

https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps

https://monocypher.org/manual/x25519

https://monocypher.org/manual/advanced/poly1305

https://monocypher.org/manual/advanced/chacha20

https://monocypher.org/manual/aead

Descargar herramienta