hacktricks/cryptography/padding-oracle-priv.md

11 KiB
Raw Blame History

{% hint style="success" %} Вивчайте та практикуйте взлом AWS: Навчання HackTricks AWS Red Team Expert (ARTE)
Вивчайте та практикуйте взлом GCP: Навчання HackTricks GCP Red Team Expert (GRTE)

Підтримайте HackTricks
{% endhint %}

CBC - Cipher Block Chaining

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

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

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

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, щоб експлуатувати цей вид вразливості або просто виконати

sudo apt-get install padbuster

Для того щоб перевірити, чи є куки сайту вразливими, ви можете спробувати:

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:

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.
Нарешті, кожен проміжний байт 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.

Посилання