ES EN
Índice

DIICOT · Capítulo 34

DIICOT: Una sílaba de diferencia

Viene del capítulo 33 · DIICOT: Sabor Ciocolata

El ejecutor del capítulo anterior llama a una máquina que ya conocía y guarda de reserva un dominio que se parece demasiado a otro que sí existió. Tirando de esa sílaba de diferencia aparecen su hermano mayor, el C2 anterior y el hueco por el que entra en las víctimas. Al final, le pregunté al otro lado qué manda.

El capítulo anterior dejó el bicho abierto encima de la mesa: un ejecutor de órdenes que llama a 91.92.47.220:222, se presenta con Ciocolata y le da a bash lo que le manden. Y dejó dos cabos sueltos. El dominio de reserva, que me sonaba a algo. Y la primera línea que manda el servidor, que el bicho tira sin mirarla.

Ninguno de los dos se resuelve dentro del binario. Empecé por la dirección, porque esa ya la conocía.

01El hilo con DIICOT

Era la que me había hecho mirar dos veces. Esto es lo que une al bicho con la serie, separado por lo que vi y lo que deduzco:

lo que une, y lo que no
visto     91.92.47.220: aquí, el C2 en el 222. En el capítulo 27, la semilla de la malla en el 8081
visto     misma red: AS197170 TechTies
visto     el mismo rango, 77.239.124.0/24, subió a /tmp/cache el bot de la malla (7-9 oct) y este ejecutor (15 oct)
visto     Go, 2026, y el mismo tipo de ofuscador: cada texto cifrado, descifrado justo antes de usarlo
visto     nada de la malla dentro: ni 8081, ni Telegram, ni peers.dat, ni DIICOT-BOTNET, ni mineros
visto     su huella no coincide con ninguna muestra de los capítulos 23 a 28
deducido  otra pieza del mismo entorno: no el bot de la malla, algo distinto

Y luego miré la máquina sin tocarla: lo que Shodan y Censys ya habían recogido por su cuenta, sin que yo le mandara un solo paquete.

una máquina, cuatro papeles
91.92.47.220    AS197170 TechTies · Países Bajos o Reino Unido, según la fuente
  22     SSH                   misma clave de agosto a octubre, actualizada mes a mes
  1337   reparto               sirvió un fichero a un intruso del cebo en octubre
  8081   semilla de la malla   visible: contesta «auth:bad»
  222    este ejecutor         invisible para Shodan y para Censys
  …      cientos de puertos más, el patrón de un escáner

Shodan la ha escaneado 878 veces desde agosto, en 652 puertos distintos. El 222 no ha aparecido ni una vez, y en Censys tampoco, ni siquiera como puerto abierto y mudo. Puede que el servidor calle hasta que alguien le diga Ciocolata, o que ese puerto lleve poco tiempo abierto: este C2 aparece con la muestra, a mediados de octubre. Desde fuera no se distingue.

Lo del SSH dice otra cosa: la misma clave de máquina durante meses, y el servidor SSH subiendo de versión con cada parche. No es una máquina abandonada: alguien la mantiene.

Por último, busqué otras máquinas con esa misma clave, por si el operador hubiera clonado la imagen en más servidores. Shodan me dio un candidato que resultó ser una coincidencia de su propio índice (un servicio distinto que compartía por casualidad el mismo número interno), así que lo descarté. Censys, que es la fuente buena para esto, dio un único resultado: ella misma.

Resultado de Censys buscando la clave SSH de la máquina: un único host, 91.92.47.220, con los servicios SSH, 2082, 6009, 8081, 23518, 27562 y 29508
Una sola respuesta. Censys, buscando cualquier máquina con la misma clave SSH: solo aparece ella. En su lista de servicios está el 8081 de la malla. El 222, no.
Lo que no afirmoNo digo que sea el mismo operador. Digo que comparte máquina, red, forma de construir y hasta el canal de entrega con la variante de 2026, y que hace otra cosa. Eso es un vínculo por infraestructura, no una firma. Preguntarle a esa máquina qué contesta en el 222 tampoco lo cerraría: lo que diga no viene firmado. Durante casi toda la investigación lo descarté, por no avisar al operador. Al final lo hice, con cuidado, y está en el apartado 03. Pero antes de eso me salvó una sílaba.

02Una sílaba de diferencia

