Investigación inicial que expone a JOKERSPY

Una descripción general de JOKERSPY, descubierta en junio de 2023, que implementó herramientas macOS personalizadas y de código abierto para explotar un exchange de criptomonedas ubicado en Japón.

15 min de lecturaPatrón de ataque, Campañas
Investigación inicial que expone a JOKERSPY

Conclusiones clave

  • Se trata de una notificación inicial de una intrusión activa con detalles adicionales a continuación
  • REF9134 aprovecha herramientas personalizadas y de código abierto para el reconocimiento y el comando y control
  • Los objetivos de esta actividad incluyen un intercambio de criptomonedas en Japón

Preámbulo

Este artículo de investigación explora una intrusión descubierta recientemente que llamamos REF9134, que implica el uso de la puerta trasera sh.py para implementar la herramienta de enumeración macOS Swiftbelt. sh.py y xcc fueron bautizados recientemente como JOKERSPY por Bitdefender.

En concreto, esta investigación abarca:

  • Cómo Elastic Security Labs identificó el reconocimiento del grupo adversario
  • Los pasos del adversario para evadir la detección mediante xcc , la instalación de la puerta trasera sh.py y la implementación de herramientas de enumeración

Es posible que se publique una mirada más profunda a este ataque en una fecha posterior.

Overview

A finales de mayo de 2023, un adversario con acceso existente en un destacado exchange de criptomonedas japonés activó una de nuestras alertas de diagnóstico de punto final que detectó la ejecución de un binario ( xcc ). xcc no es de confianza para Apple, y el adversario se autofirmó empleando la herramienta nativa de macOS codesign. Si bien esta detección en sí misma no fue necesariamente inocua, la vertical de la industria y la actividad adicional que observamos luego de estas alertas iniciales nos llamaron la atención y nos hicieron prestar más atención.

Luego de la ejecución de xcc , observamos que el actor de amenazas intentaba eludir las licencias de TCC creando su propia base de datos de TCC e intentando reemplazar la existente. El 1 de junio, se vio una nueva herramienta basada en Python ejecutar desde el mismo directorio que xcc y se empleó para ejecutar una herramienta de enumeración posterior a la explotación de macOS de código abierto conocida como Swiftbelt.

Análisis

REF9134 es una intrusión en un gran proveedor de servicios de criptomonedas con sede en Japón que se centra en el intercambio de activos para el comercio de Bitcoin, Ethereum y otras criptomonedas comunes.

El binario xcc

xcc ( d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8 ) es un binario multiarquitectura autofirmado escrito en Swift que se emplea para evaluar las licencias actuales del sistema. La versión observada por Elastic Security Labs está firmada como XProtectCheck-55554944f74096a836b73310bd55d97d1dff5cd4 , y tiene una firma de código que se asemeja a las cargas útiles conocidas públicamente y no confiables.

Para identificar otros binarios firmados con el mismo identificador, convertimos XProtectCheck-55554944f74096a836b73310bd55d97d1dff5cd4 a hexadecimal y buscamos en VirusTotal para identificar 3 muestras adicionales ( content:{5850726f74656374436865636b2d35353535343934346637343039366138333662373333313062643535643937643164666635636434} ).

Cada uno contenía la misma funcionalidad central con diferencias estructurales. Estas discrepancias pueden indicar que estas variantes de xcc se desarrollaron para eludir las capacidades de los puntos de conexión que interferían con la ejecución.

Poco luego de la creación de xcc , los investigadores observaron que el actor de amenazas copiaba /Users/Shared/tcc.db sobre la base de datos TCC existente, /Library/Application Support/com.apple.TCC/TCC.db. Esto puede permitir que la amenaza evite los avisos de TCC visibles para los usuarios del sistema y, al mismo tiempo, abuse de un directorio con amplias licencias de escritura de archivos.

Artefactos de XCode

Durante el análisis de este binario, los investigadores identificaron dos rutas únicas, /Users/joker/Developer/Xcode/DerivedData/ y /Users/joker/Downloads/Spy/XProtectCheck/XProtectCheck/ , que se destacaron como anómalas. La ruta de acceso predeterminada para compilar código con Xcode es /Users/[nombre de usuario]/Developer/Xcode/DerivedData.

Abusar de TCC

Estas licencias de introspección se gestionan mediante la característica nativa de transparencia, consentimiento y control (TCC). Los investigadores determinaron que xcc comprueba las licencias de FullDiskAccess y ScreenRecording, además de comprobar si la pantalla está bloqueada actualmente y si el proceso actual es un cliente de accesibilidad de confianza.

