Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
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)
Клас java.net.URL
реалізує Serializable
, це означає, що цей клас може бути серіалізований.
Цей клас має цікаву поведінку. З документації: “Два хости вважаються еквівалентними, якщо обидва імена хостів можуть бути перетворені в однакові IP-адреси”.
Тоді, щоразу, коли об'єкт URL викликає будь-яку з функцій equals
або hashCode
, DNS запит для отримання IP-адреси буде надіслано.
Виклик функції hashCode
з об'єкта URL досить простий, достатньо вставити цей об'єкт всередину HashMap
, який буде десеріалізовано. Це тому, що в кінці функції readObject
з HashMap
виконується цей код:
Це буде виконувати putVal
з кожним значенням всередині HashMap
. Але більш важливим є виклик hash
з кожним значенням. Ось код функції hash
:
Як ви можете спостерігати, коли десеріалізується HashMap
, функція hash
буде виконуватися з кожним об'єктом і під час виконання hash
вона буде виконувати .hashCode()
об'єкта. Тому, якщо ви десеріалізуєте HashMap
, що містить об'єкт URL, об'єкт URL виконає .hashCode()
.
Тепер давайте подивимося на код URLObject.hashCode()
:
Як ви можете бачити, коли URLObject
виконує .hashCode()
, викликається hashCode(this)
. Продовження ви можете побачити код цієї функції:
Ви можете побачити, що getHostAddress
виконується для домену, запускаючи DNS запит.
Отже, цей клас може бути зловжито для запуску DNS запиту для демонстрації, що десеріалізація можлива, або навіть для екстракції інформації (ви можете додати як піддомен вихід команди виконання).
Ви можете знайти URDNS payload код від ysoserial тут. Однак, щоб полегшити розуміння, як це закодувати, я створив свій власний PoC (на основі того, що з ysoserial):
В оригінальній ідеї корисний вантаж commons collections був змінений для виконання DNS запиту, це було менш надійно, ніж запропонований метод, але це пост: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Ви можете завантажити GadgetProbe з магазину додатків Burp Suite (Extender).
GadgetProbe спробує з'ясувати, чи існують деякі Java класи на Java класі сервера, щоб ви могли знати, чи він вразливий до деякого відомого експлойту.
GadgetProbe використовуватиме той же DNS корисний вантаж попереднього розділу, але перед виконанням DNS запиту він спробує десеріалізувати довільний клас. Якщо довільний клас існує, DNS запит буде надіслано, і GadgetProbe зафіксує, що цей клас існує. Якщо DNS запит ніколи не надсилається, це означає, що довільний клас не був десеріалізований успішно, тому або він не присутній, або він не серіалізований/експлуатований.
У GitHub, GadgetProbe має деякі словники з Java класами для тестування.
Цей сканер можна завантажити з магазину додатків Burp (Extender). Розширення має пасивні та активні можливості.
За замовчуванням він пасивно перевіряє всі запити та відповіді, що надсилаються, шукаючи Java серіалізовані магічні байти і представить попередження про вразливість, якщо такі знайдені:
Ручне тестування
Ви можете вибрати запит, клацнути правою кнопкою миші та Send request to DS - Manual Testing
.
Потім, у вкладці Deserialization Scanner Tab --> Manual testing tab ви можете вибрати точку вставки. І запустити тестування (Виберіть відповідну атаку в залежності від використаного кодування).
Навіть якщо це називається "Ручне тестування", це досить автоматизовано. Він автоматично перевірить, чи десеріалізація є вразливою до будь-якого ysoserial корисного вантажу, перевіряючи бібліотеки, присутні на веб-сервері, і підсвітить ті, що вразливі. Щоб перевірити на вразливі бібліотеки, ви можете вибрати запуск Javas Sleeps, сну через споживання ЦП, або використовуючи DNS, як вже згадувалося раніше.
Експлуатація
Якщо ви ідентифікували вразливу бібліотеку, ви можете надіслати запит до вкладки Exploiting Tab. У цій вкладці вам потрібно знову вибрати точку ін'єкції, написати вразливу бібліотеку, для якої ви хочете створити корисний вантаж, і команду. Потім просто натисніть відповідну кнопку Attack.
Зробіть так, щоб ваш корисний вантаж виконував щось на зразок наступного:
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)