Profundizando en Sodinokibi Ransomware

Acronis
Acronis Cyber Protect
antes Acronis Cyber Backup
Otros idiomas English Deutsch

Si bien el ransomware Sodinokibi ha aparecido en las noticias recientemente, los detalles técnicos de esa cepa en particular han sido mucho menos visibles. En este artículo, analizaremos Sodinokibi, arrojaremos luz sobre cómo funciona y revisaremos cómo puede proteger su sistema de esta amenaza.

Investigado y escrito por Ravikant Tiwari y Alexander Koshelev

Resumen ejecutivo

  • Es probable que Sodinokibi esté siendo distribuido por atacantes afiliados a los que distribuyeron la infame familia de ransomware GandCrab, que se supone que se retirará pronto, según el foro clandestino donde apareció por primera vez GandCrab.
  • El ransomware Sodinokibi explota una vulnerabilidad de Oracle WebLogic (CVE-2019-2725) para obtener acceso a la máquina de la víctima. Una vez que está dentro, el malware intenta ejecutarse con derechos de usuario elevados para acceder a todos los archivos y recursos del sistema sin ninguna restricción.
  • Sodinokibi intenta evitar infectar ordenadores de Irán, Rusia y otros países que antes formaban parte de la Unión de Repúblicas Socialistas Soviéticas (URSS).
  • Esta variedad de ransomware utiliza algoritmos AES y Salsa20 para cifrar los archivos del usuario, AES se utiliza para cifrar las claves de sesión y los datos que se envían al servidor de control, los archivos del usuario se cifran mediante el cifrado Salsa20.
  • Sodinokibi utiliza un algoritmo de intercambio de claves Diffie-Hellman de Curva Elíptica para generar y propagar claves de cifrado.
  • Una vez que se infiltra en una máquina, borra todos los archivos de la carpeta de copia de seguridad.
  • Actualmente, el ransomware exige 0,32806964 BTC (≈ $2.500) para recuperar el acceso a los archivos cifrados. Afirman que esta cantidad debe pagarse en cuatro días o se duplicará la demanda de rescate.
Acronis
Sodinokibi ransomware

Cómo funciona

La muestra de ransomware Sodinokibi que analizamos se empaquetó con un empaquetador personalizado. Incluso después de un desempaquetado exitoso, el código principal de Sodinokibi no parece tener una cadena legible. Tampoco tiene importaciones para bibliotecas del sistema y API, lo que significa que un escáner AV estático que depende de una cadena legible y una tabla API importada tendrá dificultades para detectarlo.

Los nombres de API y otras cadenas requeridas se descifran durante su tiempo de ejecución utilizando el algoritmo RC4. Para la situación aún más desafiante para el software antivirus, la mayoría de las operaciones en cadenas se realizan utilizando un hash DJB de la cadena en lugar de la cadena en sí.

Inicialización

Sodinokibi comienza construyendo una tabla de importación dinámica y asegurándose de que esta sea la única instancia que se esté ejecutando actualmente en el sistema con la ayuda de mutex. Una vez que se pasa la verificación de mutex, descifra la configuración JSON almacenada dentro del binario usando RC4 y busca el valor de clave booleana “exp”. Si se establece en "true", Sodinokibi intenta ejecutar un exploit. En nuestro caso, el valor de la clave "exp" se establece en true, por lo que procede a ejecutar la función de explotación.

Acronis
Sodinokibi - Decrypted JSON Configuration
Acronis
Decrypted JSON Configuration

Figura 1: Configuración JSON descifrada

El código responsable de ejecutar el exploit primero verifica si el parche del 11 de septiembre de 2018 (KB4457138) se aplica en la máquina. Este parche soluciona varias vulnerabilidades que se mencionan a continuación. Si no se detecta el parche, el ransomware procede a ejecutar una versión de 32 o 64 bits del código de shell, según la arquitectura de la plataforma. Creemos que intenta elevar su privilegio explotando CVE-2018-8440.

