Operación TA505, cuarta parte. Gemelos



Continuamos hablando sobre las actividades del grupo de hackers TA505. La conocida frase "lo nuevo es lo viejo olvidado" es el epígrafe más adecuado para el próximo capítulo de la historia sobre el grupo TA505. Es cierto que esta vez lo "viejo" no está tan "olvidado" como si fue modificado y mejorado.

A principios de septiembre, descubrimos varios descargadores maliciosos empaquetados con el PE-packer especial del grupo sobre el que escribimos anteriormente . A primera vista, parecían los conocidos montadores de la puerta trasera FlawedAmmyy. Pero un análisis más profundo mostró que esto no es así. No las técnicas más avanzadas para escribir código nos han llevado a cargas útiles radicalmente opuestas en términos de calidad de ejecución.

En este artículo, veremos más de cerca las herramientas encontradas y trazaremos paralelos con lo que ya se conoce.

Twein del cargador de arranque


En primer lugar, lo siguiente es curioso: de todas las muestras del gestor de arranque que logramos recolectar, solo una tiene una firma digital:



Fig. 1. Firma digital del gestor de arranque

Certificado emitido a nombre de PEAR SOLUTIONS LTD. Por cierto, esta no es la primera vez que un grupo firma sus herramientas, haciéndolas pasar por software legítimo de organizaciones ficticias. Aquí hay algunos otros nombres que usaron el TA505 para otras familias de malware:

  • ET HOMES LTD,
  • FIT Y FLEX LIMITED,
  • MISHA LONDRES LTD,
  • SATOJI KAIDA MB,
  • MUY TELE LIMITADO.

Dado que los cargadores de arranque detectados no difieren entre sí, seleccionamos el ya firmado firmado y nos detenemos en él con más detalle.

A lo largo del trabajo del malware, casi todas las acciones van acompañadas de la escritura en el archivo de registro y la salida de depuración de todo lo que sucede:



Fig. 2. Depuración de salida y registro

Tal rastreo no solo simplifica el análisis estático del archivo, sino que también ayuda a descubrir qué está mal en los sistemas de análisis dinámico:



Fig. 3. Salida de depuración en el analizador en línea ANY.RUN

Troyan comprueba la distribución del idioma del teclado, y no funciona en Rusia y los países vecinos:



Fig. 4. Verificación de la disposición del idioma del teclado
Luego crea el mutex Global\system32_mutant_service y verifica la disponibilidad de Internet mediante una solicitud HTTP GET a google.com. Después de eso, determina la forma de acceder a la red (dirección dedicada o NAT ) determinando la dirección IP externa por los servicios myexternalip.com, ipecho.net e ifconfig.me y comparando el valor obtenido con los especificados en los parámetros de red del sistema:



Fig. 5. Comparación de direcciones IP internas y externas

A continuación, el malware determina la versión de la biblioteca %SystemRoot%\system32\crypt32.dll y, si el número de compilación y el número de revisión son inferiores a 7601 y 18741 respectivamente, descarga e instala la actualización KB3033929 según la versión del sistema operativo:



Fig. 6. Descargue e instale actualizaciones del sistema

¿Los atacantes TA505 cuidan de la víctima y reparan el sistema según sea necesario? En absoluto La instalación de la actualización está asociada con la finalización del soporte para los certificados de seguridad de código firmados con SHA-1 y su abandono a favor del algoritmo SHA-2. Lo más probable es que los piratas informáticos ya hayan tenido dificultades para ejecutar cargas útiles firmadas en sistemas no actualizados. Curiosamente, después de instalar la actualización, el troyano envía el registro de acción generado al servidor de administración, detiene su trabajo y se borra solo, eliminando los rastros que quedan.



Fig. 7. Apagar después de instalar una actualización del sistema

Si no se requiere la instalación de la actualización, el gestor de arranque recopila y envía la siguiente información al servidor de administración:

  • información del sistema
  • información sobre el software instalado,
  • información sobre el software firmado en los directorios% ProgramFiles% y% ProgramFiles (x86)% (si corresponde),
  • Información sobre controladores firmados en el directorio% SystemRoot% \ drivers.

Tenga en cuenta que se utilizó un código legítimo para obtener información sobre las firmas.



Fig. 8. Obteniendo información del certificado

