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..
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.
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.
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.
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.
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:
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:
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:
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:
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.
Luego de filtrar el código basura, la exportación DllRegisterServer llamada por regsvr32.exe se ve de la siguiente manera:
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.
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 o %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.
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
- AppXbf13d4ea2945444d8b13e2121cb6b663\
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. |