En esta publicación, explicaremos cómo el grupo cibercriminal OceanLotus (APT32 y APT-C-00) utilizó recientemente una de las explotaciones públicas de , una vulnerabilidad de corrupción de memoria en Microsoft Office, y cómo el malware del grupo asegura persistencia en los sistemas comprometidos sin dejar rastro. A continuación, describiremos cómo desde principios de 2019 el grupo ha utilizado archivos autorreplicantes para ejecutar código.
OceanLotus se especializa en el ciberespionaje, con un enfoque en países del Sudeste Asiático. Los atacantes falsifican documentos que llaman la atención de posibles víctimas para convencerlas de ejecutar un backdoor, y también trabajan en el desarrollo de herramientas. Los métodos utilizados para crear cebos varían en diferentes ataques, desde archivos de 'doble extensión', archivos autorreplicantes, documentos con macros hasta exploits conocidos.

Uso de la explotación en Microsoft Equation Editor
A mediados de 2018, OceanLotus llevó a cabo una campaña utilizando la vulnerabilidad CVE-2017-11882. Uno de los documentos maliciosos del grupo cibernético fue analizado por especialistas del 360 Threat Intelligence Center (), que incluyó una descripción detallada de la explotación. En la publicación a continuación, se revisa un documento malicioso similar.
Primera etapa
Documento Informe FW sobre la demostración de la antigua CNRP en la República de Corea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3) es similar al mencionado en el estudio anterior. Es interesante porque está dirigido a usuarios interesados en la política camboyana (CNRP – Partido de Rescate Nacional de Camboya, disuelto a finales de 2017). A pesar de la extensión .doc, el documento tiene formato RTF (ver figura a continuación), contiene código basura y está distorsionado.

Figura 1. 'Basura' en RTF
A pesar de los elementos distorsionados, Word abre exitosamente este archivo RTF. Como se muestra en la figura 2, aquí está la estructura EQNOLEFILEHDR con un desplazamiento de 0xC00, seguida por el encabezado MTEF, y luego la entrada MTEF (figura 3) para la fuente.

Figura 2. Valores de la entrada FONT

Figura 3.
Puede haber un desbordamiento en el campo name, ya que su tamaño no se verifica antes de la copia. Un nombre demasiado largo activa la vulnerabilidad. Como se muestra en el contenido del archivo RTF (desplazamiento 0xC26 en la figura 2), el búfer se llena con código shell, seguido por un comando ficticio (0x90) y una dirección de retorno 0x402114. La dirección es un elemento de diálogo en EQNEDT32.exe, que indica la instrucción RET. Esto hace que el EIP apunte al inicio del campo name, que contiene el shellcode.

Figura 4. Inicio del shellcode del exploit
Dirección 0x45BD3C almacena la variable que se desreferencia, hasta que alcanza el puntero a la estructura cargada actualmente MTEFData. Aquí se encuentra el resto del shellcode.
El propósito del shellcode es ejecutar un segundo fragmento de shellcode incorporado en el documento abierto. Primero, el shellcode original intenta encontrar el descriptor de archivo del documento abierto, revisando todos los descriptores del sistema (NtQuerySystemInformation con el argumento SystemExtendedHandleInformation) y verifica si coincide con el PID del descriptor y PID del proceso WinWord y si el documento fue abierto con la máscara de acceso – 0x12019F.
Para confirmar la detección del descriptor correcto (y no del descriptor de otro documento abierto), el contenido del archivo se mapea usando la función CreateFileMapping, y el shellcode verifica si los últimos cuatro bytes del documento son «yyyy» (método Egg Hunting). Una vez que se detecta una coincidencia, el documento se copia en la carpeta temporal (GetTempPath) como ole.dll. Luego se leen los últimos 12 bytes del documento.
![]()
Figura 5. Marcadores de fin de documento
El valor de 32 bits entre los marcadores AABBCCDD y yyyy – es el desplazamiento del siguiente shellcode. Se llama usando la función CreateThread. Se extrae el mismo shellcode que usó el grupo OceanLotus anteriormente. , que lanzamos en marzo de 2018, aún funciona para el volcado de la segunda etapa.
Segunda etapa
Extracción de componentes
Los nombres de archivos y carpetas se eligen dinámicamente. El código selecciona aleatoriamente un nombre de archivo ejecutable o DLL en C:Windowssystem32. Luego hace una solicitud a sus recursos y extrae el campo FileDescription para usarlo como nombre de carpeta. Si esto no funciona, el código selecciona aleatoriamente un nombre de carpeta de los directorios %ProgramFiles% o C:Windows (de GetWindowsDirectoryW). Evita usar un nombre que pueda entrar en conflicto con archivos existentes y se asegura de que no contenga las siguientes palabras: windows, Microsoft, desktop, system, system32 o syswow64. Si el directorio ya existe, se le añade «NLS_{6 caracteres}».
El recurso 0x102 es analizado y los archivos se descargan en %ProgramFiles% o %AppData%, en la carpeta seleccionada aleatoriamente. La fecha de creación se modifica para tener los mismos valores que kernel32.dll.
Por ejemplo, aquí está la carpeta y la lista de archivos creados a partir de la selección del archivo ejecutable C:Windowssystem32TCPSVCS.exe como fuente de datos.

