ESET: Nuevos esquemas de entrega de puerta trasera Oceanberg de Cybergroup

En una publicación, describiremos cómo el cibergrupo OceanLotus (APT32 y APT-C-00) utilizó recientemente uno de los exploits públicos para CVE-2017-11882 , la vulnerabilidad de corrupción de memoria en Microsoft Office, y cómo el malware grupal proporciona persistencia en sistemas comprometidos sin dejar rastros . A continuación, describimos cómo, desde principios de 2019, el grupo utilizó archivos autoextraíbles para ejecutar el código.

OceanLotus se especializa en ciberespionaje, con objetivos prioritarios en el sudeste asiático. Los atacantes falsifican documentos que atraen la atención de las víctimas potenciales para convencerlos de que realicen una puerta trasera y también trabajen en el desarrollo de herramientas. Los métodos utilizados para crear señuelos varían en diferentes ataques: desde archivos con "doble extensión", archivos autoextraíbles, documentos con macros hasta exploits conocidos.


Usando un exploit en Microsoft Equation Editor


A mediados de 2018, OceanLotus lanzó una campaña con la vulnerabilidad CVE-2017-11882. Uno de los documentos maliciosos del cibergrupo fue analizado por 360 expertos del Centro de Inteligencia de Amenazas (un estudio en chino ), incluida una descripción detallada del exploit. En la publicación a continuación, una descripción general de dicho documento malicioso.

Primera etapa


El FW Report on demonstration of former CNRP in Republic of Korea.doc (SHA-1: D1357B284C951470066AAA7A8228190B88A5C7C3 ) es similar al mencionado en el estudio anterior. Es interesante porque apunta a usuarios interesados ​​en la política camboyana (CNRP - Partido de Salvación Nacional de Camboya, disuelto a fines de 2017). A pesar de la extensión .doc, el documento tiene el formato RTF (consulte la figura a continuación), contiene código basura y también está distorsionado.


Figura 1. Basura en RTF

A pesar de la presencia de elementos distorsionados, Word abre con éxito este archivo RTF. Como se puede ver en la Figura 2, aquí está la estructura EQNOLEFILEHDR con un desplazamiento de 0xC00, seguido del encabezado MTEF y luego la entrada MTEF (Figura 3) para la fuente.


Figura 2. Valores de registro FONT


Figura 3. Formato de grabación FONT

Es posible un desbordamiento en el campo de nombre , porque su tamaño no se verifica antes de copiar. Un nombre demasiado largo desencadena una vulnerabilidad. Como se puede ver en el contenido del archivo RTF (desplazamiento 0xC26 en la Figura 2), el búfer se llena con un código de shell, seguido de un comando ficticio ( 0x90 ) y la dirección de retorno 0x402114 . La dirección es un elemento de diálogo en EQNEDT32.exe que apunta a una instrucción RET . Esto hace que EIP apunte al comienzo del campo de nombre que contiene el shellcode.


Figura 4. Inicio de exploit shellcode

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

El propósito del código de shell es ejecutar el segundo fragmento del código de shell incrustado en un documento abierto. Primero, el código fuente intenta encontrar el descriptor de archivo del documento abierto, NtQuerySystemInformation sobre todos los descriptores del sistema ( NtQuerySystemInformation con el argumento SystemExtendedHandleInformation ) y verificando si el PID del descriptor y el PID del proceso WinWord WinWord y si el documento se abrió con la máscara de acceso - 0x12019F .

Para confirmar la detección del descriptor correcto (y no el descriptor de otro documento abierto), el contenido del archivo se muestra utilizando la función CreateFileMapping , y el código de shell verifica si los últimos cuatro bytes del documento corresponden a " yyyy " (método de búsqueda de huevos). Tan pronto como se encuentra una coincidencia, el documento se copia en una 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 AABBCCDD . Se llama usando la función CreateThread . Extrajo el mismo código shell utilizado por OceanLotus antes. El script de emulación de Python que lanzamos en marzo de 2018 todavía funciona para volcar la segunda etapa.

