Este artículo primero describirá cómo el grupo OceanLotus (también conocido como APT32 y APT-C-00) recientemente utilizó uno de los exploits disponibles de forma pública para explotar la CVE-2017-11882; una vulnerabilidad de corrupción de memoria presente en el software Microsoft Office, y cómo el malware de OceanLotus logra persistencia en los sistemas comprometidos sin dejar ningún rastro. Luego, el artículo describe cómo es que desde el inicio de este 2019 el grupo ha estado aprovechándose de los archivos autoextraíbles para ejecutar código.

Contexto

Hacer un seguimiento de las actividades de OceanLotus es sinónimo de realizar un tour por el mundo de los engaños. Este grupo es conocido por manipular a sus víctimas con falsos y atractivos documentos en su intento de atraer a potenciales víctimas para que ejecuten el backdoor del grupo, y a su vez continúa desarrollando nuevas ideas para diversificar sus herramientas. Las técnicas empleadas para crear los señuelos van desde archivos con doble extensión, archivos autoextraíbles y documentos con macros habilitados para reutilizar exploits conocidos. Además de eso, son muy activos y continúan atacando de manera incansable a sus víctimas favoritas: los países del sudeste asiático.

Resumen del exploit de Equation Editor

A mediados de 2018, OceanLotus llevó adelante una campaña utilizando documentos que abusaban de la vulnerabilidad CVE-2017-11882, la cual reside en el componente responsable de renderear y editar ecuaciones matemáticas. De hecho, varias Pruebas de Concepto comenzaron a circular. Uno de los documentos maliciosos utilizados por OceanLotus fue analizado por 360 Threat Intelligence Center (en chino) e incluye detalles sobre el exploit. Echemos un vistazo a un documento similar.

Primera fase

El documento “FW Report on demonstration of former CNRP in Republic of Korea.doc” ( SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3 ) es similar al mencionado en el artículo anterior, y también es interesante porque realmente apunta a personas interesadas en la política camboyana (El Partido Nacional de Rescate de Camboya, ─CNRP, por sus siglas en inglés─ es un partido político que se disolvió a fines de 2017). A pesar de su extensión .doc, el documento en realidad está en formato RTF (consulte la Figura 1), con información basura y también tiene un formato mal formado..

Figura 1 – Campos basura del RTF

A pesar de la presencia de elementos con formato incorrecto, Word abre con éxito este archivo RTF. Como se puede apreciar en la imagen (ver Figura 2), en el desplazamiento 0xC00 hay una estructura EQNOLEFILEHDR, seguida por el encabezado MTEF y luego un registro MTEF (Figura 3) para una fuente.

Figura 2 – valores de registro FONT

Figura 3 – formatos de registro FONT

Un overflow en el campo “nombre” es posible debido a que su tamaño no es revisado antes de ser copiado. Un nombre que es demasiado largo activa la vulnerabilidad. Como se vio en el contenido del archivo RTF (desplazamiento 0xC26 en la Figura 2), el buffer se completa con un shellcode seguido por una instrucción NOP sled (0x90) y la dirección de retorno 0x402114. Esa dirección hace parte de EQNEDT32.exe apuntando a una instrucción RET. Esto deriva en que el EIP apunta al inicio del campo nombre que contiene el shellcode.

Figura 4 – Inicio del shellcode exploit

La dirección 0x45BD3C almacena una variable sin referencia hasta que alcanza un puntero a la actualmente cargada estructura MTEFData. Aquí es donde el resto del shellcode se almacena.

El propósito de esta porción de código es ejecutar una segunda pieza de shellcode embebida dentro del documento abierto. Primero, el shellcode inicial intenta encontrar el handler del documento abierto mediante la repetición a través de todos los identificadores activos del sistema (NtQuerySystemInformation con el argumento SystemExtendedHandleInformation) y revisando si el PID de los procesos coinciden con el PID de un proceso WinWord, y si el documento fue abierto con la siguiente máscara de acceso: 0x12019F. Para confirmar que encontró el handle correcto, el contenido del archivo es mapeado con la función CreateFileMapping y el shellcode corrobora si los últimos cuatro bytes del documento son "yyyy"; esta técnica es denominada “Egg Hunting”. Una vez que encuentra una coincidencia, el documento se copia en una carpeta temporal (GetTempPath) como ole.dll. Luego los últimos 12 bytes del documento son leídos.