Al ejecutar con éxito en nuestro entorno Detonate , se mostraron los siguientes resultados:

Una vez que la base de datos TCC personalizada se colocó en la ubicación esperada, el actor de amenazas ejecutó el binario xcc .

Acceso inicial

El binario xcc se ejecutó a través de bash mediante tres procesos separados

  • /Applications/IntelliJ IDEA.app/Contents/MacOS/idea
  • /Applications/iTerm.app/Contents/MacOS/iTerm2
  • /Aplicaciones/Visual Studio Code.app/Contents/MacOS/Electron.

Si bien todavía estamos investigando y continuamos recopilando información, creemos firmemente que el acceso inicial para este malware fue un complemento malicioso o de puerta trasera o una dependencia de terceros que proporcionó acceso al actor de amenazas. Esto se alinea con la conexión que establecieron los investigadores de Bitdefender , quienes correlacionaron el dominio codificado encontrado en una versión de la puerta trasera sh.py con un Tweet sobre un lector de códigos QR de macOS infectado que se descubrió que tenía una dependencia maliciosa.

Bibliotecas criptográficas implementadas

El 31 de mayo, los investigadores observaron tres DyLibs no nativos desplegados en /Users/shared/keybag/ llamados libcrypto.1.0.0.dylib , libncursesw.5.dylib y libssl.1.0.0.dylib. En MacOS, las claves para la protección de datos de archivos y llaveros se almacenan en bolsas de claves y pertenecen a iOS, iPadOS, watchOS y tvOS. En este momento, los investigadores proponen que esta puesta en escena tiene un propósito de evasión de defensa y especulan que pueden contener vulnerabilidades útiles. El actor de amenazas puede planear introducir estas vulnerabilidades en sistemas o aplicaciones que de otro modo estarían parcheados.

La puerta trasera sh.py

sh.py es una puerta trasera de Python que se emplea para desplegar y ejecutar otras capacidades posteriores a la explotación como Swiftbelt .

El malware carga su configuración desde ~/Public/Safari/sar.dat. El archivo de configuración contiene elementos cruciales, como URL de comando y control (C2), un temporizador de suspensión para fines de balizamiento (el valor predeterminado es 5 segundos) y un identificador único de nueve dígitos asignado a cada agente.

Como parte de su balizamiento periódico, el malware recopila y transmite diversa información del sistema. La información enviada incluye:

  • Nombre de host
  • Nombre de usuario
  • Nombre de dominio
  • Directorio actual
  • La ruta absoluta del binario ejecutable
  • Versión del sistema operativo
  • Es un sistema operativo de 64 bits
  • Es un proceso de 64 bits
  • Versión de Python

A continuación se muestra una tabla que describe los diversos comandos que pueden ser manejados por la puerta trasera:

MandarDescripción
skDetener la ejecución de la puerta trasera
lEnumere los archivos de la ruta proporcionada como parámetro
cEjecutar y devolver la salida de un comando de shell
CDCambiar directorio y devolver la nueva ruta
XsEjecutar un código Python dado como parámetro en el contexto actual
xsiDecodifique un código Python codificado en Base64 dado como parámetro, compile y luego ejecútelo
rEliminar un archivo o directorio del sistema
eEjecutar un archivo desde el sistema con o sin parámetro
uSubir un archivo al sistema infectado
dDescargar un archivo del sistema infectado
gObtener la configuración actual del malware almacenada en el archivo de configuración
wAnular el archivo de configuración del malware con nuevos valores

Cinturón veloz

El 1 de junio, el sistema comprometido registró una alerta de firma para MacOS.Hacktool.Swiftbelt, una capacidad de enumeración de MacOS inspirada en SeatBelt y creada por el miembro del equipo rojo Cedric Owens. A diferencia de otros métodos de enumeración, Swiftbelt invoca código Swift para evitar la creación de artefactos de línea de comandos. En individuo, las variantes de xcc también se escriben con Swift.

La alerta de firma indicaba que Swiftbelt se escribió en /Users/shared/sb y se ejecutó empleando el intérprete de shell bash, sh. La línea de comandos completa observada por los investigadores fue Users/Shared/sb /bin/sh -c /users/shared/sb \> /users/shared/sb.log 2\>&1 , lo que demuestra que el actor de amenazas capturó los resultados en sb.log mientras que los errores se dirigieron a STDOUT.

Modelo Diamante

Elastic Security emplea el modelo Diamond para describir las relaciones de alto nivel entre los adversarios, las capacidades, la infraestructura y las víctimas de las intrusiones. Si bien el modelo Diamond se usa más comúnmente con intrusiones únicas y aprovechando Activity Threading (sección 8) como una forma de crear relaciones entre incidentes, un enfoque centrado en el adversario (sección 7.1.4) El enfoque permite un solo diamante, aunque desordenado.