Segunda etapa


Recuperación de componentes


Los nombres de archivo y directorio se seleccionan dinámicamente. El código selecciona aleatoriamente el nombre de un archivo ejecutable o DLL en C:\Windows\system32 . Luego realiza una solicitud a sus recursos y recupera el campo FileDescription para usarlo como el nombre de la carpeta. Si esto no funciona, el código selecciona aleatoriamente el nombre de la carpeta de los directorios %ProgramFiles% o C:\Windows (de GetWindowsDirectoryW). Evita el uso de un nombre que pueda entrar en conflicto con los archivos existentes y garantiza que no contenga las siguientes palabras: windows , Microsoft , desktop , system , system32 o syswow64 . Si el directorio ya existe, se agrega "NLS_ {6 caracteres}" al nombre.

El recurso 0x102 analiza y los archivos se 0x102 en %ProgramFiles% o %AppData% , en una carpeta seleccionada al azar. El tiempo de creación cambió para tener los mismos valores que kernel32.dll .

Por ejemplo, aquí hay una carpeta y una lista de archivos creados seleccionando el archivo ejecutable C:\Windows\system32\TCPSVCS.exe como fuente de datos.


Figura 6. Extracción de varios componentes.

La estructura del recurso 0x102 en el cuentagotas es bastante complicada. En pocas palabras, contiene:
- nombres de archivo
- Tamaño y contenido de los archivos.
- Formato de compresión ( COMPRESSION_FORMAT_LZNT1 utilizado por la función RtlDecompressBuffer )

El primer archivo se restablece como TCPSVCS.exe , que es el AcroTranscoder.exe legítimo (según FileDescription , SHA-1: 2896738693A8F36CC7AD83EF1FA46F82F32BE5A3 ).

Es posible que haya notado que algunos archivos DLL tienen más de 11 MB. Esto se debe a que un gran búfer contiguo de datos aleatorios se encuentra dentro del archivo ejecutable. Es posible que esta sea una forma de evitar la detección por parte de algunos productos de seguridad.

Persistencia


El recurso 0x101 en el cuentagotas contiene dos enteros de 32 bits que determinan cómo mantener la persistencia. El valor del primero indica cómo el malware mantendrá la persistencia sin derechos de administrador.


Tabla 1. Mecanismo de persistencia sin derechos de administrador

El valor del segundo entero indica cómo el malware debe garantizar la persistencia mientras trabaja como administrador.


Tabla 2. Mecanismo de persistencia con derechos de administrador

Un nombre de servicio es un nombre de archivo sin extensión; el nombre para mostrar es el nombre de la carpeta, pero si ya existe, se le agrega la cadena " Revision 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 estable; en caso de falla, el servicio debería reiniciarse después de 1 segundo. Luego, el valor WOW64 de la nueva clave de registro del servicio se establece en 4, lo que indica que es un servicio de 32 bits.

La tarea programada se crea a través de varias interfaces COM: ITaskScheduler , ITask , ITaskTrigger , IPersistFile e ITaskScheduler . En esencia, el programa malicioso crea una tarea oculta, establece la información de la cuenta junto con información sobre el usuario o administrador actual, y luego establece el desencadenante.

Esta es una tarea diaria con una duración de 24 horas e intervalos entre dos ejecuciones de 10 minutos, lo que significa que se realizará de forma continua.

Parte maliciosa


En nuestro ejemplo, el archivo ejecutable TCPSVCS.exe ( AcroTranscoder.exe ) es un software legítimo que descarga archivos DLL que se descargan con él. En este caso, Flash Video Extension.dll es de interés.

Su función DLLMain simplemente llama a otra función. Algunos predicados difusos están presentes:


Figura 7. Predicados difusos

Después de estas comprobaciones engañosas, el código recibe la sección TCPSVCS.exe archivo TCPSVCS.exe , cambia su protección a PAGE_EXECUTE_READWRITE y la sobrescribe, agregando instrucciones ficticias:


Figura 8. La secuencia de instrucciones