Después de eso, el gestor de arranque crea el directorio C:\Windows\Logs\diag e inicia un hilo en el que rastrea los cambios en el directorio, enviando notificaciones al servidor de gestión:



Fig. 9. Monitoreo de cambios en el directorio

Luego, prepara la información existente y faltante sobre el sistema (nombre de usuario, versión del sistema, dominio, dirección IP, información sobre la tarjeta de video, conexión de red - NAT o no NAT) y genera un archivo JSON de este tipo:

 { "adm": "0", "bid": "M3xwwhqLH/AUOhmU2+W55A==", "bit": "1", "bnet": "ldr", "cam": "0", "cis": "0", "dmn": "WORKGROUP", "hash_r": "0", "lip": "192.168.100.153", "lvl": "0", "nat": "1", "osb": "0", "osv": "Windows 7 Professional", "pc": "USER-PC", "proc_c": "0", "proc_n": "cpu", "rep": 0, "tmt": "0", "ver": "163", "video": "Standard VGA Graphics Adapter," } 

Más tarde, estos datos se gJypA9RWUlYpnBbzujVqE6fDcEAk0zoz con RC4 (la clave de cifrado gJypA9RWUlYpnBbzujVqE6fDcEAk0zoz se cifra en el cuerpo del troyano), se codifica con Base64 y se envía mediante una solicitud HTTP POST al servidor de gestión:



Fig. 10. Solicitud HTTP POST al servidor de administración



Fig. 11. La lista de servidores de control en el gestor de arranque

RC4 descifra la respuesta del servidor (la clave de cifrado es la misma que la utilizada para enviar los datos) y se verifica: los dos primeros bytes deben corresponder a la línea MZ, que es un signo del archivo PE. Ya conocimos esta secuencia antes cuando analizamos otro cargador de grupo que entregó FlawedAmmyy RAT:



Fig. 12. Un código similar para descifrar y verificar el archivo descargado para el gestor de arranque en cuestión (izquierda) y el gestor de arranque FlawedAmmyy RAT (derecha)

La carga útil se produce no solo en el hilo principal, sino también en uno creado por separado. En otras palabras, hay dos cargas útiles. En un caso, el mutex Global \ system32_host_service se verifica previamente y, en caso de ausencia, se carga un componente, al que se hace referencia en la información de depuración como carga útil o bot. Curiosamente, después de recibir una respuesta del servidor, el archivo PE no se inicia de ninguna manera. En cambio, su cuerpo está escrito en el registro en la sección HKEY_LOCAL_MACHINE\SYSTEM en la clave 0x228028 . Luego, el gestor de arranque deshabilita la redirección del sistema de archivos WoW64 para aplicaciones de 32 bits usando Wow64DisableWow64FsRedirection e inicia el proceso %SystemRoot%\System32\services.exe con el parámetro -ww. El uso de este parámetro no tiene sentido, pero completa la cadena de instalación de la carga útil resultante.



Fig. 13. Configuración de la carga útil

Hablaremos de la segunda carga útil más tarde.

Complementos Twein


Al examinar el troyano mencionado anteriormente, notamos una función que elimina dos archivos del %SystemRoot% : twein_32.dll y twein_64.dll :



Fig. 14. Eliminar archivos twein_32.dll y twein_64.dll

Estos archivos no se encuentran en ningún otro lugar, no aparecen en la lógica del gestor de arranque. Sin embargo, los nombres de las bibliotecas nos recordaron a otro grupo de malware, que ahora consideraremos.
Dos meses antes, encontramos un troyano del grupo TA505, de unos 9 MB de tamaño. El archivo está empaquetado por UPX . El troyano se instala en el sistema como un servicio WMDICToss . Los recursos contienen tres archivos: systemdiron.bat , twein__32.dll y twein__64.dll , que están cifrados con XOR lineal.



Fig. 15. Descifrado de uno de los recursos del cuentagotas

Tenga en cuenta que los nombres de los dos archivos casi coinciden con los ya mencionados anteriormente: la diferencia es solo en el número de guiones bajos.