Figura 5 – Marcadores al final del documento

El valor de 32-bit entre los marcadores AABBCCDD y yyyy representa el desplazamiento hasta la siguiente parte del shellcode. Es invocado utilizando la función CreateThread. El shellcode extraído es el mismo que el grupo OceanLotus ha estado utilizando desde hace ya un tiempo. El script emulador de Python que publicamos en marzo de 2018 sigue funcionando para dumpear la siguiente fase.

 

Segunda fase

Extrayendo los componentes

Los nombres de archivo y los directorios son elegidos de manera dinámica. El código aleatoriamente selecciona el nombre de archivo de un ejecutable o archivo DLL ubicado en C:\Windows\system32. Luego consultará sus recursos y extraerá el campo FileDescription para utilizarlo como nombre de carpeta. Si esto no funciona, el código aleatoriamente elige un nombre para la carpeta desde los directorios %ProgramFiles% o C:\Windows (desde GetWindowsDirectoryW). Evita usar un nombre que pueda entrar en conflicto con los archivos existentes al asegurarse de que no contenga: windows, Microsoft, desktop, system, system32 o syswow64. Si el directorio ya existe, el nombre del directorio se añadirá con "NLS_ {6 dígitos}".

El recurso 0x102 de la fase es parseado y los archivos son dropeados en una carpeta elegida de manera aleatoria, ya sea en %ProgramFiles% o en %AppData%. Los tiempos de creación se modifican para que tengan los mismos valores que kernel32.dll.

Por ejemplo, aquí hay una carpeta y una lista de archivos creados a partir de seleccionar los ejecutables C:\Windows\system32\TCPSVCS.exe como fuente de datos.

Figura 6 – Extracción de los diferentes componentes

La estructura del recurso 0x102 en el dropper es bastante compleja. En resumen, contiene:

  • Nombres de archivos
  • Tamaño y contenido de los archivos
  • compression format (COMPRESSION_FORMAT_LZNT1 used by RtlDecompressBuffer function)

El primer archivo es dropeado como TCPSVCS.exe, que es de hecho el legítimo AcroTranscoder.exe de Adobe (según su FileDescription, SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3).

Probablemente hayas notado que el tamaño de algunos archivos DLL exceden los 11MB. Esto es porque  un largo y contiguo buffer de datos aleatorios es colocado dentro del ejecutable. Posiblemente esto sea una manera de evadir la detección de algunas soluciones de seguridad.

Logrando persistencia

El recurso 0x101 del dropper contiene dos enteros de 32 bits que determinan cómo se implementará la persistencia. El valor del primero especifica cómo el malware logrará persistencia en un sistema sin privilegios de administración.

First integer value Persistence mechanism
0 Do not achieve persistence
1 Scheduled task as current user
2 (HKLM|HKCU)\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
3 Creation of a shortcut file (with a .lnk extension) in the subdirectory Microsoft\Windows\Start Menu\Programs\Startup under one of the environment variables: %ALLUSERSPROFILE%, %APPDATA% or %USERPROFILE%

El valor del segundo entero especifica de qué manera el malware deberá intentar lograr la persistencia si corre con privilegios elevados.

Second integer value Persistence mechanism
1 Scheduled task as administrator
2 Creation of a service

El nombre del servicio es el nombre del archivo sin la extensión; el nombre que se muestra es el nombre de la carpeta, pero si ya existe, entonces el string “Revision 1” es añadido (el número es incrementado hasta que encuentra un nombre que no haya sido utilizado). Los operadores se aseguran que la persistencia a través del servicio será resiliente: ante fallas del servicio, el servicio deberá reiniciar después de 1 segundo. Luego, el valor de registro WOW64 de la nueva llave del servicio es establecida en 4, lo que indica que es un servicio de 32 bits.

