Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Informações básicas
IBM MQ é uma tecnologia da IBM para gerenciar filas de mensagens. Como outras tecnologias de **message broker**, é dedicada a receber, armazenar, processar e classificar informações entre produtores e consumidores.
Por padrão, **ele expõe a porta TCP 1414 do IBM MQ**. Às vezes, a API REST HTTP pode ser exposta na porta **9443**. Métricas (Prometheus) também podem ser acessadas pela porta TCP **9157**.
A porta TCP 1414 do IBM MQ pode ser usada para manipular mensagens, filas, canais, ... mas **também para controlar a instância**.
A IBM fornece uma ampla documentação técnica disponível em [https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq).
## Ferramentas
Uma ferramenta sugerida para exploração fácil é **[punch-q](https://github.com/sensepost/punch-q)**, com uso de Docker. A ferramenta utiliza ativamente a biblioteca Python `pymqi`.
Para uma abordagem mais manual, use a biblioteca Python **[pymqi](https://github.com/dsuch/pymqi)**. [As dependências do IBM MQ](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) são necessárias.
### Instalando pymqi
**As dependências do IBM MQ** precisam ser instaladas e carregadas:
1. Crie uma conta (IBMid) em [https://login.ibm.com/](https://login.ibm.com/).
2. Baixe as bibliotecas do IBM MQ em [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). Para Linux x86_64 é **9.0.0.4-IBM-MQC-LinuxX64.tar.gz**.
6. Em seguida, adicione temporariamente os arquivos `.so` ao LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **antes** de executar outras ferramentas que utilizam essas dependências.
Então, você pode clonar o projeto [**pymqi**](https://github.com/dsuch/pymqi): ele contém trechos de código interessantes, constantes, ... Ou você pode instalar diretamente a biblioteca com: `pip install pymqi`.
Basta usar: `sudo docker run --rm -ti leonjza/punch-q`.
#### Sem Docker
Clone o projeto [**punch-q**](https://github.com/sensepost/punch-q) e siga o readme para instalação (`pip install -r requirements.txt && python3 setup.py install`).
Depois, pode ser usado com o comando `punch-q`.
## Enumeração
Você pode tentar enumerar o **nome do gerenciador de filas, os usuários, os canais e as filas** com **punch-q** ou **pymqi**.
### Gerenciador de Filas
Às vezes, não há proteção contra a obtenção do nome do Gerenciador de Filas:
```bash
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
Queue Manager name: MYQUEUEMGR
```
### Canais
**punch-q** está usando uma lista de palavras interna (modificável) para encontrar canais existentes. Exemplo de uso:
"SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised.
"SYSTEM.DEF.SVRCONN" might exist, but user was not authorised.
```
Acontece que algumas instâncias do IBM MQ aceitam requisições MQ **não autenticadas**, então `--username / --password` não são necessários. Claro, os direitos de acesso também podem variar.
Assim que obtivermos um nome de canal (aqui: `DEV.ADMIN.SVRCONN`), podemos enumerar todos os outros canais.
A enumeração pode ser basicamente feita com este trecho de código `code/examples/dis_channels.py` do **pymqi**:
> Alguns detalhes antes de continuar: IBM MQ pode ser controlado de várias maneiras: MQSC, PCF, Comando de Controle. Algumas listas gerais podem ser encontradas na [documentação do IBM MQ](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) (***Formatos de Comando Programáveis***) é no que estamos focados para interagir remotamente com a instância. **punch-q** e, além disso, **pymqi** são baseados em interações PCF.
>
> Você pode encontrar uma lista de comandos PCF:
> * [Da documentação PCF](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=reference-definitions-programmable-command-formats), e
> Um comando interessante é `MQCMD_CREATE_SERVICE` e sua documentação está disponível [aqui](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Ele aceita como argumento um `StartCommand` apontando para um programa local na instância (exemplo: `/bin/sh`).
>
> Há também um aviso sobre o comando na documentação: *"Atenção: Este comando permite que um usuário execute um comando arbitrário com autoridade mqm. Se concedidos direitos para usar este comando, um usuário malicioso ou descuidado poderia definir um serviço que danifica seus sistemas ou dados, por exemplo, excluindo arquivos essenciais."*
>
> *Nota: sempre de acordo com a documentação do IBM MQ (Referência de Administração), também há um endpoint HTTP em `/admin/action/qmgr/{qmgrName}/mqsc` para executar o comando MQSC equivalente para criação de serviço (`DEFINE SERVICE`). Este aspecto ainda não está coberto aqui.*
**Esteja ciente de que o lançamento do programa é assíncrono. Portanto, você precisa de um segundo item para aproveitar a exploração** ***(listener para shell reverso, criação de arquivo em um serviço diferente, exfiltração de dados através da rede ...)***
Você pode consultar a documentação do IBM MQ e usar diretamente a biblioteca python **pymqi** para testar comandos PCF específicos que não estão implementados no **punch-q**.
# 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()
```
Se você não conseguir encontrar os nomes constantes, pode consultar a [documentação do IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
> *Exemplo para [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Decimal = 73). Ele precisa do parâmetro `MQCA_CLUSTER_NAME` (Decimal = 2029) que pode ser `*` (Doc: ):*
Por padrão, a autenticação está habilitada, o nome de usuário é `admin` e a senha é `passw0rd` (variável de ambiente `MQ_ADMIN_PASSWORD`). Aqui, o nome do gerenciador de filas foi definido como `MYQUEUEMGR` (variável `MQ_QMGR_NAME`).
Você deve ter o IBM MQ em funcionamento com suas portas expostas:
```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
```
> A versão antiga das imagens do IBM MQ docker está em: https://hub.docker.com/r/ibmcom/mq/.