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:

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:
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.
03Primero, desalojar
En el noveno segundo lanza una sola línea, larguísima, que hace limpieza antes de instalar nada:
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 ; doneMata 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:
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_historyFí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.
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.

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:
/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 escanearEse 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.

DIICOT / Mexals · variante 2026
- Entrega
- SSH con contraseña · dos ficheros por scp
- 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:
tmpfs /var/tmp tmpfs rw,nosuid,nodev,noexec,size=256M 0 0noexec 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 sí 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.
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.
| Tipo | Valor |
|---|---|
| Origen de la intrusión | 109.160.32.115 (ASN 197170, TechTies · AbuseIPDB 100/100, 1.225 reportes) |
| Vía de entrada | SSH, root por contraseña, tras fuerza bruta sostenida |
| SHA-256 dropper | 28e0c4d5bc6675537ba47c6529877a3194a29585fb86477f66bf13c79252d2f0 |
| SHA-256 bot | 7d55a90710b8e79283efd756e8d3423fc23e0dcf742d6027b1a2a1b9d02a9c16 |
| SHA-256 XMRig | 79a47c33335fe1ed871a23cf7972652ee08a3ec0afed1c2dc6b5a8df675e153d |
| SHA-256 loader | ffe04bc05a56f78b1273876cf17ded8df1aa3da5a15deb17dce99a3e206eb705 |
| SHA-256 segundo minero | c1c122869f46aaf8c4e90f3132c93a801c853244c756966952d0bf19241cf084 |
| 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 |
| Reconocimiento | lspci 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