1414 - Pentesting IBM MQ
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.
Ferramentas
Uma ferramenta sugerida para exploração fácil é punch-q, com uso de Docker. A ferramenta utiliza ativamente a biblioteca Python pymqi
.
Para uma abordagem mais manual, use a biblioteca Python pymqi. As dependências do IBM MQ são necessárias.
Instalando pymqi
As dependências do IBM MQ precisam ser instaladas e carregadas:
Crie uma conta (IBMid) em https://login.ibm.com/.
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. Para Linux x86_64 é 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
Descompacte (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
).Execute
sudo ./mqlicense.sh
para aceitar os termos de licença.
Se você estiver usando Kali Linux, modifique o arquivo
mqlicense.sh
: remova/comente as seguintes linhas (entre as linhas 105-110):
Instale esses pacotes:
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: ele contém trechos de código interessantes, constantes, ... Ou você pode instalar a biblioteca diretamente com: pip install pymqi
.
Usando punch-q
Com Docker
Basta usar: sudo docker run --rm -ti leonjza/punch-q
.
Sem Docker
Clone o projeto 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:
Canais
punch-q está usando uma lista de palavras interna (modificável) para encontrar canais existentes. Exemplo de uso:
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:
... Mas punch-q também incorpora essa parte (com mais informações!). Pode ser iniciado com:
Queues
Há um trecho de código com pymqi (dis_queues.py
), mas punch-q permite recuperar mais informações sobre as filas:
Exploit
Dump messages
Você pode direcionar fila(s)/canal(is) para espionar / despejar mensagens delas (operação não destrutiva). Exemplos:
Não hesite em iterar sobre todas as filas identificadas.
Execução de código
Alguns detalhes antes de continuar: o 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. PCF (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:
Um comando interessante é
MQCMD_CREATE_SERVICE
e sua documentação está disponível aqui. Ele aceita como argumento umStartCommand
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.
A criação / exclusão de serviços com PCF para execução de programas remotos pode ser feita pelo punch-q:
Exemplo 1
Nos logs do IBM MQ, você pode ler que o comando foi executado com sucesso:
Você também pode enumerar os programas existentes na máquina (aqui /bin/doesnotexist
... não existe):
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 reverse shell, criação de arquivo em um serviço diferente, exfiltração de dados através da rede ...)
Exemplo 2
Para uma reverse shell fácil, punch-q também propõe dois payloads de reverse shell:
Um com bash
Um com perl
Claro que você pode construir um personalizado com o comando execute
.
Para bash:
Para perl:
Custom PCF
Você pode explorar 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.
Example:
Se você não conseguir encontrar os nomes constantes, pode consultar a documentação do IBM MQ.
Exemplo para
MQCMD_REFRESH_CLUSTER
(Decimal = 73). Ele precisa do parâmetroMQCA_CLUSTER_NAME
(Decimal = 2029) que pode ser*
(Doc: ):
Ambiente de teste
Se você quiser testar o comportamento e as explorações do IBM MQ, pode configurar um ambiente local baseado em Docker:
Ter uma conta em ibm.com e cloud.ibm.com.
Criar um IBM MQ containerizado com:
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:
A versão antiga das imagens do IBM MQ docker está em: https://hub.docker.com/r/ibmcom/mq/.
Referências
Last updated