hacktricks/cryptography/electronic-code-book-ecb.md

8.1 KiB
Raw Blame History

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

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

ECB

(ECB) Electronic Code Book - симетрична схема шифрування, яка замінює кожний блок відкритого тексту на блок шифротексту. Це найпростіша схема шифрування. Основна ідея полягає в тому, щоб розділити відкритий текст на блоки з N бітів (залежно від розміру блоку вхідних даних, алгоритму шифрування) і потім зашифрувати (розшифрувати) кожен блок відкритого тексту, використовуючи лише ключ.

Використання ECB має кілька наслідків з точки зору безпеки:

  • Блоки з зашифрованого повідомлення можуть бути видалені
  • Блоки з зашифрованого повідомлення можуть бути переміщені

Виявлення вразливості

Уявіть, що ви увійшли в додаток кілька разів і ви завжди отримуєте одне й те ж печиво. Це тому, що печиво додатка має формат <ім'я користувача>|<пароль>.
Потім ви створюєте двох нових користувачів, обох з однаковим довгим паролем та майже однаковим ім'ям користувача.
Ви виявляєте, що блоки по 8 байт, де інформація про обох користувачів однакова, рівні. Тоді ви уявляєте, що це може бути через використання ECB.

Подібно до наступного прикладу. Спостерігайте, як у цих 2 розкодованих печивах кілька разів зустрічається блок \x23U\xE45K\xCB\x21\xC8

\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9

\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9

Це тому, що ім'я користувача та пароль цих куків містять кілька разів літеру "a" (наприклад). Блоки, які відрізняються, - це блоки, які містять принаймні 1 відмінний символ (можливо, роздільник "|" або якась необхідна різниця в імені користувача).

Тепер зловмиснику просто потрібно виявити, чи формат <ім'я користувача><роздільник><пароль> чи <пароль><роздільник><ім'я користувача>. Для цього він може просто генерувати кілька імен користувачів з схожими та довгими іменами користувачів та паролями, поки він не знайде формат та довжину роздільника:

Довжина імені користувача: Довжина пароля: Довжина Ім'я користувача + Пароль: Довжина куки (після декодування):
2 2 4 8
3 3 6 8
3 4 7 8
4 4 8 16
7 7 14 16

Використання вразливості

Видалення цілих блоків

Знаючи формат куки (<ім'я користувача>|<пароль>), для того щоб видаляти ім'я користувача admin, створіть нового користувача з ім'ям aaaaaaaaadmin та отримайте куку та розкодуйте її:

\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4

Ми можемо побачити шаблон \x23U\xE45K\xCB\x21\xC8, створений раніше з ім'ям користувача, яке містить лише a.
Потім ви можете видалити перший блок 8B і отримаєте дійсний куки для імені користувача admin:

\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4

Переміщення блоків

У багатьох базах даних однаково шукати WHERE username='admin'; або WHERE username='admin '; (Зверніть увагу на додаткові пробіли)

Таким чином, інший спосіб уособити користувача admin буде:

  • Створити ім'я користувача таке, що: len(<username>) + len(<delimiter) % len(block). З розміром блоку 8B ви можете створити ім'я користувача під назвою: username , з розділювачем | частина <username><delimiter> створить 2 блоки з 8B.
  • Потім створіть пароль, який заповнить точну кількість блоків, що містять ім'я користувача, яке ми хочемо уособити, та пробіли, наприклад: admin

Cookie цього користувача буде складатися з 3 блоків: перші 2 блоки - це блоки імені користувача + розділювач, а третій - пароль (який фальшиво представляє ім'я користувача): username |admin

Потім просто замініть перший блок останнім разом і будете уособлювати користувача admin: admin |username

Посилання