En marzo de 2019, VirusTotal, un popular servicio de escaneo en línea, cargó una nueva muestra de malware para macOS del cybergroup OceanLotus. El archivo ejecutable de puerta trasera tiene las mismas capacidades que la versión anterior de malvari que estudiamos para macOS, pero su estructura ha cambiado y se ha vuelto más difícil de detectar. Desafortunadamente, no pudimos encontrar el gotero asociado con esta muestra, por lo que aún no conocemos el vector de infección.
Recientemente,
publicamos una
publicación sobre OceanLotus y cómo los operadores intentan mantener la persistencia, acelerar la ejecución del código y minimizar los rastros de presencia en los sistemas Windows. También se sabe que este cybergroup tiene un componente para macOS. Esta publicación describe en detalle los cambios en la última versión de Malware para macOS en comparación con la versión anterior (
descrita por Trend Micro ), así como cómo el análisis puede automatizar el descifrado de cadenas utilizando la API IDA Hex-Rays.
Análisis
Las siguientes tres partes describen el análisis de muestra con el hash SHA-1
E615632C9998E4D3E5ACD8851864ED09B02C77D2
. El archivo se llama
flashlightd , los productos antivirus ESET lo detectan como OSX / OceanLotus.D.
Anti-depuración y protección sandbox
Como todos los binarios de OceanLotus macOS, la muestra está empaquetada con UPX, pero la mayoría de las herramientas de identificación de empaquetadores no la reconocen como tal. Probablemente porque contienen principalmente una firma, dependiendo de la presencia de la cadena "UPX", además, las firmas Mach-O son menos comunes y no se actualizan con tanta frecuencia. Esta característica dificulta la detección estática. Curiosamente, después de desempacar, el punto de entrada se encuentra al comienzo de la sección
__cfstring
en el segmento
.TEXT
. Hay atributos de marca en esta sección, como se muestra en la imagen a continuación.
Figura 1. Atributos de la sección MACH-O __cfstringComo se muestra en la Figura 2, la ubicación del código en la sección
__cfstring
permite engañar algunas herramientas de desensamblaje al mostrar el código como cadenas.
Figura 2. El IDA define el código de puerta trasera como datosDespués de iniciar el archivo binario, se crea una secuencia como medio de protección contra la depuración, cuyo único propósito es verificar constantemente el depurador. Para este hilo:
- Intenta desenganchar cualquier depurador llamando a
ptrace
con PT_DENY_ATTACH
como parámetro de solicitud - Comprueba si algunos puertos de excepción están abiertos llamando a
task_get_exception_ports
- Verifica si el depurador está conectado, como se muestra en la figura a continuación, verificando la presencia del indicador
P_TRACED
en el proceso actual
Figura 3. Comprobación de la conexión del depurador utilizando la función sysctlSi el perro guardián detecta la presencia de un depurador, se llama a la función de
exit
. Además, la muestra comprueba el entorno ejecutando dos comandos:
ioreg -l | grep -e "Manufacturer" sysctl hw.model
Después de eso, la muestra verifica el valor de retorno con una lista codificada de cadenas de sistemas de virtualización conocidos:
acle ,
vmware ,
virtualbox o
paralelos . Finalmente, el siguiente comando verifica si la máquina es uno de los siguientes "MBP", "MBA", "MB", "MM", "IM", "MP" y "XS". Estos son códigos de modelo del sistema, por ejemplo, "MBP" significa MacBook Pro, "MBA" significa MacBook Air, etc.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}
Adiciones clave
A pesar de que los equipos de puerta trasera no han cambiado desde el estudio de Trend Micro, notamos varias otras modificaciones. Los servidores C&C utilizados en esta muestra son bastante nuevos, la fecha de su creación es el 22/10/2018.
- daff.faybilodeau [.] com
- sarc.onteagleroad [.] com
- au.charlineopkesston [.] com
La URL del recurso cambió a
/dp/B074WC4NHW/ref=gbps_img_m-9_62c3_750e6b35
.
El primer paquete enviado al servidor C&C contiene más información sobre la máquina host, incluidos todos los datos recopilados por los comandos de la tabla a continuación.

