LOADING

加载过慢请开启缓存 浏览器默认开启

Android安全评估

2024/8/19 渗透

Android安全评估指南

反编译保护

.apk后缀改为.zip解压获取到dex文件(有可能单个dex也有可能多个)

image-20240820152758750

使用dex2jar转换为jar

为了方便测试.dex文件拷贝到dex2jar项目目录下

img

执行以下命令,吧dex全部转换为.jar

d2j-dex2jar.bat classes.dex

img

还原的jar文件都在当前目录下

打开jadx,全选还原的jar文件拖到jadx里面

img

逆向后发现是没混淆的情况,是不安全的。

如果代码经过混淆,或者有加壳措施,不能完整恢复源代码的,都可以认为此项安全

安装包签名

使用jdk自带的jarsigner.exe检查安装包的签名,命令如下

jarsigner.exe -verify APK文件名 -verbose -certs

img

上图,说明测试结果为安全。

当输出结果为“jar 已验证”时,表示签名正常。

CN 及其他字段是否正确标识客户端程序的来源和发布者身份。

下图,说明测试结果存在风险

img

Debug 证书、第三方(如 开发方)证书等等均认为风险。

签名完整性

测试目标APP重签名是否可以正常运行。

应用完整性

Apk默认界面

img

用ApkTool工具将目标 APK 文件解包,命令如下;

java -jar apktool.jar d -f APK路径 -o 输出路径

img

img

修改文件资源,尽量找标志比较明显的图标,容易确认打包后是否修改成功。

使用以下命令打包apk

java -jar apktool.jar b -f 打包文件目录 -o 生成的apk文件.apk

签名安装后app背景换成了替换的图片

img

APP数据任意备份

使用反编译工具反编译客户端程序,并检查AndroidManifest.xml文件中的节点android:allowBackup的属性值,android:allowBackup属性默认为false。

img

APP可调试

使用反编译工具反编译客户端程序,并检查AndroidManifest.xml文件中的节点的属性值。

经测试发现,未找到android:debuggable

如果在AndroidManifest.xml中没有显式声明android:debuggable属性,那么默认情况下,这个属性的值是false。这意味着应用在发布模式下运行,而不是调试模式。

img

敏感资源文件

解压目标程序,查看解压出的相关资源文件,通过Visual Studio Code搜索敏感字段,未发现存在明文敏感信息资源文件。

Activity越权

Activity 组件默认是不导出的,如果 AndroidManifest.xml 中设置了 exported = “true”

测试样本 sieve.apk:https://github.com/as0ler/Android-Examples

手机打开drozer

img

adb forward tcp:31415 tcp:31415

drozer console connect

img

列出程序中所有的APP 包,但是没看到刚才安装的app

run app.package.list

img

使用应用信息查看器得到包名

img

识别攻击面,有3个activity是可以被导出的

run app.package.attacksurface 包名

查询暴露activity的信息

run app.activity.info -a 包名

img

打开app是需要填写账号密码

img

调用组件绕过登录页面

run app.activity.start –component 包名 服务名

img

Activity拒绝服务

查看攻击面

run app.activity.info -a 包名

img

调用组件

run app.activity.start –component 包名 服务名

img

Activity劫持保护

劫持app:https://github.com/aloswoya/android_app

被劫持app:drozer

使用drozer来调用MainActivity。

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

img

Service越权

使用Drozer框架进行检测

识别攻击面,有2个services是可以被导出的

run app.package.attacksurface 包名

img

查询暴露services的信息

run app.service.info -a 包名

img

调用组件

run app.service.start –component 包名 服务名

img

App未跳转到密码界面。

Service拒绝服务

使用Drozer框架进行检测

识别攻击面,有2个services是可以被导出的

run app.package.attacksurface 包名

img

查询暴露services的信息

run app.service.info -a 包名

img

调用组件

run app.service.start –component 包名 服务名

img

App未异常退出。

Receiver越权

使用Drozer框架进行检测,得到该客户端不存在漏洞的Receiver组件。

Receiver拒绝服务

使用Drozer框架进行检测

识别攻击面,有0个Receiver是可以被导出的。

Provider SQL注入

使用drozer扫描注入的位置

run scanner.provider.injection -a com.mwr.example.sieve

img

如果存在漏洞,执行以下命令,如果返回了报错信息,接着构造sql获取敏感数据

run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords –projection “‘“

run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords –projection “ * from Key;–+”

img

列出所有表信息

run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords –projection “* FROM SQLITE_MASTER WHERE type=’table’;–”

img

Provider 目录遍历

使用drozer扫描漏洞

run scanner.provider.traversal -a com.mwr.example.sieve

img

读取系统文件

run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts

img下载系统文件

run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db d:/tmp/database.db

img

Provider 数据泄露

在sieve添加一条数据,待会儿读取它

img

扫描漏洞

run scanner.provider.finduris -a com.mwr.example.sieve

img

尝试读取可访问的url

run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/

img

WebView代码执行

查看AndroidManifest.xml文件中节点的android:minSdkVersion的属性值,该属性值为19,不存在该漏洞。

img

WebView未移除接口

查看AndroidManifest.xml文件中节点的android:minSdkVersion的属性值,该属性值为19,不存在该漏洞。

img

Root环境

在root设备打开app是否出现安全提示。

注入检测

通过注入工具,向目标应用程序中注入动态链接库,并执行动态链接库中的函数。

检测发现,目标程序不存在反注入机制。

img

模拟器环境

测试App是否对当前运行环境检测。

SQLite敏感信息

# 1、创建临时存储文件夹

adb shell

mkdir /mnt/sdcard/BackupDBS

cd /data/data/com.mwr.example.sieve/

# 2、压缩并拉取文件

find . -name “*.db” -type f -exec cp {} /mnt/sdcard/BackupDBS ;

tar cvf /mnt/sdcard/BackupDBS/backups.tar /mnt/sdcard/BackupDBS/

adb pull /mnt/sdcard/BackupDBS/backups.tar D:\xxxx.tar

使用数据库查看工具查看是否存在敏感信息。

SharedPref敏感信息

# 1、创建临时存储文件夹

adb shell

mkdir /mnt/sdcard/BackupDBS

cd /data/data/com.mwr.example.sieve/

# 2、压缩并拉取文件

find . -name “*.xml” -type f -exec cp {} /mnt/sdcard/BackupDBS ;

tar cvf /mnt/sdcard/BackupDBS/backups.tar /mnt/sdcard/BackupDBS/

adb pull /mnt/sdcard/BackupDBS/backups.tar D:\xxxx.tar

查看xml文件是否存在敏感信息。

Log敏感信息

使用adb logcat抓取log日志,分析进程日志,查看日志中是包含明文业务信息。

通信加密

抓包查看是否使用https

关键内容加密

检测发现目标APP对登录字段进行加密处理。

img

安全退出

检查客户端在退出时,是否向服务端发送终止会话请求。客户端退出后,还能否使用退出前的会话 id 访问登录后才能访问的页面。

开放端口

利用netstat命令或者netstatplus程序,检测未发现应用程序开启全局监听端口。

img

堆栈保护

使用检测工具扫描目标APP中的so文件,测试未发现存在无保护so文件

反编译APP提取so文件

checksec –file=libpangleflipped.so

img