Al final, la instrucción CALL se agrega a la dirección de la función FLVCore::Uninitialize(void) exportada por Flash Video Extension.dll . Esto significa que después de cargar la DLL maliciosa, cuando el tiempo de ejecución llama a WinMain en TCPSVCS.exe , el puntero de la instrucción apuntará a NOP, lo que resultará en llamar a FLVCore::Uninitialize(void) , el siguiente paso.

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 volcado con la extensión * .db3, que contiene código independiente de la posición, y usa CreateThread para ejecutar el contenido.

El contenido del archivo * .db3 es el código shell utilizado comúnmente por el grupo OceanLotus. Una vez más, desempacamos con éxito su carga útil utilizando el script de emulador que publicamos en GitHub .

El guión recupera la etapa final. Este componente es una puerta trasera que ya analizamos en un estudio anterior de OceanLotus . Esto puede determinarse por el GUID {A96B020F-0000-466F-A96D-A91BBF8EAC96} archivo binario. La configuración de malware todavía está encriptada en el recurso PE. Tiene aproximadamente la misma configuración, pero los servidores C&C son diferentes de los anteriores:

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


OceanLotus nuevamente demuestra una combinación de diferentes técnicas para evitar la detección. Regresaron con un esquema "refinado" del proceso de infección. Al elegir nombres aleatorios y completar archivos ejecutables con datos aleatorios, reducen el número de IoC de confianza (en función de hashes y nombres de archivos). Además, gracias al uso de la carga de AcroTranscoder DLL de terceros, los atacantes solo necesitan eliminar el binario legítimo AcroTranscoder .

Archivos autoextraíbles