Figura 6. Extracción de varios componentes
Estructura del recurso 0x102 en el drooper es bastante compleja. En pocas palabras, contiene:
— Nombres de archivos
— Tamaño y contenido de los archivos
— Formato de compresión (COMPRESSION_FORMAT_LZNT1, utilizado por la función RtlDecompressBuffer)
El primer archivo se restaura como TCPSVCS.exe, que es legítimo AcroTranscoder.exe (según FileDescription, SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).
Es posible que haya notado que el tamaño de algunos archivos DLL supera los 11 MB. Esto se debe a que un gran búfer continuo de datos aleatorios se coloca dentro del archivo ejecutable. No es descartable que esta sea una forma de evitar la detección por algunos productos de seguridad.
Asegurando persistencia
El recurso 0x101 en el drooper contiene dos enteros de 32 bits que determinan cómo se debe garantizar la persistencia. El valor del primero indica cómo el malware mantendrá la persistencia sin privilegios de administrador.

Tabla 1. Mecanismo de persistencia sin privilegios de administrador
El valor del segundo entero indica cómo el malware debe garantizar la persistencia, operando con derechos de administrador.

Tabla 2. Mecanismo de persistencia con derechos de administrador
El nombre del servicio es el nombre del archivo sin la extensión; el nombre para mostrar es el nombre de la carpeta, pero si ya existe, se le añade la cadena “Revisión 1” (el número aumenta hasta que se encuentra un nombre no utilizado). Los operadores se aseguraron de que la persistencia a través del servicio fuera duradera; en caso de fallo, el servicio debe reiniciarse en 1 segundo. Luego, se le asigna al nuevo clave del registro del servicio el valor 4, lo que indica que es un servicio de 32 bits. WOW64 Se crea una tarea programada a través de varias interfaces COM:
ITaskScheduler ITask, ITaskTrigger, IPersistFile, . Esencialmente, el malware crea una tarea oculta, establece la información de la cuenta junto con la información del usuario actual o del administrador y luego configura un desencadenador. y ITaskEsta es una tarea diaria con una duración de 24 horas y con intervalos entre dos ejecuciones de 10 minutos, lo que significa que se ejecutará constantemente.
Esta es una tarea diaria con una duración de 24 horas y un intervalo de 10 minutos entre las dos ejecuciones, lo que significa que se llevará a cabo de forma continua.
Bit malicioso
En nuestro ejemplo, el archivo ejecutable TCPSVCS.exe (AcroTranscoder.exe) es un software legítimo que carga DLL que se restablecen junto con él. En este caso, interesa Flash Video Extension.dll.
Su función DLLMain simplemente llama a otra función. Existen algunos predicados vagos:

Figura 7. Predicados vagos
Después de estas comprobaciones engañosas, el código obtiene la sección .text archivos TCPSVCS.exe, cambia su protección a PAGE_EXECUTE_READWRITE y lo reescribe, añadiendo instrucciones ficticias:

Figura 8. Secuencia de instrucciones
Al final, se añade una instrucción a la dirección de la función FLVCore::Uninitialize(void), exportada Flash Video Extension.dll, se añade la instrucción CALL. Esto significa que después de cargar la DLL maliciosa, cuando el entorno de ejecución llama a WinMain en TCPSVCS.exe, el puntero de instrucción apuntará a NOP, lo que provoca FLVCore::Uninitialize(void), la siguiente etapa.
La función simplemente crea un mutex que comienza con {181C8480-A975-411C-AB0A-630DB8B0A221}, seguido del nombre de usuario actual. Luego lee el archivo restablecido con la extensión *.db3, que contiene código independiente de la posición, y utiliza CreateThread para ejecutar su contenido.
El contenido del archivo *.db3 es código shell que generalmente utiliza el grupo OceanLotus. Nuevamente hemos descomprimido con éxito su carga útil, utilizando un script emulador que publicamos .
El script extrae la fase final. Este componente es una puerta trasera que ya hemos analizado en . Esto se puede determinar por el GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} del archivo binario. La configuración del malware sigue encriptada en el recurso PE. Tiene aproximadamente la misma configuración, pero los servidores C&C difieren de los anteriores:
- andreagahuvrauvin[.]com
- byronorenstein[.]com
- stienollmache[.]xyz
El grupo OceanLotus demuestra nuevamente una combinación de diferentes técnicas para evitar la detección. Han vuelto con un esquema "mejorado" del proceso de infección. Al elegir nombres aleatorios y rellenar archivos ejecutables con datos aleatorios, reducen el número de IoC confiables (basados en hashes y nombres de archivos). Además, gracias al uso de descarga DLL de terceros, los atacantes solo necesitan eliminar el binario legítimo AcroTranscoder.
Archivos autoextraíbles
Después de los archivos RTF, el grupo ha pasado a archivos autoextraíbles (SFX) con íconos de documentos comunes para confundir aún más al usuario. Esto fue reportado por Threatbook (). Al ejecutar, se descomprimen archivos RAR autoextraíbles y se ejecutan DLL con la extensión .ocx, cuya carga final ha sido previamente documentada. {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. Desde mediados de enero de 2019, OceanLotus ha estado reutilizando esta técnica, pero con el tiempo han cambiado algunas configuraciones. En esta sección, hablaremos sobre la técnica y sus cambios.
Creación de una trampa
Documento THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) encontrado por primera vez en 2018. Este archivo SFX fue creado inteligentemente: la descripción (Información de la versión) indica que se trata de una imagen JPEG. El script SFX se ve de la siguiente manera:

Figura 9. Comandos SFX
El malware descomprime {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC), así como la imagen 2018 thich thong lac.jpg.
La imagen trampa se ve de la siguiente manera:

Figura 10. Imagen trampa
Es posible que haya notado que las primeras dos líneas en el script SFX invocan el archivo OCX dos veces, pero esto no es un error.
{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)
El flujo de control del archivo OCX es muy similar al de otros componentes de OceanLotus: muchas secuencias de comandos JZ/JNZ y PUSH/RET, intercaladas con código basura.

Figura 11. Código ofuscado
Después de filtrar el código basura, la exportación DllRegisterServer, llamada por regsvr32.exe, se ve de la siguiente manera:

Figura 12. Código principal del instalador
Esencialmente, en la primera llamada DllRegisterServer la exportación establece el valor del registro HKCUSOFTWAREClassesCLSID{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}Model para el desplazamiento cifrado en DLL (0x10001DE0).
Cuando la función se llama por segunda vez, lee el mismo valor y se ejecuta en esa dirección. Desde allí, se lee y ejecuta el recurso, junto con muchas acciones en la memoria.
El shellcode es el mismo cargador PE utilizado en campañas pasadas de OceanLotus. Puede ser emulado con . En última instancia, se descomprime db293b825dcc419ba7dc2c49fa2757ee.dll, lo carga en memoria y lo ejecuta DllEntry.
DLL extrae el contenido de su recurso, lo descifra (AES-256-CBC) y lo descomprime (LZMA). El recurso tiene un formato específico que es fácil de descompilar.