Buscando el dominio de reserva, hotel.wildhorsehotnet.net, por si alguien lo hubiera visto, salió otro casi igual: hotel.wildhorsehotel.net. Donde el bicho dice hotnet, ese dice hotel. Y arrastra detecciones de malware.

Lo primero fue comprobar que no me había equivocado yo al descifrar. No. En el cable, cada trozo de un nombre de dominio viaja con su longitud delante, y el bicho mandó un 15. wildhorsehotnet tiene 15 letras; wildhorsehotel, 14. El binario pide hotnet. La diferencia es suya, no mía.

Así que miré la historia del otro, sin tocarlo: lo que el DNS pasivo, VirusTotal y urlscan ya tenían guardado.

hotel.wildhorsehotel.net, según los registros pasivos
feb 2025            servido por Njalla                   # el favorito de quien no quiere dar su nombre
jun-oct 2025        hotel. → 5.178.96.15
feb 2026            caduca · página de «renueva tu dominio»
23 abr 2026         lo registra otro · aparcado en Google Cloud

Un dominio que alguien usó durante un año, dejó caducar y perdió. Hoy es de otro, con toda la pinta de un aparcamiento de dominios. Las detecciones que tiene son la herencia de su pasado; hoy no es un indicador.

¿Y quién lo usaba? VirusTotal guarda qué ficheros preguntaron por ese nombre al ejecutarse. Son ocho. Dos se llaman ciubuc_x86 (ciubuc es una palabra rumana) y son un Mirai/Gafgyt de junio de 2025. El resto son binarios grandes, de ocho a dieciocho megas comprimidos con UPX, que vacían el cron ajeno, matan a la competencia por su nombre y preguntan cuál es su IP pública a un servicio propio; alguno barre SSH y se instala en el cron. En uno de ellos ese servicio es 31.57.105.94:42. El mismo del capítulo 27: el primero al que preguntaba el bot de la malla.

Y la IP de 2025, 5.178.96.15: VirusTotal tiene once ficheros que hablan con ella, entre julio de 2025 y abril de 2026, y los que he mirado lo hacen al puerto 222. ThreatFox la lista como C2 desde julio, con estas etiquetas: Diicot, Mexals y ElPatrono1337, la firma de la llave SSH del capítulo 28.

Entre esos once había uno de casi tres megas, sin comprimir. Le pasé la huella difusa contra el nuestro: 13. Cuanto más cerca de cero, más parecidos. Eso solo no prueba mucho: en dos binarios de Go casi todo es el motor, y la huella mide sobre todo el taller. Lo que lo prueba es el código, y a eso voy. Llegaba comprimido con el nombre de cache, y lo soltaban esos bots grandes, varios de ellos con el nombre de Update en el disco. En el capítulo 26, /tmp/cache ya aparecía entre lo que deja la cadena. Nuestra muestra, mirada con esos ojos, también llegó comprimida y también se llamaba cache.

Faltaba la prueba que importaba. Me bajé el hermano de MalwareBazaar y, sin ejecutarlo, le busqué la cadena de llamadas del capítulo anterior con un buscador que no sabe nada de ninguno de los dos; lo probé antes con el nuestro, y sacó el dominio solo:

la segunda dirección de cada uno, leída del fichero
hermano   (2025)   28 números, K = 0x48   →   hotel.wildhorsehotel.net:222
nuestro   (2026)   29 números, K = 0x12   →   hotel.wildhorsehotnet.net:222
                                                           ^^^

El mismo truco, en el mismo sitio del programa y con el mismo puerto. La semilla cambia porque el ofuscador la sortea en cada compilación. En la reserva cambia una sílaba, y una letra más es un número más en la cadena. En el bot cambió algo más: la función principal de la versión nueva ocupa el doble, y es la que añade la espera de diez segundos y tira la primera línea. La vieja no tiene ninguna de las dos cosas.

el ejecutor, versión a versión
                 C2                     reserva
2025 → oct 2026  5.178.96.15:222        hotel.wildhorsehotel.net:222    # el dominio caduca en febrero
oct 2026         91.92.47.220:222       hotel.wildhorsehotnet.net:222   # nadie lo ha registrado

