
El grupo Donot Team de APT (también conocido como APT-C-35, SectorE02) ha estado activo desde al menos 2012. El interés de los atacantes está dirigido a obtener información confidencial y propiedad intelectual. Entre los objetivos de los delincuentes se encuentran los países del sur de Asia, en particular el sector público de Pakistán. En 2019, observamos sus actividades en Bangladesh, Tailandia, India, Sri Lanka y Filipinas, así como fuera de la región asiática, en Argentina, los Emiratos Árabes Unidos y el Reino Unido.
Durante varios meses, seguimos los cambios en el código de los descargadores maliciosos del grupo. En este artículo, consideraremos uno de los vectores de ataque, haremos hincapié en los cargadores mencionados con más detalle y tocaremos las características de la infraestructura de red.
Cadena de ataque
Al comienzo de la infección, la víctima recibe un documento de MS Word en formato Office Open XML. A pesar de la falta de evidencia explícita, creemos con confianza que el vector de penetración inicial es el correo electrónico de phishing dirigido con un archivo adjunto de la oficina. El documento en sí no es malicioso, pero abusa de la capacidad de cargar automáticamente elementos externos para iniciar el documento de la siguiente etapa.
Acceso a un objeto externo vinculadoEl archivo de descarga es un documento RTF que explota la vulnerabilidad CVE-2018-0802 en Microsoft Equation. La operación de shellcode principal está precedida por una cadena de intermedios que descifran la siguiente capa con XOR de un solo byte con las teclas 0x90 y 0xCE:
Descifrado por el primer shellcode del segundo
Descifrado por el segundo shellcode del tercero
Descifrado por el tercer shellcode del mainEl shellcode principal realiza las siguientes acciones:
- Un XOR de un solo byte con la clave 0x79 descifra los datos binarios del archivo % TEMP% \ one .
- Crea archivos ejecutables C: \ Windows \ Tasks \ Serviceflow.exe y C: \ Windows \ Tasks \ sinter.exe . Estos son descargadores de grupos maliciosos, de los que hablaremos.
- Crea el archivo C: \ Windows \ Tasks \ S_An.dll , en el que se escriben dos bytes 0x90.
- Crea el archivo C: \ Windows \ Tasks \ A64.dll . Dependiendo de la capacidad del sistema, esta es una versión x64 o x86 modificada de la utilidad UACMe para aumentar los privilegios en el sistema. Además de eludir el control UAC, la biblioteca crea y ejecuta el script BAT % TEMP% \ v.bat , que registrará uno de los cargadores de arranque creados previamente como un servicio utilizando los siguientes comandos:
sc create ServiceTool displayname= "ServiceFill" binpath= "C:\Windows\Tasks\Serviceflow.exe" start= "auto" sc start ServiceTool
Decodificación de cadenas de script BAT en bibliotecas UACMe modificadas- Crea y ejecuta el script JScript C: \ Windows \ Tasks \ bin.js. Su tarea es iniciar la biblioteca A64.dll a través de la exportación de RnMod usando rundll32.
- Crea un acceso directo WORDICON.lnk en el directorio de inicio. Su tarea es iniciar el gestor de arranque sinter.exe después de reiniciar el sistema.
- Crea un acceso directo Support.lnk en el directorio de inicio. Su tarea es ejecutar el script bin.js JScript después de reiniciar el sistema.
Shellcode principal descompiladoPor lo tanto, en esta etapa, dos cargadores de arranque se fijan de manera confiable en el sistema, cuya operación discutiremos con más detalle.
Cargadores Lo2
A pesar de la clasificación, los troyanos tienen diferentes tareas. Por lo tanto, el archivo
Serviceflow.exe tiene una función de vigilancia. Recopila información sobre el sistema:
- nombre de usuario
- nombre de la computadora
- el contenido de los directorios \ Archivos de programa \ y \ Archivos de programa (x86) \
- Versión del sistema operativo
- datos del procesador
y escribe los resultados en un archivo log.txt. Comprueba la existencia de los
archivos A64.dll y
sinter.exe en el directorio \ Windows \ Tasks \ y, si es necesario, los descarga del servidor de administración superior skillnew [.] Y lo inicia en nombre del usuario actual, extrayendo el token correspondiente del proceso winlogon.exe. El troyano
sinter.exe señala a un atacante acerca de la infección accediendo a
hxxps://mystrylust.pw/confirm.php
y envía información previamente recopilada sobre el sistema a skillnew [.] Arriba. Luego, si la computadora de la víctima es de mayor interés, recibe el contenido del archivo customer.txt en
hxxp://docs.google.com/uc?id=1wUaESzjGT2fSuP_hOJMpqidyzqwu15sz&export=download
. El archivo contiene el nombre del coche del servidor de control [.] Drivethrough.top, con el que se produce una mayor interacción. Los componentes descargables se encuentran en el directorio \ AppData \ Roaming \ InStore \, y su inicio se proporciona mediante el programador de tareas.
Líneas descifradas de fragmentos de comandos y plantilla de tareasEl resultado del trabajo de descargadores maliciosos es la incorporación de los componentes del marco
yty en el sistema, que permiten extraer información más completa sobre la víctima, incluidos archivos con extensiones específicas, líneas de entrada interceptadas, una lista de procesos, capturas de pantalla. Dejaremos la consideración del funcionamiento de los complementos más allá del alcance de este artículo.
Examinando otras muestras similares, encontramos las rutas y los nombres de proyectos que quedan en la información de depuración:
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2 \ SingleV2 \ Release \ BinWork.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2
\ SingleV2_Task_Layout_NewICON \ Release \ BinWork.pdb - D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2
\ SingleV2_Task_Layout_NewICON_N_Lnk \ Release \ BinWork.pdb - D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ New_Single_File \ Lo2 \ SingleV3 \ Release \ WorkFile.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ Off \ Off_New_Api \ Release \ C ++ \ ConnectLink.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ Off \ Off_New_Api \ Release \ C ++ \ TerBin.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ m0 \ yty 2.0 - Con AES Chunks LOC FOR XP Solo Bit-Change_Name \ Release \ TaskTool.pdb
- D: \ Soft \ DevelopedCode_Last \ BitDefenderTest \ yty 2.0 - Con AES Chunks OFFS Just Bit \ Release \ C ++ \ MsBuild.pdb
- D: \ Soft \ DevelopedCode_Last \ yty 2.0 \ Release \ C ++ \ Setup.pdb
Además de la subcadena "yty 2.0", que conecta los troyanos al marco mencionado anteriormente, notamos la subcadena "Lo2", que puede ser una abreviatura de "Loader 2".
En las versiones de cargadores de arranque hasta mediados de 2018, todas las líneas usadas se almacenaban en un archivo abierto en un archivo. En las siguientes versiones, los atacantes comenzaron a usar el cifrado de cadenas. De versión en versión, el algoritmo cambió de la siguiente manera:
- Desde mayo de 2018: invierta la línea y codifique Base64.
- Desde abril de 2019: realice los pasos anteriores dos veces .
- Desde enero de 2019: cifre la cadena con el algoritmo AES en modo CBC y codifique Base64. Código de muestra de Python para descifrar:
import base64 from Cryptodome.Cipher import AES aeskey = (0x23, 0xd4, 0x67, 0xad, 0x96, 0xc3, 0xd1, 0xa5, 0x23, 0x76, 0xae, 0x4e, 0xdd, 0xca, 0x13, 0x55) def aes_decrypt(data, aeskey): iv = bytes(list(range(0, 16))) key = bytes(aeskey) aes = AES.new(key, AES.MODE_CBC, iv) return aes.decrypt(data).decode().strip('\x00') def base64_aes_decrypt(data, aeskey): data = base64.b64decode(data) data = aes_decrypt(data, aeskey) return data
- A partir de junio de 2019: realice una sustracción cíclica de carácter por carácter con una matriz dada de bytes, codifique utilizando UTF-8 y codifique Base64. Código de muestra de Python para descifrar:
subgamma = (0x2d, 0x55, 0xf, 0x59, 0xf, 0xb, 0x60, 0x33, 0x29, 0x4e, 0x19, 0x3e, 0x57, 0x4d, 0x56, 0xf) def sub_decrypt(data, subgamma): o = '' length = len(data) subgamma_length = len(subgamma) for i in range(length): o += chr((0x100 + ord(data[i]) - subgamma[i%subgamma_length]) & 0xff) return o def base64_utf8_sub_decrypt(data, subgamma): data = base64.b64decode(data) data = data.decode('utf-8') data = sub_decrypt(data, subgamma) return data
- Desde octubre de 2019: realice XOR cíclico modificado carácter por carácter con una matriz de bytes dada y codifique Base64 dos veces . La peculiaridad del algoritmo XOR es que si el valor del carácter de cadena coincide con el valor del carácter en la matriz de bytes dada, XOR no es necesario. Código de muestra de Python para descifrar:
xorgamma = (0x56, 0x2d, 0x61, 0x21, 0x16) def modxor_decrypt(data, xorgamma): o = '' length = len(data) xorgamma_length = len(xorgamma) for i in range(length): c = data[i] if c != xorgamma[i%xorgamma_length]: c = data[i] ^ xorgamma[i%xorgamma_length] o += chr(c) return o def base64_modxor_decrypt(data, xorgamma): data = base64.b64decode(data) data = modxor_decrypt(data, xorgamma) return data
En el proceso de escribir un script para descifrar, descubrimos que algunas líneas individuales no podían descifrarse. Pero luego resultó que cualquiera de los otros métodos de descifrado descritos anteriormente era adecuado para tales cadenas. Después de asegurarnos de que solo se implementó un método de decodificación de los datos en cada muestra, llegamos a la conclusión de que los atacantes simplemente olvidaron eliminar las líneas no utilizadas o reemplazarlas por las correctamente encriptadas para la próxima versión de malware.
Las líneas en una de las muestras del cargador de arranque se cifraron de varias maneras, mientras que en el archivo ejecutable solo unaTales errores están siempre en manos de los investigadores: por ejemplo, repetidamente entre las líneas olvidadas llegaron los servidores de control de intrusos, previamente desconocidos para nosotros.
Características de la infraestructura de red.
Para completar, observamos algunas características que ayudarán a conectar futuros ataques de agrupación:
- La mayoría de los servidores de administración son arrendados por el proveedor DigitalOcean, LLC (ASN 14061) y están ubicados en Amsterdam.
- Los atacantes no usan los mismos servidores para diferentes nombres DNS: para cada nuevo nombre de dominio prefieren reservar un nuevo host dedicado.
- En la mayoría de los casos, los datos de registro de los propietarios de dominios están ocultos por los servicios de privacidad. Para esto se utilizan los siguientes servicios: WhoisGuard, Inc.; Servicio de Protección de Privacidad Whois, Inc .; Dominios por Proxy, LLC; Fundación Whois Privacy Protection. En algunos casos, los datos están disponibles y puede seguir el enfoque general para completar los campos.
Información de dominio de WHOIS que quema bosques [.] Com
Información de dominio de WHOIS servicio de almacenamiento en la nube [.] Com- Los más utilizados son .top, .pw, .space, .live y .icu TLD.
Conclusión
Donot Team se distingue por el uso de sus propias herramientas en cada etapa del ataque. Técnicas aplicadas para complicar el análisis de código, por un lado, la falta de intentos de ocultar o enmascarar cuidadosamente sus acciones en el sistema, por otro.
Los ataques múltiples contra los mismos objetivos no solo pueden indicar un interés especial en el círculo elegido de víctimas, sino que también confirman la baja eficiencia de las tácticas y técnicas utilizadas.
Publicado por Alexey Vishnyakov, Tecnologías positivas
COI6ce1855cf027d76463bb8d5954fcc7bb - gestor de arranque en formato MS Word
hxxp: //plug.msplugin.icu/MicrosoftSecurityScan/DOCSDOC
21b7fc61448af8938c09007871486f58 - cuentagotas en formato MS Word
71ab0946b6a72622aef6cdd7907479ec: cargador Lo2 en C: \ Windows \ Tasks \ Serviceflow.exe
22f41b6238290913fc4d196b8423724d - Lo2 Loader en C: \ Windows \ Tasks \ sinter.exe
330a4678fae2662975e850200081a1b1 - versión x86 modificada de UACMe
22e7ef7c3c7911b4c08ce82fde76ec72 - versión modificada x64 de UACMe
habilidadesnuevo [.] arriba
hxxps: //mystrylust.pw/confirm.php
hxxp: //docs.google.com/uc? id = 1wUaESzjGT2fSuP_hOJMpqidyzqwu15sz & export = download
coche [.] drivethrough.top
bosques ardientes [.] com
servicio de almacenamiento en la nube [.] com