{% 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)