Figura 13. Estructura de configuración del instalador (KaitaiStruct Visualizer)
La configuración está explícitamente definida: dependiendo del nivel de privilegios, los datos binarios se escribirán en %appdata%IntellogsBackgroundUploadTask.cpl o %windir%System32BackgroundUploadTask.cpl (o SysWOW64 para sistemas de 64 bits).
La persistencia se asegura mediante la creación de una tarea llamada BackgroundUploadTask[junk].job, donde [junk] que representa un conjunto de bytes 0x9D y 0xA0.
Nombre de la tarea de la aplicación %windir%System32control.exe, y el valor del parámetro es la ruta al archivo binario descargado. La tarea oculta se ejecuta todos los días.
Constructivamente, el archivo CPL es un DLL con el nombre interno ac8e06de0a6c4483af9837d96504127e.dll, que exporta la función CPlApplet. Este archivo descifra su único recurso {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, luego carga este DLL y llama su única exportación DllEntry.
Archivo de configuración del backdoor
La configuración del backdoor está cifrada e incrustada en sus recursos. La estructura del archivo de configuración es muy similar a la anterior.

Figura 14. Estructura de la configuración del backdoor (KaitaiStruct Visualizer)
A pesar de la estructura similar, los valores de muchos campos han sido actualizados en comparación con los datos presentados en .
El primer elemento del arreglo binario contiene el DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759), . Pero dado que el nombre de exportación se eliminó del archivo binario, los hashes no coinciden.
Investigaciones adicionales
Al recolectar muestras, notamos algunas características. La muestra recién descrita apareció alrededor de julio de 2018, y otras similares a ella – muy recientemente, a mediados de enero – principios de febrero de 2019. Se utilizó un archivo SFX como vector de infección, que descargó un documento legítimo como señuelo y un archivo malicioso OCX.
A pesar de que OceanLotus utiliza marcas de tiempo falsas, notamos que las marcas de tiempo de los archivos SFX y OCX son siempre las mismas (0x57B0C36A (08/14/2016 @ 7:15pm UTC) y 0x498BE80F (02/06/2009 @ 7:34am UTC) respectivamente). Probablemente, esto indica que los autores tienen algún tipo de 'constructor' que utiliza las mismas plantillas y simplemente cambia algunas características.
Entre los documentos que hemos revisado desde principios de 2018, encontramos varios nombres que indican a los países de interés para los atacantes:
— La Nueva Información de Contacto de los Medios de Camboya (New).xls.exe
— 李建香 (个人简历).exe (documento PDF falso de un CV)
— feedback, Rally en EE.UU. del 28 al 29 de julio de 2018.exe
Desde el descubrimiento del backdoor {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll y la publicación de su análisis por varios investigadores, hemos observado algunos cambios en los datos de configuración del malware.
En primer lugar, los autores comenzaron a eliminar nombres de los DLL auxiliares (DNSprov.dll y dos versiones HttpProv.dll). Luego los operadores dejaron de empaquetar el tercer DLL (segunda versión HttpProv.dll), eligiendo integrar solo uno.
En segundo lugar, muchos campos de configuración del backdoor fueron modificados, probablemente para evitar la detección, ya que muchos IoCs se volvieron disponibles. Entre los campos importantes que los autores cambiaron se encuentran los siguientes:
- se cambió la sección del registro de AppX (ver IoCs)
- cadena de codificación del mutex («def», «abc», «ghi»)
- número de puerto
Finalmente, en todas las nuevas versiones analizadas aparecieron nuevos C&C, enumerados en la sección de IoCs.
Conclusiones
OceanLotus sigue evolucionando. El grupo cibernético se enfoca en perfeccionar y expandir su kit de herramientas y cebos. Los autores ocultan cargas útiles maliciosas utilizando documentos atractivos, cuyo tema es relevante para las víctimas previstas. Desarrollan nuevos esquemas y también utilizan herramientas de acceso público, como el exploit de Equation Editor. Además, mejoran las herramientas para reducir la cantidad de artefactos que quedan en las máquinas de las víctimas, disminuyendo así la posibilidad de detección por parte del software antivirus.
Indicadores de compromiso
Los indicadores de compromiso, así como los atributos de MITRE ATT&CK, están disponibles y .
Fuente: habr.com
