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

81 lines
8.1 KiB
Markdown
Raw Normal View History

{% hint style="success" %}
Вивчайте та практикуйте хакінг AWS: <img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**Навчання HackTricks AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Вивчайте та практикуйте хакінг GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**Навчання HackTricks GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Підтримайте HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Поширюйте хакерські трюки, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
2022-05-01 16:32:23 +00:00
# ECB
(ECB) Electronic Code Book - симетрична схема шифрування, яка **замінює кожний блок відкритого тексту** на **блок шифротексту**. Це **найпростіша** схема шифрування. Основна ідея полягає в тому, щоб **розділити** відкритий текст на **блоки з N бітів** (залежно від розміру блоку вхідних даних, алгоритму шифрування) і потім зашифрувати (розшифрувати) кожен блок відкритого тексту, використовуючи лише ключ.
2022-05-01 16:32:23 +00:00
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png)
2024-03-29 18:49:46 +00:00
Використання ECB має кілька наслідків з точки зору безпеки:
2024-03-29 18:49:46 +00:00
* **Блоки з зашифрованого повідомлення можуть бути видалені**
* **Блоки з зашифрованого повідомлення можуть бути переміщені**
2024-03-29 18:49:46 +00:00
# Виявлення вразливості
2024-03-29 18:49:46 +00:00
Уявіть, що ви увійшли в додаток кілька разів і ви **завжди отримуєте одне й те ж печиво**. Це тому, що печиво додатка має формат **`<ім'я користувача>|<пароль>`**.\
Потім ви створюєте двох нових користувачів, обох з **однаковим довгим паролем** та **майже** **однаковим** **ім'ям користувача**.\
Ви виявляєте, що **блоки по 8 байт**, де **інформація про обох користувачів** однакова, **рівні**. Тоді ви уявляєте, що це може бути через використання **ECB**.
Подібно до наступного прикладу. Спостерігайте, як у цих **2 розкодованих печивах** кілька разів зустрічається блок **`\x23U\xE45K\xCB\x21\xC8`**
```
2021-09-22 15:32:15 +00:00
\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
2021-09-22 15:32:15 +00:00
\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 |
2024-03-29 18:49:46 +00:00
# Використання вразливості
2024-03-29 18:49:46 +00:00
## Видалення цілих блоків
Знаючи формат куки (`<ім'я користувача>|<пароль>`), для того щоб видаляти ім'я користувача `admin`, створіть нового користувача з ім'ям `aaaaaaaaadmin` та отримайте куку та розкодуйте її:
```
2021-09-22 15:32:15 +00:00
\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
```
2024-03-29 18:49:46 +00:00
Ми можемо побачити шаблон `\x23U\xE45K\xCB\x21\xC8`, створений раніше з ім'ям користувача, яке містить лише `a`.\
Потім ви можете видалити перший блок 8B і отримаєте дійсний куки для імені користувача `admin`:
```
2021-09-22 15:32:15 +00:00
\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4
```
2024-03-29 18:49:46 +00:00
## Переміщення блоків
2024-03-29 18:49:46 +00:00
У багатьох базах даних однаково шукати `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 `
2022-05-01 16:32:23 +00:00
**Потім просто замініть перший блок останнім разом і будете уособлювати користувача `admin`: `admin |username`**
2024-03-29 18:49:46 +00:00
## Посилання
2022-05-01 16:32:23 +00:00
* [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](http://cryptowiki.net/index.php?title=Electronic_Code_Book_\(ECB\))