Padding Oracle

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

CBC - Cipher Block Chaining

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

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

Зверніть увагу, що потрібно використовувати ключ шифрування та 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.

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated