- El autor logró recuperar los datos de una empresa infectada con ransomware Akira sin pagar rescate
- El código fuente usado durante la recuperación está disponible en GitHub
- El ransomware Akira tiene múltiples variantes y esta variante ha estado activa desde finales de 2023
- En versiones anteriores (antes de mediados de 2023), había un bug que permitió a Avast desarrollar un descifrador, pero después de que esto se hizo público, los atacantes actualizaron el cifrado
- El hash de las muestras del ransomware puede consultarse en GitHub
Resumen del método de recuperación de archivos de Akira ransomware (variante Linux/ESXI 2024)
Enfoque de la solución
Análisis inicial
- El ransomware usa como semilla la hora actual en nanosegundos
- Como el tiempo de modificación de archivos en Linux tiene resolución de nanosegundos, se descubrió la posibilidad de recuperar la semilla
- Se intentó un enfoque de fuerza bruta basado en las marcas de tiempo de los archivos modificados
Proceso de cifrado complejo
- El ransomware usa 4 valores de semilla (tiempo en nanosegundos)
- La generación de claves repite el hash SHA-256 1500 veces
- El sistema de archivos VMware VMFS solo guarda el tiempo de modificación con resolución de segundos
- Debido al cifrado basado en múltiples hilos, es difícil recuperar el momento exacto
Ingeniería inversa
- El código estaba escrito en C++, lo que dificultó el análisis, pero no estaba ofuscado
- A través de mensajes de error se confirmó el uso de la librería Nettle
- El generador aleatorio se basa en el algoritmo Yarrow256 y usa el siguiente código
void generate_random(char *buffer, int size)
{
uint64_t t = get_current_time_nanosecond();
char seed[32];
snprintf(seed, sizeof(seed), "%lld", t);
struct yarrow256_ctx ctx;
yarrow256_init(&ctx, 0, NULL);
yarrow256_seed(&ctx, strlen(seed), seed);
yarrow256_random(&ctx, size, buffer);
}
- Durante la generación de claves se producen 4 llamadas a
generate_random()
- chacha8_key (32 bytes)
- chacha8_nonce (16 bytes)
- kcipher2_key (16 bytes) × 2
Revisión de la viabilidad de la fuerza bruta
Estrategia principal
- Generar dos marcas de tiempo (t3, t4), convertirlas en semillas y luego generar números aleatorios
- Usar esos números aleatorios como clave e IV de KCipher2, cifrar y comparar el resultado con el archivo cifrado
Análisis de rendimiento
- Convertir 100 millones de marcas de tiempo toma 3 horas (en CPU)
- Con GPU, la velocidad de conversión se reduce a menos de 6 minutos
- En un rango de 1 segundo, hay alrededor de 500 billones de pares posibles
- Tras optimizar para GPU, una RTX 3090 puede procesar 1.5 mil millones de cifrados por segundo
Tipos de archivos de VMware y estrategia de recuperación
FLAT-VMDK
- Los primeros 8 bytes de un VMDK pueden recuperarse desde el bootloader
- Es necesario instalar el mismo sistema operativo verificando la información del SO en el archivo VMX
SESPARSE
- El patrón del encabezado del archivo se confirmó a partir del código fuente de QEMU
- El encabezado comienza con
0x00000000cafebabe
Otros archivos
- En archivos NVRAM, archivos VMX, logs y otros, se pueden identificar marcas de tiempo iniciales
Recuperación de marcas de tiempo
Logs de ESXi
- Los logs de ESXi registran tiempos de ejecución con precisión de milisegundos
- Si no hay logs con milisegundos, se puede estimar a partir del tiempo en segundos
Tiempo de modificación del sistema de archivos
- En ESXi, como la resolución es de segundos, es difícil estimar la hora exacta
Cifrado multihilo
- El cifrado de archivos se procesa en paralelo según la cantidad de núcleos de CPU
- El tiempo de modificación del archivo suele estar cerca del momento en que termina el cifrado
Implementación de la herramienta de fuerza bruta
Algoritmo KCipher2
- Se usa una versión modificada de KCipher2, no la estándar (incluyendo el manejo de endianess)
- Se aplicó optimización para GPU usando CUDA
Mejoras de rendimiento
- Se mejoró el rendimiento usando memoria compartida
- Se aumentó la velocidad eliminando copias de memoria
- Se implementó procesamiento paralelo de archivos → aproximadamente 1.5 mil millones de operaciones por segundo
RTX 3090 vs RTX 4090
- La RTX 4090 es aproximadamente 2.3 veces más rápida → 7 días
- RTX 3090 → aproximadamente 16 días
Pasos de recuperación
1. Extraer marcas de tiempo
- Verificar la hora de modificación con el comando
stat
- Extraer la hora de inicio de ejecución desde los logs de ESXi
2. Extraer datos cifrados
- Extraer bloques cifrados de VMDK, SESPARSE, etc.
3. Medir la velocidad del servidor
- Usar la herramienta
timing-patch de GitHub
4. Dividir el trabajo
- Crear y dividir el archivo de configuración
- Configurarlo para ejecución paralela en GPU
5. Alquilar GPU y ejecutar
- Runpod → costo aproximado de 116 dólares por 7 días
- Vast.ai → más barato, pero la velocidad puede variar según el estado del equipo
6. Ejecutar fuerza bruta de KCipher2
./akira-bruteforce run2 config.json
7. Ejecutar fuerza bruta de Chacha8
- Necesario en el caso de archivos grandes
8. Ejecutar el descifrado
./decrypt filename.vmdk <t1> <t2> <t3> <t4>
Resultados de rendimiento
- RTX 3090 → 1.5 mil millones de operaciones por segundo
- RTX 4090 → 3.5 mil millones de operaciones por segundo
- Usando 16 RTX 4090 → recuperación posible en menos de 10 horas
Posibilidades y límites de recuperación
- La probabilidad de éxito al recuperar datos del ransomware es de menos de 0.1%
- Si se cumplen ciertas condiciones, existe posibilidad de recuperación
- El método de cifrado puede cambiar según la variante del ransomware
Conclusión
- Recuperar datos de ransomware es muy difícil, pero en ciertas condiciones puede ser posible
- La fuerza bruta basada en GPU es la herramienta clave
- El autor publicó el código de recuperación como open source, pero le resulta difícil brindar soporte adicional
Referencias adicionales
- Consultar el archivo
README.md en GitHub
- El código fue escrito para la situación de un cliente específico → no es una herramienta genérica
- Generar el archivo de configuración, ajustar timings, etc., requiere habilidades de nivel administrador de sistemas
1 comentarios
Comentarios en Hacker News
Alguien mencionó la "vida útil limitada" del ransomware. Por eso se eliminó un comentario que decía que no afectaría a otras víctimas, pero se publicó una respuesta al respecto
Hubo una pregunta sobre por qué se usan marcas de tiempo
Este artículo fue agradable de leer y tenía el nivel justo de detalle para satisfacer la curiosidad sobre el proceso
Si las aplicaciones estuvieran aisladas en sandbox por defecto, el problema del ransomware se reduciría
"Estimé que la CPU de mi mini PC calcula 100,000 marcas de tiempo por segundo como bytes aleatorios (usando todos los núcleos)"
Me pregunto por qué cifran los primeros 65k con KCipher2 y el resto con otra cosa. Se ve extraño
"Espero que después de publicar esto los atacantes vuelvan a cambiar el cifrado"
"Cada vez que escribo sobre ransomware en mi blog de Indonesia, mucha gente me pide ayuda con ransomware"