Tácticas y técnicas observadas

Tácticas de MITRE ATT&CK

La táctica representa el porqué de una técnica o subtécnica. Es el objetivo táctico del adversario: la razón para realizar una acción. Estas son las tácticas observadas por Elastic Security Labs en esta campaña:

MITRE ATT&CK Techniques / Sub techniques

Las técnicas y subtécnicas representan cómo un adversario logra un objetivo táctico mediante la realización de una acción. Estas son las técnicas observadas por Elastic Security Labs en esta campaña:

Lógica de detección

YARA

Elastic Security creó reglas YARA para identificar esta actividad. A continuación se muestran las reglas de YARA para identificar la puerta trasera JOKERSPY y la herramienta SwiftBelt.

rule Macos_Hacktool_JokerSpy {
    meta:
        author = "Elastic Security"
        creation_date = "2023-06-19"
        last_modified = "2023-06-19"
        os = "MacOS"
        arch = "x86"
        category_type = "Hacktool"
        family = "JokerSpy"
        threat_name = "Macos.Hacktool.JokerSpy"
        reference_sample = "d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8"
        license = "Elastic License v2"

    strings:
        $str1 = "ScreenRecording: NO" fullword
        $str2 = "Accessibility: NO" fullword
        $str3 = "Accessibility: YES" fullword
        $str4 = "eck13XProtectCheck"
        $str5 = "Accessibility: NO" fullword
        $str6 = "kMDItemDisplayName = *TCC.db" fullword
    condition:
        5 of them
}
rule MacOS_Hacktool_Swiftbelt {
    meta:
        author = "Elastic Security"
        creation_date = "2021-10-12"
        last_modified = "2021-10-25"
        threat_name = "MacOS.Hacktool.Swiftbelt"
        reference_sample = "452c832a17436f61ad5f32ee1c97db05575160105ed1dcd0d3c6db9fb5a9aea1"
        os = "macos"
        arch_context = "x86"
        license = "Elastic License v2"

    strings:
        $dbg1 = "SwiftBelt/Sources/SwiftBelt"
        $dbg2 = "[-] Firefox places.sqlite database not found for user"
        $dbg3 = "[-] No security products found"
        $dbg4 = "SSH/AWS/gcloud Credentials Search:"
        $dbg5 = "[-] Could not open the Slack Cookies database"
        $sec1 = "[+] Malwarebytes A/V found on this host"
        $sec2 = "[+] Cisco AMP for endpoints found"
        $sec3 = "[+] SentinelOne agent running"
        $sec4 = "[+] Crowdstrike Falcon agent found"
        $sec5 = "[+] FireEye HX agent installed"
        $sec6 = "[+] Little snitch firewall found"
        $sec7 = "[+] ESET A/V installed"
        $sec8 = "[+] Carbon Black OSX Sensor installed"
        $sec9 = "/Library/Little Snitch"
        $sec10 = "/Library/FireEye/xagt"
        $sec11 = "/Library/CS/falcond"
        $sec12 = "/Library/Logs/PaloAltoNetworks/GlobalProtect"
        $sec13 = "/Library/Application Support/Malwarebytes"
        $sec14 = "/usr/local/bin/osqueryi"
        $sec15 = "/Library/Sophos Anti-Virus"
        $sec16 = "/Library/Objective-See/Lulu"
        $sec17 = "com.eset.remoteadministrator.agent"
        $sec18 = "/Applications/CarbonBlack/CbOsxSensorService"
        $sec19 = "/Applications/BlockBlock Helper.app"
        $sec20 = "/Applications/KextViewr.app"
    condition:
        6 of them
}

Referencias

A lo largo de la investigación anterior se hizo referencia a lo siguiente:

Observaciones

En esta investigación se discutieron los siguientes observables.

ObservableTipoNombreReferencia
app.influmarket[.]orgDominioN/Ash.py dominio
d895075057e491b34b0f8c0392b44e43ade425d19eaaacea6ef8c5c9bd3487d8SHA-256/Usuarios/Compartido/xccMacos.Hacktool.JokerSpy
8ca86f78f0c73a46f31be366538423ea0ec58089f3880e041543d08ce11fa626SHA-256/Usuarios/Compartido/sbMacOS.Hacktool.Swiftbelt
aa951c053baf011d08f3a60a10c1d09bbac32f332413db5b38b8737558a08dc1SHA-256/Usuarios/Compartido/sh.pysh.py guión