Además de este cambio de configuración, la muestra no usa la biblioteca
libcurl para el filtrado de la red, sino una biblioteca externa. Para encontrarlo, la puerta trasera intenta descifrar cada archivo en el directorio actual usando AES-256-CBC con la clave
gFjMXBgyXWULmVVVzyxy
con ceros. Cada archivo se descifra y se guarda como
/tmp/store
, y se intentó cargarlo como una biblioteca utilizando la función
dlopen . Cuando un intento de descifrado conduce a una llamada
dlopen
exitosa, la puerta trasera recupera las
Boriry
exportadas de
Boriry
y
ChadylonV
, que parecen ser responsables de la comunicación de red con el servidor. No tenemos un cuentagotas u otros archivos de la ubicación de origen de la muestra, por lo que no podemos analizar esta biblioteca. Además, dado que el componente está encriptado, la regla YARA basada en estas líneas no coincidirá con el archivo encontrado en el disco.
Como se describe en el artículo anterior, se crea
cliendID . Este identificador es un hash MD5 del valor de retorno de uno de los siguientes comandos:
-
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformSerialNumber/ { split($0, line, "\""); printf("%s", line[4]); }'
-
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s", line[4]); }'
-
ifconfig en0 | awk \'/ether /{print $2}\'
ifconfig en0 | awk \'/ether /{print $2}\'
(obtener la dirección MAC)
- comando desconocido ("
\x1e\x72\x0a
"), que se utiliza en muestras anteriores
Antes del hash, el carácter "0" o "1" se agrega al valor devuelto, lo que indica la presencia de privilegios de root. Este
ID de cliente se almacena en
/Library/Storage/File System/HFS/25cf5d02-e50b-4288-870a-528d56c3cf6e/pivtoken.appex
si el código se ejecuta como root o en ~ / Library / SmartCardsServices / Technology / PlugIns / drivers / snippets.ecgML en todos los demás casos. Un archivo generalmente se oculta usando la función
_chflags ; su marca de tiempo se cambia usando el comando
touch –t
con un valor aleatorio.
Decodificar cuerdas
Como en versiones anteriores, las cadenas se encriptan usando AES-256-CBC (clave hexadecimal:
9D7274AD7BCEF0DED29BDBB428C251DF8B350B92
con ceros, y IV se rellena con ceros) usando la función
CCCrypt . La clave se ha cambiado de versiones anteriores, pero dado que el grupo todavía usa el mismo algoritmo de cifrado de cadenas, el descifrado se puede automatizar. Además de esta publicación, estamos lanzando un script IDA que usa la API Hex-Rays para descifrar las cadenas presentes en un archivo binario. Este script puede ayudar en el análisis futuro de OceanLotus y el análisis de muestras existentes que aún no hemos podido obtener. El script se basa en un método universal para recibir argumentos pasados a una función. También está buscando la configuración de destino. El método se puede reutilizar para obtener una lista de argumentos de función y luego pasarlo a una devolución de llamada.
Conociendo el prototipo de la función de
descifrado , el script encuentra todas las referencias cruzadas a esta función, todos los argumentos, luego descifra los datos y coloca texto plano dentro del comentario en la dirección de la referencia cruzada. Para que el script funcione correctamente, debe tener el alfabeto definido por el usuario utilizado por la función de decodificación base64 y debe definirse una variable global que contenga la longitud de la clave (en este caso, DWORD, consulte la Figura 4).
Figura 4. Definición de la variable global key_lenEn la ventana Función, puede hacer clic con el botón derecho en la función de descifrado y hacer clic en "Extraer y descifrar argumentos". El script debe poner las líneas descifradas en los comentarios, como se muestra en la Figura 5.
Figura 5. El texto descifrado se coloca en el comentarioPor lo tanto, las líneas descifradas se colocan convenientemente juntas en la ventana IDA
xrefs para esta función, como se muestra en la Figura 6.
Figura 6. Xrefs a la función f_decryptEl guión final se puede encontrar en el
repositorio de Github .
Conclusión
Como ya se mencionó, OceanLotus está constantemente mejorando y actualizando su conjunto de herramientas. Esta vez, el cybergroup mejoró el malware para trabajar con usuarios de Mac. El código no ha cambiado mucho, pero dado que muchos usuarios de Mac ignoran los productos de seguridad, proteger Malware de la detección es de importancia secundaria.
Los productos de ESET ya han detectado este archivo en el momento del estudio. Dado que la biblioteca de red utilizada para la comunicación C&C ahora está encriptada en el disco, aún no se conoce el protocolo de red exacto utilizado por los atacantes.
Indicadores de compromiso
Los indicadores de compromiso, así como los atributos MITER ATT y CK también están disponibles en
GitHub .