Después de los archivos RTF, el grupo cambió a archivos de extracción automática (SFX) con iconos de documentos comunes para confundir aún más al usuario. Esto fue escrito por Threatbook ( enlace en chino ). Después de comenzar, se descargan los archivos RAR autoextraíbles y se ejecutan las DLL con la extensión .ocx, cuya carga final se documentó previamente {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll . Desde mediados de enero de 2019, OceanLotus ha reutilizado esta técnica, pero con el tiempo, algunas configuraciones han cambiado. En esta sección hablaremos sobre tecnología y cambios.

Creación de cebo


El documento THICH-THONG-LAC-HANH-THAP-THIEN-VIET-NAM (1).EXE (SHA-1: AC10F5B1D5ECAB22B7B418D6E98FA18E32BBDEAB ) se encontró por primera vez en 2018. Este archivo SFX fue creado sabiamente: la descripción ( Información de la versión ) dice que esta es una imagen JPEG. El script SFX es el siguiente:


Figura 9. Comandos SFX

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

La imagen del cebo es la siguiente:


Figura 10. La imagen del cebo

Es posible que haya notado que las dos primeras líneas del script SFX llaman al archivo OSX dos veces, pero esto no es un error.

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


El flujo de control de archivos OSX es muy similar a otros componentes de OceanLotus: hay muchas secuencias de JZ/JNZ y PUSH/RET alternan 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 ve así:


Figura 12. Código de instalador básico

De hecho, la primera vez que DllRegisterServer llama a DllRegisterServer exportación establece el valor de registro HKCU\SOFTWARE\Classes\CLSID\{E08A0F4B-1F65-4D4D-9A09-BD4625B9C5A1}\Model para el desplazamiento cifrado en la DLL ( 0x10001DE0 ).

Cuando una función se llama por segunda vez, lee el mismo valor y se ejecuta en esa dirección. A partir de aquí, se lee y ejecuta un recurso y muchas acciones en RAM.

El shellcode es el mismo cargador PE utilizado en campañas OceanLotus anteriores. Se puede emular usando nuestro script . Como resultado, db293b825dcc419ba7dc2c49fa2757ee.dll , lo carga en la memoria y ejecuta DllEntry .

La 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 se establece explícitamente: según el nivel de privilegio, los datos binarios se escribirán en %appdata%\Intel\logs\BackgroundUploadTask.cpl o %windir%\System32\BackgroundUploadTask.cpl (o SysWOW64 para sistemas de 64 bits).

La persistencia se garantiza creando una tarea llamada BackgroundUploadTask[junk].job , donde [junk] es un conjunto de bytes 0x9D y 0xA0 .

El nombre de la aplicación de la tarea es %windir%\System32\control.exe , y el valor del parámetro es la ruta al archivo binario descargado. La tarea oculta se ejecuta todos los días.

Estructuralmente, el archivo CPL es una 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 esta DLL y llama a su única exportación DllEntry .

Archivo de configuración de puerta trasera


La configuración de puerta trasera está encriptada e incrustada en sus recursos. La estructura del archivo de configuración es muy similar a la anterior.


Figura 14. Estructura de configuración de puerta trasera (KaitaiStruct Visualizer)

A pesar de la estructura similar, los valores de muchos campos se actualizaron en comparación con los datos proporcionados en nuestro informe anterior .

El primer elemento de la matriz binaria contiene la DLL ( HttpProv.dll MD5: 2559738D1BD4A999126F900C7357B759 ) identificada por Tencent . Pero como el nombre de exportación se ha eliminado del binario, los hashes no coinciden.

Investigación adicional


Recolectando muestras, llamamos la atención sobre algunas características. La muestra que acabamos de describir apareció alrededor de julio de 2018, y otras similares recientemente, a mediados de enero y principios de febrero de 2019. Se utilizó un archivo SFX como vector de infección, volcando un documento de cebo legítimo y un archivo OSX malicioso.

Aunque OceanLotus utiliza marcas de tiempo falsas, notamos que las marcas de tiempo de los archivos SFX y OCX son siempre las mismas ( 0x57B0C36A (14/08/2016 a las 7:15 pm UTC) y 0x498BE80F (06/02/2009 a las 7:34 am UTC ) respectivamente). Esto probablemente indica que los autores tienen un cierto "constructor" que usa las mismas plantillas y simplemente cambia algunas características.

Entre los documentos que hemos estudiado desde principios de 2018, hay varios nombres que indican los países de interés del ataque:

- La nueva información de contacto de Cambodia Media (New) .xls.exe
- 李建 香 (个人 简历) .exe (documento pdf falso de un CV)
- Comentarios, Rally en EE. UU. del 28 al 29 de julio de 2018.exe

Desde el descubrimiento de la puerta trasera {A96B020F-0000-466F-A96D-A91BBF8EAC96}.dll y la publicación de su análisis por parte de varios investigadores, hemos observado algunos cambios en los datos de configuración del malware.

Primero, los autores comenzaron a eliminar nombres de DLL DLL auxiliares ( DNSprov.dll y dos versiones de HttpProv.dll ). Luego, los operadores dejaron de empaquetar la tercera DLL (la segunda versión de HttpProv.dll ), eligiendo incrustar solo una.

En segundo lugar, se cambiaron muchos campos de configuración de puerta trasera, probablemente para evitar la detección, ya que muchos IoC estuvieron disponibles. Entre los campos importantes modificados por los autores están los siguientes:

  • La clave de registro de AppX cambió (ver IoC)
  • cadena de codificación mutex ("def", "abc", "ghi")
  • número de puerto

Finalmente, en todas las nuevas versiones analizadas, los nuevos C&C se enumeran en la sección IoC.

Conclusiones


OceanLotus continúa evolucionando. El cybergroup se centra en el refinamiento y la expansión de herramientas y señuelos. Los autores enmascaran cargas maliciosas con la ayuda de documentos llamativos que son relevantes para las presuntas víctimas. Desarrollan nuevos diseños y también usan herramientas disponibles públicamente, como el exploit del Editor de ecuaciones. Además, son herramientas de perfeccionamiento para reducir la cantidad de artefactos que quedan en las máquinas de las víctimas, reduciendo así la posibilidad de detección por software antivirus.

Indicadores de compromiso


Los indicadores de compromiso, así como los atributos MITER ATT y CK están disponibles en Welivesecurity y en GitHub .

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


All Articles