1414 - Pentesting IBM MQ
Basic information
IBM MQ — це технологія IBM для управління чергами повідомлень. Як і інші технології брокерів повідомлень, вона призначена для отримання, зберігання, обробки та класифікації інформації між виробниками та споживачами.
За замовчуванням вона відкриває TCP порт IBM MQ 1414. Іноді HTTP REST API може бути відкрито на порту 9443. Метрики (Prometheus) також можуть бути доступні з TCP порту 9157.
TCP порт IBM MQ 1414 може бути використаний для маніпуляцій з повідомленнями, чергами, каналами, ... але також для контролю інстанції.
IBM надає велику технічну документацію, доступну на https://www.ibm.com/docs/en/ibm-mq.
Tools
Рекомендований інструмент для легкого експлуатації — punch-q, з використанням Docker. Інструмент активно використовує бібліотеку Python pymqi
.
Для більш ручного підходу використовуйте бібліотеку Python pymqi. Залежності IBM MQ потрібні.
Installing pymqi
Залежності 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
.
Використання punch-q
З Docker
Просто використовуйте: sudo docker run --rm -ti leonjza/punch-q
.
Без Docker
Клонуйте проект punch-q, а потім дотримуйтесь інструкцій у readme для установки (pip install -r requirements.txt && python3 setup.py install
).
Після цього його можна використовувати з командою punch-q
.
Перерахування
Ви можете спробувати перерахувати ім'я менеджера черг, користувачів, канали та черги за допомогою punch-q або pymqi.
Менеджер черг
Іноді немає захисту від отримання імені менеджера черг:
Channels
punch-q використовує внутрішній (модифікований) список слів для знаходження існуючих каналів. Приклад використання:
Виявляється, що деякі екземпляри IBM MQ приймають неаутентифіковані MQ запити, тому --username / --password
не потрібні. Звичайно, права доступу також можуть варіюватися.
Як тільки ми отримаємо одне ім'я каналу (тут: DEV.ADMIN.SVRCONN
), ми можемо перерахувати всі інші канали.
Перерахунок в основному можна виконати за допомогою цього фрагмента коду code/examples/dis_channels.py
з pymqi:
... Але punch-q також вбудовує цю частину (з більшою кількістю інформації!). Його можна запустити за допомогою:
Черги
There is a code snippet with pymqi (dis_queues.py
) but punch-q permits to retrieve more pieces of info about the queues:
Exploit
Dump messages
Ви можете націлитися на чергу(и)/канал(и), щоб перехопити / скинути повідомлення з них (неконструктивна операція). Приклади:
Не соромтеся ітерувати всі виявлені черги.
Виконання коду
Декілька деталей перед продовженням: IBM MQ можна контролювати кількома способами: MQSC, PCF, Control Command. Деякі загальні списки можна знайти в документації IBM MQ. PCF (Програмовані формати команд) - це те, на чому ми зосереджені для віддаленої взаємодії з екземпляром. punch-q і, крім того, pymqi базуються на взаємодії PCF.
Ви можете знайти список команд PCF:
Одна цікава команда - це
MQCMD_CREATE_SERVICE
, а її документація доступна тут. Вона приймає як аргументStartCommand
, що вказує на локальну програму на екземплярі (приклад:/bin/sh
).У документації також є попередження про команду: "Увага: ця команда дозволяє користувачу виконувати довільну команду з правами mqm. Якщо надано права на використання цієї команди, зловмисний або недбалий користувач може визначити сервіс, який пошкодить ваші системи або дані, наприклад, видаливши важливі файли."
Примітка: завжди відповідно до документації IBM MQ (Посібник з адміністрування), також є HTTP-інтерфейс за адресою
/admin/action/qmgr/{qmgrName}/mqsc
для виконання еквівалентної команди MQSC для створення сервісу (DEFINE SERVICE
). Цей аспект ще не охоплений тут.
Створення / видалення сервісу за допомогою PCF для віддаленого виконання програми може бути виконано за допомогою punch-q:
Приклад 1
У журналах IBM MQ ви можете прочитати, що команда успішно виконана:
Ви також можете перерахувати існуючі програми на машині (тут /bin/doesnotexist
... не існує):
Зверніть увагу, що запуск програми асинхронний. Тому вам потрібен другий елемент для використання експлойту (слухач для зворотного шеллу, створення файлу на різному сервісі, ексфільтрація даних через мережу ...)
Приклад 2
Для простого зворотного шеллу, punch-q також пропонує два корисних навантаження для зворотного шеллу:
Одне з bash
Одне з perl
Звичайно, ви можете створити власне з допомогою команди execute
.
Для bash:
Для perl:
Custom PCF
Ви можете ознайомитися з документацією IBM MQ і безпосередньо використовувати бібліотеку pymqi для тестування конкретної команди 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, що працює з відкритими портами:
Старі версії образів IBM MQ docker доступні за адресою: https://hub.docker.com/r/ibmcom/mq/.
References
Last updated