Se espera que uno de los recursos descifrados con el nombre systemdiron.bat sea ​​un script de comando que proporcione el lanzamiento de otros componentes dependiendo de la capacidad del sistema:

 @echo off if defined PROCESSOR_ARCHITEW6432 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==IA64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==AMD64 (goto LABEL_X64) if %PROCESSOR_ARCHITECTURE%==x86 (goto LABEL_X86) goto LABEL_NON :LABEL_X64 echo OS type: x64 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__64.dll,Install copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_X86 echo OS type: x86 copy c:\temp\tmp.log c:\i.txt rundll32.exe C:\Windows\twein__32.dll,Install del c:\temp\tmp.log del c:\i.txt shutdown.exe -r -t 00 goto LABEL_END :LABEL_NON echo OS type: undefined goto LABEL_END :LABEL_END pause 

Ambas bibliotecas de twein actúan de manera similar. Empaquetado con el característico empacador del grupo TA505. Nombres de biblioteca originales: av_block.dll . El análisis es significativamente complicado por el uso de un ofuscador, y la proporción de código ofuscado es aproximadamente del 80%. Como resultado de esto, la ejecución del programa está saturada con numerosas transiciones, decodificación de los siguientes pasos del código, llamadas a funciones no lineales.

Las bibliotecas contienen una impresionante lista de cadenas similares a Base64, que se descifran de la siguiente manera:

1. La cadena de entrada se divide en bloques de 4 bytes;
2. Cada bloque se decodifica usando el algoritmo de reemplazo y cambio:

 import binascii def block_decode(input_str, len_of_block): alphabet = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x3E\x00\x00\x00\x3F\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x00\x00\x00\x00\x00\x00\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' int_result = 0 for i in range(len_of_block): alph = ord(alphabet[ord(input_str[i])]) alph <<= 0x6 * i int_result += alph str_result = hex(int_result)[2:] if len(str_result) % 2 != 0: str_result = '0' + str_result return binascii.unhexlify(str_result).decode('latin1')[::-1] 


3) los bloques se recogen en una sola línea;
4) el algoritmo eexec descifra el resultado con una clave de doble byte, que se pasa como parámetro:



Fig. 16. Implementación del algoritmo eexec

La mayoría de las líneas son los nombres y las rutas a los archivos de los productos antivirus, sin embargo, algunos de ellos no pertenecen a herramientas de seguridad en absoluto: MS Exchange Server, MySQL Server, SAP, Apache, PostgreSQL, Elasticsearch, etc. Incluso hubo rutas únicas:

  • C: \ Users \ tislam \ Desktop \ salik app \ Aye_salik_data \ Aye_salik_data \ bin \ Debug \ Aye_salik_data.exe
  • C: \ oem13c \ agent13c \ agent_13.2.0.0.0 \ perl \ bin \ perl.exe
  • C: \ Users \ adadmin \ Ubiquiti UniFi \ bin \ mongod.exe
  • C: \ Users \ sakella \ AppData \ Local \ Microsoft \ OneDrive \ OneDrive.exe
  • D: \ Complementos \ IMI_CREDIT_POLICY Test v 02.01 \ IMI_CREDIT_POLICY.exe

Si se encuentra software en el sistema de la lista, se eliminan los archivos y directorios.

Para protegerse en el sistema, las bibliotecas se configuran como la interfaz del proveedor de servicios de Windows Sockets (SPI), denominada Intel e IntelFiltr. Además, cambian el orden de los manejadores en la cadena de protocolo para ser el primer SPI en manejar la solicitud del cliente.

En 2015, nuestros colegas de FireEye presentaron el análisis de bot LatentBot . Es curioso que el algoritmo de cifrado de cadenas en LatentBot y las bibliotecas de twein revisadas sean completamente iguales. Además, LatentBot utiliza un módulo de seguridad como uno de los complementos, que busca herramientas de seguridad en el sistema utilizando las rutas especificadas y los nombres de productos, aunque se limita a verificar la disponibilidad.

Rootkit twein


Volver al gestor de arranque, es decir, la segunda carga útil. Desde las líneas de depuración de intentar abrir rootkit ... y Driver% S instalado, es fácil adivinar el formato de la próxima carga útil. Después de una carga exitosa, el controlador se escribirá en el %SystemRoot%\System32\drivers con un nombre formado de forma pseudoaleatoria a partir de los nombres de otros archivos legítimos. Luego se creará y lanzará el servicio:



Fig. 17. Instalación e inicio del servicio.

