De vuelta en casa, instalé yara, abrí mi vim — porque para escribir reglas YARA uno no usa nano, no sería serio — y le dije a la vecina:
- Mira, esto es lo que hace yara: le das una regla con unos strings o unos bytes, y la herramienta te busca en cada fichero, proceso o pcap si aparece. Es el
grepde los malotes. - ¿Y qué vamos a poner?
- Firma. Algo que solo ellos escriban. Los bp tienen tics, las personas tienen tics, los malwares también.
# apt-get install yara -y
$ vim /home/jorge/rules/bp.yar
Escribí tres reglas, una inicial, un poco ingenua, con las cadenas obvias:
rule BP_Beacon_v17 {
meta:
author = "GNU/Linux, para ser mas exactos"
desc = "Blue Pantallaz bp-agent 1.7 beacon"
strings:
$s1 = "bp-agent/1.7"
$s2 = "badd7zv4obfuscadosjkl.onion"
$s3 = { 62 70 2D 61 67 65 6E 74 } /* "bp-agent" */
condition:
any of ($s*)
}
La segunda regla, la importante, era para él. Para .(punto)Antúnez. Pensé mucho antes de escribirla. El hombre siempre dejaba, en sus binarios, una cadena inmutable, casi una firma de artista: exactamente .(punto), así, con el paréntesis y el punto adentro, como quien firma sus cuadros.
rule Antunez_Signature {
meta:
author = "jorgedihe"
desc = "Marca de la casa de .(punto)Antunez"
strings:
$sig = ".(punto)"
$ctrl = "CTRL+H" // el despedido
$meta = "made-with-love-and-coffee"
condition:
$sig and ($ctrl or $meta)
}
Y la tercera, una combinación, por si se escondía el muy sinvergüenza:
rule BP_Or_Antunez {
condition:
BP_Beacon_v17 or Antunez_Signature
}
Lancé el escaneo recursivo sobre los backups de los últimos 10 años — porque yo, como todo buen paranoico, tengo copias en un disco externo desde 2015 — y le pedí a la vecina que se diera una ducha. Iba a tardar. Tardó cuarenta minutos y un episodio de cosa-que-ella-ve.
# yara -r /home/jorge/rules/bp.yar /mnt/backup/2014-2026/
BP_Beacon_v17 /mnt/backup/2024/.sysupd.1
BP_Beacon_v17 /mnt/backup/2024/.sysupd.2
Antunez_Signature /mnt/backup/2018/captura-playa.pcap
Antunez_Signature /mnt/backup/2019/xorlab.bin
El pcap de 2018. La captura-playa.pcap. La captura que yo había hecho en la playa, cuando perdí el PC. Ese pcap había vivido nueve años tranquilo en mi disco externo. Y ahora, pobre, tenía la firma de .(punto)Antúnez dentro.
Lo abrí con wireshark:
# wireshark /mnt/backup/2018/captura-playa.pcap
Entre miles de paquetes aburridos de la red del chiringuito, había un paquete UDP de 612 bytes con un payload en texto aparentemente basura. Pero al hacer «Follow UDP stream», salía esto:
made-with-love-and-coffee
.(punto) dice: si llegas hasta aqui es que me has buscado bien.
las coordenadas estan al final. nos vemos cuando hagas falta.
lat: 36.76xxxxx
lon: -6.35xxxxx
z: pesquero "El Forkado", amarrado B-17
.(punto)
Ocho años escondidas en mi propio pcap. Un mensaje en botella, en UDP. El muy sinvergüenza se había escapado en 2018 al mismo pesquero al que yo iba a terminar llegando en el capítulo 9. Pero yo no lo sabía todavía. Copié las coordenadas.
Google Maps, carga: Sanlúcar de Barrameda, puerto pesquero. Marina. Amarre B-17. Un pesquero llamado, confirmo: El Forkado.
- Un barco con nombre «El Forkado» — me dijo la vecina, secándose el pelo con una toalla. – Suena a chiste malo.
- Peor — le dije. – Suena a .(punto)Antúnez.
Lancé la misma yara contra la Raspberry muerta. Bingo: la cadena .(punto) aparecía DENTRO del binario bp-agent. O bien los Blue Pantallaz habían copiado código de él, o bien él estaba, como sospechaba el Profesor, trabajando para ambos bandos. La lectura más fina: él los había saboteado desde dentro. Un topo con punto.
Corría a Sanlúcar. Pero antes necesitaba algo más: un dump de memoria de un agente bp capturado, para ver el último estado vivo. Linares tenía uno. Toca volatility.