El equipo de investigación de ESET analizó un backdoor que no había sido reportado anteriormente y que ha estado siendo utilizando por el grupo de APT ScarCruft. Este backdoor, al cual hemos llamado Dolphin, cuenta con múltiples capacidades para el espionaje que incluyen: la posibilidad de monitorear unidades y dispositivos portátiles, la exfiltración de archivos de interés, el registro de las pulsaciones de teclado (keylogging), la capacidad para realizar captura de pantallas del equipo de la víctima, y el robo de credenciales del navegador. Las funcionalidades han sido desplegadas en blancos de ataque específicos y previamente seleccionados por los actores de amenazas, en los cuales se despliega el backdoor después de comprometer inicialmente el equipo víctima utilizando un malware menos avanzado. En línea con otras herramientas utilizadas por ScarCruft, el backdoor Dolphin abusa de los servicios de almacenamiento en la nube, específicamente Google Drive, para la comunicación con el servidor de C&C.
Durante nuestra investigación hemos visto un desarrollo continuo del backdoor y una búsqueda de los autores de malware de evadir la detección. Una característica destacadas de las primeras versiones que analizamos de Dolphin es su capacidad para modificar la configuración de las cuentas de Google y Gmail de las víctimas para reducir su seguridad, muy probablemente para mantener el acceso a las bandejas de entrada de correo electrónico de las víctimas.
En esta publicación compartimos un análisis técnico de este backdoor llamado Dolphin y explicamos su vínculo con el grupo ScarCruft. Los hallazgos de esta nueva adición al conjunto de herramientas de ScarCruft fueron también presentados en la conferencia AVAR 2022.
Puntos clave en esta publicación:
- Los investigadores de ESET analizaron Dolphin, un backdoor que no había sido reportado anteriormente y que ha sido utilizado por el grupo de APT ScarCruft.
- Dolphin es desplegado solo en objetivos seleccionados. Su objetivo es buscar archivos interesantes en las unidades de los sistemas comprometidos y exfiltrarlos vía Google Drive.
- El backdoor fue utilizado a principios de 2021como el payload (carga útil) final de un ataque compuesto por varias etapas. En esa ocasión el ataque involucró: un ataque de watering hole a un periódico en línea de Corea del Sur, un exploit de Internet Explorer y otro backdoor de ScarCruft llamado BLUELIGHT.
- Desde el descubrimiento de Dolphin en abril de 2021, los investigadores de ESET han observado múltiples versiones del backdoor en las cuales los actores de amenazas mejoraron sus capacidades e intentaron evadir la detección.
- Una característica notable que observamos en las primeras versiones de Dolphin es su capacidad para modificar la configuración de las cuentas de Google y Gmail de las víctimas para reducir su seguridad.
Perfil de ScarCruft
ScarCruft, también conocido como APT37 o Reaper, es un grupo de espionaje que ha estado operando desde al menos 2012. Sus ataques se han enfocado principalmente en Corea del Sur, pero otros países asiáticos también han sido atacados. ScarCruft parece estar interesado principalmente en organizaciones gubernamentales y militares, así como en empresas de diversas industrias vinculadas a los intereses de Corea del Norte.
Descripción de Dolphin
En 2021, ScarCruft realizó un ataque de watering hole en un periódico en línea de Corea del Sur enfocado en Corea del Norte. El ataque constaba de varios componentes, incluido un exploit de Internet Explorer y una shellcode que conducía a un backdoor denominado BLUELIGHT, informó Volexity y Kaspersky.
En esos informes, el backdoor BLUELIGHT se describió como el payload final del ataque. Sin embargo, al analizar el ataque, descubrimos a través de la telemetría de ESET un segundo backdoor más sofisticado, desplegado a través de BLUELIGHT en víctimas seleccionadas. Llamamos a este segundo backdoor Dolphin en función de una ruta PDB que se encuentra en el ejecutable.
Mientras que el backdoor BLUELIGHT después de la explotación realiza un reconocimiento básico y una evaluación de la máquina comprometida, Dolphin es más sofisticado y se despliega manualmente solo en algunas víctimas seleccionadas. Ambos backdoors son capaces de exfiltrar archivos de una ruta especificada en un comando, pero Dolphin también busca activamente en las unidades y exfiltra automáticamente los archivos con extensiones de interés para los operadores de ScarCruft.
La Figura 1 proporciona una descripción general de los componentes del ataque que conducen a la ejecución del backdoor Dolphin.
Análisis de Dolphin
En la siguiente sección analizamos los componentes de Dolphin y sus capacidades.
El análisis se basa en la primera versión (1.9) que encontramos del backdoor (basada en una string en el código) y en los cambios introducidos en las versiones más recientes.
Instalador de Dolphin
Las siguientes secciones describimos el instalador y loader, que son los componentes responsables de la ejecución del backdoor Dolphin en el escenario de ataque analizado.
Vale la pena señalar que el instalador y el loader desplegado no son exclusivos de Dolphin, ya que anteriormente fueron utilizados por ScarCruft con otro malware.
El instalador sigue estos objetivos principales:
- Descargar y desplegar un intérprete de Python
- Generar y desplegar una cadena de carga con su payload
- Asegurar la persistencia de la cadena de carga
El instalador descarga un archivo CAB de OneDrive, que contiene un intérprete legítimo de Python 2.7. El CAB es descomprimido en %APPDATA% y, según la arquitectura, el intérprete termina en uno de los siguientes directorios:
- %appdata%\Python27(32)\
- %appdata%\Python27(64)\
El instalador genera dos rutas de archivos para los componentes de la cadena de carga, loader_step_1> y <loader_encrypted_step_2>, con el formato <base_dir>\<inf_name>\<dll_name>.
<base_dir> es seleccionada de forma aleatoria desde:
- %PROGRAMDATA%
- %PUBLIC%
- %APPDATA%\Microsoft
- %APPDATA%\Microsoft\Windows
- %LOCALAPPDATA%
- %LOCALAPPDATA%\Microsoft
- %LOCALAPPDATA%\Microsoft\Windows
<inf_name> y <dll_name> se seleccionan aleatoriamente de los nombres de archivo existentes (sin extensión) en %windir%\inf\*.inf y en %windir%\system32\*.dll.
Para generar el Paso 1 del Loader utiliza una plantilla de script que es completada con nombres generados aleatoriamente (variables, funciones). La plantilla con un ejemplo generado se muestra en la Figura 2.
Luego, el script se escribe en <loader_step_1>.
El paso 2 (embebido en el instalador) que contiene el resto de la cadena de carga, incluido el payload, se cifra con una clave XOR de un byte derivada de la hora actual y se escribe en <loader_encrypted_step_2>.
Para persistir el inicio de la cadena de carga, el instalador establece un valor de registro Run:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\<random_run_name>\"%appdata%\Python27({32|64})\pythonw.exe" "<loader_step_1>" "<loader_encrypted_step_2>"
La <random_run_name> se selecciona aleatoriamente de los nombres de archivo existentes que coincidan con %WINDIR%\inf\*.inf y se descarta la extensión .inf.
Para iniciar la cadena de carga después de la instalación, crea una tarea programada única.
Loader de Dolphin
El loader de Dolphin consta de un script de Python y una shellcode.
El paso 1, el script de Python, lee un archivo específico, descifra su contenido y ejecuta la shellcode resultante.
El paso 2, la shellcode crea un proceso de host (ejecutable CLI aleatorio de %WINDIR%\System32\*.exe), descifra la shellcode adicional que lleva dentro y la inyecta en el proceso creado.
Paso 3, otra shellcode, descifra un archivo PE embebido (el backdoor Dolphin), y lo carga y ejecuta usando un loader PE personalizado.
Backdoor Dolphin
Dolphin es un backdoor que recopila información y ejecuta comandos emitidos por sus operadores. El backdoor es un ejecutable normal de Windows, escrito en C++. Se comunica con el servicio de almacenamiento en la nube Google Drive, que es utilizado como su servidor de C&C.
Nombramos al backdoor Dolphin en función de una ruta PDB que se encuentra en el ejecutable:
D:\Development\BACKDOOR\Dolphin\x64\Release\Dolphin.pdb
Persistencia
El backdoor verifica periódicamente y crea su propia persistencia asegurándose de que el Paso 1 del loader se ejecute cada vez que se inicia el sistema, a través de un valor del registro Run, de la misma manera que en el instalador:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run\<random_run_name>\"%appdata%\Python27({32|64})\pythonw.exe" "<loader_step_1>" "<loader_encrypted_step_2>"
Capacidades
Se recopila la siguiente información básica sobre la computadora y sobre el backdoor:
- Configuración actual del backdoor
- Nombre de usuario
- Nombre de la computadora
- Dirección IP local y externa
- Lista de productos de seguridad instalados
- Tamaño y uso de RAM
- Resultado de la búsqueda de un debugger y otras herramientas de inspección (como Wireshark)
- versión del sistema operativo
- Tiempo actual
- Versión de malware
Dolphin descarga comandos que son emitidos por sus operadores desde Google Drive y los ejecuta. Después de la ejecución, el output o salida de los comandos se carga. La mayoría de las capacidades de Dolphin son controladas a través de comandos.
Las capacidades más relevantes se describen a continuación.
Exfiltración de archivos
De forma predeterminada, Dolphin busca en todas las unidades no fijas (USB), crea listas de directorios y exfiltra los archivos por extensión. Esta búsqueda se puede extender a unidades fijas (HDD), a través de comandos dedicados.
Las siguientes extensiones de archivo de interés, específicas para medios, documentos, correos electrónicos y certificados, son especificadas en la configuración predeterminada:
jpg, doc, xls, ppt, hwp, url, csv, pdf, show, cell, eml, odt, rtf, nxl, amr, 3gp, m4a, txt, msg, key, der, cer, docx, xlsx, pptx, pfx, mp3
Además de esta búsqueda automática, se pueden exfiltrar archivos específicos.
En las versiones más nuevas, la búsqueda predeterminada se amplió a unidades fijas. Se mejoró el comando para obtener archivos específicos almacenándolo en la configuración hasta que se complete.
Dispositivos portables
Entre las unidades regulares, Dolphin también busca dispositivos portátiles, como smartphones, utilizando la API de dispositivos portátiles de Windows (WPD). Crea listas de directorios y exfiltra archivos. Esta funcionalidad parecía estar en desarrollo en la primera versión que encontramos, por varias razones:
- Confiar en una ruta hardcodeada con un nombre de usuario que probablemente no exista en la computadora de la víctima
- Falta de variable de inicialización: se supone que algunas variables se inicializaron en cero o se desreferenciaron, como punteros sin inicialización
- Falta de filtrado de extensiones
El código se basa en gran medida en la muestra de código de la API COM de dispositivos portátiles de Microsoft.
Además de la búsqueda automática, los operadores pueden especificar archivos individuales para exfiltrarlos de dispositivos portátiles.
En las versiones más recientes, esta capacidad se completó y mejoró al agregar el filtrado de extensiones. Por razones desconocidas, se eliminó el comando para recuperar archivos específicos de dispositivos portátiles.
Capturas de pantalla y keylogging
Dolphin registra las pulsaciones de teclado en ventanas con títulos que contienen substrings especificadas en su configuración. Los valores predeterminados son chrome e internet explore (sic). Esto se hace a través de la API GetAsyncKeyState, y las pulsaciones del teclado se registran junto con el nombre de la ventana y la hora actual. Las capturas de pantalla también se toman en un intervalo configurable; el valor predeterminado es una vez cada 30 segundos.
Las capturas de pantalla y el registro de las pulsaciones de teclado están habilitadas de forma predeterminada y se pueden alternar mediante un comando.
Shellcode
Dolphin puede recibir shellcode para su ejecución. La shellcode se almacena en el registro, bajo una de las siguientes claves:
- HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\Classic\<random_number>
- HKCU\Software\Microsoft\OneDrive\Update\<random_number>
- HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\HttpsSoftware\Microsoft\Internet Explorer\Zone\<random_number> (dos subclaves como una, probablemente un error a la hora de escribir el código)
Se puede ejecutar localmente o en un proceso separado específico que se crea e inyecta.
En las versiones más nuevas, la shellcode se almacena en archivos en lugar del registro, y la shellcode almacenada se carga y ejecuta en el inicio de Dolphin, lo que no era el caso en la versión 1.9 (la versión original que analizamos).
Comandos de Shell
Dolphin puede ejecutar comandos de shell; esto se hace a través de la API popen y la recuperación de la información de salida (output).
Robo de credenciales
Dolphin puede recuperar las credenciales almacenadas en los navegadores en forma de contraseñas y de cookies guardadas. Esto es posible en los siguientes navegadores:
- Chrome
- Edge
- Internet Explorer
En la versión 2.2 esta capacidad se eliminó, presumiblemente para evitar la detección. Posteriormente se restauró en la versión 3.0, pero de forma diferente. Ahora se recibe dinámicamente desde el C&C en forma de shellcode.
Cuenta de Google
Otro de los comandos de Dolphin modifica la configuración de la cuenta de Google a la que está conectada en ese momento, reduciendo la seguridad a través de modificaciones en la configuración predeterminada. Roba del navegador la cookie de la cuenta iniciada y elabora solicitudes que modifican la configuración.
En primer lugar, permite el acceso a Gmail a través del protocolo IMAP mediante el envío de una solicitud HTTP POST a:
- https://mail.google.com/mail/u/0/?ik=<GM_ID_KEY>&at=<GM_ACTION_TOKEN>&view=up&act=prefs
Luego, habilita el "acceso a aplicaciones menos seguro" al enviar una solicitud RPC no documentada a través de HTTP POST a:
- https://myaccount.google.com/_/AccountSettingsUi/data/batchexecute
Estas modificaciones se denominan “thunder access” en el backdoor, y probablemente se trate de una referencia al cliente de correo electrónico Thunderbird. Acceder a la bandeja de entrada de las víctimas mediante un cliente de terceros a través de IMAP probablemente ayude a los operadores de ScarCruft a mantener el acceso a los correos electrónicos de las víctimas después de robar las credenciales, lo que puede no ser suficiente por sí solo debido a la detección de intentos de inicio de sesión sospechosos por parte de Google.
Esta característica se encontró en las versiones 1.9 y 2.0 del backdoor, pero no está presente en las versiones 2.2 o 3.0.
Almacenamiento de datos
Dolphin exfiltra los datos al almacenamiento de Google Drive y los guarda en archivos ZIP cifrados antes de cargarlos. El backdoor también mantiene una lista de archivos en forma de hash MD5 para evitar cargar el mismo archivo varias veces. Esta lista se puede restablecer a través de un comando dedicado.
Configuración
El backdoor contiene una configuración predeterminada inicial que persiste en la primera ejecución y se carga en las ejecuciones posteriores. Se almacena en el archivo %ProgramData%\<variable_cfg_name>.inf, donde <variable_cfg_name> se selecciona aleatoriamente a partir nombres de archivo existentes que coinciden con %windir%\inf\*.inf. El contenido se cifra mediante AES CBC con claves aleatorias de 16 bytes y IV, que se almacenan al principio del archivo. La configuración utiliza el formato JSON, con claves tipo hash. En la Figura 3 se muestra un ejemplo de una configuración descifrada.
La configuración se puede modificar mediante comandos que contienen, entre otros, lo siguiente:
- Claves de cifrado
- Credenciales para el acceso a la API de Google Drive
- Títulos de ventana para registro de las pulsaciones de teclado
- Lista de extensiones de archivo para exfiltrar
Evolución de Dolphin
Desde el descubrimiento inicial de Dolphin en abril de 2021, hemos observado múltiples versiones de este backdoor en las que los actores de amenazas mejoraron las capacidades del backdoor e intentaron mejorar los mecanismos para evadir la detección. La Figura 4 resume las versiones que hemos observado. A continuación se proporciona una descripción más detallada de los cambios en cada versión.
Noviembre 2021 – versión 2.0
En la versión 2.0 introdujo los siguientes cambios respecto de la versión encontrada en abril de 2021:
- Resolución dinámica de API sospechosas en lugar de importaciones estáticas (por ejemplo, GetAsyncKeyState)
- Capacidad de Shellcode terminada y mejorada
- Shellcode persistente almacenada en archivos en lugar del registro
- Shellcode persistente cargada y ejecutada en el inicio de Dolphin (anteriormente faltaba)
- Capacidad de exfiltración de archivos de dispositivos portátiles terminada y mejorada
- Añadió exfiltración por extensiones
- Añadió reconocimiento de memoria interna y tarjetas SD (desde el ID del dispositivo)
- Detección de dispositivos/unidades y exfiltración de archivos mejorada
- Dolphin ahora crea incondicionalmente listados de directorios y exfiltra archivos por extensión cada 30 minutos para todas las unidades y dispositivos (unidades fijas, unidades extraíbles, dispositivos portátiles). Anteriormente, era solo para unidades extraíbles. Las unidades fijas estaban deshabilitadas de forma predeterminada y el código utilizado para acceder a los dispositivos portátiles tenía bugs y estaba roto.
Diciembre de 2021 – version 2.2
Los cambios introducidos en la versión 2.2 se centraron principalmente en la evasión de detección. Se eliminó la capacidad de robo de credenciales y los comandos relacionados con ella (los comandos de robo de credenciales y cuenta de Google). La mayoría de las strings en esta versión están cifradas en base64.
Enero de 2022 – version 3.0
En la versión 3.0, el código se reorganizó y las clases se renombraron, y las capacidades permanecieron sin cambios. Las strings cifradas en base64 en esta versión estaban de nuevo en texto sin formato. Observamos los siguientes cambios adicionales:
- Comando para robar credenciales restauradas en una forma diferente; ahora ejecuta la shellcode desde el C&C
- Comando para obtener archivos de los dispositivos portátiles eliminado
- El comando para obtener archivos de las unidades ahora se almacena en la configuración hasta que se complete. Si se interrumpe (por ejemplo, por el apagado de la computadora), se realiza en la próxima ejecución. Esto también es útil en el caso de unidades extraíbles que pueden no estar conectadas cuando se emite el comando.
- Se añade comprobación de conexión a Internet (https://www.microsoft.com); no se ejecuta ningún código malicioso si no hay conexión
Las diferencias entre las versiones 2.2 y 3.0, especialmente la discrepancia en la codificación de strings, sugieren que es probable que diferentes personas hayan trabajado de forma paralela en el desarrollo de las versiones.
Conclusión
Dolphin es la nueva incorporación al ya extenso arsenal de backdoors del grupo ScarCruft que abusan de los servicios de almacenamiento en la nube. Después de desplegarse en objetivos especialmente seleccionadas, busca archivos interesantes en las unidades de los sistemas comprometidos y los exfiltra a Google Drive. Una capacidad inusual que se encuentra en las primeras versiones de este backdoor es la capacidad de modificar la configuración de las cuentas de Google y Gmail de las víctimas para reducir su seguridad, presumiblemente para mantener el acceso a la cuenta para los atacantes. Durante nuestro análisis de las múltiples versiones de Dolphin, observamos un desarrollo continuo y una clara intención de evadir la detección.
Por cualquier consulta sobre la investigación publicada en WeLiveSecurity, contáctenos a threatintel@eset.com.
Indicadores de Compromiso
SHA-1 | Filename | ESET detection name | Description |
---|---|---|---|
F9F6C0184CEE9C1E4E15C2A73E56D7B927EA685B | N/A | Win64/Agent.MS | |
5B70453AB58824A65ED0B6175C903AA022A87D6A | N/A | Win32/Spy.Agent.QET | |
21CA0287EC5EAEE8FB2F5D0542E378267D6CA0A6 | N/A | Win64/Agent.MS | |
D9A369E328EA4F1B8304B6E11B50275F798E9D6B | N/A | Win32/Agent.UYO | |
2C6CC71B7E7E4B28C2C176B504BC5BDB687C4D41 | N/A | Win64/Agent.MS |
Técnicas de MITRE ATT&CK
Esta table fue creada utilizando la versión 12 del framework MITRE ATT&CK.
Tactic | ID | Name | Description |
---|---|---|---|
Initial Access | T1189 | Drive-by Compromise | ScarCruft uses watering-hole attacks to compromise victims. |
Execution | T1059.006 | Command and Scripting Interpreter: Python | The Dolphin loader a uses Python script. |
T1059.007 | Command and Scripting Interpreter: JavaScript | ScarCruft used malicious JavaScript for a watering-hole attack. | |
T1203 | Exploitation for Client Execution | ScarCruft exploits CVE-2020-1380 to compromise victims. | |
T1106 | Native API | Dolphin uses Windows API functions to execute files and inject processes. | |
Persistence | T1053.005 | Scheduled Task/Job: Scheduled Task | Dolphin uses a temporary scheduled task to start after installation. |
T1547.001 | Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder | Dolphin uses Run keys for persistence of its loader. | |
Defense Evasion | T1055.002 | Process Injection: Portable Executable Injection | Dolphin can inject into other processes. |
T1027 | Obfuscated Files or Information | Dolphin has encrypted components. | |
Credential Access | T1555.003 | Credentials from Password Stores: Credentials from Web Browsers | Dolphin can obtain saved passwords from browsers. |
T1539 | Steal Web Session Cookie | Dolphin can obtain cookies from browsers. | |
Discovery | T1010 | Application Window Discovery | Dolphin captures the title of the active window. |
T1083 | File and Directory Discovery | Dolphin can obtain file and directory listings. | |
T1518.001 | Software Discovery: Security Software Discovery | Dolphin obtains a list of installed security software. | |
T1082 | System Information Discovery | Dolphin obtains various system information including OS version, computer name and RAM size. | |
T1016 | System Network Configuration Discovery | Dolphin obtains the device’s local and external IP address. | |
T1016.001 | System Network Configuration Discovery: Internet Connection Discovery | Dolphin checks internet connectivity. | |
T1033 | System Owner/User Discovery | Dolphin obtains the victim’s username. | |
T1124 | System Time Discovery | Dolphin obtains the victim’s current time. | |
Collection | T1056.001 | Input Capture: Keylogging | Dolphin can log keystrokes. |
T1560.002 | Archive Collected Data: Archive via Library | Using the Zipper library, Dolphin compresses and encrypts collected data before exfiltration. | |
T1119 | Automated Collection | Dolphin periodically collects files with certain extensions from drives. | |
T1005 | Data from Local System | Dolphin can collect files from local drives. | |
T1025 | Data from Removable Media | Dolphin can collect files from removable drives. | |
T1074.001 | Data Staged: Local Data Staging | Dolphin stages collected data in a directory before exfiltration. | |
T1113 | Screen Capture | Dolphin can capture screenshots. | |
Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | Dolphin uses HTTPS to communicate with Google Drive. |
T1102.002 | Web Service: Bidirectional Communication | Dolphin communicates with Google Drive to download commands and exfiltrate data. | |
Exfiltration | T1020 | Automated Exfiltration | Dolphin periodically exfiltrates collected data. |
T1567.002 | Exfiltration Over Web Service: Exfiltration to Cloud Storage | Dolphin exfiltrates data to Google Drive. |