OpenClaw está teniendo su momento. El agente de IA autónomo — que quizás conozcas como Clawdbot o Moltbot, según cuándo lo encontraste por primera vez — ha subido en picado en las tablas de GitHub durante las últimas semanas, y la gente está levantando instancias en todas partes. Desde la semana pasada también está viviendo su primer momento de seguridad real: se publicó CVE-2026-25253, un RCE de 1 clic, con un parche llegando apenas unos días después. Si ejecutas estas instancias, o eres responsable de una red donde alguien podría hacerlo, ahora es el momento de averiguar dónde están.
Contexto rápido
OpenClaw conecta LLMs (Claude, GPT-4, los modelos de Google) a tu máquina y a un navegador real, y permite que un agente haga trabajo en tu nombre — chatear por Telegram/Slack, realizar tareas web, ejecutar comandos. El componente que le importa a esta plantilla es el servicio gateway, que se anuncia para su descubrimiento local a través de multicast DNS (mDNS) en el puerto 5353/UDP.
Una nota sobre la nomenclatura, porque los matchers dependen de ello: el proyecto es OpenClaw ahora, pero se publicó como Clawdbot y, antes, como Moltbot — la misma base de código, y los nombres de servicio mDNS todavía llevan la denominación antigua (_clawdbot-gw, _openclaw-gw). La plantilla hace coincidir ambos para que el cambio de nombre no la ciegue.
La plantilla
id: openclaw-exposure
info:
name: Openclaw (formerly Clawdbot / Moltbot) - Detect
author: rxerium
severity: info
description: |
Clawdbot Gateway service was detected exposing configuration information via mDNS including DNS settings, gateway details, and service configuration.
classification:
cwe-id: CWE-200
metadata:
verified: true
max-request: 1
shodan-query: product:openclaw
fofa-query: body="ClawdBot"
tags: network,openclaw,gateway,exposure,udp,mdns,js,discovery
javascript:
- pre-condition: |
isUDPPortOpen(Host,Port);
code: |
let c = require("nuclei/net");
let conn = c.Open('udp', `${Host}:${Port}`);
// mDNS query for _clawdbot-gw._tcp.local PTR record
let packet = "000000000001000000000000095f7365727669636573075f646e732d7364045f756470056c6f63616c00000c0001"
conn.SendHex(packet);
let resp = conn.RecvString(2048);
resp;
args:
Host: "{{Host}}"
Port: 5353
matchers:
- type: dsl
dsl:
- "contains(response, '_openclaw-gw') && success == true"
- "contains(response, 'clawdbot') && success == true"
condition: or
extractors:
- type: regex
part: response
name: server
group: 1
regex:
- 'displayName=([a-zA-Z0-9._-]+)'
Cómo funciona
Es una plantilla de protocolo JavaScript, no HTTP. La mayoría de las plantillas de exposición lanzan un GET y hacen coincidir el cuerpo de la respuesta. Esta usa la biblioteca nuclei/net de Nuclei para abrir un socket en bruto y hablar directamente un protocolo binario — necesario, porque mDNS no es algo que puedas expresar con matchers HTTP.
La condición previa controla todo el proceso. isUDPPortOpen(Host, Port) comprueba que 5353/UDP está realmente escuchando antes de que salga cualquier paquete. Si está cerrado, la plantilla hace un cortocircuito y no gastas una petición — lo que mantiene los escaneos baratos cuando apuntas esto a un rango grande donde la mayoría de los hosts no ejecutarán un gateway.
El código envía una consulta mDNS en bruto y lee la respuesta. Abre una conexión UDP a Host:5353, envía un paquete DNS codificado en hexadecimal con SendHex, y lee hasta 2048 bytes de vuelta. El payload decodificado es una consulta DNS-SD de enumeración de servicios — una pregunta PTR para _services._dns-sd._udp.local, la meta-consulta estándar de "listar todo lo que anuncias". Un host que ejecuta el gateway responde con sus servicios anunciados, y el nombre de servicio OpenClaw/Clawdbot aparece en esa respuesta.
Los matchers confirman que es un gateway. Dos comprobaciones DSL combinadas con or: contains(response, '_openclaw-gw') o contains(response, 'clawdbot'), cada una con la condición success == true para que un socket semicerrado o una lectura vacía no puedan producir un falso positivo. Cualquiera de las dos cadenas en la respuesta mDNS confirma que estás mirando un gateway OpenClaw, independientemente del branding que lleve.
El extractor obtiene el nombre de pantalla del dispositivo. Un regex extrae displayName=... del anuncio y lo muestra como server en tu salida. Así que un resultado no es solo "existe un gateway" — obtienes el nombre legible por humanos que el operador le dio, que es oro para el inventario y el triaje.
La severidad es info, CWE-200. Esta es la clasificación honesta: la plantilla detecta una exposición de información (CWE-200, Information Exposure) — un gateway que anuncia su configuración donde no debería — no explotación activa. La filtración de mDNS hacia una interfaz alcanzable es el hallazgo; lo que un atacante hace a continuación es un problema aparte.
verified: true significa que la plantilla fue confirmada contra una instancia real, no solo escrita según especificaciones — por lo que una coincidencia es de confianza.
Por qué vale la pena tener detección mDNS
La toma de huellas HTTP es la forma obvia de encontrar estos, y funciona. Pero mDNS captura una parte diferente. Un gateway puede estar filtrando descubrimiento de servicios hacia un segmento de red que un atacante puede alcanzar incluso cuando el lado HTTP está cortafuegos, detrás de un proxy, o en un puerto no estándar que tu escaneo HTTP no cubrió. Es especialmente relevante para evaluaciones internas y redes planas, donde el multicast cruza alegremente segmentos que no debería y el gateway está efectivamente anunciando "Estoy aquí, y este es mi nombre" a todo lo que hay en la red. Ejecuta esto junto con una huella HTTP y obtienes cobertura que ninguno de los dos tiene por sí solo.
Ejecutándolo a escala
Tu propia red y perímetro primero — autorización más clara, y los hallazgos mDNS son más accionables dentro de las redes que controlas.
nuclei -t openclaw-exposure.yaml -l targets.txt -o openclaw-hits.txt
La plantilla ya fija el puerto 5353 en sus args, y la condición previa isUDPPortOpen significa que puedes lanzarle una lista de hosts amplia sin golpear nada — los puertos cerrados se omiten antes de que se envíe un paquete.
Filtra previamente con un escaneo UDP para rangos grandes. El escaneo UDP es más lento que TCP, por lo que en grandes ámbitos vale la pena encontrar primero los oyentes 5353 activos y pasarlos solo a Nuclei:
# naabu doesn't do UDP; use nmap for the 5353/udp sweep
nmap -sU -p 5353 --open -iL ranges.txt -oG - | awk '/Up$/{print $2}' > mdns-hosts.txt
nuclei -t openclaw-exposure.yaml -l mdns-hosts.txt -o openclaw-hits.txt
A escala de internet, apóyate en datos de escaneo. No blastees activamente UDP por todo internet — es ruidoso, lento y legalmente complicado. Usa las consultas de metadata integradas en la plantilla (product:openclaw en Shodan, body="ClawdBot" en FOFA) para enumerar instancias expuestas, luego ejecuta la plantilla solo contra candidatos en tu alcance autorizado.
Ejecútalo continuamente, no una vez. La base de instalación de OpenClaw está creciendo día a día ahora mismo, lo que significa que aparecen nuevos gateways todo el tiempo — un escaneo puntual se queda obsoleto rápido. Y combina cada resultado con dos acciones: saca el gateway de cualquier interfaz alcanzable, y rota las credenciales que contiene.
Por qué esto importa
La filtración mDNS es el hallazgo que produce la plantilla, pero la razón para preocuparse ahora mismo es lo que hay detrás de un gateway expuesto.
El timing es la historia. CVE-2026-25253 se divulgó el 26 de enero y se parcheó en OpenClaw 2026.1.29, publicado a finales de la semana pasada. Es un remote code execution de 1 clic: la Control UI acepta un gatewayUrl de una cadena de consulta de URL y abre automáticamente un WebSocket hacia él sin confirmación, filtrando el token de autenticación de la instancia a quien controle esa URL. Roba el token, secuestra el WebSocket, ejecuta comandos. No necesita autenticación previa, está calificado como CVSS 8.8 (CWE-669, Incorrect Resource Transfer Between Spheres), y — la parte desagradable — funciona incluso contra instancias que solo se ejecutan en localhost, porque el ataque pivota a través del propio navegador de la víctima. Los investigadores lo llaman una "cadena de muerte RCE de 1 clic." El código de prueba de concepto ya es público, y la cobertura periodística amplia está llegando justo cuando escribo esto.
Ese es el problema agudo, pero el permanente es la exposición en general. OpenClaw almacena credenciales para los modelos en la nube que maneja — Claude, OpenAI, Google AI — además de tokens para cualquier integración de mensajería y herramientas que hayas conectado. Un gateway expuesto es SSH abierto sin contraseña, excepto que la contraseña es un montón de credenciales de IA de pago y un punto de apoyo en el host. Y porque un agente es una identidad con acceso, quien se apodere de uno hereda sus tokens y concesiones OAuth, y puede darle instrucciones que ejecutará sin cuestionarlas. Las credenciales son el premio inmediato; el punto de apoyo persistente dentro de un agente privilegiado es el duradero. Un gateway que transmite su propio displayName por mDNS simplemente se está haciendo más fácil de encontrar. Esa es la brecha para la que sirve esta plantilla.
Mitigación
Si ejecutas OpenClaw, la lista de tareas de esta semana:
- Parchea ahora. Actualiza a 2026.1.29 o posterior — corrige CVE-2026-25253. Parchear no deshace la exposición previa, así que trátalo como el primer paso, no el trabajo completo.
- Rota el token del gateway y cada credencial almacenada. Nuevo
authToken, nuevas claves API para Claude/OpenAI/Google AI, y comprueba los registros de uso. Si era alcanzable, asume que está comprometido. - Sácalo de cualquier interfaz alcanzable. Vincula al loopback, o ponlo detrás de una VPN, bastión o ZTNA, y bloquea 5353/UDP en los límites de segmento para que mDNS deje de cruzar redes donde no tiene nada que hacer. El loopback es el mínimo, no el techo — el RCE pivota a través del navegador, así que solo-localhost no es un pase libre.
- Ejecuta el agente con privilegios mínimos. Sin "modo dios". Reduce su acceso al sistema, archivos y claves, y monitorízalo como cualquier cuenta con concesiones OAuth y API permanentes.
- Vigila el patrón de explotación. Marca las conexiones WebSocket inesperadas desde navegadores a dominios externos, y alerta sobre cambios de configuración del gateway.
La detección en sí no es exótica — una condición previa, una consulta mDNS en bruto, dos matchers de cadenas. El valor está en el timing: captura gateways que se anuncian en la red incluso cuando el lado HTTP está bloqueado, justo cuando un RCE público de 1 clic hace urgente encontrarlos. Ejecútalo pronto, ejecútalo a menudo, rota las claves en cada resultado. Los runtimes de agentes son identidades con claves; encontrar los expuestos rápido es el juego completo.