Voltar às publicações
Arquivo de pesquisa

Detectando Gateways OpenClaw via mDNS

Detecção da exposição de gateways OpenClaw, Clawdbot e Moltbot escutando anúncios de serviços mDNS com um template Nuclei de protocolo JavaScript.

openclawnucleiexposuremdnsudpdetectionai-security

O OpenClaw está vivendo seu momento. O agente de IA autônomo — que você talvez conheça como Clawdbot ou Moltbot, dependendo de quando o encontrou pela primeira vez — subiu nas paradas do GitHub nas últimas semanas, e as pessoas estão levantando instâncias em todo lugar. A partir da semana passada, ele também vive seu primeiro momento real de segurança: a CVE-2026-25253 foi divulgada, um RCE de 1 clique, com um patch chegando apenas alguns dias depois. Se você roda essas instâncias, ou é responsável por uma rede onde alguém pode fazer isso, agora é a hora de descobrir onde estão.

Contexto rápido

O OpenClaw conecta LLMs (Claude, GPT-4, os modelos do Google) à sua máquina e a um navegador real, permitindo que um agente faça trabalho em seu nome — conversar no Telegram/Slack, executar tarefas na web, rodar comandos. O componente que interessa a este template é o serviço de gateway, que se anuncia para descoberta local via DNS multicast (mDNS) na porta 5353/UDP.

Uma nota sobre nomenclatura, porque os matchers dependem disso: o projeto é OpenClaw agora, mas foi lançado como Clawdbot e, anteriormente, como Moltbot — mesma base de código, e os nomes de serviço mDNS ainda carregam a nomenclatura antiga (_clawdbot-gw, _openclaw-gw). O template faz match nos dois para que a renomeação não o cegue.

O template

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._-]+)'

Como funciona

É um template de protocolo JavaScript, não HTTP. A maioria dos templates de exposição dispara um GET e faz match no corpo da resposta. Este usa a biblioteca nuclei/net do Nuclei para abrir um socket bruto e falar um protocolo binário diretamente — necessário, porque mDNS não é algo que se consegue expressar com matchers HTTP.

A pré-condição controla tudo. isUDPPortOpen(Host, Port) verifica que 5353/UDP está realmente escutando antes de qualquer pacote ser enviado. Se estiver fechado, o template faz curto-circuito e você não gasta uma requisição — o que mantém os scans baratos quando você aponta isso para um grande intervalo onde a maioria dos hosts não vai estar rodando um gateway.

O código envia uma query mDNS bruta e lê a resposta. Ele abre uma conexão UDP para Host:5353, envia um pacote DNS codificado em hex com SendHex, e lê até 2048 bytes de volta. O payload decodificado é uma query DNS-SD de enumeração de serviços — uma pergunta PTR para _services._dns-sd._udp.local, a meta-query padrão "liste tudo que você anuncia". Um host rodando o gateway responde com os serviços anunciados, e o nome de serviço OpenClaw/Clawdbot volta nessa resposta.

Os matchers confirmam que é um gateway. Dois checks DSL combinados em or: contains(response, '_openclaw-gw') ou contains(response, 'clawdbot'), cada um condicionado a success == true para que um socket semi-aberto ou uma leitura vazia não produza falso positivo. Qualquer uma das strings na resposta mDNS confirma que você está olhando para um gateway OpenClaw, qualquer que seja o branding que ele carregue.

O extractor puxa o nome de exibição do dispositivo. Um regex captura displayName=... do anúncio e o exibe como server na sua saída. Então um hit não é só "um gateway existe" — você obtém o nome legível que o operador deu a ele, que vale ouro para inventário e triagem.

Severidade é info, CWE-200. Esta é a classificação honesta: o template detecta uma exposição de informação (CWE-200, Information Exposure) — um gateway anunciando sua configuração onde não deveria — não exploração ativa. O mDNS vazando para uma interface alcançável é o achado; o que um atacante faz a seguir é um problema separado.

verified: true significa que o template foi confirmado contra uma instância real, não apenas escrito de acordo com especificações — então um match é confiável.

Por que ter detecção mDNS vale a pena

Fingerprinting HTTP é a forma óbvia de encontrar esses gateways, e funciona. Mas o mDNS captura uma fatia diferente. Um gateway pode estar vazando descoberta de serviço para um segmento de rede que um atacante consegue alcançar mesmo quando o lado HTTP está bloqueado por firewall, atrás de um proxy, ou em uma porta não padrão que o seu scan HTTP não cobriu. É especialmente relevante para avaliações internas e redes planas, onde multicast cruza alegremente segmentos que não deveria e o gateway está efetivamente anunciando "Estou aqui, e esse é meu nome" para tudo no cabo. Execute isso junto com um fingerprint HTTP e você obtém cobertura que nenhum dos dois tem sozinho.

Rodando em escala

Sua própria rede e perímetro primeiro — autorização mais limpa, e os achados mDNS são mais acionáveis dentro das redes que você controla.

nuclei -t openclaw-exposure.yaml -l targets.txt -o openclaw-hits.txt

O template já afixa a porta 5353 nos seus args, e a pré-condição isUDPPortOpen significa que você pode jogar uma lista ampla de hosts sem massacrar nada — portas fechadas são puladas antes de um pacote ser enviado.

Pré-filtre com um scan UDP para grandes intervalos. Scan UDP é mais lento que TCP, então em escopos grandes vale a pena encontrar os listeners 5353 ativos primeiro e passar apenas esses para o 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

Em escala de internet, use dados de scan. Não dispare UDP ativamente pela internet toda — é barulhento, lento e juridicamente arriscado. Use as queries de metadata embutidas no template (product:openclaw no Shodan, body="ClawdBot" no FOFA) para enumerar instâncias expostas, depois rode o template apenas contra candidatos no seu escopo autorizado.

Rode continuamente, não uma só vez. A base de instalação do OpenClaw está crescendo dia a dia agora, o que significa que novos gateways aparecem o tempo todo — um scan pontual fica desatualizado rápido. E associe cada hit a duas ações: tire o gateway de qualquer interface alcançável, e rotacione as credenciais que ele carrega.

Por que isso importa

Vazamento de mDNS é o achado que o template produz, mas o motivo para se preocupar agora mesmo é o que está por trás de um gateway exposto.

O timing é a história. A CVE-2026-25253 foi divulgada em 26 de janeiro e corrigida no OpenClaw 2026.1.29, lançado no final da semana passada. É uma execução remota de código de 1 clique: a Control UI aceita um gatewayUrl de uma query string de URL e abre automaticamente um WebSocket para ele sem confirmação, vazando o token de autenticação da instância para quem controlar essa URL. Rouba o token, sequestra o WebSocket, executa comandos. Não precisa de autenticação prévia, está avaliado como CVSS 8.8 (CWE-669, Incorrect Resource Transfer Between Spheres), e — a parte desagradável — funciona mesmo contra instâncias rodando apenas em localhost, porque o ataque pivoteia através do próprio navegador da vítima. Pesquisadores estão chamando de "kill chain RCE de 1 clique." Código de prova de conceito já é público, e a ampla cobertura da imprensa está chegando agora mesmo enquanto escrevo.

Esse é o problema agudo, mas o permanente é a exposição em geral. O OpenClaw armazena credenciais para os modelos de nuvem que conduz — Claude, OpenAI, Google AI — além de tokens para quaisquer integrações de mensagens e ferramentas que você tenha conectado. Um gateway exposto é SSH aberto sem senha, exceto que a senha é uma pilha de credenciais de IA pagas e uma posição no host. E como um agente é uma identidade com acesso, quem o assume herda seus tokens e concessões OAuth, e pode dar a ele instruções que ele executará sem questionar. As credenciais são o prêmio imediato; a posição persistente dentro de um agente privilegiado é a duradoura. Um gateway transmitindo seu próprio displayName via mDNS está apenas se tornando mais fácil de encontrar. Essa é a lacuna que este template preenche.

Mitigação

Se você roda OpenClaw, a lista de tarefas desta semana:

  1. Aplique o patch agora. Atualize para 2026.1.29 ou posterior — corrige a CVE-2026-25253. Patchear não desfaz a exposição anterior, então trate isso como passo um, não como o trabalho completo.
  2. Rotacione o token do gateway e cada credencial armazenada. Novo authToken, novas chaves de API para Claude/OpenAI/Google AI, e verifique os logs de uso. Se estava alcançável, assuma que está comprometido.
  3. Tire-o de qualquer interface alcançável. Faça bind no loopback, ou coloque atrás de VPN, bastion ou ZTNA, e bloqueie 5353/UDP nas fronteiras de segmento para que o mDNS pare de cruzar redes onde não tem nada que fazer. Loopback é o piso, não o teto — o RCE pivoteia pelo navegador, então só-localhost não é um salvo-conduto.
  4. Rode o agente com privilégio mínimo. Sem "modo deus". Reduza o acesso dele ao sistema, arquivos e chaves, e monitore-o como qualquer conta com concessões permanentes de API e OAuth.
  5. Fique de olho no padrão de exploit. Sinalize conexões WebSocket inesperadas de navegadores para domínios externos, e alerte sobre mudanças de configuração do gateway.

A detecção em si não é exótica — uma pré-condição, uma query mDNS bruta, dois matchers de string. O valor é o timing: ela captura gateways se anunciando na rede mesmo quando o lado HTTP está bloqueado, exatamente quando um RCE público de 1 clique torna urgente encontrá-los. Rode cedo, rode com frequência, rotacione chaves em cada hit. Runtimes de agentes são identidades com chaves; encontrar os expostos rapidamente é o jogo todo.