🎵 Rational Gaze — Meshuggah

de Nothing

Hay un tráfico que sale de una estación de trabajo hacia un dominio que nadie clasificó, cada sesenta segundos, con una regularidad de reloj suizo. El contenido va por HTTPS, así que no se puede leer: son bytes cifrados hacia un .xyz registrado hace nueve días. Un analista que quiera saber qué dice ese tráfico va a perder la tarde, porque para eso está el cifrado. Pero no hace falta abrir el sobre para saber que algo anda mal. Alcanza con mirar el reloj.

El contenido va cifrado, y no importa.

La primera reacción, la de instinto, es querer descifrar. Es la reacción equivocada, y es cara: el TLS moderno está para que no puedas, y pelearte con eso es regalarle horas al adversario mientras exfiltra tranquilo. El error de fondo es creer que el secreto está en el mensaje. No está ahí. Un canal de comando y control tiene que hacer dos cosas incompatibles: mantenerse en contacto con el operador y no llamar la atención. La segunda es la que se le complica, porque estar en contacto significa hablar seguido, y hablar seguido —de forma automatizada, sin un humano que introduzca desorden— produce un patrón. El payload es opaco. El patrón, no. Toda la caza de C2 vive en esa asimetría: no en lo que se dice, sino en la huella que deja el decirlo.

La puntualidad es la confesión.

Un beacon —el latido, literalmente, con que el implante avisa “sigo acá, ¿hay órdenes?"— es una llamada periódica al servidor. Cada hora, cada dos, cada minuto. Y esa periodicidad es la firma más honesta que existe, porque ninguna persona se comporta así. Un usuario real navega a tirones: abre cinco pestañas, se levanta a buscar café, vuelve, no toca nada por veinte minutos, descarga un adjunto. Su tráfico es irregular porque la vida es irregular. Un implante no tiene vida: tiene un sleep interval, un número configurado que dice cuánto duerme entre llamada y llamada. El default de Cobalt Strike, por ejemplo, son sesenta segundos —cómodo para el operador, suicida para el implante—, y esos sesenta segundos exactos, repetidos doscientas veces sin que varíe ni el peso del paquete, son un metrónomo. Nadie que quiera esconderse debería sonar como un metrónomo. Herramientas como RITA o Zeek no hacen otra cosa que buscar metrónomos: conexiones demasiado regulares en el tiempo y demasiado constantes en el volumen. La regularidad es la que canta.

El navegador que nunca escribió ese User-Agent.

Cuando el ritmo no alcanza, está la cabecera. El User-Agent es el campo donde un cliente HTTP declara qué es, y el malware tiene que declarar algo, así que suele mentir —mal—. Un caso de manual: un implante que se anuncia como Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F...), un Samsung Galaxy, saliendo desde un host que en todo su historial de navegación fue un Windows 10 de escritorio. El teléfono apareció de la nada, para una sola sesión, y desapareció. Nadie cambia de dispositivo a mitad de una conexión; la cabecera fue inyectada estáticamente en el binario y el atacante ni se molestó en que fuera coherente con la máquina. Peor todavía es cuando el cliente ni finge ser un navegador: un User-Agent que dice WindowsPowerShell/5.1.14393.1944 es un intérprete de consola descargando cosas de internet, que es exactamente lo que uno no quiere ver saliendo de la notebook de contabilidad. Y cuando el malware se pone astuto y genera cadenas aleatorias —el minero PCASTLE rotaba agentes de seis caracteres sin sentido, lasdowdmvvx y parientes— la aleatoriedad misma es el tell: se caza por entropía, porque un User-Agent legítimo pertenece a un conjunto conocido y chico, y una cadena de ruido no pertenece a ninguno.

El jitter: enseñarle al malware a llegar tarde a propósito.

Los que diseñan estos implantes conocen todo esto, obviamente, y tienen una contramedida con nombre propio: el jitter. Es ruido estadístico agregado a mano sobre el intervalo base —en vez de llamar cada sesenta segundos clavados, llama cada sesenta más o menos un treinta por ciento al azar, a veces a los cuarenta y dos, a veces a los setenta y ocho—. Es, dicho sin vueltas, enseñarle a la máquina a ser impuntual para que se parezca más a una persona. Y funciona: degrada la detección por periodicidad, ensucia el metrónomo, obliga al defensor a mirar ventanas más largas y distribuciones en lugar de intervalos exactos. Pero hay una ironía que me gusta en esto, y es que el jitter es una confesión de segundo orden. El atacante que agrega jitter está admitiendo que sabe que el ritmo lo delata; está gastando esfuerzo de diseño en parecer desordenado. El desorden fingido tiene su propia estructura —una distribución acotada, un promedio que no se mueve, un piso y un techo—, y esa estructura también se puede medir. Se puede esconder el latido. Cuesta mucho más esconder que hay un corazón.

Cazar la forma cuando el fondo es ilegible.

La pregunta útil, entonces, no es “¿qué está diciendo este tráfico?” —esa tiene por respuesta un muro de bytes cifrados y una tarde perdida—. Es “¿este tráfico se comporta como algo que tiene una agenda?”. Cada cuánto habla, si el intervalo es sospechosamente parejo, si el peso de los paquetes no varía como variaría una conversación real, si los bytes que salen empiezan a superar groseramente a los que entran —el momento en que un check-in se convierte en exfiltración, cuando de golpe todo son POST y CONNECT con cargas de un mega y el contador de bytes salientes se dispara a cincuenta—. Todo eso se lee sin descifrar una sola cosa. Es el mismo principio con el que un rastreador lee un bosque: no ve al animal, ve la cadencia de las pisadas, el peso, la distancia entre huellas, y de ahí deduce qué pasó y hacia dónde. El animal se puede esconder. El caminar deja forma.

Esto es, en el fondo, lo mismo que vengo diciendo sobre el trabajo del que junta señales tibias: la evidencia casi nunca falta, falta el que la lee en el eje correcto. Y se emparenta con otra cosa que escribí, sobre una credencial robada que es idéntica a la legítima —ahí también la defensa que queda no es mirar la cosa robada, imposible de distinguir, sino el contexto alrededor: desde dónde, con qué ritmo, para hacer qué—.

Un buen operador puede cifrarlo todo, rotar los dominios con un DGA, esconder el destino real detrás de una CDN con domain fronting, y aun así le queda un problema que no se resuelve con criptografía: en algún momento el implante tiene que hablar, y hablar seguido, y la única forma de no dejar ritmo es no llamar nunca —y un C2 que no llama nunca no es un C2, es un archivo muerto en un disco—. La necesidad de estar en contacto es la vulnerabilidad. No se puede parchear sin dejar de ser lo que se es. Lo apunto, y sigo mirando el reloj: es más honesto que el sobre.

commit b34c0n60s

Date: 2026-09-14 09:00 PM

perf: stop decrypting the payload — time the heartbeat instead