12 KiB
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
{% embed url="https://websec.nl/" %}
CBC - Cipher Block Chaining
В режимі CBC попередній зашифрований блок використовується як IV для XOR з наступним блоком:
Щоб розшифрувати CBC, виконуються протилежні операції:
Зверніть увагу, що потрібно використовувати ключ шифрування та IV.
Message Padding
Оскільки шифрування виконується в фіксованих розмірах блоків, зазвичай потрібне доповнення в останньому блоці для завершення його довжини.
Зазвичай використовується PKCS7, який генерує доповнення, повторюючи кількість байтів, необхідних для завершення блоку. Наприклад, якщо останньому блоку не вистачає 3 байтів, доповнення буде \x03\x03\x03
.
Розглянемо більше прикладів з 2 блоками довжиною 8 байтів:
byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #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 |
Зверніть увагу, що в останньому прикладі останній блок був заповнений, тому був згенерований ще один лише з доповнення.
Padding Oracle
Коли програма розшифровує зашифровані дані, спочатку вона розшифровує дані; потім видаляє доповнення. Під час очищення доповнення, якщо недійсне доповнення викликає помітну поведінку, у вас є вразливість padding oracle. Помітна поведінка може бути помилкою, відсутністю результатів або повільнішою відповіддю.
Якщо ви виявите цю поведінку, ви можете розшифрувати зашифровані дані і навіть зашифрувати будь-який відкритий текст.
How to exploit
Ви можете використовувати https://github.com/AonCyberLabs/PadBuster для експлуатації цього типу вразливості або просто зробити
sudo apt-get install padbuster
Щоб перевірити, чи вразливий кукі сайту, ви можете спробувати:
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
Кодування 0 означає, що base64 використовується (але доступні й інші, перевірте меню допомоги).
Ви також можете зловживати цією вразливістю для шифрування нових даних. Наприклад, уявіть, що вміст cookie є "user=MyUsername", тоді ви можете змінити його на "_user=administrator_" і підвищити привілеї в додатку. Ви також можете зробити це, використовуючи paduster
, вказуючи параметр -plaintext:
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator"
Якщо сайт вразливий, padbuster
автоматично спробує визначити, коли виникає помилка заповнення, але ви також можете вказати повідомлення про помилку, використовуючи параметр -error.
perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding"
Теорія
У резюме, ви можете почати розшифровувати зашифровані дані, вгадуючи правильні значення, які можна використовувати для створення всіх різних заповнень. Потім атака на основі заповнення почне розшифровувати байти з кінця на початок, вгадуючи, яке буде правильне значення, що створює заповнення 1, 2, 3 тощо.
Уявіть, що у вас є деякий зашифрований текст, який займає 2 блоки, сформовані байтами з E0 до E15.
Щоб розшифрувати останній блок (E8 до E15), весь блок проходить через "дешифрування блочного шифру", генеруючи проміжні байти I0 до I15.
Нарешті, кожен проміжний байт XOR'иться з попередніми зашифрованими байтами (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
Продовжуйте цю ланцюг, поки не розшифруєте весь зашифрований текст.
Виявлення вразливості
Зареєструйте обліковий запис і увійдіть з цим обліковим записом.
Якщо ви входите багато разів і завжди отримуєте один і той же cookie, ймовірно, що в додатку є щось неправильно. Cookie, що повертається, повинен бути унікальним щоразу, коли ви входите. Якщо cookie завжди один і той же, ймовірно, він завжди буде дійсним, і не буде способу його анулювати.
Тепер, якщо ви спробуєте модифікувати cookie, ви можете побачити, що отримуєте помилку від додатку.
Але якщо ви BF заповнення (використовуючи padbuster, наприклад), ви зможете отримати інший cookie, дійсний для іншого користувача. Цей сценарій, ймовірно, вразливий до padbuster.
Посилання
{% embed url="https://websec.nl/" %}
{% hint style="success" %}
Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримати HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.