1414 - Pentesting IBM MQ
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
IBM MQ είναι μια τεχνολογία της IBM για τη διαχείριση ουρών μηνυμάτων. Όπως άλλες τεχνολογίες message broker, είναι αφιερωμένη στη λήψη, αποθήκευση, επεξεργασία και ταξινόμηση πληροφοριών μεταξύ παραγωγών και καταναλωτών.
Από προεπιλογή, εκθέτει την TCP θύρα 1414 του IBM MQ. Μερικές φορές, το HTTP REST API μπορεί να εκτεθεί στην θύρα 9443. Οι μετρήσεις (Prometheus) μπορούν επίσης να προσπελαστούν από την TCP θύρα 9157.
Η TCP θύρα 1414 του IBM MQ μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά και για να ελέγξει την instance.
Η IBM παρέχει εκτενή τεχνική τεκμηρίωση διαθέσιμη στο https://www.ibm.com/docs/en/ibm-mq.
Ένα προτεινόμενο εργαλείο για εύκολη εκμετάλλευση είναι το punch-q, με χρήση Docker. Το εργαλείο χρησιμοποιεί ενεργά τη βιβλιοθήκη Python pymqi
.
Για μια πιο χειροκίνητη προσέγγιση, χρησιμοποιήστε τη βιβλιοθήκη Python pymqi. Εξαρτήσεις IBM MQ είναι απαραίτητες.
Οι εξαρτήσεις IBM MQ πρέπει να εγκατασταθούν και να φορτωθούν:
Δημιουργήστε έναν λογαριασμό (IBMid) στο https://login.ibm.com/.
Κατεβάστε τις βιβλιοθήκες 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. Για Linux x86_64 είναι 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
Αποσυμπιέστε (tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
).
Εκτελέστε sudo ./mqlicense.sh
για να αποδεχθείτε τους όρους άδειας.
Αν βρίσκεστε σε Kali Linux, τροποποιήστε το αρχείο
mqlicense.sh
: αφαιρέστε/σχολιάστε τις παρακάτω γραμμές (μεταξύ γραμμών 105-110):
Εγκαταστήστε αυτά τα πακέτα:
Στη συνέχεια, προσθέστε προσωρινά τα .so
αρχεία στο LD: export LD_LIBRARY_PATH=/opt/mqm/lib64
, πριν εκτελέσετε άλλα εργαλεία που χρησιμοποιούν αυτές τις εξαρτήσεις.
Στη συνέχεια, μπορείτε να κλωνοποιήσετε το έργο pymqi: περιέχει ενδιαφέροντα αποσπάσματα κώδικα, σταθερές, ... Ή μπορείτε να εγκαταστήσετε απευθείας τη βιβλιοθήκη με: pip install pymqi
.
Απλά χρησιμοποιήστε: sudo docker run --rm -ti leonjza/punch-q
.
Κλωνοποιήστε το έργο punch-q και στη συνέχεια ακολουθήστε το readme για την εγκατάσταση (pip install -r requirements.txt && python3 setup.py install
).
Μετά, μπορεί να χρησιμοποιηθεί με την εντολή punch-q
.
Μπορείτε να προσπαθήσετε να αριθμήσετε το όνομα διαχειριστή ουράς, τους χρήστες, τα κανάλια και τις ουρές με punch-q ή pymqi.
Μερικές φορές, δεν υπάρχει προστασία κατά της απόκτησης του ονόματος διαχειριστή ουράς:
punch-q χρησιμοποιεί μια εσωτερική (τροποποιήσιμη) λίστα λέξεων για να βρει υπάρχοντες καναλιούς. Παράδειγμα χρήσης:
Συμβαίνει μερικές φορές ορισμένες περιπτώσεις IBM MQ να δέχονται μη αυθεντικοποιημένα αιτήματα MQ, οπότε δεν χρειάζεται --username / --password
. Φυσικά, τα δικαιώματα πρόσβασης μπορεί επίσης να διαφέρουν.
Μόλις αποκτήσουμε ένα όνομα καναλιού (εδώ: DEV.ADMIN.SVRCONN
), μπορούμε να απαριθμήσουμε όλα τα άλλα κανάλια.
Η απαρίθμηση μπορεί βασικά να γίνει με αυτό το απόσπασμα κώδικα code/examples/dis_channels.py
από pymqi:
... Αλλά το punch-q ενσωματώνει επίσης αυτό το μέρος (με περισσότερες πληροφορίες!). Μπορεί να εκκινήσει με:
Υπάρχει ένα απόσπασμα κώδικα με pymqi (dis_queues.py
) αλλά το punch-q επιτρέπει την ανάκτηση περισσότερων πληροφοριών σχετικά με τις ουρές:
Μπορείτε να στοχεύσετε ουρές/κανάλια για να κατασκοπεύσετε/εξάγετε μηνύματα από αυτά (μη καταστροφική λειτουργία). Examples:
Μη διστάσετε να επαναλάβετε όλες τις αναγνωρισμένες ουρές.
Ορισμένες λεπτομέρειες πριν συνεχίσουμε: Το IBM MQ μπορεί να ελεγχθεί μέσω πολλών τρόπων: MQSC, PCF, Control Command. Ορισμένες γενικές λίστες μπορούν να βρεθούν στην τεκμηρίωση του IBM MQ. PCF (Προγραμματιζόμενες Μορφές Εντολών) είναι αυτό που επικεντρωνόμαστε για να αλληλεπιδράσουμε απομακρυσμένα με την περίπτωση. punch-q και επιπλέον pymqi βασίζονται σε αλληλεπιδράσεις PCF.
Μπορείτε να βρείτε μια λίστα με τις εντολές PCF:
Μια ενδιαφέρουσα εντολή είναι η
MQCMD_CREATE_SERVICE
και η τεκμηρίωσή της είναι διαθέσιμη εδώ. Δέχεται ως επιχείρημα μιαStartCommand
που δείχνει σε ένα τοπικό πρόγραμμα στην περίπτωση (παράδειγμα:/bin/sh
).Υπάρχει επίσης μια προειδοποίηση για την εντολή στα έγγραφα: "Προσοχή: Αυτή η εντολή επιτρέπει σε έναν χρήστη να εκτελέσει μια αυθαίρετη εντολή με εξουσία mqm. Εάν παραχωρηθούν δικαιώματα για τη χρήση αυτής της εντολής, ένας κακόβουλος ή απρόσεκτος χρήστης θα μπορούσε να ορίσει μια υπηρεσία που θα βλάψει τα συστήματα ή τα δεδομένα σας, για παράδειγμα, διαγράφοντας απαραίτητα αρχεία."
Σημείωση: πάντα σύμφωνα με την τεκμηρίωση του IBM MQ (Administration Reference), υπάρχει επίσης ένα HTTP endpoint στο
/admin/action/qmgr/{qmgrName}/mqsc
για να εκτελέσετε την αντίστοιχη εντολή MQSC για τη δημιουργία υπηρεσίας (DEFINE SERVICE
). Αυτό το θέμα δεν έχει καλυφθεί ακόμα εδώ.
Η δημιουργία / διαγραφή υπηρεσίας με PCF για απομακρυσμένη εκτέλεση προγράμματος μπορεί να γίνει με punch-q:
Παράδειγμα 1
Στα αρχεία καταγραφής του IBM MQ, μπορείτε να διαβάσετε ότι η εντολή εκτελέστηκε επιτυχώς:
Μπορείτε επίσης να απαριθμήσετε τα υπάρχοντα προγράμματα στη μηχανή (εδώ /bin/doesnotexist
... δεν υπάρχει):
Να είστε προσεκτικοί ότι η εκκίνηση του προγράμματος είναι ασύγχρονη. Έτσι χρειάζεστε ένα δεύτερο στοιχείο για να εκμεταλλευτείτε την ευπάθεια (listener for reverse shell, file creation on different service, data exfiltration through network ...)
Παράδειγμα 2
Για εύκολη reverse shell, punch-q προτείνει επίσης δύο payloads reverse shell:
Ένα με bash
Ένα με perl
Φυσικά μπορείτε να δημιουργήσετε ένα προσαρμοσμένο με την εντολή execute
.
Για bash:
Για perl:
Μπορείτε να ερευνήσετε την τεκμηρίωση του IBM MQ και να χρησιμοποιήσετε απευθείας τη βιβλιοθήκη pymqi python για να δοκιμάσετε συγκεκριμένη εντολή PCF που δεν έχει υλοποιηθεί στο punch-q.
Example:
Αν δεν μπορείτε να βρείτε τα ονόματα σταθερών, μπορείτε να ανατρέξετε στην τεκμηρίωση IBM MQ.
Παράδειγμα για
MQCMD_REFRESH_CLUSTER
(Δεκαδικό = 73). Χρειάζεται την παράμετροMQCA_CLUSTER_NAME
(Δεκαδικό = 2029) η οποία μπορεί να είναι*
(Έγγραφο: ):
Αν θέλετε να δοκιμάσετε τη συμπεριφορά και τις εκμεταλλεύσεις του IBM MQ, μπορείτε να ρυθμίσετε ένα τοπικό περιβάλλον βασισμένο σε Docker:
Έχοντας έναν λογαριασμό στο ibm.com και cloud.ibm.com.
Δημιουργήστε ένα κοντέινερ IBM MQ με:
Κατά προεπιλογή, η αυθεντικοποίηση είναι ενεργοποιημένη, το όνομα χρήστη είναι admin
και ο κωδικός πρόσβασης είναι passw0rd
(Μεταβλητή περιβάλλοντος MQ_ADMIN_PASSWORD
). Εδώ, το όνομα του διαχειριστή ουρών έχει οριστεί σε MYQUEUEMGR
(μεταβλητή MQ_QMGR_NAME
).
Πρέπει να έχετε το IBM MQ σε λειτουργία με τις θύρες του εκτεθειμένες:
Οι παλιές εκδόσεις των εικόνων docker του IBM MQ βρίσκονται στη διεύθυνση: https://hub.docker.com/r/ibmcom/mq/.