En la etapa final de su trabajo, el gestor de arranque configurará el controlador para que se incluya en una lista negra en las claves de registro: los nombres de los procesos antivirus, las herramientas de análisis y los proveedores de protección en las firmas de archivos digitales se ingresarán en los valores numéricos especificados de las claves de la rama HKEY_LOCAL_MACHINE\SYSTEM :



Fig. 18. Configuración del controlador en la lista negra

En el proceso de investigación del gestor de arranque, no pudimos obtener una muestra del controlador del servidor de administración. Sin embargo, encontramos mención de un rootkit que fue bombeado por otro gestor de arranque similar.

El controlador está firmado digitalmente a nombre de Lizas Limited con administrator@lizaslimited.site como correo electrónico:



Fig. 19. controlador firmado digitalmente

Durante la investigación, encontramos mucho en común con el conocido rootkit de la botnet Necurs, que fue utilizado activamente por el grupo TA505 para enviar spam y propagar malware. Consideremos con más detalle las características más interesantes de su trabajo.

El controlador registra controladores de eventos para iniciar procesos y cargar imágenes PE utilizando PsSetCreateProcessNotifyRoutine y PsSetLoadImageNotifyRoutine . En otras palabras, esto permite que el controlador controle el lanzamiento de todos los procesos y servicios nuevos. Usando las listas negras que mencionamos anteriormente, el rootkit termina los procesos no deseados con ZwTerminateProcess y evita que otros controladores potencialmente peligrosos se carguen, sobrescribiendo el valor del punto de entrada en las instrucciones:

 mov eax, 0C0000001 retn 8 

Como resultado, el servicio se descargará con el error STATUS_UNSUCCESSFULL .



Fig. 20. Finalización del proceso



Fig. 21. Sobrescribir puntos de entrada del conductor

Mediante CmRegisterCallback, el controlador intercepta los eventos de acceso al registro del sistema. En particular, su trabajo adicional está parametrizado por los valores numéricos de las teclas a las que se accede en eventos interceptados.



Fig. 22. Gestión de rootkits de accesos de clave de registro

Curiosamente, en algunas versiones del rootkit Necurs, se usaron los mismos valores numéricos que los códigos de solicitud ioctl.



Fig. 23. Administrar un rootkit Necurs usando consultas ioctl

Este truco puede considerarse como un paso hacia un mayor secreto: el acceso al registro causa menos sospechas que las solicitudes ioctl a DeviceObject.

El cuerpo del rootkit contiene una biblioteca DLL auxiliar cifrada con XOR de un solo byte. Al crear un nuevo proceso, el controlador inyecta la biblioteca junto con otro archivo PE, que se extrae del registro y se descifra nuevamente con un XOR de un solo byte.



Fig. 24. Descifrado e inyección de la biblioteca auxiliar en el proceso creado.

El componente auxiliar es un cargador reflexivo personalizado que coloca correctamente el segundo archivo PE en la memoria, que actúa como una carga útil, y le transfiere el control. Ahora queda claro cómo exactamente la carga útil que el gestor de arranque escribió en el registro desde la primera parte del artículo comienza a funcionar.



Fig. 25. Llenar la tabla de importación con una biblioteca auxiliar

Conclusión


En el artículo, nos familiarizamos con las características del trabajo de muchos troyanos gemelos. ¿Por qué gemelos? El gestor de arranque malicioso con el que comenzamos nuestra investigación es muy similar al conocido gestor de arranque de puerta trasera FlawedAmmyy en la calidad de la escritura de código y los matices de implementación. Las bibliotecas de twein que está tratando de eliminar del sistema son las que probablemente veamos a continuación. Las bibliotecas son muy similares al complemento de seguridad LatentBot. Una de las cargas útiles del gestor de arranque es un controlador derivado del popular rootkit de Necurs.

Algunas familias de malware tienen más de 5 años, sin embargo, los atacantes continúan actualizándolas y mejorándolas, teniendo en cuenta el desarrollo de sistemas operativos y herramientas de seguridad.

Autores : Alexey Vishnyakov y Daniil Koloskov, Tecnologías positivas

COI
a28a54abc30805cc6ea2ce0732989287 - Twein bootloader
f6b6526b8d494dce14568e3703368432 - cuentagotas plugin twein
983dd279722154a12093410067fe070e - rootkit Twein

Artículos anteriores de la serie:


Source: https://habr.com/ru/post/475328/


All Articles