Acronis

Figura 2: Fragmento 1

Las vulnerabilidades abordadas por el parche KB4457138 se mencionan en la siguiente tabla:

Vulnerabilidades abordadas por KB4457138
CVE-2018-8457
CVE-2018-8335
CVE-2018-8424
CVE-2018-8455
CVE-2018-8468
CVE-2018-8447
CVE-2018-8475
CVE-2018-8271
CVE-2018-8440
CVE-2018-8464
CVE-2018-8469
CVE-2018-8421
CVE-2018-8442
CVE-2018-8367
CVE-2018-8443
CVE-2018-8465
CVE-2018-8419
CVE-2018-8466
CVE-2018-8410
CVE-2018-8467
CVE-2018-8462
CVE-2018-8452
CVE-2018-8446
CVE-2018-8449
CVE-2018-8420
CVE-2018-8433
CVE-2018-8438
CVE-2018-8435
CVE-2018-8456
CVE-2018-8354
CVE-2018-8434
CVE-2018-8470
CVE-2018-8332
CVE-2018-0965
CVE-2018-8315
CVE-2018-8439
CVE-2018-8392
CVE-2018-8425
CVE-2018-8393
 
 
 

Si el sistema no es vulnerable y el proceso aún se está ejecutando como un usuario limitado, usará un comando RUNAS para lanzar otra instancia con derechos administrativos y finalizará la instancia actual si se está ejecutando con privilegios limitados. El flujo completo se puede ver en el código a continuación.

Acronis
Sodinokibi ransomware

Figura 3

Una vez que Sodinokibi se inicia con éxito en el modo de Administrador, realiza una verificación previa adicional basada en la clave "bro" en la configuración JSON y el país. Intentará no infectar equipos de los siguientes países, según la configuración regional del equipo.

Acronis
Figure 4: Matching language IDs

Figura 4: ID de idioma coincidentes

Lista de países exentos

Rumania
Rusia
Ucrania
Bielorrusia
Estonia
Letonia
Lituania
Tayikistán
Irán
Armenia
Azerbaiyán
Georgia
Kazajistán
Kirguistán
Turkmenistán
Uzbekistán
Tartaristán
 

Después de pasar la verificación previa, finaliza el proceso mysql.exe (si se está ejecutando) para que pueda obtener acceso a los archivos MySQL para el cifrado, luego elimina todas las COPIAS SOMBRAS de Windows (mecanismo de copia de seguridad integrado de Windows) usando vssadmin y deshabilita Windows recuperación usando bcdedit (editor de políticas de arranque), como se muestra a continuación:

vssadmin.exe Delete Shadows /All /Quiet & bcedit /set {default} recoveryenabled No & bcedit /set {default} bootstatuspolice ignorealfailures

Acronis

Figura 5

Antes de cifrar los archivos del usuario, Sodinokibi busca en todo el sistema de archivos y en los recursos compartidos de la red todos los directorios denominados "copia de seguridad" y los elimina. Curiosamente, antes de borrar todos los archivos dentro de este directorio, sobrescribe el contenido con bytes aleatorios para hacer imposible la recuperación de archivos. Afortunadamente, los archivos de Acronis Backup no se pueden eliminar fácilmente, ya que están protegidos mediante controladores en modo kernel para frustrar dicha eliminación ilícita por ransomware.

Generación de claves

Sodinokibi utiliza un algoritmo de intercambio y generación de claves Diffie-Hellman de Curva Elíptica (ECDH, por sus siglas en inglés) para generar un par de claves público-privadas. Utiliza esto para generar un secreto compartido, que se utilizará como clave para los algoritmos de cifrado simétrico AES y Salsa20 que se utilizan para cifrar diferentes tipos de datos.

  • El cifrado AES se utiliza para cifrar las claves privadas del par de claves público-privadas, que se genera localmente en la máquina del usuario, así como los datos enviados a través de la red.
  • Salsa20, por otro lado, se utiliza para cifrar archivos de usuario.

