hacktricks/cryptography/padding-oracle-priv.md

110 lines
11 KiB
Markdown
Raw Normal View History

{% hint style="success" %}
Вивчайте та практикуйте взлом AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Вивчайте та практикуйте взлом GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Підтримайте HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи 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.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-05-01 16:32:23 +00:00
# CBC - Cipher Block Chaining
2024-03-29 18:49:46 +00:00
У режимі CBC **попередній зашифрований блок використовується як IV** для операції XOR з наступним блоком:
2024-02-08 21:36:35 +00:00
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
2024-03-29 18:49:46 +00:00
Для розшифрування CBC виконуються **протилежні операції**:
2024-02-08 21:36:35 +00:00
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
2024-03-29 18:49:46 +00:00
Зверніть увагу, що потрібно використовувати **ключ шифрування** та **IV**.
2024-03-29 18:49:46 +00:00
# Доповнення повідомлення
Оскільки шифрування виконується у **фіксованих розмірних блоках**, **доповнення** зазвичай потрібне в **останньому блоку**, щоб завершити його довжину.\
Зазвичай використовується **PKCS7**, яке генерує доповнення, **повторюючи** кількість **байтів**, **необхідних** для **завершення** блоку. Наприклад, якщо в останньому блоку не вистачає 3 байтів, доповнення буде `\x03\x03\x03`.
Давайте розглянемо більше прикладів з **2 блоками довжиною 8 байтів**:
2024-03-29 18:49:46 +00:00
| байт #0 | байт #1 | байт #2 | байт #3 | байт #4 | байт #5 | байт #6 | байт #7 | байт #0 | байт #1 | байт #2 | байт #3 | байт #4 | байт #5 | байт #6 | байт #7 |
2021-10-10 22:24:28 +00:00
| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** |
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** |
| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** |
| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** |
2021-09-22 14:27:03 +00:00
2024-03-29 18:49:46 +00:00
Зверніть увагу, що в останньому прикладі **останній блок був повним, тому був згенерований ще один лише з доповненням**.
2024-03-29 18:49:46 +00:00
# Oracle доповнення
Коли додаток розшифровує зашифровані дані, він спочатку розшифровує дані; потім він видаляє доповнення. Під час очищення доповнення, якщо **недійсне доповнення викликає виявний вчинок**, у вас є **уразливість Oracle доповнення**. Виявний вчинок може бути **помилкою**, **відсутністю результатів** або **повільною відповіддю**.
Якщо ви виявите цей вчинок, ви можете **розшифрувати зашифровані дані** та навіть **зашифрувати будь-який чистий текст**.
2024-03-29 18:49:46 +00:00
## Як експлуатувати
Ви можете використовувати [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster), щоб експлуатувати цей вид вразливості або просто виконати
2021-10-10 22:24:28 +00:00
```
sudo apt-get install padbuster
```
Для того щоб перевірити, чи є куки сайту вразливими, ви можете спробувати:
```bash
2021-10-10 22:24:28 +00:00
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
```
2024-03-29 18:49:46 +00:00
**Кодування 0** означає, що використовується **base64** (але доступні й інші, перевірте меню довідки).
Ви також можете **зловживати цією вразливістю для шифрування нових даних. Наприклад, уявіть, що вміст куки - "**_**user=MyUsername**_**", тоді ви можете змінити його на "\_user=administrator\_" та підвищити привілеї всередині додатка. Ви також можете це зробити, використовуючи `padbuster`, вказавши параметр -plaintext**:
```bash
2021-10-10 22:24:28 +00:00
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
```
2024-03-29 18:49:46 +00:00
Якщо сайт вразливий, `padbuster` автоматично спробує знайти помилку у доповненні, але ви також можете вказати повідомлення про помилку, використовуючи параметр **-error**.
```bash
2021-10-10 22:24:28 +00:00
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
```
2024-03-29 18:49:46 +00:00
## Теорія
У **короткому** вигляді, ви можете почати розшифровувати зашифровані дані, вгадуючи правильні значення, які можуть бути використані для створення всіх **різних додаткових байтів**. Потім атака на оракула додаткового байту почне розшифровувати байти з кінця до початку, вгадуючи, яке буде правильне значення, яке **створює додатковий байт 1, 2, 3** і т.д.
2022-02-02 15:35:20 +00:00
![](<../.gitbook/assets/image (629) (1) (1).png>)
2024-03-29 18:49:46 +00:00
Уявіть, що у вас є зашифрований текст, який займає **2 блоки**, утворені байтами від **E0 до E15**.\
Для того, щоб **розшифрувати останній блок** (**E8** до **E15**), весь блок проходить через "розшифрування блоку шифру" і генерує **проміжні байти I0 до I15**.\
2024-03-29 18:49:46 +00:00
Нарешті, кожен проміжний байт **XORed** з попередніми зашифрованими байтами (E0 до E7). Таким чином:
2021-09-22 14:27:03 +00:00
* `C15 = D(E15) ^ E7 = I15 ^ E7`
* `C14 = I14 ^ E6`
2021-10-28 10:53:20 +00:00
* `C13 = I13 ^ E5`
* `C12 = I12 ^ E4`
* ...
2024-03-29 18:49:46 +00:00
Тепер можна **змінити `E7` до тих пір, поки `C15` не буде `0x01`**, що також буде правильним додатковим байтом. Таким чином, у цьому випадку: `\x01 = I15 ^ E'7`
2024-03-29 18:49:46 +00:00
Таким чином, знаходячи E'7, можна **обчислити I15**: `I15 = 0x01 ^ E'7`
2024-03-29 18:49:46 +00:00
Це дозволяє нам **обчислити C15**: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
2024-03-29 18:49:46 +00:00
Знаючи **C15**, тепер можна **обчислити C14**, але цього разу методом грубої сили додаткового байту `\x02\x02`.
Ця BF така ж складна, як і попередня, оскільки можливо обчислити **`E''15`**, значення якого 0x02: `E''7 = \x02 ^ I15`, тому просто потрібно знайти **`E'14`**, який генерує **`C14`, рівний `0x02`**.\
2024-03-29 18:49:46 +00:00
Потім виконайте ті самі кроки для розшифрування C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
2024-03-29 18:49:46 +00:00
**Слідуйте цьому ланцюжку, поки не розшифруєте весь зашифрований текст.**
2024-03-29 18:49:46 +00:00
## Виявлення вразливості
Зареєструйте обліковий запис та увійдіть за допомогою цього облікового запису.\
Якщо ви **увійдете багато разів** і завжди отримуєте **той самий кукі**, ймовірно, у програмі є **щось не так**. Куки, які надсилаються назад, повинні бути унікальними кожного разу, коли ви увійдете. Якщо куки завжди **однакові**, вони, ймовірно, завжди будуть дійсними, і **немає способу їх анулювати**.
2024-03-29 18:49:46 +00:00
Тепер, якщо ви спробуєте **змінити** куки, ви побачите, що отримаєте **помилку** від програми.\
Але якщо ви використовуєте BF для додаткового байту (наприклад, використовуючи padbuster), ви зможете отримати інший куки, дійсний для іншого користувача. Цей сценарій ймовірно дуже вразливий до padbuster.
2021-10-10 22:24:28 +00:00
2024-03-29 18:49:46 +00:00
## Посилання
2021-10-28 10:53:20 +00:00
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)