1414 - Pentesting IBM MQ
Información básica
IBM MQ es una tecnología de IBM para gestionar colas de mensajes. Al igual que otras tecnologías de broker de mensajes, está dedicada a recibir, almacenar, procesar y clasificar información entre productores y consumidores.
Por defecto, expone el puerto TCP 1414 de IBM MQ. A veces, la API REST HTTP puede estar expuesta en el puerto 9443. Las métricas (Prometheus) también podrían ser accesibles desde el puerto TCP 9157.
El puerto TCP 1414 de IBM MQ se puede utilizar para manipular mensajes, colas, canales, ... pero también para controlar la instancia.
IBM proporciona una amplia documentación técnica disponible en https://www.ibm.com/docs/en/ibm-mq.
Herramientas
Una herramienta sugerida para una explotación sencilla es punch-q, con uso de Docker. La herramienta utiliza activamente la biblioteca de Python pymqi
.
Para un enfoque más manual, utiliza la biblioteca de Python pymqi. Se necesitan dependencias de IBM MQ.
Instalación de pymqi
Es necesario instalar y cargar las dependencias de IBM MQ:
Crea una cuenta (IBMid) en https://login.ibm.com/.
Descarga las bibliotecas de IBM MQ desde 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 es 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
Descomprime (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
).Ejecuta
sudo ./mqlicense.sh
para aceptar los términos de la licencia.
Si estás en Kali Linux, modifica el archivo
mqlicense.sh
: elimina/comenta las siguientes líneas (entre las líneas 105-110):
Instala estos paquetes:
Luego, añade temporalmente los archivos
.so
a LD:export LD_LIBRARY_PATH=/opt/mqm/lib64
, antes de ejecutar otras herramientas que utilicen estas dependencias.
Luego, puedes clonar el proyecto pymqi: contiene fragmentos de código interesantes, constantes, ... O puedes instalar la biblioteca directamente con: pip install pymqi
.
Usando punch-q
Con Docker
Simplemente usa: sudo docker run --rm -ti leonjza/punch-q
.
Sin Docker
Clona el proyecto punch-q y luego sigue el archivo readme para la instalación (pip install -r requirements.txt && python3 setup.py install
).
Después, se puede utilizar con el comando punch-q
.
Enumeración
Puedes intentar enumerar el nombre del gestor de colas, los usuarios, los canales y las colas con punch-q o pymqi.
Gestor de Colas
A veces, no hay protección contra obtener el nombre del Gestor de Colas:
Canales
punch-q está utilizando una lista de palabras interna (modificable) para encontrar canales existentes. Ejemplo de uso:
Sucede que algunas instancias de IBM MQ aceptan solicitudes de MQ sin autenticación, por lo que no se necesita --username / --password
. Por supuesto, los derechos de acceso también pueden variar.
Tan pronto como obtengamos un nombre de canal (aquí: DEV.ADMIN.SVRCONN
), podemos enumerar todos los demás canales.
La enumeración se puede hacer básicamente con este fragmento de código code/examples/dis_channels.py
de pymqi:
... Pero punch-q también incrusta esa parte (¡con más información!). Se puede lanzar con:
Colas
Hay un fragmento de código con pymqi (dis_queues.py
) pero punch-q permite recuperar más información sobre las colas:
Explotar
Volcar mensajes
Puedes apuntar a cola(s)/canal(es) para husmear/volcar mensajes de ellos (operación no destructiva). Ejemplos:
No dudes en iterar en todas las colas identificadas.
Ejecución de código
Algunos detalles antes de continuar: IBM MQ se puede controlar de varias formas: MQSC, PCF, Control Command. Algunas listas generales se pueden encontrar en la documentación de IBM MQ. PCF (Formatos de Comando Programables) es en lo que nos enfocamos para interactuar de forma remota con la instancia. punch-q y además pymqi se basan en interacciones de PCF.
Puedes encontrar una lista de comandos de PCF:
Un comando interesante es
MQCMD_CREATE_SERVICE
y su documentación está disponible aquí. Toma como argumento unStartCommand
que apunta a un programa local en la instancia (ejemplo:/bin/sh
).También hay una advertencia del comando en la documentación: "Atención: Este comando permite a un usuario ejecutar un comando arbitrario con autoridad mqm. Si se otorgan derechos para usar este comando, un usuario malintencionado o descuidado podría definir un servicio que dañe sus sistemas o datos, por ejemplo, al eliminar archivos esenciales."
Nota: siempre según la documentación de IBM MQ (Referencia de Administración), también hay un punto final HTTP en
/admin/action/qmgr/{qmgrName}/mqsc
para ejecutar el comando MQSC equivalente para la creación de servicios (DEFINE SERVICE
). Este aspecto aún no se ha cubierto aquí.
La creación / eliminación de servicios con PCF para la ejecución remota de programas se puede hacer con punch-q:
Ejemplo 1
En los registros de IBM MQ, puedes leer que el comando se ejecutó correctamente:
También puedes enumerar los programas existentes en la máquina (aquí /bin/doesnotexist
... no existe):
Ten en cuenta que el lanzamiento del programa es asíncrono. Por lo tanto, necesitas un segundo elemento para aprovechar el exploit (escucha para shell inverso, creación de archivos en un servicio diferente, exfiltración de datos a través de la red ...)
Ejemplo 2
Para un shell inverso fácil, punch-q propone también dos payloads de shell inverso:
Uno con bash
Uno con perl
Por supuesto, puedes construir uno personalizado con el comando execute
.
Para bash:
Para perl:
PCF Personalizado
Puedes consultar la documentación de IBM MQ y utilizar directamente la biblioteca de Python pymqi para probar comandos PCF específicos que no estén implementados en punch-q.
Ejemplo:
Si no puedes encontrar los nombres de las constantes, puedes consultar la documentación de IBM MQ.
Ejemplo para
MQCMD_REFRESH_CLUSTER
(Decimal = 73). Necesita el parámetroMQCA_CLUSTER_NAME
(Decimal = 2029) que puede ser*
(Doc: ):
Entorno de prueba
Si deseas probar el comportamiento y exploits de IBM MQ, puedes configurar un entorno local basado en Docker:
Tener una cuenta en ibm.com y cloud.ibm.com.
Crear un IBM MQ en contenedores con:
Por defecto, la autenticación está habilitada, el nombre de usuario es admin
y la contraseña es passw0rd
(Variable de entorno MQ_ADMIN_PASSWORD
). Aquí, el nombre del gestor de colas se ha establecido como MYQUEUEMGR
(variable MQ_QMGR_NAME
).
Deberías tener IBM MQ funcionando y con sus puertos expuestos:
La versión antigua de las imágenes de Docker de IBM MQ se encuentran en: https://hub.docker.com/r/ibmcom/mq/.
Referencias
Última actualización