Sodinokibi se envía con dos claves públicas diferentes, una como parte de la configuración JSON y otra incrustada en el binario. Estas claves públicas se utilizarán para cifrar la clave privada generada localmente. A continuación, detallamos los pasos incluidos en el proceso de generación de claves y cifrado.

Paso 1. Genere una sesión privada (número secreto, aleatorio) y un par de claves públicas en la máquina local.

Acronis
Generating local public and private keys

Figura 6: Generación de claves públicas y privadas locales

Cifrar la clave privada del Paso 1 usando la clave pública presente en la configuración JSON

Paso 2. Genere otro par de claves pública y privada.

Paso 3. Utilice la clave privada del Paso 2 y la clave pública (valor de clave pk) de JSON para generar una clave compartida y aplicar un hash para generar una clave simétrica.

Acronis
Generating a symmetric key using a shared key

Figura 7: Generación de una clave simétrica usando una clave compartida

Paso 4. Genere un Vector de Inicialización (IV, por sus siglas en inglés) de 16 bytes.

Paso 5. Cifre la clave privada generada en el Paso 1 usando el cifrado AES con la Clave y el IV generados en los Pasos 3 y 4.

Paso 6. Calcule el CRC32 de la clave privada cifrada generada en el Paso 5.

Paso 7. Añada el IV y CRC32 al final del búfer que contiene la clave privada cifrada del Paso 5.

Paso 8. Guarde este búfer en un desplazamiento de archivo mapeado marcado como "sk_key" en la memoria.

Acronis
Figure 8: Encrypting the private key from step one using the attacker's public keys

Figura 8: Cifrado de la clave privada del Paso 1 usando las claves públicas del atacante

Cifrar la clave privada del Paso 1 utilizando la clave pública presente incrustada en el binario

Paso 9. Repita los Pasos 2 a 7 utilizando una clave pública diferente que viene incrustada en el binario para el Paso 3.

Paso 10. Guarde este búfer en un desplazamiento de archivo mapeado marcado como "0_key" en la memoria.

Sk_key, 0_key y pk_key se escriben en la siguiente clave de registro, respectivamente, según los derechos de acceso.

HKLM\SOFTWARE\recfg\sk_key   OR    HKCU\SOFTWARE\recfg\sk_key

HKLM\SOFTWARE\recfg\0_key   OR   HKCU\SOFTWARE\recfg\0_key

HKLM\SOFTWARE\recfg\pk_key   OR   HKCU\SOFTWARE\recfg\pk_key

Acronis
Encrypted secret key in registry

Figura 9: Clave secreta cifrada en el registro

Generar claves por archivo para Salsa20

Paso 11. Genere un nuevo par de claves pública y privada.

Paso 12. Genere una clave compartida usando la clave pública de sesión generada en el Paso 2 y hash para obtener otra clave simétrica para usar en la generación de claves Salsa20.

Paso 13. Configurar un estado de clave Salsa20 de 256 bits (32 bytes).

Paso 14. Genere un IV de 8 bits para la clave Salsa20.

Paso 15. Genere una clave Salsa20.

Paso 16. Utilice este key_state de Salsa20 para cifrar los archivos de usuario mediante el cifrado de Salsa20.

Acronis
Generation of per file Salsa20 key

Figura 10: Generación de clave Salsa20 por archivo

Repita los Pasos del 11 al 16 para cada archivo que desee cifrar.

Ilustración de cifrado y descifrado

Para comprender cómo se generan y transfieren las claves entre el atacante y la máquina de la víctima, debemos observar cómo funciona Diffie Hellman con la ayuda de la imagen a continuación.

Acronis

Figura 11: Intercambio de claves Diffie-Hellman de Curva Elíptica (ECDH) 

El proceso de cifrado de Sodinokibi en detalle

Acronis

Figura 12: Proceso de cifrado

El proceso de descifrado de Sodinokibi en detalle

