1414 - Pentesting IBM MQ
Grundinformationen
IBM MQ ist eine IBM-Technologie zur Verwaltung von Nachrichtenwarteschlangen. Wie andere Nachrichtenbroker-Technologien ist es dafür vorgesehen, Informationen zwischen Produzenten und Verbrauchern zu empfangen, zu speichern, zu verarbeiten und zu klassifizieren.
Standardmäßig stellt es den IBM MQ TCP-Port 1414 zur Verfügung. Manchmal kann die HTTP REST API auf Port 9443 verfügbar sein. Metriken (Prometheus) können ebenfalls über den TCP-Port 9157 abgerufen werden.
Der IBM MQ TCP-Port 1414 kann verwendet werden, um Nachrichten, Warteschlangen, Kanäle ... zu manipulieren, aber auch um die Instanz zu steuern.
IBM bietet eine umfangreiche technische Dokumentation, die auf https://www.ibm.com/docs/en/ibm-mq verfügbar ist.
Werkzeuge
Ein empfohlenes Werkzeug für eine einfache Ausnutzung ist punch-q, mit Docker-Nutzung. Das Tool verwendet aktiv die Python-Bibliothek pymqi
.
Für einen manuellen Ansatz verwenden Sie die Python-Bibliothek pymqi. IBM MQ-Abhängigkeiten sind erforderlich.
Installation von pymqi
IBM MQ-Abhängigkeiten müssen installiert und geladen werden:
Erstellen Sie ein Konto (IBMid) auf https://login.ibm.com/.
Laden Sie die IBM MQ-Bibliotheken von 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 herunter. Für Linux x86_64 ist es 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
Dekomprimieren Sie (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
).Führen Sie
sudo ./mqlicense.sh
aus, um die Lizenzbedingungen zu akzeptieren.
Wenn Sie unter Kali Linux sind, ändern Sie die Datei
mqlicense.sh
: Entfernen/Kommentieren Sie die folgenden Zeilen (zwischen den Zeilen 105-110):
Installieren Sie diese Pakete:
Fügen Sie dann vorübergehend die
.so
-Dateien zu LD hinzu:export LD_LIBRARY_PATH=/opt/mqm/lib64
, bevor Sie andere Tools verwenden, die diese Abhängigkeiten nutzen.
Dann können Sie das Projekt pymqi klonen: Es enthält interessante Code-Snippets, Konstanten, ... Oder Sie können die Bibliothek direkt mit: pip install pymqi
installieren.
Verwendung von punch-q
Mit Docker
Einfach verwenden: sudo docker run --rm -ti leonjza/punch-q
.
Ohne Docker
Klonen Sie das Projekt punch-q und folgen Sie dann der README zur Installation (pip install -r requirements.txt && python3 setup.py install
).
Danach kann es mit dem Befehl punch-q
verwendet werden.
Enumeration
Sie können versuchen, den Queue-Manager-Namen, die Benutzer, die Kanäle und die Warteschlangen mit punch-q oder pymqi aufzulisten.
Queue-Manager
Manchmal gibt es keinen Schutz gegen das Abrufen des Queue-Manager-Namens:
Channels
punch-q verwendet eine interne (modifizierbare) Wortliste, um vorhandene Kanäle zu finden. Anwendungsbeispiel:
Es kommt vor, dass einige IBM MQ-Instanzen unauthentifizierte MQ-Anfragen akzeptieren, sodass --username / --password
nicht benötigt wird. Natürlich können auch die Zugriffsrechte variieren.
Sobald wir einen Kanalnamen erhalten (hier: DEV.ADMIN.SVRCONN
), können wir alle anderen Kanäle auflisten.
Die Auflistung kann grundsätzlich mit diesem Code-Snippet code/examples/dis_channels.py
aus pymqi durchgeführt werden:
... Aber punch-q bettet auch diesen Teil ein (mit mehr Informationen!). Es kann gestartet werden mit:
Queues
Es gibt einen Code-Snippet mit pymqi (dis_queues.py
), aber punch-q ermöglicht es, mehr Informationen über die Warteschlangen abzurufen:
Exploit
Nachrichten dumpen
Sie können Warteschlange(n)/Kanal(e) anvisieren, um Nachrichten von ihnen abzuhören / zu dumpen (nicht destruktive Operation). Beispiele:
Zögern Sie nicht, alle identifizierten Warteschlangen zu durchlaufen.
Codeausführung
Einige Details, bevor wir fortfahren: IBM MQ kann auf verschiedene Weise gesteuert werden: MQSC, PCF, Control Command. Einige allgemeine Listen finden Sie in der IBM MQ-Dokumentation. PCF (Programmable Command Formats) ist das, worauf wir uns konzentrieren, um remote mit der Instanz zu interagieren. punch-q und darüber hinaus pymqi basieren auf PCF-Interaktionen.
Sie finden eine Liste von PCF-Befehlen:
Ein interessanter Befehl ist
MQCMD_CREATE_SERVICE
und seine Dokumentation ist hier verfügbar. Er nimmt als Argument einenStartCommand
, der auf ein lokales Programm auf der Instanz verweist (Beispiel:/bin/sh
).Es gibt auch eine Warnung des Befehls in den Dokumenten: "Achtung: Dieser Befehl erlaubt es einem Benutzer, einen beliebigen Befehl mit mqm-Berechtigungen auszuführen. Wenn die Rechte zur Nutzung dieses Befehls gewährt werden, könnte ein böswilliger oder nachlässiger Benutzer einen Dienst definieren, der Ihre Systeme oder Daten schädigt, zum Beispiel durch das Löschen wesentlicher Dateien."
Hinweis: Immer gemäß der IBM MQ-Dokumentation (Administrationsreferenz) gibt es auch einen HTTP-Endpunkt unter
/admin/action/qmgr/{qmgrName}/mqsc
, um den entsprechenden MQSC-Befehl zur Dienstcreation (DEFINE SERVICE
) auszuführen. Dieser Aspekt ist hier noch nicht behandelt.
Die Dienstcreation / -löschung mit PCF für die remote Programmausführung kann mit punch-q durchgeführt werden:
Beispiel 1
In den Protokollen von IBM MQ können Sie lesen, dass der Befehl erfolgreich ausgeführt wurde:
Sie können auch vorhandene Programme auf der Maschine auflisten (hier /bin/doesnotexist
... existiert nicht):
Seien Sie sich bewusst, dass der Programmstart asynchron ist. Daher benötigen Sie ein zweites Element, um den Exploit auszunutzen (Listener für Reverse Shell, Dateierstellung auf einem anderen Dienst, Datenexfiltration über das Netzwerk ...)
Beispiel 2
Für eine einfache Reverse Shell bietet punch-q auch zwei Reverse Shell-Payloads an:
Eine mit bash
Eine mit perl
Natürlich können Sie auch eine benutzerdefinierte mit dem execute
-Befehl erstellen.
Für bash:
Für Perl:
Custom PCF
Sie können in die IBM MQ-Dokumentation eintauchen und direkt die pymqi Python-Bibliothek verwenden, um spezifische PCF-Befehle zu testen, die nicht in punch-q implementiert sind.
Beispiel:
Wenn Sie die konstanten Namen nicht finden können, können Sie auf die IBM MQ-Dokumentation verweisen.
Beispiel für
MQCMD_REFRESH_CLUSTER
(Dezimal = 73). Es benötigt den ParameterMQCA_CLUSTER_NAME
(Dezimal = 2029), der*
sein kann (Dok: ):
Testumgebung
Wenn Sie das Verhalten von IBM MQ und Exploits testen möchten, können Sie eine lokale Umgebung basierend auf Docker einrichten:
Ein Konto auf ibm.com und cloud.ibm.com haben.
Erstellen Sie eine containerisierte IBM MQ mit:
Standardmäßig ist die Authentifizierung aktiviert, der Benutzername ist admin
und das Passwort ist passw0rd
(Umgebungsvariable MQ_ADMIN_PASSWORD
). Hier wurde der Name des Queue-Managers auf MYQUEUEMGR
(Variable MQ_QMGR_NAME
) gesetzt.
Sie sollten IBM MQ am Laufen haben, mit seinen exponierten Ports:
Die alte Version der IBM MQ Docker-Images befindet sich unter: https://hub.docker.com/r/ibmcom/mq/.
References
Last updated