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 RTFA 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 FONTEs 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 shellcodeLa 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 documentoEl 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 administradorEl 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 administradorUn 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 difusosDespué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 instruccionesAl 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 SFXEl 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 ceboEs 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 ofuscadoDespués de filtrar el código basura, la exportación
DllRegisterServer
llamada por
regsvr32.exe
ve así:
Figura 12. Código de instalador básicoDe 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.exeDesde 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 .