Capítulo 3: Tor y el cron sospechoso de las 3:33

Volví de Malasaña a las tres menos cuarto de la madrugada, con dos vinos encima, un cogote helado y una frase de .(punto)Antúnez bailándome por el kernel: «Mira tu propio reloj. Ahí está el bicho». La vecina dormía sin saber. Al entrar en el salón, mi portátil, que estaba en sleep, de pronto rugió. El ventilador subió a 5500 rpm y el LED del disco parpadeó como si estuviera compilando el kernel 6.9 a mano. Miré la hora:

03:33:00

Tres tres tres. Los tres tres. Si hasta ahí hubiera sido broma, yo me reía. No lo era. Quince segundos después el ventilador bajó, el LED se tranquilizó y la máquina volvió a dormir. Como si nada. Acaricié la tapa y le prometí que la iba a desmontar.

  • Eres mío o lo eres de ellos, cacharro. Vamos a averiguarlo.

Abrí una TTY — porque cuando hay faena de verdad yo me voy a la TTY1, las X son un salón con visitas — y empecé por lo obvio: el crontab.

# crontab -l -u root
33 3 * * * /usr/local/bin/.sysupd > /dev/null 2>&1

¡No me digas! Una tarea programada a las 3:33 de la madrugada ejecutando un binario que se llamaba dot-sysupd, con el punto delante como los ficheros ocultos, como .bashrc, como... .(punto)Antúnez. Me empecé a enfadar. No porque me lo hubieran metido en el cron, sino por la falta de originalidad. Un malware que se pone punto delante del nombre es el equivalente digital al ladrón con antifaz. Pero no, esto no era obra de .(punto)Antúnez: él firmaba, este no.

# ls -la /usr/local/bin/.sysupd
-rwxr-xr-x 1 root root 114688 Apr 12 03:33 .sysupd
# file /usr/local/bin/.sysupd
ELF 64-bit LSB executable, statically linked, stripped
# sha256sum /usr/local/bin/.sysupd
b4dc0dec4fee0000baddbeef...  .sysupd

Un ELF estático, stripped, timestamp de hace tres días a las 3:33:00 exactas (el mismo bot, el mismo reloj). Ejecutando cada madrugada. Necesitaba saber con quién hablaba antes de matarlo. Instalé el campamento base:

# apt-get install tcpdump ss lsof net-tools -y

Programé un tcpdump con filtro tight a partir de las 3:32:

# tcpdump -i any -w /tmp/sysupd.pcap -G 60 -W 3 \
         'not port 22 and not port 53' &

Y dejé un ss en bucle escribiendo a fichero:

# while sleep 1; do \
    ss -tnp state established 2>/dev/null | \
    grep -v ':22' >> /tmp/sysupd.ss.log
  done &

Las 3:33 llegaron solas, como siempre llegan las cosas que una teme y espera. El ventilador cantó. El LED parpadeó. Quince segundos después, paz.

# cat /tmp/sysupd.ss.log | sort -u
ESTAB 0 0 192.168.1.42:34119 127.0.0.1:9050 users:(("sysupd",pid=8842))
ESTAB 0 0 127.0.0.1:9050 ...:443 users:(("tor",pid=611))

9050. El puerto de Tor. El bichejo se salía del piso vía Tor, hacia dios sabe qué cebolla. En el pcap, el handshake TLS era limpio pero el SNI estaba vacío — cosa que no pasa ni con las abuelas de Google. Era un cliente custom. Reconstruí a mano la conexión:

# strings /usr/local/bin/.sysupd | grep -Ei 'onion|tor|http'
badd7zv4obfuscadosjkl.onion
/api/v2/beacon
bp-agent/1.7

Bp-agent 1.7. Los Blue Pantallaz habían liberado versión nueva, como diría el manual: con correcciones menores y una nueva funcionalidad: chivarse por Tor. Un softwarito mantenido, qué quieres que te diga, hasta orgullo profesional me daba. Casi.

La neutralización fue rápida. Primero amordacé el cron:

# crontab -l | grep -v '.sysupd' | crontab -
# chattr +i /var/spool/cron/crontabs/root

Después le puse al binario un cinturón de castidad con chmod 000 y chattr +i, porque quería estudiarlo, no destruirlo:

# chmod 000 /usr/local/bin/.sysupd
# chattr +i /usr/local/bin/.sysupd

A la vecina no le conté nada. Dormía. Le di un beso en la frente, como los maridos traicioneros de las telenovelas, y volví a la TTY1. Iba a necesitar wireshark, a ella, y a un par de botellas nuevas. Porque si el bicho salía por Tor, la madre de todas las preguntas era: ¿de dónde narices sacaba conectividad para Tor sin yo enterarme? Mi wlan0 estaba más controlada que la pizza de los viernes.

Miré el reloj: 4:47 am. Me serví un Gran Heredad Segismundo Sintierra 2008 stable, un tinto que por debajo de ciertos decibelios sonaba a Verdi. Mañana, wireshark. Mañana, también, debía explicarle a la vecina que en realidad íbamos a necesitar una segunda tarjeta de red y un poco más de paciencia con Guindous, del que le tocaba, dolorosamente, jubilarse del todo.