La tarea programada es creada a través varias interfaces COM: ITaskScheduler, ITask, ITaskTrigger, IPersistFile y ITaskScheduler. Esencialmente, el malware crea una tarea oculta, establece la información de la cuenta con el usuario actual o el administrador de información y establece la activación.

Esta es una tarea diaria con una duración de 24 horas y un intervalo entre las dos ejecuciones establecido en 10 minutos, lo cual quiere decir que estará corriendo de manera permanente.

El bit malicioso

En nuestro ejemplo, el ejecutable TCPSVCS.exe (AcroTranscoder.exe) es un software legítimo que carga de forma lateral las DLL que fueron dropeadas con él. En este caso, el interesante es Flash Video Extension.dll.

Su función DLLMain llamará a una sola función. Algunos variantes están ofuscadas:

Figura 7 – Variables ofuscadas

Luego de estas revisiones engañosas, el código obtiene la sección .text de TCPSVCS.exe, cambia su protección a PAGE_EXECUTE_READWRITE y lo sobrescribe con instrucciones de no realizar nada que no tenga efectos secundarios:

Figura 8 – Secuencia de instrucciones sin efectos secundarios

Al final, es añadida una instrucción CALL a la dirección de la función FLVCore::Uninitialize(void) exportada por Flash Video Extension.dll. Esto quiere decir que, luego de carga la DLL malicioso, cuando se ejecuta el runtime llame a WinMain en TCPSVCS.exe, el puntero de instrucciones apuntará al “NOP” sled, el cual eventualmente llamará a la siguiente fase FLVCore::Uninitialize(void).

Esta función simplemente crea un mutex que comienza con {181C8480-A975-411C-AB0A-630DB8B0A221} seguido por el nombre de usuario actual. Luego, lee el archivo dropeado con la extensión .db3, el cual contiene código independiente de la posición, y utiliza CreateThread para ejecutar su contenido.

El contenido del archivo .db3 es un shellcode comúnmente utilizado por OceanLotus. Nuevamente, satisfactoriamente desempaquetamos su payload utilizando el script emulador que publicamos en GitHub.

El script extrae la fase final. Este componente es el backdoor que ya hemos analizado en este white paper: OceanLotus: Old techniques, new backdoor. Es reconocible como tal por el GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} que está presente en el binario. La configuración del malware sigue estando cifrada en un recurso PE. Contiene prácticamente la misma configuración, pero los servidores C&C son diferentes de los hasta ahora se habían publicado:

  • andreagahuvrauvin[.]com
  • byronorenstein[.]com
  • stienollmache[.]xyz

Una vez más, OceanLotus demuestra una larga combinación de técnicas para permanecer fuera del alcance de los análisis. Regresaron con una versión mejorada del proceso de infección. Al elegir nombres aleatorios y llenando los ejecutables con datos aleatorios reducen el número de IoC´s confiables (basados en el hash y basados en el nombre de archivo). Además, desde que están utilizando la técnica de carga lateral de DLL, los atacantes solo deben dropear el binario legítimo AcroTranscoder tal como es.

Archivos autoextraibles