El proceso de descifrado requerirá el conocimiento de la clave privada del atacante que no se divulga públicamente y, por lo tanto, no es posible restaurar los archivos.

Acronis

Figura 13: Proceso de descifrado (el secreto del atacante es la clave privada del atacante)

La versión simplificada de cómo se verá el proceso de descifrado de los archivos de usuario como el gráfico a continuación.

Acronis

Figura 14

Cifrado de archivos en discos duros locales y recursos compartidos de red

Para cifrar archivos de usuario, Sodinokibi utiliza puertos de finalización de E/S y crea varios subprocesos de cifrado hasta un máximo del doble de la cantidad de núcleos de procesador presentes en la máquina y asocia estos subprocesos al puerto de finalización de E/S creado. Estos subprocesos utilizan la función GetQueuedCompletionStatus de Win API para esperar a que un paquete de finalización se ponga en cola en el puerto de finalización de E/S antes de continuar con el cifrado de archivos.

Una vez que se crean los subprocesos y se espera que lleguen los paquetes de E/S, Sodinokibi comienza a enumerar los archivos de usuario en todas las unidades locales y recursos compartidos de red, excepto las unidades CDROM y RAMDISK, y comienza a asociar archivos que no están en la carpeta, archivo o lista de extensión de archivo exentos a este puerto de finalización de E/S llamando a la función de usuario AddFileToIoCompletionPort y llama a PostQueuedCompletionStatus de Win API para publicar un paquete de E/S en los puertos de finalización de E/S que activará el hilo que espera en este puerto de finalización de E/S para reanudar y proceder a cifrar archivos. AddFileToIoCompletionPort también genera una clave Salsa20 única para cada archivo que se va a cifrar y pasa esta clave Salsa20 al hilo de cifrado como parte de la estructura que contiene otros metadatos que deben escribirse en el archivo también después del cifrado utilizando el parámetro lpOverlapped de Win API PostQueuedCompletionStatus. Durante la enumeración, también crea un archivo de ransom en todas las carpetas que no están en la lista de carpetas exentas. Una vez que no hay más archivos para enumerar, el subproceso principal espera en un bucle hasta que el número total de archivos cifrados y renombrados sea igual al número total de archivos agregados al puerto de finalización de E/S para el cifrado.

Finalmente, establece una bandera que indica que no hay más archivos para enumerar y publica múltiples paquetes de finalización de E/S, al hacer esto, se asegura de que los subprocesos adicionales que esperan archivos se reanuden y rompan el flujo de ejecución para finalizar de inmediato.

Acronis

Figura 15

Carpetas exentas

  • "$windows.~bt"
  • "intel"
  • "program files (x86)"
  • "program files"
  • "msocache"
  • "$recycle.bin"
  • "$windows.~ws"
  • "tor browser"
  • "boot"
  • "system volume information"
  • "perflogs"
  • "google"
  • "application data"
  • "windows"
  • "programdata"
  • "windows.old"
  • "appdata"
  • "mozilla"

Archivos exentos

  • "bootfont.bin"
  • "boot.ini"
  • "ntuser.dat"
  • "desktop.ini"
  • "iconcache.db"
  • "ntldr"
  • "ntuser.dat.log"
  • "thumbs.db"
  • "bootsect.bak"
  • "ntuser.ini"
  • "autorun.inf"

Extensiones de archivo exentas

  • "themepack"
  • "ldf"
  • "scr"
  • "icl"
  • "386"
  • "cmd"
  • "ani"
  • "adv"
  • "theme"
  • "msi"
  • "rtp"
  • "diagcfg"
  • "msstyles"
  • "bin"
  • "hlp"
  • "shs"
  • "drv"
  • "wpx"
  • "deskthemepack"
  • "bat"
  • "rom"
  • "msc"
  • "lnk"
  • "cab"
  • "spl"
  • "ps1"
  • "msu"
  • "ics"
  • "key"
  • "msp"
  • "com"
  • "sys"
  • "diagpkg"
  • "nls"
  • "diagcab"
  • "ico"
  • "lock"
  • "ocx"
  • "mpa"
  • "cur"
  • "cpl"
  • "mod"
  • "hta"
  • "exe"
  • "icns"
  • "prf"
  • "dll"
  • "nomedia"
  • "idx"

