Padding Oracle

Reading time: 5 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

CBC - Cipher Block Chaining

В режимі CBC попередній зашифрований блок використовується як IV для XOR з наступним блоком:

https://defuse.ca/images/cbc_encryption.png

Щоб розшифрувати CBC, виконуються протилежні операції:

https://defuse.ca/images/cbc_decryption.png

Зверніть увагу, що потрібно використовувати ключ шифрування та IV.

Message Padding

Оскільки шифрування виконується в фіксованих розмірах блоків, зазвичай потрібне доповнення в останньому блоці для завершення його довжини.
Зазвичай використовується PKCS7, який генерує доповнення, повторюючи кількість байтів, необхідних для завершення блоку. Наприклад, якщо останньому блоку не вистачає 3 байтів, доповнення буде \x03\x03\x03.

Розглянемо більше прикладів з 2 блоками довжиною 8 байтів:

byte #0byte #1byte #2byte #3byte #4byte #5byte #6byte #7byte #0byte #1byte #2byte #3byte #4byte #5byte #6byte #7
PASSWORD1234560x020x02
PASSWORD123450x030x030x03
PASSWORD1230x050x050x050x050x05
PASSWORD0x080x080x080x080x080x080x080x08

Зверніть увагу, що в останньому прикладі останній блок був заповнений, тому був згенерований ще один лише з доповненням.

Padding Oracle

Коли програма розшифровує зашифровані дані, спочатку вона розшифровує дані; потім видаляє доповнення. Під час очищення доповнення, якщо недійсне доповнення викликає помітну поведінку, у вас є вразливість padding oracle. Помітна поведінка може бути помилкою, відсутністю результатів або повільнішою відповіддю.

Якщо ви виявите цю поведінку, ви можете розшифрувати зашифровані дані і навіть зашифрувати будь-який відкритий текст.

How to exploit

Ви можете використовувати 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 (але доступні й інші, перевірте меню допомоги).

Ви також можете зловживати цією вразливістю для шифрування нових даних. Наприклад, уявіть, що вміст cookie є "user=MyUsername", тоді ви можете змінити його на "_user=administrator_" і підвищити привілеї в додатку. Ви також можете зробити це, використовуючи paduster, вказуючи параметр -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"

Теорія

У резюме, ви можете почати розшифровувати зашифровані дані, вгадуючи правильні значення, які можна використовувати для створення всіх різних заповнень. Потім атака на padding oracle почне розшифровувати байти з кінця на початок, вгадуючи, яке буде правильне значення, що створює заповнення 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.

Посилання

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks