ES EN
Índice

DIICOT · Capítulo 26

Sesenta y seis segundos

La familia del capítulo anterior no se quedó quieta: hay una versión más nueva circulando, y la pillé desde el primer segundo. Entra por SSH a la fuerza, mide el equipo, desaloja a la competencia —incluida su propia versión vieja—, sube dieciséis megas de un solo fichero y lanza. Todo en poco más de un minuto. Y entonces se estrella contra una línea del fstab.

El capítulo anterior acabó con una promesa: la familia que llevaba cinco años cobrando en la misma cartera no se había quedado quieta, y andaba circulando una versión más nueva. Aquí está.

Duró sesenta y seis segundos, y los tengo todos: entra, mide la máquina, desaloja a quien hubiera, sube dieciséis megas de un solo fichero y lanza. Tres minutos más tarde el disco estaba congelado, con todo dentro.

Lo que subió resultó ser una muñeca rusa. Y lo que lo paró no fue ninguna defensa preparada: fue una opción de montaje de tres sílabas que lleva décadas en los manuales.

01Sesenta y seis segundos

Antes del minuto hay horas de aburrimiento: fuerza bruta sostenida contra la cuenta de root, cientos de intentos, desde una única dirección. Hasta que uno acierta. Lo que viene después es esto:

Terminal con la cronología del asalto: login SSH como root, reconocimiento, desalojo de la competencia, subida del kit y el intento de ejecución que falla
Sesenta y seis segundos de asalto. Entra por SSH como root, reconoce la máquina, mata a la competencia, sube su kit… y se estrella contra un /var/tmp montado noexec. El cebo se congeló tres minutos después.

Voy a contarlo en tiempos relativos desde que la contraseña cuela — la hora del reloj no la publico, porque la campaña sigue viva. En los primeros ocho segundos mide la máquina. En el noveno, desaloja. En el décimo empieza a subir. En el decimotercero intenta arrancar. Y ahí se acaba.

No hay tanteo, no hay exploración, no hay un solo comando de más. Es una lista que se ejecuta de arriba abajo.

02Lo que pregunta antes de nada

El reconocimiento cabe en ocho segundos y no sobra nada:

el reconocimiento, entero
uname -s -v -n -r -m           # sistema, versión, nombre y arquitectura
uname -m                       # la arquitectura, otra vez y a solas
uptime | grep -ohe 'up .*'     # cuánto lleva encendida
nproc                          # cuántos núcleos
lscpu | egrep "Model name:"    # qué CPU exactamente
lspci | egrep VGA              # ¿hay tarjeta gráfica?
lspci | egrep VGA | grep Radeon | wc -l
nvidia-smi -q | grep "Product Name" | wc -l
curl ipinfo.io/org             # ← ¿de quién es esta máquina?

Las tres preguntas por la gráfica cuentan a qué viene: no le basta con saber si hay una, quiere saber de qué marca, porque el minero que use depende de eso. Un cryptojacker que distingue entre Radeon y NVIDIA antes de decidir qué baja.

Pero la que más me gustó es la última. curl ipinfo.io/org devuelve a qué operador pertenece la IP de la máquina en la que acaba de entrar. Es el equivalente a mirar el buzón antes de decidir si merece la pena entrar a robar: sirve para saber si has caído en un servidor de empresa, en un proveedor de nube o en la conexión doméstica de alguien. Es la única consulta del reconocimiento que sale a internet, y por eso quedó registrada también en el cortafuegos.

Lo que no pregunta, también dice algoNo mira quién se ha conectado últimamente, no busca ficheros, no husmea en el correo ni en las bases de datos, no toca datos de nadie. Le interesan exactamente cuatro cosas: cuántos núcleos, qué gráfica, cuánto lleva encendida y de quién es la línea. Es la lista de la compra de alguien que solo quiere la máquina para que trabaje gratis.

03Primero, desalojar

En el noveno segundo lanza una sola línea, larguísima, que hace limpieza antes de instalar nada:

el desalojo
crontab -r ; rm -rf /var/tmp/.* /var/tmp/* /tmp/.* /tmp/*
ps aux | awk '$3 > 40.0 && $11 !~ /sshd/ {print $2}' | while read pid; do
    readlink -f /proc/$pid/exe | xargs rm -f ; kill -9 $pid ; done
ps aux | awk '$4 > 60.0 && $11 !~ /sshd/ {print $2}' | …
for proc in xmrig cpuminer minerd ccminer; do pidof $proc | … ; pkill -9 $proc ; done

Mata por nombre a los mineros conocidos, pero lo listo es lo otro: barre por consumo. Cualquier proceso que pase del 40 % de CPU o del 60 % de memoria y no sea el servidor SSH, fuera. No necesita saber cómo se llama el minero del vecino; le basta con que se note.

Y no se conforma con matarlo. Antes de mandar la señal averigua de qué fichero salió ese proceso y lo borra del disco. No es matar: es desinstalar al anterior.

Tres segundos después, cuando ya ha subido sus cosas, remata con una segunda tanda:

la segunda pasada, y el lanzamiento
chattr -iae ~/.ssh/authorized_keys
rm -rf /dev/shm/.x /dev/shm/rete* /var/tmp/.update-logs /var/tmp/Documents
rm -rf /tmp/.diicot /tmp/kuak ; rm -rf xmrig .diicot .black Opera
pkill Opera ; pkill cnrig ; pkill java ; killall xmrig
cd /var/tmp && chmod +x aLAJrFpX && ./aLAJrFpX & disown
history -c ; rm -rf ~/.bash_history

Fíjate en lo que borra: .diicot, kuak, retea, .x, Opera, .black. Ésos no son nombres de la competencia: son los suyos. Son los ficheros que deja esta misma familia — los mismos nombres que viene usando desde que la documentan, en 2021.

Se está desalojando a sí mismoLa versión nueva entra y, antes de instalarse, borra los restos de la versión vieja. Tiene toda la lógica: dos generaciones del mismo kit peleándose por la misma CPU no le sirven a nadie, y menos al que cobra. Pero deja una imagen que cuesta olvidar: un bicho que llega a una máquina y lo primero que hace es echar a su propio antecesor.

El chattr -iae sobre authorized_keys merece un renglón aparte: le quita el atributo de inmutable al fichero de llaves SSH de root, el que decide quién entra sin contraseña. No es limpieza — es dejar el terreno preparado para plantar la suya. Y cierra borrando el historial, que es el gesto de siempre.

04Una muñeca rusa

Entre las dos tandas de limpieza sube dos ficheros por scp. Uno pequeño, de dos megas y pico. Y otro de dieciséis megas y medio, que para un bicho de estos es enorme.

Ese grande es un solo ELF escrito en Go y empaquetado con UPX. Al abrirlo aparece por qué pesa tanto: lleva otros cinco programas dentro, cada uno a su vez empaquetado. Es una muñeca rusa.

Terminal mostrando los cinco módulos extraídos del dropper con sus tamaños y funciones
Una muñeca rusa. Un solo ELF en Go despliega cinco módulos —bot, loader, XMRig, coinminer y escáner SSH— más su diccionario de credenciales.

Los tallé del binario uno a uno, y después detoné el dropper en la jaula para ver qué escribía en el disco con sus nombres reales. Coinciden por hash, así que no hay duda de qué es cada cosa:

los cinco módulos y dónde los deja
/tmp/cache            el bot: malla P2P + mando por Telegram
/tmp/diicot           el loader: motor de persistencia y descarga
/tmp/kuak             XMRig, el minero de Monero
/dev/shm/retea        un segundo minero
/dev/shm/.x/network   el escáner: fuerza bruta SSH para propagarse

/dev/shm/.x/pass      su diccionario de contraseñas
/dev/shm/.x/bios.txt  la lista de objetivos a escanear

Ese pass es el detalle que más dice de cómo se propaga esto. Es un fichero de texto con parejas de usuario y contraseña, y son exactamente las que uno esperaría: root root, root 123456, root Passw0rd, root P@ssw0rd… y root Huawei@123, que delata a qué clase de cacharros apunta además de a servidores.

O sea: el kit no es solo un minero. Es un minero que trae consigo la máquina de buscar la siguiente víctima. Entra por fuerza bruta, y lo primero que instala es su propio buscador de fuerza bruta. Así se sostiene una botnet sin que el operador mueva un dedo.

Diagrama de la cadena completa: desde la fuerza bruta SSH hasta los cinco módulos y las dos vías de mando
La cadena entera. De la fuerza bruta SSH a los cinco módulos y las dos vías de mando: la malla P2P con Telegram por un lado, y la segunda etapa que baja la configuración de minado por otro.
ESPÉCIMEN 009 · ELF ×6

DIICOT / Mexals · variante 2026

◈ VIVO · NO EJECUTAR
Entrega
SSH con contraseña · dos ficheros por scp
Dropper
16.604.752 B · Go · UPX · stripped y ofuscado
Contiene
bot P2P · loader · XMRig · segundo minero · escáner SSH
Propagación
fuerza bruta SSH con diccionario propio
Resultado
no llegó a ejecutarse — ver §05
SHA-256 dropper
28e0c4d5bc6675537ba47c6529877a3194a29585fb86477f66bf13c79252d2f0
SHA-256 bot
7d55a90710b8e79283efd756e8d3423fc23e0dcf742d6027b1a2a1b9d02a9c16

05Y se estrelló contra una línea del fstab

La última orden de la sesión pedía arrancarlo: cd /var/tmp && chmod +x aLAJrFpX && ./aLAJrFpX & disown. En la auditoría del núcleo —que registra todas las ejecuciones— aparece el chmod. Y no aparece nada más.

El motivo está en una línea del /etc/fstab de la máquina:

la línea que lo paró todo
tmpfs  /var/tmp  tmpfs  rw,nosuid,nodev,noexec,size=256M  0 0

noexec significa «desde esta carpeta no se ejecuta nada». Da igual que el fichero tenga permiso de ejecución: el sistema se niega. El bicho hizo todo bien —entró, midió, desalojó, subió dieciséis megas— y se estrelló contra una opción de montaje de tres sílabas.

Y se estrelló por poco. El otro fichero, el bot, lo había subido a /tmp, que permite ejecutar. Si hubiera puesto el dropper ahí, o si la sesión hubiera durado un minuto más, esto sería otro capítulo.

Cómo lo sé, y qué implica para lo que vieneNo lo deduzco del silencio: lo compruebo por tres vías. En la auditoría no hay ninguna ejecución del binario ni de sus hijos; en el disco congelado no existe ninguno de los ficheros que el dropper habría creado; y el montaje noexec explica exactamente ese resultado.

La consecuencia hay que decirla de frente, porque gobierna los capítulos siguientes: todo lo que sé de lo que hace este kit lo sé porque lo detoné yo en una jaula aislada, no porque lo viera actuar aquí. Lo que el cebo demuestra es cómo llegó y que no arrancó. Lo que hace, lo demuestra el laboratorio.

Hay una ironía en el resultado. El cebo está puesto para que le entren, y le entraron. Pero lo que impidió el desastre no fue ninguna defensa lista: fue una opción de montaje que lleva décadas en los manuales de endurecimiento de Linux y que casi nadie se molesta en poner. Tres sílabas en un fichero de configuración.

06Indicadores (IOCs)

Los de la llegada. Lo que el kit hace por dentro —el mando, la malla, cómo se actualiza solo— va en el capítulo siguiente.

TipoValor
Origen de la intrusión109.160.32.115 (ASN 197170, TechTies · AbuseIPDB 100/100, 1.225 reportes)
Vía de entradaSSH, root por contraseña, tras fuerza bruta sostenida
SHA-256 dropper28e0c4d5bc6675537ba47c6529877a3194a29585fb86477f66bf13c79252d2f0
SHA-256 bot7d55a90710b8e79283efd756e8d3423fc23e0dcf742d6027b1a2a1b9d02a9c16
SHA-256 XMRig79a47c33335fe1ed871a23cf7972652ee08a3ec0afed1c2dc6b5a8df675e153d
SHA-256 loaderffe04bc05a56f78b1273876cf17ded8df1aa3da5a15deb17dce99a3e206eb705
SHA-256 segundo mineroc1c122869f46aaf8c4e90f3132c93a801c853244c756966952d0bf19241cf084
Ficheros que deja/tmp/{cache,diicot,kuak} · /dev/shm/retea · /dev/shm/.x/{network,pass,bios.txt,iplist,.usrs}
Marcador/tmp/d.log con el contenido admin
Desalojo (conducta)crontab -r + matar por CPU>40 % y MEM>60 % borrando el ejecutable · chattr -iae sobre authorized_keys
Borra de su propia familia.diicot · kuak · retea · .x · Opera · .black
Reconocimientolspci VGA + Radeon + nvidia-smi · curl ipinfo.io/org

Y una contramedida que no cuesta nada y aquí lo paró todo: montar /tmp, /var/tmp y /dev/shm con noexec. Este kit deja sus cinco módulos exactamente en esos tres sitios.

Continuará — el kit se quedó quieto en el disco, así que me lo llevé a la jaula y lo encendí yo. Dentro estaba lo que hace de verdad: una malla de hasta dos mil nodos que elige un jefe, y un jefe que recibe las órdenes por un chat de Telegram. En el Capítulo 27. 🍯

Comentarios