{% hint style="success" %}
Вивчайте та практикуйте взлом AWS: [**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Вивчайте та практикуйте взлом GCP: [**Навчання HackTricks GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Підтримайте HackTricks
* Перевірте [**плани підписки**](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.
{% endhint %}
# CBC - Cipher Block Chaining
У режимі CBC **попередній зашифрований блок використовується як IV** для операції XOR з наступним блоком:
![https://defuse.ca/images/cbc\_encryption.png](https://defuse.ca/images/cbc\_encryption.png)
Для розшифрування CBC виконуються **протилежні операції**:
![https://defuse.ca/images/cbc\_decryption.png](https://defuse.ca/images/cbc\_decryption.png)
Зверніть увагу, що потрібно використовувати **ключ шифрування** та **IV**.
# Доповнення повідомлення
Оскільки шифрування виконується у **фіксованих розмірних блоках**, **доповнення** зазвичай потрібне в **останньому блоку**, щоб завершити його довжину.\
Зазвичай використовується **PKCS7**, яке генерує доповнення, **повторюючи** кількість **байтів**, **необхідних** для **завершення** блоку. Наприклад, якщо в останньому блоку не вистачає 3 байтів, доповнення буде `\x03\x03\x03`.
Давайте розглянемо більше прикладів з **2 блоками довжиною 8 байтів**:
| байт #0 | байт #1 | байт #2 | байт #3 | байт #4 | байт #5 | байт #6 | байт #7 | байт #0 | байт #1 | байт #2 | байт #3 | байт #4 | байт #5 | байт #6 | байт #7 |
| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| 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** |
Зверніть увагу, що в останньому прикладі **останній блок був повним, тому був згенерований ще один лише з доповненням**.
# Oracle доповнення
Коли додаток розшифровує зашифровані дані, він спочатку розшифровує дані; потім він видаляє доповнення. Під час очищення доповнення, якщо **недійсне доповнення викликає виявний вчинок**, у вас є **уразливість Oracle доповнення**. Виявний вчинок може бути **помилкою**, **відсутністю результатів** або **повільною відповіддю**.
Якщо ви виявите цей вчинок, ви можете **розшифрувати зашифровані дані** та навіть **зашифрувати будь-який чистий текст**.
## Як експлуатувати
Ви можете використовувати [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster), щоб експлуатувати цей вид вразливості або просто виконати
```
sudo apt-get install padbuster
```
Для того щоб перевірити, чи є куки сайту вразливими, ви можете спробувати:
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
```
**Кодування 0** означає, що використовується **base64** (але доступні й інші, перевірте меню довідки).
Ви також можете **зловживати цією вразливістю для шифрування нових даних. Наприклад, уявіть, що вміст куки - "**_**user=MyUsername**_**", тоді ви можете змінити його на "\_user=administrator\_" та підвищити привілеї всередині додатка. Ви також можете це зробити, використовуючи `padbuster`, вказавши параметр -plaintext**:
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
```
Якщо сайт вразливий, `padbuster` автоматично спробує знайти помилку у доповненні, але ви також можете вказати повідомлення про помилку, використовуючи параметр **-error**.
```bash
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
```
## Теорія
У **короткому** вигляді, ви можете почати розшифровувати зашифровані дані, вгадуючи правильні значення, які можуть бути використані для створення всіх **різних додаткових байтів**. Потім атака на оракула додаткового байту почне розшифровувати байти з кінця до початку, вгадуючи, яке буде правильне значення, яке **створює додатковий байт 1, 2, 3** і т.д.
![](<../.gitbook/assets/image (629) (1) (1).png>)
Уявіть, що у вас є зашифрований текст, який займає **2 блоки**, утворені байтами від **E0 до E15**.\
Для того, щоб **розшифрувати останній блок** (**E8** до **E15**), весь блок проходить через "розшифрування блоку шифру" і генерує **проміжні байти I0 до I15**.\
Нарешті, кожен проміжний байт **XORed** з попередніми зашифрованими байтами (E0 до E7). Таким чином:
* `C15 = D(E15) ^ E7 = I15 ^ E7`
* `C14 = I14 ^ E6`
* `C13 = I13 ^ E5`
* `C12 = I12 ^ E4`
* ...
Тепер можна **змінити `E7` до тих пір, поки `C15` не буде `0x01`**, що також буде правильним додатковим байтом. Таким чином, у цьому випадку: `\x01 = I15 ^ E'7`
Таким чином, знаходячи E'7, можна **обчислити I15**: `I15 = 0x01 ^ E'7`
Це дозволяє нам **обчислити C15**: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7`
Знаючи **C15**, тепер можна **обчислити C14**, але цього разу методом грубої сили додаткового байту `\x02\x02`.
Ця BF така ж складна, як і попередня, оскільки можливо обчислити **`E''15`**, значення якого 0x02: `E''7 = \x02 ^ I15`, тому просто потрібно знайти **`E'14`**, який генерує **`C14`, рівний `0x02`**.\
Потім виконайте ті самі кроки для розшифрування C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`**
**Слідуйте цьому ланцюжку, поки не розшифруєте весь зашифрований текст.**
## Виявлення вразливості
Зареєструйте обліковий запис та увійдіть за допомогою цього облікового запису.\
Якщо ви **увійдете багато разів** і завжди отримуєте **той самий кукі**, ймовірно, у програмі є **щось не так**. Куки, які надсилаються назад, повинні бути унікальними кожного разу, коли ви увійдете. Якщо куки завжди **однакові**, вони, ймовірно, завжди будуть дійсними, і **немає способу їх анулювати**.
Тепер, якщо ви спробуєте **змінити** куки, ви побачите, що отримаєте **помилку** від програми.\
Але якщо ви використовуєте BF для додаткового байту (наприклад, використовуючи padbuster), ви зможете отримати інший куки, дійсний для іншого користувача. Цей сценарій ймовірно дуже вразливий до padbuster.
## Посилання
* [https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation](https://en.wikipedia.org/wiki/Block\_cipher\_mode\_of\_operation)