El hilo de cifrado se encarga de leer el contenido del archivo, cifrarlo, volver a escribirlo en el mismo archivo, escribir metadatos que contienen la sesión cifrada Clave privada, Clave pública ECDH por archivo y el IV Salsa20 por archivo utilizado para cifrar los archivos y luego renombrarlos agregando un nombre de extensión generado aleatoriamente. Los archivos se cifran utilizando el algoritmo de cifrado Salsa20 (variante Chacha) dentro de la función de usuario EncryptAndWrite.

El siguiente fragmento muestra el código para la función de usuario EncryptingThreadRoutine.

Acronis

Figura 16

Estructura de archivos después del cifrado

Acronis

Figura 17: Estructura del archivo cifrado

Actividad de la red

Una vez que se completa el proceso de cifrado, el ransomware prepara los datos para enviarlos al servidor de control. Estos datos contienen diferentes campos de la configuración JSON, información del sistema y claves de cifrado. Los datos preparados también se guardan en la clave de registro “[HKLM|HKCU]\SOFTWARE\recfg\stat” antes de cifrarlos con AES y enviarlos al servidor del atacante.

Acronis
Figure 18: Data sent over network

Figura 18: Datos enviados a través de la red

Campo
Descripción
ver
Valor codificado 256
pid
Valor de la clave 'pid ' del archivo de configuración JSON
sub
Valor de la clave 'sub' en el archivo de configuración JSON
pk
Clave pública
uid
crc32 (número de serie del volumen) + crc32 (modelo de procesador
sk
Clave secreta 
unm
Nombre de usuario
net
Nombre de la máquina
grp
Nombre de dominio de red del sistema
lng
Idioma del sistema
bro
Verdadero o falso según el país exento
os
Nombre del sistema operativo
bit
Arquitectura de plataforma (32|64 bits)
dsk
Tamaño del disco

La información se envía a una URL generada aleatoriamente que tiene el formato

donde:

Nombre de dominio
sochi-okna23[.]ru
Ruta parte 1
"wp-content" "static" "content" "include" "uploads" "news" "data" "admin"
Ruta parte 2
"images" "pictures" "image" "temp" "tmp" "graphic" "assets" "pics" "game"
Acronis
Generating URL

Figura 19: Generación de URL

Nota de rescate

Sodinokibi contiene una plantilla de su nota de rescate con marcadores de posición para detalles específicos del usuario. Estos marcadores de posición se sustituyen dinámicamente con el nombre de extensión específico del usuario, la identificación del usuario (uid, consulte la tabla anterior para obtener una descripción) y la clave. La nota de rescate se coloca en cada directorio excluyendo el de la lista blanca.

Acronis

Figura 20

Descifrado

No hay un descifrador gratuito disponible para este ransomware y la única opción es utilizar el servicio de descifrado proporcionado por los atacantes, al que se puede acceder siguiendo las instrucciones de la nota de rescate.

El descifrado es el siguiente 

Acronis

Figura 21

Conclusión

Para protegerse contra el ransomware, recomendamos utilizar una solución antiransomware avanzada y mantener una solución antivirus actualizada. Todos los productos de Acronis están equipados con tecnología avanzada antiransomware y pueden protegerlo contra cualquier ataque de este tipo y minimizar el riesgo de pérdida de datos.

Los productos de protección cibernética como la solución personal Acronis True Image 2020 o la solución empresarial Acronis Backup vienen con la defensa antimalware basada en inteligencia artificial Acronis Active Protection integrada y, por lo tanto, pueden proteger a los usuarios contra el ransomware Sodinokibi.

Acronis

Figura 22: Acronis Active Protection detecta Sodinokibi

Acronis

Más de Acronis