Después de utilizar archivos RTF, el grupo comenzó a utilizar archivos autoextraíbles (SFX, por sus siglas en inglés) que utilizan íconos de documentos comunes en un intento de engañar a sus víctimas. Esto fue brevemente documentado por Threatbook (in Chinese). Cuando corren, estos archivos RAR autoextraíbles dropean y ejecutan archivos DLL (con una extensión .ocx) con el payload final siendo el anteriormente documentado {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll. Desde mediados de enero de 2019, OceanLotus comenzó a reutilizar la técnica, pero con el tiempo cambiaron parte de la configuración. Esta sección describirá la técnica y lo que han alterado para lograr su objetivo.

Cayendo en la trampa

El documento THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (que significa “RELACIÓN FAVORITA DEL DESEMPEÑO VIETNAMITA”, según Google Translate, SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB) fue visto por primera vez en 2018. Este archivo SFX fue inteligentemente diseñado, ya que la descripción (Version Info) indica que es una “Imagen JPEG”. El script del SFX es el siguiente:

Figura 9 – Comandos SFX

El malware dropea {9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (SHA-1: EFAC23B0E6395B1178BCF7086F72344B24C04DCC) así como la imagen 2018 thich thong lac.jpg.

La imagen señuelo es la siguiente:

Figura 10 – Imagen señuelo

Probablemente has notado que las primeras dos líneas en el script SFX invocan al archivo OCX dos veces, pero esto no es un error...

{9ec60ada-a200-4159-b310-8071892ed0c3}.ocx (ShLd.dll)

El control de flujo de los archivos OCX es muy similar a otros componentes de OceanLotus: hay muchas secuencias de instrucciones JZ/JNZ y PUSH/RET intercalados con código basura.

Figura 11 – Código ofuscado

Luego 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

Básicamente, la primera vez que es llamado el DllRegisterServer,establece el valor de registro HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model a un desplazamiento codificado en el DLL (0x10001DE0). La segunda vez que la función es llamada lo que hace es leer este mismo valor y ejecuta la función en la dirección. Desde ahí, el recurso es leído y ejecutado y muchas operaciones en memoria son ejecutadas.

El shellcode es el mismo loader PE utilizado en campañas tempranas de OceanLotus. Puede ser emulado con nuestro script de emulación miasm. Por último, dropea db293b825dcc419ba7dc2c49fa2757ee.dll, carga en la memoria y ejecuta DllEntry.

Esta DLL recupera el contenido de sus recursos, descifra (AES-256-CBC) y lo descomprime (LZMA). El recurso tiene un formato específico al cual es bastante sencillo aplicarle ingeniería inversa.

Figura 13 – Estructura del instalador

La configuración es explícita: dependiendo del nivel de privilegios, los datos del binario serán escritos tanto a %appdata%\Intel\logs\BackgroundUploadTask.cpl %windir%\System32\BackgroundUploadTask.cpl (o SysWOW64 para sistemas 64-bit). Luego, la persistencia es lograda mediante la creación de una tarea llamada BackgroundUploadTask[junk].job en la que [junk] es una colección de 0x9D y 0xA0 bytes.

El nombre de la aplicación de la tarea es %windir%\System32\control.exe y el valor del parámetro corresponde con la ruta del binario dumpeado. La tarea es programada para correr a diario.

Estructuralmente, el archivo CPL es un DLL cuyo nombre interno es ac8e06de0a6c4483af9837d96504127e.dll que eso exporta una función CPlApplet. Este archivo descifra su único recurso  {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll, luego carga la DLL y llama a su única exportación, DllEntry.

Archivo de configuración del backdoor

El backdoor presenta una configuración cifrada embebida en sus recursos. La estructura del archivo de configuración es bastante similar al anterior.

Figura 14 – Estructura de la configuración del backdoor (KaitaiStruct Visualizer)

A pesar de la similitud en cuanto a estructura, en muchos de estos campos los valores han sido actualizados en comparación con los de nuestro white paper de marzo de 2018. El primer elemento del array de los binarios contiene una DLL (HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759) identificado por Tencent pero como el nombre de exportación ha sido removido del binario, los hashes no coinciden.

Yendo más allá

Durante la búsqueda de muestras, algunas características sobresalieron. La muestra recientemente analizada apareció cerca de julio de 2018 y otras similares fueron descubiertas recientemente entre mediados de enero y finales de febrero de 2019. El vector de infección utilizado fue un archivo SFX que dumpeo un documento legítimo como señuelo y un archivo OCX malicioso.

Incluso aunque OceanLotus utiliza falsos timestamps, se ha observado que el timestamp de los archivos SFX y OCX siempre es el mismo (0x57B0C36A (08/14/2016 @ 7:15pm UTC) y 0x498BE80F (02/06/2009 @ 7:34am UTC) respectivamente). Esto probablemente signifique que tienen alguna especie de “builder” que reutiliza los mismos templates y solamente cambia algunas características.

Entre los documentos que analizamos desde principios de 2018, hemos visto diferentes nombres de documentos insinúan una relación con diferentes países como blancos de ataque.

  • The New Contact Information Of Cambodia Media(New).xls.exe
  • 李建香 (个人简历).exe (fake pdf document of a CV)
  • feedback, Rally in USA from July 28-29, 2018.exe

Desde el hallazgo del backdoor {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll y la  publicación de análisis por parte de múltiples investigadores, hemos observado ciertos cambios en la configuración de los datos de los malware. Primero, los autores comenzaron a remover los nombres de los DLLs helper (DNSprov.dll, y las dos versiones de HttpProv.dll). Luego, que los operadores dejaron de empaquetar el tercer DLL (second version of HttpProv.dll) y decidieron embeber solamente uno.

En segundo lugar, que muchos de los campos en la configuración de los backdoor han sido modificados, quizás para evitar la detección, desde que muchos IoCs se hicieron públicos.

Los campos importantes que fueron modificados son los siguientes:

  • la llave de registro de "AppX" se modificó (ver IoCs)
  • la codificación del string de mutex ("def", "abc", "ghi")
  • el número de puerto

Finalmente, todas las variantes nuevas que analizamos presentan nuevos servidores C&C, los cuales están listados en la sección IoCs.

Conclusión

OceanLotus está muy activo y continúa evolucionando. El grupo realmente se enfoca en hacer cambios en su set de herramientas y señuelos. De manera inteligente esconden sus payloads en documentos atractivos basados en eventos actuales que tienen a resultar de interés para las víctimas que eligen. Continúan apareciendo con diferentes técnicas e incluso reutilizan y readaptan códigos de exploits disponibles de manera pública como fue que hicieron con el del exploit de Equation Editor. Además, continúan mejorando sus técnicas para reducir el número de artefactos que dejan en las computadoras de sus víctimas en un intento de reducir las posibilidades de detección por parte de los productos de seguridad. Otro punto interesante es que algunos nombres de dominio parecen haber sido extraídos de un diccionario. OceanLotus está haciendo un esfuerzo extra para continuar llevando adelante sus campañas, pero no entren en pánico…

Indicadores de Compromiso (IoCs)

Los IoCs en este post, así como los atributos de MITRE ATT&CK, están también disponibles en nuestro repositorio en GitHub.

Llaves/valores de registro

  • HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model
  • [HKCU|HKLM]\SOFTWARE\App\
    • AppXbf13d4ea2945444d8b13e2121cb6b663\
      • Application
      • DefaultIcon
    • AppX70162486c7554f7f80f481985d67586d\
      • Application
      • DefaultIcon
    • AppX37cc7fdccd644b4f85f4b22d5a3f105a\
      • Application
      • DefaultIcon

 

Mutexes:

  • {181C8480-A975-411C-AB0A-630DB8B0A221}_ (+ username)

Domain names
aliexpresscn[.]net
andreagahuvrauvin[.]com
andreagbridge[.]com
aol.straliaenollma[.]xyz
beaudrysang[.]xyz
becreybour[.]com
byronorenstein[.]com
chinaport[.]org
christienoll[.]xyz
christienollmache[.]xyz
cloud.360cn[.]info
dieordaunt[.]com
dns.chinanews[.]network
illagedrivestralia[.]xyz
karelbecker[.]com
karolinblair[.]com
lauradesnoyers[.]com
ntop.dieordaunt[.]com
office.ourkekwiciver[.]com
ourkekwiciver[.]com
sophiahoule[.]com
stienollmache[.]xyz
straliaenollma[.]xyz
ursulapapst[.]xyz

Archivos:

Documents exploiting CVE-2017-11882:
SHA-1 hashes
D1357B284C951470066AAA7A8228190B88A5C7C3
49DFF13500116B6C085C5CE3DE3C233C28669678
9DF3F0D8525EDF2B88C4A150134C7699A85A1508
50A755B30E8F3646F9476080F2C3AE1347F8F556
BB060E5E7F7E946613A3497D58FBF026AE7C369A
E2D949CF06842B5F7AE6B2DFFAA49771A93A00D9
ESET detection names
Win32/Exploit.CVE-2017-11882.BU
Win32/Exploit.CVE-2017-11882.A
Win32/Exploit.Agent.KT
Win32/Exploit.Agent.LT
Win32/Exploit.CVE-2017-11882.EI
SFX archives and OCX droppers:
SHA-1 hashes
AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB
7642F2181CB189965C596964D2EDF8FE50DA742B
CD13210A142DA4BC02DA47455EB2CFE13F35804A
377FDC842D4A721A103C32CE8CB4DAF50B49F303
B4E6DDCD78884F64825FDF4710B35CDBEAABE8E2
BD39591A02B4E403A25AAE502648264308085DED
B998F1B92ED6246DED13B79D069AA91C35637DEC
CC918F0DA51794F0174437D336E6F3EDFDD3CBE4
83D520E8C3FDAEFB5C8B180187B45C65590DB21A
EFAC23B0E6395B1178BCF7086F72344B24C04DCC
8B991D4F2C108FD572C9C2059685FC574591E0BE
B744878E150A2C254C867BAD610778852C66D50A
3DFC3D81572E16CEAAE3D07922255EB88068B91D
77C42F66DADF5B579F6BCD0771030ADC7AEFA97C
ESET detection names
Win32/Agent.ZUR

Técnicas MITRE ATT&CK

Tactic ID Name Description
Initial Access T1193 Spearphishing Attachment Deceitful RTF documents and self-extracting archives are sent to potential victims.
Execution T1204 User Execution The user needs to execute the self-extracting archive or open the RTF document.
T1117 Regsvr32 The self-extracting archives execute regsvr32 to run the OceanLotus' backdoor.
T1035 Service Execution The second stage of the exploit tries to run OceanLotus' backdoor as a service.
Persistence T1050 New Service The second stage of the exploit tries to achieve persistence by creating a service.
T1060 Registry Run Keys / Start Folder The second stage of the exploit tries to achieve persistence by adding a value in the Run registry key.
T1053 Scheduled Task The second stage of the exploit tries to achieve persistence by creating a schedule task.
Defense Evasion T1009 Binary Padding The second stage of the exploit fills dropped executables with random data.
T1073 DLL Side-Loading OceanLotus' backdoor is side-loaded by dropping a library and a legitimate, signed executable (AcroTranscoder).
T1112 Modify Registry OceanLotus' backdoor stores its configuration in a registry key.
T1027 Obfuscated Files or Information The second stage of the exploit drops an encrypted shellcode.
T1099 Timestomp The creation time of the files dropped by the second stage of the exploit is set to match the creation time of kernel32.dll.
Discovery T1083 File and Directory Discovery OceanLotus' backdoor can list files and directories.
T1012 Query Registry OceanLotus' backdoor can query the Windows Registry to gather system information.
T1082 System Information Discovery OceanLotus' backdoor captures system information and sends it to its C&C server.
Exfiltration T1002 Data Compressed OceanLotus' backdoor uses LZMA compression before exfiltration.
T1022 Data Encrypted OceanLotus' backdoor uses RC4 encryption before exfiltration.
T1041 Exfiltration Over Command and Control Channel Data exfiltration is done using the already opened channel with the C&C server
T1203 Exploitation for Client Execution The RTF document includes an exploit to execute malicious code. (CVE‑2017‑11882)
Command And Control T1094 Custom Command and Control Protocol OceanLotus' backdoor can exfiltrate data by encoding it in the subdomain field of DNS packets.
T1065 Uncommonly Used Port OceanLotus' backdoor use HTTP over an uncommon TCP port (14146). Port is specified in the backdoor configuration.