Las dos versiones pasaron por mi cebo con tres días de diferencia. El 12 de octubre, el cache viejo llegó con el gusano, sin que nadie lo subiera por su nombre, y llamó a 5.178.96.15:222 con su Ciocolata. El 15, el nuevo lo subió directamente por scp el rango 77.239.124.0/24, y llamó a 91.92.47.220:222. Y antes, del 7 al 9, ese mismo rango había subido al mismo /tmp/cache otra cosa: el bot de la malla del capítulo 26, con el mismo hash.

cache es un hueco, no un programaEs un nombre fijo que se rellena con lo que toca: el bot de la malla una semana, el ejecutor la siguiente. Por eso la limpieza del guion empieza matando cualquier cosa que se llame así antes de subir lo nuevo. Si encuentras un /tmp/cache, el nombre no te dice qué es. Te dice quién lo puso.

Y el hermano dejó una cosa más, de regalo. En marzo, en uno de los sandboxes de VirusTotal, su C2 todavía contestaba. El bicho ejecutó esto:

lo que el C2 anterior le dijo al hermano, visto por VirusTotal
bash -c "ClientID: 27813"

El servidor saluda con un número de cliente, y la versión vieja se lo daba a bash como si fuera una orden. La nueva, la nuestra, tira la primera línea sin mirarla: lo que me desconcertó en el capítulo anterior. Encaja como arreglo entre versiones, y el código lo respalda: es justo lo que a la vieja le falta. En el apartado siguiente, el C2 de ahora lo enseña.

Lo que no afirmoNo sé si hotnet es un cambio pensado o un dedo que se fue de tecla. Tampoco sé quién tiene hoy wildhorsehotel.net; sé que no parece el operador, y por eso no va en los indicadores. Las etiquetas de ThreatFox son de un tercero. Lo que sí está visto es que la reserva vieja se perdió, y la nueva todavía no la ha comprado nadie. Si el C2 de ahora cayera, el bicho preguntaría por un nombre vacío.

03Lo que dijo el otro lado

Durante casi toda la investigación sostuve que al 222 no se le pregunta. Al final lo repensé. Lo que hay detrás no es una puerta escondida para uno: atiende a cualquiera que diga Ciocolata, y está pensada para cientos de máquinas infectadas. Una conexión más no destaca. La condición era que no saliera de ninguna máquina mía.

Así que salió de una que no tiene nada que ver con el cebo, ni con el laboratorio, ni con este blog. El programa era muy corto y hacía una sola cosa: presentarse como lo haría el bicho, con un nombre de máquina inventado, y escuchar. Ni contesta, ni obedece, ni vuelve a llamar. Lo que llega lo guarda en hexadecimal, y nada más.

medio segundo de conversación
0,000   →  Ciocolata · <nombre inventado>     # el saludo, una sola vez
0,053   ←  ClientID: <n>                      # el banner: un número
0,054   ←  1.316 bytes, cinco líneas de shell  # las órdenes
  …     ←  nada más                           # no contestamos; no hubo latido

La primera línea es un número de cliente, como el ClientID que el C2 viejo le mandó al hermano en VirusTotal. Y con eso queda resuelto lo que me desconcertó en el capítulo anterior. El bicho tira la primera línea porque el servidor siempre empieza por ella. Si la ejecutara, bash contestaría ClientID: command not found, que es justo lo que hacía la versión vieja. Las órdenes de verdad vienen detrás.

El número exacto que me tocó no lo pongo: es la huella de mi conexión. Pero hay otros dos que sí se pueden usar, porque los recibió el hermano en los sandboxes de VirusTotal, de su C2 de entonces:

dos ClientID del C2 anterior, vistos por terceros
10 dic 2025   CAPE     ClientID: 5842
 5 mar 2026   Zenbox   ClientID: 27813
              ──────────────────────────
              unos 22.000 más en 85 días   ≈ 260 al día · ≈ 11 a la hora

Si es un contador, y si nadie lo puso a cero entre medias, a ese servidor llamaban once veces por hora. Pero son llamadas, no víctimas. El bicho se va a los diez segundos si nadie le habla, cada vez que algo lo vuelve a lanzar gasta un número nuevo, y una sola máquina insistiendo puede gastar decenas al día. Los sandboxes y los curiosos como yo también cuentan. Es el pulso de la puerta, no el tamaño de la flota.

Y lo que viene detrás del banner no pide nada secreto. Son cinco líneas, cinco órdenes que el bot ejecuta una a una, y todas piden medidas:

las órdenes, resumidas
1  cuántos núcleos    nproc
2  cuánta memoria     free -m
3  cuánto disco       df -m /
4  cuánta bajada      contra speed.cloudflare.com, hasta cuatro descargas a la vez
5  cuánta subida      lo mismo, subiendo diez megas de ceros
                      con curl si lo hay; si no, con wget

Ni contraseñas, ni ficheros, ni claves. Es lo que hace quien tiene muchas máquinas y tiene que decidir qué hacer con cada una: esta tiene ocho núcleos, esta tiene un enlace gordo, esta no vale para nada. Lo primero que le pregunta a cada víctima es cuánto rinde. Y no es la primera vez que lo veo. Antes de subir nada al cebo, el rango 77.239.124.0/24 preguntaba lo mismo de otra manera: nproc, lspci, nvidia-smi buscando una tarjeta gráfica. Son dos piezas distintas con la misma obsesión.

Esto, además, no lo destapé yo. Las cuatro primeras órdenes ya estaban a la vista: el 14 de octubre, el día antes de que el bicho cayera en el cebo, los sandboxes de VirusTotal lo ejecutaron, el C2 les contestó y el triaje quedó registrado, igual letra por letra. Lo que añadió la escucha es el banner, el orden en que llega todo y la quinta orden, la de subida, que allí no aparece.

Lo que hace después con esos números no lo sé. Para saberlo habría que devolvérselos, y en ese momento dejaría de escuchar para ponerme a jugar en su lado.

Lo que se hizo, y lo que noUna conexión, una vez, desde fuera, y solo para escuchar. El programa no puede ejecutar nada de lo que recibe porque no tiene con qué. No contestó, no mandó latido y no volvió a llamar. No se midió nada ni se le devolvió nada. speed.cloudflare.com aparece en las órdenes, pero no lo tocamos. Con 5.178.96.15 y con los dos dominios no hubo ningún contacto.

04Indicadores

Los del binario están en el capítulo anterior. Estos son los de la infraestructura y la familia.

TipoValor
C2 principal91.92.47.220:222 (TCP, texto plano; AS197170 TechTies; la misma máquina es la semilla de la malla en el 8081, capítulo 27, y reparte ficheros en el 1337)
C2 de reservahotel.wildhorsehotnet.net:222 (sin registrar en noviembre de 2026: reserva dormida)
C2 anterior5.178.96.15:222 (visto de julio de 2025 a octubre de 2026; en ThreatFox como Diicot; IP de alquiler, puede cambiar de manos)
Banner del C2ClientID: <n> como primera línea, antes de las órdenes
Primeras órdenes vistastriaje en cinco líneas: núcleos, memoria, disco, bajada y subida contra speed.cloudflare.com (servicio legítimo: lo que delata es el patrón, no el dominio) · en sandboxes de VirusTotal desde el 14 de octubre de 2026; recibidas de nuevo, con la subida, el 2 de noviembre
Reparto77.239.124.0/24 (fuerza bruta SSH con cliente Go, scp de /var/tmp/<8 letras> y de /tmp/cache, marcador /tmp/d.log con la contraseña acertada)
Descargashxxp://91.92.47[.]220:1337/<6 letras>/c (la misma máquina también reparte ficheros)
Nombre en disco/tmp/cache es un hueco: lo han ocupado el bot de la malla y las dos versiones de este ejecutor · el viejo lo suelta el gusano (Update), el nuevo llega directo por scp
Clave SSH del C2SHA-256 ba13ccd57a8dce8d84f49deacdcbe1697035bd8a577b34c5c63cb1758182448f · MD5 dc:d0:64:24:28:b0:cf:cc:cc:3d:8e:b7:c0:48:43:40
SHA-256 hermano6041b27598fa7db6df3364ba1e1d94268616bef7ccab5cd48c2646b6a7d087e2 (desempaquetado de 640c817722a4cd22251fcff100fdba167b7dfff885f36b5f64f2d59c52514180)

Si un servidor, sin que nadie lo haya pedido, se pone a medir su velocidad contra speed.cloudflare.com con varios hilos a la vez, alguien le está tomando las medidas.

Continuará - el cebo sigue encendido. Ya sé lo primero que le manda su amo a cada máquina nueva: una cinta métrica. Lo que viene después de medir lo sabrá quien le devuelva los números, y aquí no se devuelve nada. 🍯

Comentarios