Os especialistas da ESET falaram sobre o novo malware que visa clusters de HPC em todo o mundo. É interessante por vários motivos. Apesar do tamanho relativamente pequeno da base de código (as amostras analisadas tinham 25 KB), o malware é complexo o suficiente para realizar ataques em Linux, BSD e Solaris e, potencialmente, pode ser adequado para ataques em AIX e Microsoft Windows . Outra característica distintiva é a capacidade de transformar servidores infectados em novos C&C ao comando do operador. Devido aos muitos truques e ao pequeno tamanho do código, os pesquisadores o chamaram de Kobalos - em homenagem aos travessos espíritos da Grécia Antiga que uma vez roubaram Hércules e adoravam enganar e assustar as pessoas.
O estudo publicado por especialistas descreve os vetores iniciais estimados de mecanismos de comprometimento, autenticação e distribuição, funções integradas e fornece uma análise técnica do código malicioso. Em seguida, os especialistas apontam os sinais de comprometimento e os métodos aplicados do MITER ATT & CK.
Tínhamos a ideia de que pessoas que dominam mal o inglês, mas não são indiferentes às pesquisas atuais na área de segurança da informação, em particular, à análise de malware, seriam interessantes e úteis para traduzir a análise deste, em nossa opinião, malware incomum.
A ESET Research analisou Kobalos, um malware anteriormente desconhecido, complexo e multiplataforma projetado para rodar em Linux, FreeBSD e Solaris. Dado que as vítimas são principalmente organizações bem conhecidas, não há dúvida de que foram alvo do software. Quando implantado, o Kobalos dá acesso ao sistema de arquivos do host comprometido e ao terminal remoto, permitindo que os invasores executem comandos arbitrários.
Kobalos tem capacidades de rede notáveis. Ele pode funcionar tanto no modo passivo quanto como um bot, conectando-se ativamente aos seus servidores C&C. É curioso que esses próprios servidores tenham sido comprometidos por Kobalos: o código para seu uso está em todas as amostras desse malware.
Por meio de uma extensa pesquisa de rede, a ESET Research foi capaz de identificar e notificar as vítimas de Kobalos. Não se sabe quando este software foi desenvolvido, mas sua primeira atividade conhecida, confirmada por uma vítima, foi registrada no final de 2019. O grupo de invasores que comanda o Kobalos continuou ao longo de 2020. As técnicas de ataque do Linux continuam a evoluir e os autores de malware se esforçam muito para melhorar seus designs. Kobalos é um desses programas.
Principais conclusões
- Kobalos é um backdoor multiplataforma que roda em Linux, FreeBSD e Solaris. Há indícios de que esse software pode existir no AIX e até no Windows.
- Kobalos , , , -. Kobalos , .
- Kobalos , .
- Kobalos C&C- . , .
- OpenSSH. Kobalos.
- Kobalos. , , - . , SSH.
Se você acompanhou a ESET Research nos últimos anos, deve ter notado que preferimos pesquisar e documentar malware do lado do servidor desenvolvido para Linux e outros sistemas operacionais menos comuns. Um dos primeiros relatórios é dedicado à Operação Windigo e descreve várias famílias de software que trabalham juntas para redirecionar o tráfego da Internet, enviar spam e outras atividades maliciosas. A Operação Windigo é baseada no Ebury, um backdoor OpenSSH que rouba credenciais. Ebury pode comprometer o cliente e servidor SSH sem modificar os executáveis OpenSSH. Em vez disso, ele modifica a biblioteca que estão carregando e corrige as funções para poder iniciar e roubar credenciais após carregar o backdoor. A tarefa não é fácil, mas os autores de Ebury conseguiram resolvê-la.
Após a Operação Windigo, descobrimos e descrevemos vários outros malwares no Linux, como Mumblehard , Moose , Shishiga , e também descrevemos dezenas de backdoors para OpenSSH em O lado negro do relatório ForSSHe .
Até agora, não encontramos malware para Linux que fosse tão difícil de analisar quanto o Ebury. Mas desta vez a situação é diferente: ao contrário de Ebury, as ações de Kobalos não parecem tão em grande escala. O número de carros comprometidos por eles é da ordem das dezenas e, no caso da Ebury, dezenas de milhares. Este artigo fornece uma análise técnica completa de Kobalos, os alvos dos invasores e indicadores de comprometimento que podem ajudar as vítimas em potencial a encontrar malware e se livrar dele.
Vítimas
Depois de analisar o malware, a ESET conduziu uma extensa varredura na Internet em busca de vítimas de Kobalos. Estávamos procurando por um comportamento backdoor específico, caracterizado pelo estabelecimento de uma conexão TCP com um host comprometido de uma porta de saída específica.
Dada a complexidade deste software, ficamos surpresos com o número muito pequeno de vítimas encontradas. No entanto, os objetivos em si claramente não foram escolhidos por acaso: são computadores de alto desempenho (HPC) e servidores que fazem parte de redes científicas e de pesquisa. Um desses computadores tinha pelo menos 512 GB de RAM e quase um petabyte de armazenamento em disco. Também encontramos outras organizações de vítimas bem conhecidas, como um fornecedor de segurança de endpoint (não nós!).
Figura 1. Indústrias e regiões às quais pertencem as organizações comprometidas.
Em algumas organizações, vários servidores foram infectados ao mesmo tempo. Notificamos todas as vítimas que encontramos e trabalhamos juntos para remover o malware. Obrigado a todos que responderam e compartilharam informações que nos ajudaram neste estudo.
Vetor inicial de compromisso
Não sabemos em primeira mão como os sistemas foram comprometidos para que os invasores pudessem obter acesso administrativo para instalar o Kobalos. Podemos apenas especular com base nas evidências coletadas.
Nas máquinas comprometidas cujos administradores de sistemas participaram da investigação, descobrimos que o programa de roubo de credenciais SSH foi apresentado como um cliente OpenSSH Trojanized. Arquivo
/usr/bin/ssh
foi substituído por um executável modificado que registrava o nome de usuário, a senha, o nome do host de destino e os salvava em um arquivo criptografado. Portanto, acreditamos que o roubo de identidade foi uma das formas de distribuição de Kobalos. Isso também pode explicar por que muitas redes acadêmicas foram comprometidas: se algum cliente SSH for usado por alunos ou pesquisadores de várias universidades, as credenciais de todos esses sistemas de terceiros podem ser roubadas.
Outro ponto de entrada possível pode ser a exploração de uma vulnerabilidade conhecida: algumas máquinas comprometidas estavam executando sistemas operacionais e aplicativos antigos, sem suporte ou sem patch, portanto, a opção de usar um exploit conhecido é mais provável. Mas você também não deve excluir a possibilidade de usar uma vulnerabilidade atualmente desconhecida.
Ataque em redes para computação de alto desempenho
A ESET compartilhou informações com organizações que desempenham um papel importante na resolução de incidentes em sistemas acadêmicos e de pesquisa, como a Equipe de Segurança de Computadores do CERN. Eles confirmaram que, do final de 2019 a meados de 2020, a comunidade HPC foi atingida por uma onda de três ataques diferentes, alguns dos quais anunciados publicamente .
Depois de muitos meses de investigação, ainda não está claro se essas três ondas estavam relacionadas entre si ou se foi apenas uma coincidência inesperada. Os operadores de malware usaram diferentes táticas, técnicas e níveis de dificuldade. Por outro lado, é estranho que em diferentes ataques alguns endereços IP coincidam.
- A primeira onda usou Kobalos, que é descrito neste estudo.
- A segunda onda se concentrou na mineração de criptomoedas com um conjunto de ferramentas muito diferente.
- A terceira onda foi a maior, mas sua carga útil ainda não foi determinada.
Sinais indiretos de comprometimento como resultado da segunda e terceira ondas foram descritos pela Equipe de Resposta a Incidentes de Segurança de Computadores da Infraestrutura de Rede Europeia na forma dos incidentes # EGI20200421 e # EGI2020512 .
Não está claro por que a comunidade HPC é dominante entre as vítimas desses ataques. Os HPCs são interessantes, é claro, mas geralmente são mais difíceis de penetrar do que outros servidores de P&D. Por meio de um processo de resposta a incidentes distribuído com base na comunidade, o CERN e outras equipes envolvidas identificaram uma série de arquiteturas desatualizadas e práticas de segurança abaixo do ideal que desempenharam um papel fundamental na proliferação de ataques. Além disso, a maioria das vítimas da comunidade HPC estava mal equipada para conduzir investigações, especialmente em termos de monitoramento da atividade do sistema.
Crítica de Kobalos
Kobalos tem vários recursos para acessar sistemas comprometidos e ocultar rastros de seu uso.
Acesso a sistemas comprometidos
Primeiro, o Kobalos fornece comandos gerais para leitura e gravação no sistema de arquivos, bem como para iniciar um terminal e executar comandos arbitrários. Infelizmente, não há carga útil específica no programa que sugira as intenções dos autores. Provavelmente, os operadores executam um shell de comando por meio do terminal e executam os comandos de que precisam.
Disponibilidade
Em segundo lugar, o Kobalos possui uma série de recursos que permitem estabelecer uma conexão de rede entre as operadoras e o malware que está sendo executado. O software fornece sua acessibilidade externa de várias maneiras:
- Abre uma porta TCP e aguarda uma conexão de entrada (esse modo às vezes é chamado de backdoor passiva).
- Conecta-se a outra instância Kobalos que está configurada como um servidor C&C.
- Aguardando conexões com um serviço legítimo já em execução, saindo de uma porta TCP específica.
O último método requer a substituição do serviço em execução por outro que contenha o código Kobalos. Em todos os casos em que observamos o uso desse método, os invasores tiveram que modificar o servidor OpenSSH em execução. O arquivo foi
sshd
completamente substituído, para que o programa continuasse a funcionar mesmo quando o serviço ou sistema fosse reiniciado.
Autenticação e criptografia de rede
Terceiro, para executar o backdoor, você precisa autenticar seus clientes, que devem ter uma chave RSA-512 privada e uma senha. Após verificá-los, Kobalos gera e criptografa duas chaves de chave pública de 16 bytes usando o algoritmo RSA-512 e as envia aos invasores. Essas duas chaves são usadas para criptografia RC4 do tráfego de entrada e saída subsequente.
Mudança de porta
Em quarto lugar, durante a autenticação, o operador pode continuar a interagir em outra conexão TCP. Mediante solicitação, Kobalos pode começar a escutar a porta desejada e transferir todas as comunicações subsequentes para ela. Os dados que passam por este canal são criptografados usando chaves RC4 que foram criadas durante a autenticação.
Proxy para outras máquinas comprometidas
Quinto, o Kobalos pode ser usado como um proxy para se conectar a outros servidores comprometidos. Este não é um proxy TCP comum: requer encapsulamento de dados em pacotes especiais, e também suporta a mudança de porta acima: para isso, é enviado um comando que "muda" a conexão.
Os proxies podem ser encadeados, o que significa que os operadores podem usar várias máquinas Kobalos comprometidas para se conectar aos servidores de destino.
Um conjunto de possibilidades
Figura 2. Visão geral dos recursos do Kobalos e possíveis cenários para acessar servidores comprometidos.
O primeiro cenário é a conexão direta com servidores comprometidos para acessar seus recursos. No diagrama, o backdoor é executado dentro do processo do servidor OpenSSH e espera que a conexão tenha uma porta de origem. O operador deve usar a porta TCP de origem correta para se comunicar com a porta dos fundos.
O segundo cenário é indiscutivelmente o mais desafiador, mas vem com as características exclusivas dos Kobalos. O operador pode executar o servidor C&C a partir de qualquer servidor que execute este software. Nenhum código adicional é necessário para isso, todas as funcionalidades já estão integradas. Após seu lançamento, o servidor C&C verifica a lista de bots conectados e o operador pode se conectar a qualquer um deles. O último nó requer autenticação e reforça a criptografia de ponta a ponta usando a troca de chaves RC4. Para garantir tal esquema de trabalho, a instância Kobalos no servidor B deve ter o endereço IP e a porta do servidor C&C em execução no servidor A. O servidor B troca tráfego apenas com o servidor A, ocultando o endereço IP da operadora.
No terceiro cenário, o Servidor A é usado como proxy da conexão ao Servidor C. Isso também aplica a autenticação e a criptografia ponta a ponta forçada. O operador pode definir a porta de origem ao se conectar do Servidor A a C. Isso significa que o Servidor A pode ser usado para se conectar a instâncias Kobalos que estão esperando por uma conexão de uma porta específica.
Análise Técnica Kobalos
Pela primeira vez, analisamos um servidor OpenSSH trojanizado. O tamanho do código malicioso e dos dados do Kobalos é bem pequeno: cerca de 25 KB para amostras x86-64. Curiosamente, todo o código é compactado em uma função. Existe apenas uma chamada para esta função no código OpenSSH legítimo.
Kobalos é um software complexo. Obviamente, seus desenvolvedores colocaram muito esforço em sua criação. Os autores implementaram vários recursos e implementaram sua própria ofuscação.
Ofuscação
Achatamento excepcional do fluxo de controle
O fato de o código se encaixar em uma função não significa que o fluxo de controle seja linear. Kobalos chama recursivamente sua função para realizar as subtarefas necessárias.
Figura 3. Gráfico de fluxo de controle de Kobalos.
O primeiro parâmetro da função é a ação a ser executada. Kobalos pode realizar 37 ações. Eles estão listados no apêndice Kobalos Built-in Features , que o ajuda a analisar as versões atuais e provavelmente futuras deste software. A função também serve como um manipulador de sinais
SIGCHLD
para encerrar normalmente o processo filho e
SIGALRM
lidar com o tempo limite de conexão.
No que diz respeito ao código-fonte do Kobalos, pode ser como compilar o código C abaixo. Parte da conversão pode ser automatizada pela função embutida pelo compilador, mas atribuindo identificadores numéricos a todas as funções e manipulando o mesmo número de argumentos nas funções requer trabalho manual ou ferramentas especiais.
| Antes de | Depois de |
|---|---|
|
|
Figura 4. Este código C mostra a aparência do código-fonte do Kobalos após o alinhamento do fluxo de controle.
Valores de string criptografados
O código e os dados do Kobalos não contêm valores de string de texto simples. Apenas algumas sequências curtas criptografadas com RC4 são usadas aqui. Eles são descriptografados imediatamente após a interação inicial com o programa, mas antes da autenticação. Para todas as amostras que analisamos, uma chave é usada -
AE 0E 05 09 0F 3A C2 B5 0B 1B C6 E9 1D 2F E3 CE
.
Valores de string decodificados:
- % WL
- / dev / ptmx
- ptem
- ldterm
- ttcompat
- / dev / tty
- % s
- % d
- /
- \
- % d.% d
- win3.11
- win95
- winNT
- ganhar ??
- \\. \ pipe \ 2
- % s% s.% s
- / dev / ptc
Nas amostras de Kobalos que analisamos, apenas os valores em negrito (1 e 6-9) são usados. Outros não são mencionados, embora possam ser usados em algumas outras versões. Em particular:
- As linhas 10 e 12-16 parecem ser específicas do Windows.
- A linha 18 é o caminho para o driver de dispositivo do pseudoterminal no AIX.
- As linhas 3-5 são usadas por chamadas de sistema de pseudo-terminal do Solaris.
Não podemos excluir a opção de tentar desinformar os pesquisadores sobre a existência de versões para outros sistemas operacionais. Dado que confirmamos o suporte para três sistemas operacionais, não será nenhuma surpresa se houver mais. Por outro lado, o Windows 3.11 e o Windows 95 têm mais de 25 anos. Existem versões do Kobalos para esses sistemas legados?
Opondo-se a uma investigação
Depois de autenticado, algumas técnicas são aplicadas ao processo backdoor para impedir a investigação:
- O valor
RLIMIT_CORE
é limpo para evitar que um dump do kernel seja gerado no caso de uma falha do processo. - A maioria dos sinais são ignorados para dificultar a interrupção do processo.
Figura 5. Kobalos evita dumps do kernel no travamento e ignora a maioria dos sinais.
É importante notar que a configuração
RLIMIT_CORE
não atrapalha em despejar o processo manualmente, por exemplo, usando
gcore
gdb. Este limite é usado pelo kernel para determinar o tamanho máximo de um despejo de memória quando um processo falha.
Carimbos de tempo
Uma análise do sistema de arquivos dos servidores comprometidos mostrou que, após a configuração, os carimbos de data / hora dos arquivos substituídos (como
ssh
para adicionar um módulo de roubo de credencial ou
sshd
para implantar o Kobalos) são adulterados para evitar suspeitas.
Configuração
Kobalos tem uma configuração estática que ativa ou desativa as funções do software. A Tabela 1 lista os campos que consideramos fazer parte da configuração. A Figura 6 mostra um exemplo do mundo real.
Tabela 1. Estrutura da configuração estática Kobalos:
| Tamanho (bytes) | Descrição |
|---|---|
| 2 | Provavelmente um número de versão. Transmitido na autenticação bem-sucedida. Em todas as amostras encontradas, isso faz diferença 0xB03
(considerando que é transmitido no formato do mais alto para o mais baixo, como todos os outros dados Kobalos). |
| 320 | Módulo de chave pública RSA. Criptografado em um formato binário especial. |
| 2 | Porta TCP para escutar. Se definido como zero, Kobalos não escutará nas portas, mas usará outros métodos para esperar por uma conexão com a porta dos fundos. |
| 2 | C&C-, . , — . |
| 2 | . ( ) ( ). |
| 4 | IP- C&C- . Kobalos . |
| 2 x 16 | TCP-, C&C-. |
| 16 | MD5- , . |
Figura 6. Amostra de configuração da amostra Kobalos embutida no sshd.
Algumas das configurações serão diferentes se o Kobalos for executado internamente
sshd
ou como um arquivo executável separado. No último caso, o endereço do servidor C&C remoto (
remote_c2_addr
) ou a porta de escuta (
listen_port
) é necessário .
Implantação e preservação
Se o Kobalos for implantado para ser executado como parte de um servidor OpenSSH, o arquivo
sshd
deve ser recompilado para adicionar código malicioso. Comparamos a versão Trojanizada do OpenSSH e aquela que deve ser instalada no sistema, por exemplo, a partir do gerenciador de pacotes. Parece que o operador está compilando o Kobalos com base na fonte correta do OpenSSH já instalada no servidor. O executável infectado provavelmente será compilado na máquina da vítima antes de substituir o original. Provavelmente, tal esquema foi escolhido para garantir a segurança do software, evitando incompatibilidades de versão, devido às quais a incompatibilidade da biblioteca pode surgir.
Deve-se notar que para substituir
sshd
precisa de privilégios de root. No entanto, existem versões do Kobalos como arquivos separados que se conectam ao servidor C&C ou ouvem na porta TCP. Você não precisa de privilégios de administrador para executá-los, mas o acesso ao sistema de arquivos e ao conjunto de comandos será limitado pelo nível de acesso do usuário atual.
Interação de backdoor
Conexão backdoor
Uma das características notáveis do Kobalos é a flexibilidade no estabelecimento de conexões entre operadoras e hosts comprometidos. Isso pode ser feito de três maneiras:
- Ouvindo a porta TCP especificada (modo passivo).
- Conectando-se ao servidor C&C (modo ativo) e aguardando que a operadora se conecte através deste servidor.
- Substituindo o serviço existente que escuta nas portas TCP e esperando por uma conexão de uma porta TCP de origem específica.
Usando a configuração estática do Kobalos, vários métodos podem ser ativados ao mesmo tempo, porém, em cada amostra que analisamos, apenas um foi ativado.
O último método requer a modificação do daemon executável. A versão trojanizada chama o código Kobalos toda vez que aceita uma nova conexão TCP, conforme mostrado na Figura 7. O backdoor pode aceitá-la se a conexão vier de uma porta TCP específica. Se o número da porta corresponder, a função não retornará nada e o subprocesso será encerrado quando a conexão for fechada. Se a porta não corresponder à prescrita, o programa não faz nada e transfere o trabalho para o código do serviço legítimo, que continua a funcionar corretamente.
Figura 7. Chamando uma função de uma função OpenSSH trojanizada após aceitar uma nova conexão TCP. Este é o que vimos mais e só foi abusado pelo servidor OpenSSH. No entanto, os dados podem estar errados, porque esta é a forma que pudemos detectar ao fazer uma varredura na Internet. Conforme mostrado na Figura 8, Kobalos está escutando na porta TCP 55201.
kobalos
main
Figura 8. Comparação da porta de origem com 55201.
Kobalos implementa um método adicional para filtrar conexões TCP de entrada, comparando a porta de origem com uma lista de 16 portas:
Figura 9. Comparação de uma porta de origem com uma lista de 16 portas.
Lista de 16 portas:
| vinte | 567 | 2734 | 22392 |
| 21 | 982 | 5392 | 33921 |
| 53 | 1821 | 11568 | 44983 |
| 230 | 1912 | 19678 | 55201 |
No entanto, nenhuma das amostras encontradas usou este filtro. Pode ter sido usado em uma versão anterior da porta dos fundos.
Autenticação
Depois que a conexão é estabelecida, a autenticação é executada. Para trabalhar mais, você precisa de uma chave RSA privada e uma senha de 32 bytes. O cliente Kobalos envia um pacote inicial de 320 bytes para o servidor infectado, cuja estrutura é descrita na Tabela 2.
Tabela 2. A estrutura do pacote de autenticação (criptografado usando a chave RSA privada) :
| Tamanho (bytes) | Descrição | Valor |
|---|---|---|
| quatro | Parâmetro misterioso | 0x7FFF000A
|
| 2 | Porta de ligação | Se 0x0000
, então, Kobalos escolhe uma porta aleatória.Se 0xFFFF
, então ele usa uma conexão TCP existente. |
| 1 | Identificador de canal de comunicação | Parece estar sempre definido como 0xFF
. |
| 32 | Senha | O valor da senha corresponde ao hash MD5 na configuração estática. |
| 280 | Enchimento |
Os primeiros 64 bytes do pacote são descriptografados usando o módulo e expoente de chave pública RSA-512 configurados
0x10001
(consulte a Figura 11). Em seguida, conforme mostrado na Figura 10, o hashing MD5 é aplicado à senha de 32 bytes e o resultado é comparado com as informações da configuração estática.
Figura 10. Após receber 320 bytes, a autenticação é realizada.
Figura 11. Carregando uma chave pública RSA-512.
Usando a chave RSA pública, Kobalos criptografa e define as chaves RC4 que são usadas para comunicação posterior: uma para o tráfego de entrada, outra para o tráfego de saída. Kobalos envia chaves criptografadas em sua resposta.
Tabela 3. Estrutura da resposta de Kobalos (criptografada com chave pública RSA) :
| Tamanho (bytes) | Descrição | Valor |
|---|---|---|
| quatro | Parâmetro misterioso | 0x7FFF000A
|
| 16 | Chave RC4 para tráfego de entrada | Chave RC4 usada para tráfego para o host comprometido. |
| 16 | Chave RC4 para tráfego de saída | Chave RC4 usada para tráfego de um host comprometido. |
| 2 | Porto vinculado | Porta TCP usada como canal ativo. O valor 0xFFFF
significa o uso da conexão atual. |
| 282 | Enchimento |
Canal ativo
Depois de passar pela autenticação, o canal ativo pode usar uma porta diferente. Você deve ter notado que, com a autenticação do cliente, é necessário fornecer uma "porta de ligação" na mensagem criptografada.
- Se seu valor for diferente de
0xFFFF
, então Kobalos começará a escutar a porta TCP especificada. - Se o valor for zero, a porta dos fundos começará a escutar uma porta aleatória acima de 1024.
Conforme mencionado acima, na resposta de autenticação, junto com o par de chaves RC4, o número da porta recém-aberta é transmitido. Se desejar, uma conexão TCP adicional pode ser criada: se um valor for transmitido como a porta de ligação
0xFFFF
, a conexão atual será usada.
A comunicação subsequente por meio dessas conexões TCP é encapsulada em pacotes, cujo formato é descrito na Tabela 4.
Tabela 4. Estrutura do pacote Kobalos :
| Tamanho (bytes) | Valor |
|---|---|
| 1 | Significado misterioso ( 0x7F
) |
| 2 | Carga útil |
| 1 | Identificador do canal de comunicação. |
| 1 | Identificador do canal de comunicação. |
| payload_size | Carga útil (criptografada com RC4). |
Kobalos é o primeiro a enviar o pacote à operadora conectada. O pacote contém informações básicas sobre a máquina, como o nome do host e a versão do kernel. A Figura 12 mostra os níveis de encapsulamento em um pacote.
Figura 12. Informações enviadas ao operador de um host comprometido.
A Figura 13 mostra os processos de comunicação entre a Kobalos e seu cliente.
Figura 13. Diagrama de sequência do protocolo de rede Kobalos.
Gerenciamento de backdoor
Após a autenticação, o operador pode emitir comandos diferentes para a porta dos fundos. Nós os dividimos em categorias:
- Conecte-se a outros servidores infectados com Kobalos e atue como um proxy.
- Ler e gravar quaisquer arquivos no sistema de arquivos.
- Iniciar e acessar um pseudo-terminal em um host comprometido.
- Lançar e gerenciar servidores Kobalos C&C com acesso a bots conectados.
Os comandos são encapsulados no canal ativo. Eles começam com um byte de identificação, seguido pelos parâmetros que são analisados por este comando. Os comandos descritos neste trabalho são processados por Kobalos, ou seja, o operador os envia para o sistema comprometido através de um cliente especial. Kobalos responde no mesmo formato, com o primeiro byte identificador, e as respostas são processadas pelo mesmo cliente. Por exemplo, após a autenticação, o comando "send host information" (
0x04
) pode ser dado .
Usando como proxy
Os operadores podem usar o Kobalos instalado na máquina comprometida para se conectar a outras instâncias da porta dos fundos em outros sistemas. O modo proxy usa o tamanho de pacote especial descrito acima para autenticação e encapsulamento, ou seja, não é um proxy TCP normal.
Ao conectar-se a uma máquina de terceiros, o operador pode selecionar a porta TCP de origem. Isso permite que você se conecte a instâncias Kobalos que estão esperando por uma conexão de uma porta específica. Também é possível reconectar o canal ativo por meio de uma porta alternativa. Para isso, um comando especial é dado.
Uma das tarefas neste caso é garantir um certo nível de anonimato do operador. O nó final vê apenas o endereço IP da outra máquina comprometida, não o endereço IP do operador. Para ocultar ainda mais o endereço do operador, você pode criar cadeias de máquinas proxy comprometidas. A Figura 14 mostra esse cenário.
Figura 14. Kobalos está sendo usado como proxy.
Os comandos de controle de proxy são descritos na Tabela 5.
Tabela 5. Comandos para usar Kobalos como um proxy :
| Comando | Descrição | Opções |
|---|---|---|
| 0x01 | Estabelecendo uma conexão com outro host comprometido por Kobalos. | Endereço remoto. Porta de origem. Porta final. Mensagem de autenticação (320 bytes). |
| 0x03 | . , TCP-. | . |
| 0x05 | . |
Após a autenticação, o operador pode ler ou gravar qualquer arquivo no sistema. No protocolo de rede Kobalos, a carga útil encapsulada é definida usando um inteiro de 16 bits. Isso significa que o operador só pode enviar pacotes de 64K. Por exemplo, se ele deseja gravar 200 KB em um arquivo, ele terá que executar quatro comandos de gravação bem-sucedidos. O comando de leitura tem uma limitação ainda mais restrita: apenas 1000 bytes podem ser lidos e enviados por vez.
A Tabela 6 descreve os comandos para trabalhar com o sistema de arquivos.
Tabela 6. Comandos para leitura e gravação de arquivos :
| Comando | Descrição | Opções |
|---|---|---|
| 0x18 | Abrindo um arquivo para escrita; caso contrário, o arquivo é criado. | Posição de pesquisa. O caminho para o arquivo. |
| 0x1A | Gravando em um arquivo. | Dados para escrever. Eles serão substituídos na posição de pesquisa. |
| 0x1C | Fechando o arquivo após a gravação. | |
| 0x1D | Abrindo e lendo um arquivo. | Posição de pesquisa. O caminho para o arquivo. |
| 0x20 | Fechando o arquivo após a leitura. |
Criação de um pseudoterminal
Essa funcionalidade permite que um operador autenticado crie um shell em um novo pseudoterminal e execute comandos arbitrários. Para fazer isso, use os comandos da Tabela 7.
Tabela 7. Comandos para criar e gerenciar pseudoterminais :
| Comando | Descrição | Opções |
|---|---|---|
| 0x12 | Lançamento de um novo pseudo-terminal. | O caminho para o shell (por exemplo /bin/sh
). Argumento. |
| 0x0D | Especifica o tamanho da janela do pseudo-terminal. | Valores de estrutura winsize
aceitos por TIOCSWINSZ . |
| 0x14 | Fechando um pseudo-terminal. | |
| 0x16 | Escrevendo em um pseudo-terminal. | Dados para escrever. |
Os dados do terminal são enviados aos operadores e, após os dados, vem o identificador do comando de fechamento
0x17
. É implementado no cliente que as operadoras utilizam.
Use como um servidor C&C
Uma das características mais incomuns do Kobalos é que o código do servidor C&C já está embutido na própria porta dos fundos. Isso permite que os invasores transformem qualquer máquina infectada em servidores C&C (para outros bots) com um único comando. Após iniciar o servidor, o operador pode definir seu endereço IP e porta nas configurações de futuras instâncias Kobalos que serão implantadas em outros hosts. Isso permite:
- Use recursos comprometidos como servidores C&C, em vez de alugar servidores de fornecedores regulares. Isso reduz a probabilidade de indisponibilidade do servidor.
- Use o servidor C&C como um nó intermediário para máquinas protegidas por firewalls com as quais não há conexão direta da Internet.
Quando o operador envia um comando "transição para o modo C&C" (
0x21
) , o número da porta é passado como parâmetro. Kobalos começa a ouvi-lo e os bots usam essa porta para se conectar à instância do servidor C&C. No entanto, a porta dos fundos também escuta no próximo número de porta superior. Por exemplo, se os bots usam a porta TCP 7070, no modo C&C Kobalos também escuta na 7071. A segunda porta é usada pelo operador para controlar as funções C&C, como listar bots e estabelecer túneis para eles. O diagrama é mostrado na Figura 15.
Figura 15. O operador Kobalos chama bots que se reportaram ao servidor C&C.
A Tabela 8 descreve os comandos para controlar os recursos do servidor C&C.
Tabela 8. Comandos para controlar as funções do servidor C&C :
| Comando | Descrição | Opções |
|---|---|---|
| 0x21 | Lançamento do servidor C&C. | Porta TCP para servidor C&C. |
| 0x23 | Obtenha o número de conexões ativas e o total desde o início do C&C. | |
| 0x25 | Lista de todos os bots prontos para executar comandos. | |
| 0x29 | Desconectando o servidor C&C. | |
| 0x2B | Conecte-se ao bot. | Índice de bot da lista de bots prontos para se conectar. Mensagem de autenticação (320 bytes). |
| 0x2D | Conectando-se a um bot sem autenticação. | Índice de bot da lista de bots prontos para se conectar. |
Comandos
0x23
-
0x2D
processados pelo subprocesso do servidor C&C. Conforme mostrado na Figura 16, após serem enviados em um canal ativo, os dados são redirecionados por TCP para a interface de loopback da porta de controle (um a mais do que o número de porta usado pelos bots) do servidor C&C.
Figura 16. Pacotes relacionados ao gerenciamento do servidor C&C são encaminhados por TCP para um subprocesso.
Outros comandos
Variáveis ambientais
Para o processo backdoor, existe um comando para definir as variáveis de ambiente. Ele pega uma string como parâmetro e simplesmente a passa para putenv , que espera dados no formato "VAR = valor".
Tabela 9. Outros comandos que Kobalos entende :
| Comando | Descrição | Opções |
|---|---|---|
| 0x0E | Define a variável de ambiente para a sessão. | String para passar putenv
. |
Operações vazias
Existem mais dois comandos implementados, mas eles não fazem nada. Temos duas explicações para isso:
- Os autores removeram a funcionalidade dos comandos porque eram usados em versões anteriores e não são mais necessários.
- Os comandos são específicos da plataforma e não se aplicam às versões Linux e FreeBSD do Kobalos que analisamos.
Figura 17. Equipes e não fazer nada. A segunda explicação parece mais provável porque sabemos os valores de string para Solaris, AIX e Windows (consulte o capítulo Valores de string criptografados).
0x07
0x09
Programa de roubo de credenciais OpenSSH
Na maioria dos sistemas comprometidos por Kobalos, o backdoor também implantou um programa para roubar credenciais SSH por meio de um cliente SSH Trojanized. Encontramos diferentes versões desses arquivos, incluindo Linux e FreeBSD. Ao contrário de Kobalos, as capacidades deste programa dificilmente foram ofuscadas. Sua principal função é roubar o nome do host, o número da porta, o nome de usuário e a senha para estabelecer uma conexão SSH de um host comprometido. Os dados são salvos em um arquivo criptografado. As versões mais recentes do Trojan também podem transmitir informações pela rede via UDP, mas esse recurso não foi ativado na configuração da maioria das amostras encontradas.
Mas no momento da publicação de nosso estudo anterior sobre backdoors do OpenSSH "O lado negro do ForSSHE", não sabíamos sobre este Trojan, então ele não é mencionado naquele trabalho. Também não podemos vinculá-lo a nenhum dos programas de roubo de credenciais do OpenSSH descritos em fontes abertas.
A localização do arquivo de dados roubados depende da versão do programa. Todas as amostras criaram um
/var/run
arquivo com a extensão .pid no diretório . Ele é usado em muitos dos arquivos neste diretório. Você pode ver exemplos de nomes de arquivo e caminhos para eles a partir de diferentes exemplos no capítulo "Sinais de compromisso".
Todas as amostras encontradas criptografam o conteúdo dos arquivos usando uma cifra simples. Conforme mostrado na Figura 18, o Trojan simplesmente adiciona 123 a cada byte de dados que armazena.
Figura 18. Criptografando e gravando credenciais SSH roubadas no arquivo.
A versão do FreeBSD usa o mesmo formato e cifra. No entanto, eles são implementados de forma um pouco diferente, por exemplo, no programa, o caminho para o arquivo é criptografado usando um XOR de byte único.
Família de programas em desenvolvimento
Depois de notificarmos uma das organizações vítimas, eles descobriram o que parece ser uma versão mais recente de um cavalo de Tróia para roubo de credenciais. Ele contém uma configuração criptografada e permite que informações roubadas sejam transmitidas via UDP para o host remoto especificado na configuração. Ebury e outros programas de roubo de credenciais SSH, como Bonadan, Kessel e Chandrila, também têm essa capacidade. Talvez o UDP tenha sido escolhido para contornar firewalls e não fazer conexões TCP com hosts potencialmente não confiáveis. O Trojan usa apenas um método de transmissão - por meio de um arquivo ou rede, porque o nome do host de destino e o caminho para o arquivo são armazenados na mesma variável.
A Figura 19 mostra o código descompilado para envio de dados por UDP. E a figura 20 mostra a configuração da amostra encontrada. Ele foi configurado para registrar as informações roubadas
/var/run/sshd/sshd.pid
.
Figura 19. O cavalo de Tróia envia credenciais via UDP .
Figura 20. Exemplo de uma configuração que usa um arquivo para capturar dados roubados.
Curiosamente, a configuração também contém o nome do hospedeiro da vítima. Provavelmente é usado por operadores para denotar uma fonte de dados. Isso também significa que cada servidor comprometido recebe uma instância exclusiva do Trojan.
Conclusão
Numerosos recursos e técnicas de evasão de rede bem implementados indicam que os autores do Kobalos são muito mais habilidosos do que muitos criadores de malware para Linux e outros sistemas não Windows. O Targeting - organizações bastante conhecidas - também nos diz que os operadores da Kobalos não têm como objetivo infectar o maior número possível de sistemas. Traços baixos e técnicas de desvio de rede podem ser o motivo pelo qual a porta dos fundos passou despercebida até que informamos as vítimas dos resultados de nossa varredura de rede.
Não podemos responder à pergunta sobre as intenções dos atacantes. Os recursos do backdoor permitem que você o use para resolver qualquer problema. Nenhum software adicional foi encontrado nas máquinas comprometidas, exceto para um Trojan que rouba credenciais SSH. Portanto, consideramos SSH como o ponto de entrada, e não a carga útil. De acordo com as informações dos administradores de sistemas dos sistemas de informação HPC comprometidos dos administradores de sistemas dos sistemas HPC comprometidos, ninguém tentou minerar criptomoedas ou iniciar outras tarefas que requerem grande poder de computação.
O que os atacantes estão perseguindo?
Também não foi possível descobrir há quanto tempo este software está em uso. Encontramos linhas relacionadas ao Windows 3.11 e Windows 95 que surgiram há mais de 25 anos. Existe uma versão do Kobalos para Windows? Este programa foi criado há muito tempo? Temos conhecimento de novas infecções em 2019 e 2020, mas não encontramos evidências de uso anterior.
Embora os autores deste software pareçam versados na operação dos protocolos de rede e sistemas operacionais de suas vítimas, Kobalos tem vários pontos fracos. Em primeiro lugar, os problemas de criptografia provavelmente se devem ao desenvolvimento dessa indústria, se é que o Kobalos realmente foi desenvolvido por muito tempo. Em segundo lugar, você pode notar que há instâncias de escuta passiva, especialmente se exigirem uma porta TCP de origem específica. Aproveitamos com sucesso esse recurso e notificamos as vítimas para reduzir o número de hosts infectados e entender melhor essa ameaça recém-descoberta.
Também relatamos o trabalho de Maciej Kotowicz do MalwareLab pl , que analisou Kobalos de forma independente e com quem trocamos os resultados da pesquisa. Ele disse Oh My H@ck 2020.
. Kobalos
| 1003 | INITIALIZE | socket, filter | Kobalos , ( enum). |
| 1004 | START_LISTENING | C&C- . | |
| 1005 | START_C2_SERVER | socket_1, socket_2 | C&C-. |
| 1006 | SEND_PACKET | socket_fd, &channel_1,
&channel_2, data, data_len |
Kobalos socket_fd. |
| 1007 | RECV_PACKET | socket_fd, &channel_1,
&channel_2, data, data_len |
Kobalos socket_fd. |
| 1008 | GET_RANDOM_INT | random_int | 32- . PRNG . |
| 1009 | GET_HOST_INFO | out_buf, returns buf_len | , IP- . |
| 1010 | SET_COMMON_SOCKOPT | socket | SO_REUSEADDR SO_KEEPALIVE
true, SO_LINGER — 15 . |
| 1011 | RC4_DECRYPT_STRING_INPLACE | str, len | str RC4- . |
| 1012 | CLEANUP_THINGS | what_to_close, send_report | . . . |
| 1013 | RC4_INIT | context, key_size, key | RC4 . |
| 1014 | RC4_CRYPT | context, len, data_in, data_out | RC4- . |
| 1015 | MD5 | input, input_len, output_digest | MD5-. |
| 1016
to 1037 |
, . | ||
| 1038 | RSA_PUBLIC_DECRYPT | ||
| 1039 | LOAD_PUB_KEY | key_bin_data, public_key | Carrega um BLOB com uma chave RSA pública de key_bin_data para public_key. |
Sinais de compromisso
Nomes encontrados pela ESET
- Linux / Kobalos
- Linux / Agent.IV
- Linux / SSHDoor.EV
- Linux / SSHDoor.FB
- Linux / SSHDoor.FC
Amostras
Kobalos
| SHA-1 | SO alvo | Incorporado | Disponibilidade |
|---|---|---|---|
FBF0A76CED2939D1F7EC5F9EA58C5A294207F7FE
|
RHEL | sshd | Aguardando conexão da porta de origem 55201. |
479F470E83F9A5B66363FBA5547FDFCF727949DA
|
Debian | Estar sozinho | Conecta-se a
151.80.57 [.] 191: 7070 |
AFFA12CC94578D63A8B178AE19F6601D5C8BB224
|
FreeBSD | sshd | Aguardando conexão da porta de origem 55201. |
325F24E8F5D56DB43D6914D9234C08C888CDAE50
|
Ubuntu | sshd | Aguardando conexão da porta de origem 55201. |
A4050A8171B0FA3AE9031E0F8B7272FACF04A3AA
|
Arch Linux | sshd | Aguardando conexão da porta de origem 55201. |
Trojan para roubar credenciais SSH
| SHA-1 | SO alvo | Escreve em |
|---|---|---|
6616DE799B5105EE2EB83BBE25C7F4433420DFF7
|
RHEL | /var/run/nscd/ns.pid
|
E094DD02CC954B6104791925E0D1880782B046CF
|
RHEL | /var/run/udev/ud.pid
|
1DD0EDC5744D63A731DB8C3B42EFBD09D91FED78
|
FreeBSD | /var/run/udevd.pid
|
C1F530D3C189B9A74DBE02CFEB29F38BE8CA41BA
|
Arch Linux | /var/run/nscd/ns.pid
|
659CBDF9288137937BB71146B6F722FFCDA1C5FE
|
Ubuntu | /var/run/sshd/sshd.pid
|
Chaves
Chave pública RSA
-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOUgD8sEF1kZ04QxCd60HrB+TxWnLQED wzb0sZ8vMMD6xnUAJspdYzSVDnRnKYjTOM43qtLNcJOwVj6cuC1uHHMCAwEAAQ== -----END PUBLIC KEY-----
Chave RC4 estática para valores de string
AE0E05090F3AC2B50B1BC6E91D2FE3CE
Regras YARA
rule kobalos { meta: = “Kobalos malware” author = “Marc-Etienne M.Léveillé” date = “2020-11-02” reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause» version = “1” strings: $encrypted_strings_sizes = { 05 00 00 00 09 00 00 00 04 00 00 00 06 00 00 00 08 00 00 00 08 00 00 00 02 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 05 00 00 00 07 00 00 00 05 00 00 00 05 00 00 00 05 00 00 00 0A 00 00 00 } $password_md5_digest = { 3ADD48192654BD558A4A4CED9C255C4C } $rsa_512_mod_header = { 10 11 02 00 09 02 00 } $strings_RC4_key = { AE0E05090F3AC2B50B1BC6E91D2FE3CE } condition: any of them } rule kobalos_ssh_credential_stealer { meta: = “Kobalos SSH credential stealer seen in OpenSSH client” author = “Marc-Etienne M.Léveillé” date = “2020-11-02” reference = «http://www.welivesecurity.com» source = «https://github.com/eset/malware-ioc/» license = «BSD 2-Clause» version = “1” strings: $ = “user: %.128s host: %.128s port %05d user: %.128s password: %.128s” condition: any of them }
Técnicas MITER ATT e CK
A tabela foi compilada usando a oitava versão da estrutura ATT & CK.
| Táticas | Identificador | Nome | Descrição |
|---|---|---|---|
| Sustentabilidade | T1554 | Binário de software cliente comprometido | Kobalos OpenSSH- sshd
.Kobalos SSH- . |
| T1205 | Traffic Signaling | Kobalos TCP- . | |
| Defense Evasion | T1070.003 | Clear Command History | Kobalos , . |
| T1070.006 | Timestomp | Kobalos . | |
| T1027.002 | Software Packing | Kobalos . | |
| Command And Control | T1573.001 | Encrypted Channel: Symmetric Cryptography | RC4. |
| T1573.002 | Encrypted Channel: Asymmetric Cryptography | RSA-512. | |
| T1090.003 | Proxy: Multi-hop Proxy | Kobalos , Kobalos. |