1414 - Pentesting IBM MQ
Informazioni di base
IBM MQ è una tecnologia IBM per gestire code di messaggi. Come altre tecnologie di message broker, è dedicata a ricevere, archiviare, elaborare e classificare informazioni tra produttori e consumatori.
Per impostazione predefinita, espone la porta TCP IBM MQ 1414. A volte, l'API REST HTTP può essere esposta sulla porta 9443. Le metriche (Prometheus) potrebbero anche essere accessibili dalla porta TCP 9157.
La porta TCP IBM MQ 1414 può essere utilizzata per manipolare messaggi, code, canali, ... ma anche per controllare l'istanza.
IBM fornisce una vasta documentazione tecnica disponibile su https://www.ibm.com/docs/en/ibm-mq.
Strumenti
Uno strumento suggerito per una facile esecuzione è punch-q, con l'utilizzo di Docker. Lo strumento utilizza attivamente la libreria Python pymqi
.
Per un approccio più manuale, utilizzare la libreria Python pymqi. Sono necessarie le dipendenze IBM MQ.
Installazione di pymqi
È necessario installare e caricare le dipendenze IBM MQ:
Crea un account (IBMid) su https://login.ibm.com/.
Scarica le librerie IBM MQ da https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=ibm%7EWebSphere&product=ibm/WebSphere/WebSphere+MQ&release=9.0.0.4&platform=All&function=fixId&fixids=9.0.0.4-IBM-MQC-*,9.0.0.4-IBM-MQ-Install-Java-All,9.0.0.4-IBM-MQ-Java-InstallRA&useReleaseAsTarget=true&includeSupersedes=0&source=fc. Per Linux x86_64 è 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
Decomprimi (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
).Esegui
sudo ./mqlicense.sh
per accettare i termini delle licenze.
Se si utilizza Kali Linux, modificare il file
mqlicense.sh
: rimuovere/commentare le seguenti righe (tra le righe 105-110):
Installa questi pacchetti:
Successivamente, aggiungi temporaneamente i file
.so
a LD:export LD_LIBRARY_PATH=/opt/mqm/lib64
, prima di eseguire altri strumenti che utilizzano queste dipendenze.
Successivamente, puoi clonare il progetto pymqi: contiene interessanti frammenti di codice, costanti, ... Oppure puoi installare direttamente la libreria con: pip install pymqi
.
Utilizzo di punch-q
Con Docker
Basta usare: sudo docker run --rm -ti leonjza/punch-q
.
Senza Docker
Clona il progetto punch-q e segui le istruzioni per l'installazione (pip install -r requirements.txt && python3 setup.py install
).
Successivamente, può essere utilizzato con il comando punch-q
.
Enumerazione
Puoi provare a enumerare il nome del gestore della coda, gli utenti, i canali e le code con punch-q o pymqi.
Gestore della coda
A volte, non c'è protezione contro l'ottenimento del nome del gestore della coda:
Canali
punch-q utilizza una lista di parole interne (modificabile) per trovare canali esistenti. Esempio di utilizzo:
Accade che alcune istanze di IBM MQ accettino richieste MQ non autenticate, quindi --username / --password
non è necessario. Naturalmente, i diritti di accesso possono variare.
Appena otteniamo un nome di canale (in questo caso: DEV.ADMIN.SVRCONN
), possiamo enumerare tutti gli altri canali.
L'enumerazione può essere effettuata essenzialmente con questo frammento di codice code/examples/dis_channels.py
da pymqi:
... Ma punch-q incorpora anche quella parte (con ulteriori informazioni!). Può essere avviato con:
Code
Ecco un frammento di codice con pymqi (dis_queues.py
), ma punch-q permette di ottenere ulteriori informazioni sulle code:
Sfruttare
Estrarre messaggi
Puoi prendere di mira code/canali per intercettare/estrarre messaggi da essi (operazione non distruttiva). Esempi:
Non esitare a iterare su tutte le code identificate.
Esecuzione del codice
Alcuni dettagli prima di continuare: IBM MQ può essere controllato attraverso diversi metodi: MQSC, PCF, Control Command. Alcuni elenchi generali possono essere trovati nella documentazione di IBM MQ. PCF (Programmable Command Formats) è ciò su cui ci concentriamo per interagire in remoto con l'istanza. punch-q e inoltre pymqi si basano su interazioni PCF.
Puoi trovare un elenco di comandi PCF:
Un comando interessante è
MQCMD_CREATE_SERVICE
e la sua documentazione è disponibile qui. Prende come argomento unStartCommand
che punta a un programma locale sull'istanza (esempio:/bin/sh
).C'è anche un avviso sul comando nella documentazione: "Attenzione: Questo comando consente a un utente di eseguire un comando arbitrario con l'autorità mqm. Se vengono concessi i diritti per utilizzare questo comando, un utente malintenzionato o negligente potrebbe definire un servizio che danneggia i tuoi sistemi o dati, ad esempio eliminando file essenziali."
Nota: sempre secondo la documentazione di IBM MQ (Riferimento all'amministrazione), c'è anche un endpoint HTTP su
/admin/action/qmgr/{qmgrName}/mqsc
per eseguire l'equivalente comando MQSC per la creazione del servizio (DEFINE SERVICE
). Questo aspetto non è ancora trattato qui.
La creazione / eliminazione del servizio con PCF per l'esecuzione remota del programma può essere fatta tramite punch-q:
Esempio 1
Nei log di IBM MQ, è possibile leggere che il comando è stato eseguito con successo:
È anche possibile enumerare i programmi esistenti sulla macchina (qui /bin/doesnotexist
... non esiste):
Fai attenzione che il lancio del programma è asincrono. Quindi hai bisogno di un secondo elemento per sfruttare l'exploit (ascoltatore per la shell inversa, creazione di file su un servizio diverso, esfiltrazione di dati tramite la rete...)
Esempio 2
Per una shell inversa semplice, punch-q propone anche due payload per la shell inversa:
Uno con bash
Uno con perl
Ovviamente puoi crearne uno personalizzato con il comando execute
.
Per bash:
Per perl:
PCF personalizzato
Puoi approfondire la documentazione di IBM MQ e utilizzare direttamente la libreria python pymqi per testare comandi PCF specifici non implementati in punch-q.
Esempio:
Se non riesci a trovare i nomi delle costanti, puoi fare riferimento alla documentazione di IBM MQ.
Esempio per
MQCMD_REFRESH_CLUSTER
(Decimale = 73). Richiede il parametroMQCA_CLUSTER_NAME
(Decimale = 2029) che può essere*
(Doc: ):
Ambiente di test
Se desideri testare il comportamento e gli exploit di IBM MQ, puoi configurare un ambiente locale basato su Docker:
Avere un account su ibm.com e cloud.ibm.com.
Creare un'istanza containerizzata di IBM MQ con:
Di default, l'autenticazione è abilitata, il nome utente è admin
e la password è passw0rd
(variabile d'ambiente MQ_ADMIN_PASSWORD
). Qui, il nome del gestore della coda è stato impostato su MYQUEUEMGR
(variabile MQ_QMGR_NAME
).
Dovresti avere IBM MQ in esecuzione con le sue porte esposte:
La vecchia versione delle immagini Docker di IBM MQ si trova su: https://hub.docker.com/r/ibmcom/mq/.
Riferimenti
Last updated