1414 - Pentesting IBM MQ
Podstawowe informacje
IBM MQ to technologia firmy IBM do zarządzania kolejkami komunikatów. Podobnie jak inne technologie brokera komunikatów, jest dedykowana do odbierania, przechowywania, przetwarzania i klasyfikowania informacji między producentami a konsumentami.
Domyślnie eksponuje port TCP IBM MQ 1414. Czasami interfejs API HTTP REST może być dostępny na porcie 9443. Metryki (Prometheus) mogą być również dostępne z portu TCP 9157.
Port TCP IBM MQ 1414 można używać do manipulowania wiadomościami, kolejkami, kanałami, ... ale również do kontrolowania instancji.
IBM udostępnia obszerną dokumentację techniczną dostępną na stronie https://www.ibm.com/docs/en/ibm-mq.
Narzędzia
Zalecanym narzędziem do łatwego wykorzystania jest punch-q, z użyciem Dockera. Narzędzie aktywnie korzysta z biblioteki Pythona pymqi
.
Dla bardziej manualnego podejścia, użyj biblioteki Pythona pymqi. Potrzebne są zależności IBM MQ.
Instalowanie pymqi
Należy zainstalować i załadować zależności IBM MQ:
Utwórz konto (IBMid) na stronie https://login.ibm.com/.
Pobierz biblioteki IBM MQ ze strony 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. Dla Linux x86_64 jest to 9.0.0.4-IBM-MQC-LinuxX64.tar.gz.
Rozpakuj (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz
).Uruchom
sudo ./mqlicense.sh
, aby zaakceptować warunki licencji.
Jeśli używasz Kali Linux, zmodyfikuj plik
mqlicense.sh
: usuń/zakomentuj następujące linie (między liniami 105-110):
Zainstaluj te pakiety:
Następnie tymczasowo dodaj pliki
.so
do LD:export LD_LIBRARY_PATH=/opt/mqm/lib64
, przed uruchomieniem innych narzędzi korzystających z tych zależności.
Następnie możesz sklonować projekt pymqi: zawiera interesujące fragmenty kodu, stałe, ... Lub możesz bezpośrednio zainstalować bibliotekę za pomocą: pip install pymqi
.
Korzystanie z punch-q
Z użyciem Dockera
Po prostu użyj: sudo docker run --rm -ti leonjza/punch-q
.
Bez użycia Dockera
Sklonuj projekt punch-q, a następnie postępuj zgodnie z instrukcjami w pliku readme dotyczącymi instalacji (pip install -r requirements.txt && python3 setup.py install
).
Następnie można go używać za pomocą polecenia punch-q
.
Wyliczanie
Możesz spróbować wyliczyć nazwę menedżera kolejek, użytkowników, kanały i kolejki za pomocą punch-q lub pymqi.
Menedżer kolejek
Czasami nie ma ochrony przed uzyskaniem nazwy menedżera kolejek:
Kanały
punch-q korzysta z wewnętrznej (modyfikowalnej) listy słów do wyszukiwania istniejących kanałów. Przykład użycia:
Zdarza się, że niektóre instancje IBM MQ akceptują nieuwierzytelnione żądania MQ, więc nie jest wymagane użycie --username / --password
. Oczywiście, prawa dostępu mogą się różnić.
Gdy tylko uzyskamy nazwę jednego kanału (tutaj: DEV.ADMIN.SVRCONN
), możemy wyliczyć wszystkie inne kanały.
Wyliczenie można zasadniczo wykonać za pomocą tego fragmentu kodu code/examples/dis_channels.py
z biblioteki pymqi:
... Ale punch-q również zawiera tę część (z większą ilością informacji!). Można go uruchomić za pomocą:
Kolejki
Istnieje fragment kodu z pymqi (dis_queues.py
), ale punch-q pozwala na pobranie większej ilości informacji na temat kolejek:
Wykorzystanie
Wydobywanie wiadomości
Możesz wybrać kolejki/kanały, aby przechwycić/wydobyć z nich wiadomości (operacja nieniszcząca). Przykłady:
Nie wahaj się iterować po wszystkich zidentyfikowanych kolejkach.
Wykonanie kodu
Kilka szczegółów przed kontynuacją: IBM MQ można kontrolować na wiele sposobów: MQSC, PCF, Control Command. Niektóre ogólne listy można znaleźć w dokumentacji IBM MQ. PCF (Programmable Command Formats) to to, na czym się skupiamy, aby zdalnie komunikować się z instancją. punch-q i dalej pymqi opierają się na interakcjach PCF.
Można znaleźć listę poleceń PCF:
Z dokumentacji PCF, oraz
Jednym interesującym poleceniem jest
MQCMD_CREATE_SERVICE
, a jego dokumentacja jest dostępna tutaj. Jako argument przyjmujeStartCommand
, wskazujący na lokalny program na instancji (przykład:/bin/sh
).W dokumentacji znajduje się również ostrzeżenie dotyczące tego polecenia: "Uwaga: To polecenie umożliwia użytkownikowi uruchomienie dowolnego polecenia z uprawnieniami mqm. Jeśli użytkownikowi zostaną przyznane uprawnienia do korzystania z tego polecenia, złośliwy lub nieostrożny użytkownik może zdefiniować usługę, która uszkodzi systemy lub dane, na przykład przez usunięcie istotnych plików."
Uwaga: zawsze zgodnie z dokumentacją IBM MQ (Administration Reference), istnieje również punkt końcowy HTTP pod adresem
/admin/action/qmgr/{qmgrName}/mqsc
, aby uruchomić równoważne polecenie MQSC dla tworzenia usługi (DEFINE SERVICE
). Ten aspekt nie jest jeszcze tutaj omawiany.
Tworzenie / usuwanie usługi za pomocą PCF w celu zdalnego wykonania programu można wykonać za pomocą punch-q:
Przykład 1
W dziennikach IBM MQ można odczytać, że polecenie zostało pomyślnie wykonane:
Można również wyliczyć istniejące programy na maszynie (tutaj /bin/doesnotexist
... nie istnieje):
Bądź świadomy, że uruchomienie programu jest asynchroniczne. Więc potrzebujesz drugiego elementu, aby wykorzystać podatność (słuchacz dla odwróconej powłoki, tworzenie pliku na innym serwisie, eksfiltracja danych przez sieć...)
Przykład 2
Dla łatwej odwróconej powłoki, punch-q proponuje również dwa payloady odwróconej powłoki:
Jeden z bashem
Jeden z perlem
Oczywiście możesz zbudować własny z użyciem polecenia execute
.
Dla basha:
Dla perl:
Niestandardowe PCF
Możesz zgłębić dokumentację IBM MQ i bezpośrednio użyć biblioteki python pymqi, aby przetestować konkretną komendę PCF, która nie jest zaimplementowana w punch-q.
Przykład:
Jeśli nie możesz znaleźć nazw stałych, możesz odwołać się do dokumentacji IBM MQ.
Przykład dla
MQCMD_REFRESH_CLUSTER
(dziesiętnie = 73). Wymaga parametruMQCA_CLUSTER_NAME
(dziesiętnie = 2029), który może być*
(Dok: ):
Środowisko testowe
Jeśli chcesz przetestować zachowanie i wykorzystanie IBM MQ, możesz skonfigurować lokalne środowisko oparte na Dockerze:
Posiadając konto na ibm.com i cloud.ibm.com.
Utwórz skonteneryzowany IBM MQ za pomocą:
Domyślnie uwierzytelnianie jest włączone, nazwa użytkownika to admin
, a hasło to passw0rd
(zmienna środowiskowa MQ_ADMIN_PASSWORD
). Tutaj nazwa menedżera kolejek została ustawiona na MYQUEUEMGR
(zmienna MQ_QMGR_NAME
).
Powinieneś mieć uruchomiony IBM MQ z wystawionymi portami:
Stare wersje obrazów IBM MQ dla Docker znajdują się pod adresem: https://hub.docker.com/r/ibmcom/mq/.
Odnośniki
Last updated