En marzo de 2019, se cargó una nueva muestra de malware para macOS del grupo cibernético OceanLotus en VirusTotal, un popular servicio de escaneo en línea. El archivo ejecutable del backdoor tiene las mismas capacidades que la versión anterior de malware para macOS que estudiamos, pero su estructura ha cambiado y se ha vuelto más difícil de detectar. Desafortunadamente, no pudimos encontrar el dropper asociado a esta muestra, por lo que aún no conocemos el vector de infección.
Recientemente publicamos y cómo los operadores intentan asegurar la persistencia, acelerar la ejecución del código y minimizar las huellas de presencia en sistemas Windows. También se sabe que este grupo cibernético tiene un componente para macOS. Esta entrada detalla los cambios en la versión más reciente de malware para macOS en comparación con la versión anterior (), así como cómo se puede automatizar la descodificación de cadenas mediante la API de IDA Hex-Rays durante el análisis.

Análisis
En las siguientes tres partes se describe el análisis de una muestra con hash SHA-1 E615632C9998E4D3E5ACD8851864ED09B02C77D2. El archivo se llama flashlightd, y los productos antivirus de ESET lo detectan como OSX/OceanLotus.D.
Anti-debugging y protección contra sandboxes
Como todos los binarios de macOS de OceanLotus, 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 principalmente contienen una firma dependiente de la presencia de la cadena 'UPX', además de que 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 descomprimir, el punto de entrada se encuentra al comienzo de la sección __cfstring en el segmento .TEXT. En esta sección hay atributos de flag, como se muestra en la figura a continuación.

Figura 1. Atributos de la sección MACH-O __cfstring
Como se muestra en la figura 2, las ubicaciones de código en la sección __cfstring permiten engañar a algunas herramientas de desensamblado, mostrando el código en forma de cadenas.

Figura 2. El código del backdoor se identifica en IDA como datos
Después de ejecutarse, el archivo binario crea un hilo como medio de protección contra la depuración, cuyo único objetivo es verificar continuamente la presencia de un depurador. Para esto, el hilo:
— Intenta desenganchar cualquier depurador llamando a ptrace con PT_DENY_ATTACH como parámetro de solicitud
— Verifica si están abiertos algunos puertos excepcionales llamando a la función task_get_exception_ports
— Verifica si el depurador está conectado, como se muestra en la imagen a continuación, comprobando la presencia de la bandera P_TRACED en el proceso actual

Figura 3. Verificación de la conexión del depurador mediante la función sysctl
Si el esquema de vigilancia detecta la presencia del depurador, se llama a la función exit. Además, a continuación, la muestra verifica el entorno ejecutando dos comandos:
ioreg -l | grep -e "Manufacturer" y sysctl hw.model
Después de esto, la muestra verifica el valor devuelto contra una lista codificada de strings de sistemas de virtualización conocidos: acle, vmware, virtualbox o parallels. Finalmente, el siguiente comando comprueba si la máquina es uno de los siguientes "MBP", "MBA", "MB", "MM", "IM", "MP" y "XS". Estos son los códigos de modelo del sistema, por ejemplo, "MBP" significa MacBook Pro, "MBA" - MacBook Air, etc.
system_profiler SPHardwareDataType 2>/dev/null | awk '/Boot ROM Version/ {split($0, line, ":");printf("%s", line[2]);}'
Complementos principales
A pesar de que los comandos del backdoor no han cambiado desde la investigación de Trend Micro, hemos notado algunas otras modificaciones. Los servidores C&C utilizados en esta muestra son bastante nuevos, con fecha de creación el 22.10.2018.
— daff.faybilodeau[.]com
— sarc.onteagleroad[.]com
— au.charlineopkesston[.]com
El recurso URL ha cambiado 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, incluyendo todos los datos recopilados por los comandos de la tabla a continuación.

Además de esto, en los cambios de configuración, la muestra usa para la filtración de red no la biblioteca , sino una biblioteca externa. Para encontrarla, el backdoor intenta descifrar cada archivo en el directorio actual utilizando AES-256-CBC con la clave gFjMXBgyXWULmVVVzyxy, complementada con ceros. Cada archivo se descifra y se guarda como /tmp/store, y se intenta cargar como una biblioteca utilizando la función . Cuando el intento de descifrado resulta en una llamada exitosa dlopen, el backdoor extrae las funciones exportadas Boriry y ChadylonV, que aparentemente son responsables de la interacción en red con el servidor. No tenemos el dropper ni otros archivos de la ubicación original de la muestra, por lo que no podemos analizar esta biblioteca. Además, dado que el componente está cifrado, la regla YARA basada en estas cadenas no coincidirá con el archivo encontrado en el disco.
Como se describe en el artículo mencionado anteriormente, se crea cliendID. Este identificador es un hash MD5 del valor devuelto por uno de los siguientes comandos:
— 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]); }'
— ifconfig en0 | awk '/ether /{print $2}' (obtener dirección MAC)
— comando desconocido ("x1ex72x0a"), que se utiliza en los ejemplos anteriores
Antes de que el valor devuelto sea hash, se añade el carácter "0" o "1", que indica la presencia de privilegios de root. Este clientID 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 otros casos. El archivo generalmente está oculto mediante la función , su marca de tiempo se modifica con el comando touch -t con un valor aleatorio.
Descifrando cadenas
Al igual que en las versiones anteriores, las cadenas están encriptadas utilizando AES-256-CBC (clave hexadecimal: 9D7274AD7BCEF0DED29BDBB428C251DF8B350B92 rellenada con ceros, y IV llenado con ceros) a través de la función . La clave ha cambiado en comparación con versiones anteriores, pero, dado que el grupo sigue utilizando el mismo algoritmo de cifrado de cadenas, la descifrado puede ser automatizada. Además de esta publicación, liberamos un script de IDA que utiliza la API Hex-Rays para descifrar las cadenas presentes en el archivo binario. Este script puede ayudar en el análisis futuro de OceanLotus y en el análisis de muestras existentes que todavía no hemos podido obtener. La base del escenario es un método universal para obtener argumentos pasados a la función. Además, busca las asignaciones de parámetros. El método se puede reutilizar para obtener una lista de argumentos de la función y luego pasarla a un callback.
Conociendo el prototipo de la función decrypt, el script encuentra todas las referencias cruzadas a esta función, todos los argumentos, luego descifra los datos y coloca el texto plano dentro del comentario en la dirección de la referencia cruzada. Para que el script funcione correctamente, debe establecerse un alfabeto personalizado que use la función de decodificación base64, y debe definirse una variable global que contenga la longitud de la clave (en este caso DWORD, ver figura 4).

Figura 4. Definición de la variable global key_len
En la ventana de Función, se puede hacer clic derecho en la función de descifrado y seleccionar «Extraer y descifrar argumentos». El script debe colocar las cadenas descifradas en los comentarios, como se muestra en la Figura 5.

Figura 5. El texto descifrado se coloca en los comentarios
De este modo, las cadenas descifradas se agrupan de manera conveniente en la ventana IDA xrefs para esta función, como se muestra en la Figura 6.

Figura 6. Xrefs a la función f_decrypt
La versión final del script se puede encontrar en .
Salida
Como ya se mencionó, OceanLotus continúa perfeccionando y actualizando su kit de herramientas. Esta vez, el grupo cibernético ha mejorado el malware para usuarios de Mac. El código no ha cambiado mucho, pero dado que muchos usuarios de Mac ignoran los productos de seguridad, la protección contra la detección del malware es secundaria.
Los productos de ESET ya habían detectado este archivo en el momento de la investigación. Dado que la biblioteca de red utilizada para la comunicación C&C ahora está cifrada en el disco, el protocolo de red exacto utilizado por los atacantes aún se desconoce.
Indicadores de compromiso
Los indicadores de compromiso, así como los atributos de MITRE ATT&CK, también están disponibles en .
Fuente: habr.com
