首页
社区
课程
招聘
[原创]#30天写作挑战#App安全评估手册-Android
发表于: 2020-9-21 19:42 19102

[原创]#30天写作挑战#App安全评估手册-Android

2020-9-21 19:42
19102

记录下常见的App安全评估方法,若存在问题希望伙伴们可以指正,也希望可以给出一些建议,共同学习,共同进步
版本:V1.0

更新日期:2020年9月21日
完善了语言描述,并修正了图片显示错误。
首发:
https://sec-in.com/article/498
因评估方法比较多,为便于学习与归纳,分一下几类进行叙述:

使用:

测试
成功访问,为提示证书问题,数据成功抓取

因一些问题,请自行网络搜索下载其安装包,推荐使用English版本
某些App只在WLAN设置代理会抓不到包,故需要一些工具协助进行抓包,平常我使用drony这个工具

抓不到包的原因
为提高数据安全,App拥有自己的http客户端,不使用系统代理,导致抓不到包。

不安全行为

service是一个没有用户界面的程序,可以用来开发后台服务或者监控类的程序和执行比较耗时的后台任务。例如,当音乐播放器退出用户界面之后,还需要继续播放,通常会使用Context.startService()来启动一个后台服务,来保持音乐的持续播放。

Activity是Android四大组件之一,它用于展示界面。Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务。Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。

ContentProvider:内容提供者是应用程序之间共享数据的接口,使用ContentProvider共享数据的好处是统一了数据访问方式。

在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast/sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。

dz> run app.broadcast.send --component 包名 --action android.intent.action.XXX
利用空actoin和空extras拒绝服务

#空action情况
run app.broadcast.send --component 包名 广播名
dz> run app.broadcast.send --component com.xxx.activity com.xxx.lock.MyExitReceiver
dz> run app.broadcast.send --component com.xxx.activity com.xxx.lock.LockScreenReceiver

#空extras情况
dz> run app.broadcast.send --action wisorg.intent.action.PUSH_MESSAGE
```

关注的是用户能否从这个安装包中获取项目的源代码。

“Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。

app的证书是在被推送到app市场的app中,表示开发者身份的。它是以把开发者的id和他们的app以密码学的方式关联起来的方式实现的。通过提供一个简单而又有效的确认和强制保证Android app的完整性的机制,app的签名确保了没有哪个app会被其他app所冒充。所有的app在被安装之前,都必须要经过签名。

安卓官方12月份更新修复了一个高危漏洞,攻击者可以利用该漏洞修改应用而不影响应用签名。漏洞名称为Janus,CVE编号CVE-2017-13156,影响安卓5.1.1到安卓8.0版本,大约74%的安卓设备受影响。

WebView(网络视图)能加载显示网页,可以将其视为一个浏览器。它在Kitkat(android 4.4)以前使用WebKit渲染引擎加载显示网页,在Kitkat之后使用Google自家内核chromium,是Android系统中的一个View控件。对于Android操作系统来说WebView本身只是一个View控件,它存在的一些漏洞对于整体应用来说应该是影响不大的。但是,由于Android的发展越来越好,Android应用程序存在这升级难、更新难等客户端的通病,使得目前市面上WebApp越来越流行起来。这就使得WebView的漏洞影响面得到了扩大。

存储安全分析主要就是对Android应用程序运行中所产生的文件,如数据库文件、私有文件、证书文件等,进行安全验证分析,特别是对明文存储敏感数据,导致直接被攻击者复制或篡改。

当应用处理用户或其它数据源输入的数据时,可能会把数据放在不安全的位置,而这些数据能够被同一设备上其它的恶意应用读取,这就造成了风险,也就是俗称的
边信道信息泄漏。

验证码可绕过漏洞

问题描述:
短信发送功能模块存在逻辑问题,导致可对指定手机号码随意发送短信,造成短信炸弹攻击,可能造成用户投诉或恶意软件传播等。

登录界面可被钓鱼劫持

对App服务器进行安全测试,检测是否存在漏洞。

介绍了评估环境搭建与常见评估方法,并进行了模拟实战

APP模块的作用说明
APP模块
模块名 ------------------------ 作用
app.activity.forintent : 通过intent查找它的activity
app.activity.info : 获取activities信息
app.activity.start : 开启 Activity
app.broadcast.info : 获取broadcast receivers信息
app.broadcast.send : 发送广播
app.broadcast.sniff : 嗅探广播中intent的数据
app.package.attacksurface :确定安装包的可攻击面
app.package.backup : 列出可备份的包
app.package.debuggable: 列出可debug的包
app.package.info : 获取已安装包的信息
app.package.launchintent: 获取程序启动的activity信息
app.package.list : 手机已安装的程序包
app.package.manifest : 获取程序manifest文件信息
app.package.native : 列出Native libraries 信息
app.package.shareduid : 查找拥有共同uid的包和他们所有的权限
app.provider.columns : 展示content provider URI的各列
app.provider.delete : 删除content provider URI的内容
app.provider.download : 使用openInputStream读取指定uri的内容,并下载在电脑中
app.provider.info : 获取 content providers信息
app.provider.insert : 插入数据到content provider
app.provider.query : 查询content provider 内容
app.provider.read : 使用openInputStream读取指定uri的内容
app.provider.update : 更新content provider的内容
app.service.info : 获取services的信息
app.service.send : 使用 Message攻击暴露的service,其service实现了handleMessage
app.service.start : 开启服务
app.service.stop : 停止服务
APP模块的作用说明
APP模块
模块名 ------------------------ 作用
app.activity.forintent : 通过intent查找它的activity
app.activity.info : 获取activities信息
app.activity.start : 开启 Activity
app.broadcast.info : 获取broadcast receivers信息
app.broadcast.send : 发送广播
app.broadcast.sniff : 嗅探广播中intent的数据
app.package.attacksurface :确定安装包的可攻击面
app.package.backup : 列出可备份的包
app.package.debuggable: 列出可debug的包
app.package.info : 获取已安装包的信息
app.package.launchintent: 获取程序启动的activity信息
app.package.list : 手机已安装的程序包
app.package.manifest : 获取程序manifest文件信息
app.package.native : 列出Native libraries 信息
app.package.shareduid : 查找拥有共同uid的包和他们所有的权限
app.provider.columns : 展示content provider URI的各列
app.provider.delete : 删除content provider URI的内容
app.provider.download : 使用openInputStream读取指定uri的内容,并下载在电脑中
app.provider.info : 获取 content providers信息
app.provider.insert : 插入数据到content provider
app.provider.query : 查询content provider 内容
app.provider.read : 使用openInputStream读取指定uri的内容
app.provider.update : 更新content provider的内容
app.service.info : 获取services的信息
app.service.send : 使用 Message攻击暴露的service,其service实现了handleMessage
app.service.start : 开启服务
app.service.stop : 停止服务
 
存在漏洞的案例:
dz> run app.service.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.AuthService
  Permission: null
com.mwr.example.sieve.CryptoService
  Permission: null
利用dz提升权限:
dz> run app.service.start --action xxx --extra xxxx
存在漏洞的案例:
dz> run app.service.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.AuthService
  Permission: null
com.mwr.example.sieve.CryptoService
  Permission: null
利用dz提升权限:
dz> run app.service.start --action xxx --extra xxxx
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
APP模块的作用说明
APP模块
模块名 ------------------------ 作用
app.activity.forintent : 通过intent查找它的activity
app.activity.info : 获取activities信息
app.activity.start : 开启 Activity
app.broadcast.info : 获取broadcast receivers信息
app.broadcast.send : 发送广播
app.broadcast.sniff : 嗅探广播中intent的数据
app.package.attacksurface :确定安装包的可攻击面
app.package.backup : 列出可备份的包
app.package.debuggable: 列出可debug的包
app.package.info : 获取已安装包的信息
app.package.launchintent: 获取程序启动的activity信息
app.package.list : 手机已安装的程序包
app.package.manifest : 获取程序manifest文件信息
app.package.native : 列出Native libraries 信息
app.package.shareduid : 查找拥有共同uid的包和他们所有的权限
app.provider.columns : 展示content provider URI的各列
app.provider.delete : 删除content provider URI的内容
app.provider.download : 使用openInputStream读取指定uri的内容,并下载在电脑中
app.provider.info : 获取 content providers信息
app.provider.insert : 插入数据到content provider
app.provider.query : 查询content provider 内容
app.provider.read : 使用openInputStream读取指定uri的内容
app.provider.update : 更新content provider的内容
app.service.info : 获取services的信息
app.service.send : 使用 Message攻击暴露的service,其service实现了handleMessage
app.service.start : 开启服务
app.service.stop : 停止服务
1
2
3
4
5
6
7
8
9
存在漏洞的案例:
dz> run app.service.info -a com.mwr.example.sieve
Package: com.mwr.example.sieve
com.mwr.example.sieve.AuthService
  Permission: null
com.mwr.example.sieve.CryptoService
  Permission: null
利用dz提升权限:
dz> run app.service.start --action xxx --extra xxxx
  • 逍遥:https://www.xyaz.cn/
  • 夜神:https://www.yeshen.com/

    GDA

    官网:http://www.gda.wiki:9090/

    drozer

    下载:
  • 官网:https://labs.f-secure.com/tools/drozer/
  • GitHub:https://github.com/FSecureLABS/drozer
  • 软件安装:本机根据自身系统安装安装包,模拟器安装drozer Agent.apk
  • 运行
    模拟器打开drozer Agent.apk,点击Embedded Server

    点击Disabled叛变的黑色按钮显示Enabled

  • 端口转发
    因在模拟器使用,需要端口转发才可正常使用
    在模拟器安装目录启用cmd,运行以下命令
    adb forward tcp:31415 tcp:31415

    若报错重新启动模拟器
    在drozer安装目录启用cmd,运行以下命令
    drozer.bat console connect
    (输入drozer console connect命令也可运行,但建议加上文件后缀.bat)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    APP模块的作用说明
    APP模块
    模块名 ------------------------ 作用
    app.activity.forintent : 通过intent查找它的activity
    app.activity.info : 获取activities信息
    app.activity.start : 开启 Activity
    app.broadcast.info : 获取broadcast receivers信息
    app.broadcast.send : 发送广播
    app.broadcast.sniff : 嗅探广播中intent的数据
    app.package.attacksurface :确定安装包的可攻击面
    app.package.backup : 列出可备份的包
    app.package.debuggable: 列出可debug的包
    app.package.info : 获取已安装包的信息
    app.package.launchintent: 获取程序启动的activity信息
    app.package.list : 手机已安装的程序包
    app.package.manifest : 获取程序manifest文件信息
    app.package.native : 列出Native libraries 信息
    app.package.shareduid : 查找拥有共同uid的包和他们所有的权限
    app.provider.columns : 展示content provider URI的各列
    app.provider.delete : 删除content provider URI的内容
    app.provider.download : 使用openInputStream读取指定uri的内容,并下载在电脑中
    app.provider.info : 获取 content providers信息
    app.provider.insert : 插入数据到content provider
    app.provider.query : 查询content provider 内容
    app.provider.read : 使用openInputStream读取指定uri的内容
    app.provider.update : 更新content provider的内容
    app.service.info : 获取services的信息
    app.service.send : 使用 Message攻击暴露的service,其service实现了handleMessage
    app.service.start : 开启服务
    app.service.stop : 停止服务

    Java运行环境

    可运行keytool.exe,以及为ApkIDE提供环境支持。

    adb

    模拟器自带
  • 查询已连接设备/模拟器
    adb devices
  • 查看日志
    adb logcat > 导出名称.txt
  • 其它玩法可用搜索引擎搜索
    案例:https://blog.csdn.net/zhonglunshun/article/details/78362439

    资源管理器

    MT管理器
    资源管理器

    抓包

  • Burp
  • Charles
  • Wireshark
  • Fiddler
    我平常使用Burp进行测试,故案例使用Burp演示,其它软件配置方法类似
  • 配置代理
    选用以下框选区域的内网IP进行设置(此区域的内网IP会变化,Burp关闭后,再次使用建议重新在设置下),端口建议使用8888(很少有于这个冲突的)


    模拟器配置此代理
  • 点击设置
  • 点击WLAN
  • 鼠标左键按住点击已连接的WLAN,例如这里是lskbjqo514,直至弹出如下窗口
  • 点击修改网络-高级选项-代理-手动-根据Burp设置的代理信息进行配置

    若一些地址不想被抓取请在“对以下网址不使用代理”区域进行添加
  • 安装证书
    打开模拟器浏览器或将制作好的证书拖拽到模拟器内进行安装
    访问http://burp/,点击CA Certificate进行下载

    在文件管理器,找的下载的文件,并更改文件后缀为.cer

    点击设置-安全-从SD卡安装证书,找的刚才下载的文件路径,选择安装

    安装证书需设置手机锁,根据提示设置就好

    之后给证书设置一个名称

    成功安装,出现如下提示
  • 测试
    成功访问,为提示证书问题,数据成功抓取

    drony

    因一些问题,请自行网络搜索下载其安装包,推荐使用English版本
    某些App只在WLAN设置代理会抓不到包,故需要一些工具协助进行抓包,平常我使用drony这个工具

  • 抓不到包的原因
    为提高数据安全,App拥有自己的http客户端,不使用系统代理,导致抓不到包。

  • 解决
    方法1.控制DNS解析,通过修改dns的方式让客户端以为我们的代理服务器就是目标服务器。
    方法2.在网络设备上直接做流量转发,将指定终端设备上发往80及443端口的数据直接转发到代理服务器的目标端口上
    方法3.使用某些软件将终端设备的流量转发到代理服务器
  • 我这里采用方法3这样简单些,网上找的这个工具drony,它将手机上的所有流量都重定向到drony自身,这样drony就可以管理所有手机上的网络流量,甚至可以对手机上不同APP的流量进行单独配置。
    安装配置
  • 打开drony,默认处于关闭状态,若需要配置需鼠标按住向左方滑动至设置区域SETTINGS
  • 查看系统代理(因一些原因内网地址变化重新配置了下)
  • SETTINGS-Proxy-Proxy port设置若下图所示
  • SETTINGS-Networks-Wi-Fi设置若下图所示
    点击Wi-Fi

    点击已连接的Wi-Fi
  • Wi-Fi如下图配置

    Proxy type代理方式选择 Plain,之后出现下图样式

    Filter default value 选择 Direct all

    Rules选择需抓包的App,例如这里我选择了浏览器,正常需求更改下图的两个配置就可以抓包,但Hostname 及 Port 不填 表示所有的都会被强制代理,平常为了测试效果,避免信息漏掉,这两项我都没有填写。

    之后点击保存返回主页LOG区域,点击OFF使其变为ON就可以抓包了

    ApkIDE

    AndroidKiller
    ApkIDE最新3.5.0少月增强版
    备注:以上工具开发者已不在维护,其自行更新所用插件,主要使用的是其框架。

    ApkInfo

    项目地址:https://github.com/bihe0832/Android-GetAPKInfo
    项目地址:https://github.com/Enyby/APK-Info

    信息收集

  • md5:
    82AB8B2193B3CFB1C737E3A786BE363A
  • 大小:
    1.43 MB (1,502,294 字节)
  • 包名:
    jakhar.aseem.diva
  • 下载地址:
    http://www.payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz
  • 问题描述:
    若AndroidManifest.xml文件中Debuggable属性值未设置,可以设置断点来控制程序的执行流程,在应用程序运行时修改其行为。
  • 检测方法:
    1.使用反编译软件GDA对apk进行反编译。
    2.在AndroidManifest.xml文件中查看Debuggable属性,检查是否被设置为true或未配置。
  • 所用工具:
    GDA
  • 检测记录:
    使用GDA查看测试ApkAndroidManifest.xml文件,发现Debuggable属性值已设置,属性值为true,存在漏洞,如图所示:
  • 修复建议:
    设置Debuggable属性值为false。
  • 问题描述:
    若AndroidManifest.xml文件中allowBackup属性值被设置为true或未设置,可通过adb backup对应用数据进行备份,在无root的情况下可以导出应用中存储的所有数据,造成用户数据泄露。
  • 检测方法:
    1.使用反编译软件GDA对apk进行反编译。
    2.在AndroidManifest.xml文件中查看allowBackup属性,检查是否未设置或者被设置为true。
  • 所用工具:
    GDA
  • 检测记录:
    使用GDA查看测试ApkAndroidManifest.xml文件,发现allowbackup属性值已设置,属性值为true,存在漏洞,如图所示:
  • 修复建议:
    设置allowbackup属性值为false。

    公共组件

    环境搭建
    端口转发:adb forward tcp:31415 tcp:31415

    运行drozer Agent.apk,点击Embedded Server

    点击Disabled叛变的黑色按钮显示Enabled


    连接drozer:drozer.bat console connect
  • 问题描述:
    Service是Android中四大组件进行后台作业的主要组件,如果被测应用对权限控制不当,攻击者可绕过正常认证流程直接调用启动暴露的Service组件。
  • 所用工具:
    drozer、adb、drozer Agent.apk
  • 检测方法:
    adb进行端口转发,调试drozer运行环境使其可以使用,并用drozer检测Service组件权限是否有做配置。使用命令:
    run app.service.info -a 包名
  • 检测记录:

    未启用Service组件,无漏洞
    修复建议:无
  • 补充知识
    1
    2
    3
    4
    5
    6
    7
    8
    9
    存在漏洞的案例:
    dz> run app.service.info -a com.mwr.example.sieve
    Package: com.mwr.example.sieve
    com.mwr.example.sieve.AuthService
      Permission: null
    com.mwr.example.sieve.CryptoService
      Permission: null
    利用dz提升权限:
    dz> run app.service.start --action xxx --extra xxxx
  • 安全使用
    1.如果应用的Service组件为私有组件,建议设置exported属性为false
    2.如果组件必须要提供给外部应用使用,建议对组件进行权限控制
  • 常见配置:
    1.Lable属性:
    Activity页面的标题,界面的名字,如果此界面被创建快捷方式,则快捷方式的名字就是lable值
    2.Name属性:
    指定的值为:包名.Activity类名。
    包名如果与mainfest的package一致,可以用“.”代替。或者不写
    3.Intent-filter子节点:
    添加意图过滤,可以通过隐式意图启动。
    可以在桌面生成快捷方式,应用程序的入口
    4.Icon属性:
    指定应用程序的图标
    5.android:theme属性:
    指定主题
    android:theme="@android:style/Theme.Dialog"
    android:exported
    是否允许外部程序调用
    下面就是我们再AndroidManifest.xml中定义的组件的常见形式。

    activity通过exported属性来对activity进行的安全控制。
    默认情况,如果activity没有设置intent-filter,则exported默认的属性为false,就是这个组件仅仅能被自身内部程序调用。
    如果activity设置了intent-filter,则android:exported默认为true。这样对这个值进行控制就会导致一系列安全问题。所以组件安全也主要针对配置了意图过滤的组件。
    这时我们把组件分为公有组件和私有组件
    1.公有组件:activity组件可以被外部程序调用
    2.私有组件:就是不能被其他程序启动或调用。
    因此在创建组件时:
    如果是私有的组件,android:exported属性一律设置为false.
    如果是公有的,就设置android:exported为true。
    不管公有的还是私有的组件,处理接收的intent时都应该进行验证的数据验证。公有组件防止信息泄露和接收外部数据时进行严格的处理。如果对私有组件没有进行相应的配置,可能导致组件被其他程序调用,敏感信息泄露,拒绝服务器攻击和权限绕过等漏洞。
  • 问题描述:
    Activity是安卓应用组件,提供与用户进行交互的界面。如果应用对权限控制不当,攻击者可绕过正常认证流程直接调用启动暴露的Activity组件显示登录后界面。
  • 所用工具:
    drozer、adb、drozer Agent.apk
  • 检测方法:
    adb进行端口转发,调试drozer运行环境使其可以使用,并用drozer检测Activity组件权限是否有做配置。使用命令:
    run app.activity.info -a 包名 分析出可以调用的activity组件
  • 检测记录:
    通过run app.activity.info -a 包名 分析出可以调用的activity组件

    登录页面

    通过run app.activity.start --component 包名 组件名 启动它

    经测试发现,登录页面被绕过存在漏洞
  • 修复建议:
    为Activity组件设置最小权限。
  • 安全使用
    1.当activity组件为私有组件时,建议设置exported的值为false.
    2.当activity组件为公有组件时,建议对其进行权限控制。
  • 问题描述:
    Content Provider是安卓应用组件,以表格的形式把数据展现给外部的应用。每个Content Provider都对应一个以”content://”开头的特定URI,任何应用都可以通过这个URI操作Content Provider 应用的数据库。如果应用对权限控制不当就会造成信息泄露。
  • 所用工具:
    drozer、adb、drozer Agent.apk
  • 检测方法:
    adb进行端口转发,调试drozer运行环境使其可以使用,并用drozer检测Content Provider组件权限是否有做配置。使用命令:
    run app.provider.info -a 包名 获取Content Provider信息
  • 检测记录:
    run app.provider.info -a 包名 获取Content Provider信息

    先获取所有可以访问的Uri:

    获取Uri数据:

    查到数据,存在漏洞
    Content Providers(SQL注入)

    报错存在SQL注入
    列出所有表:

    获取某个表(如notes)中的数据:

    修复建议:为Content Provider组件设置最小权限。
  • 安全使用
    1.将不必要到出的Content Provider中exported值设为false.
    2.使用openFile接口时对其uri进行严格验证.
    3.移除没有必要的openFile()接口.
    4.设置权限来进行内部应用(比如同公司应用)通过Content Provider的数据共享,如 使用签名验证来控制Content Provider共享数据的访问权限:设置protectionLevel=”signature”.
    5.如果必须要有数据提供给外部应用使用,建议对组件进行权限控制
  • 问题描述:
    Broadcast Receiver是Android中四大组件用于处理广播事件的组件,若存在配置不当则攻击者可绕过正常认证流程直接调用启动暴露的Broadcast Receiver组件。
  • 所用工具:
    drozer、adb、drozer Agent.apk
  • 检测方法:
    adb进行端口转发,调试drozer运行环境使其可以使用,并用drozer检测Broadcast组件权限是否有做配置。使用命令:
    run app.broadcast.info -a 包名 查看暴露的广播组件信息
  • 检测记录:

    无暴露风险,不存在漏洞
  • 修复建议:不存在漏洞,无需修复
  • 补充知识
    ```
    存在漏洞的案例
    dz> run app.broadcast.info -a com.xxx.activity
    Package: com.xxx.activity
    com.xxx.lock.MyExitReceiver
    Permission: null
    com.xxx.lock.LockScreenReceiver
    Permission: null
    com.xxx.lock.LockScreenDeamonReceiver
    Permission: null
    查看暴露的广播组件详细信息
    dz> run app.broadcast.info -a com.package.name -i
  • 安全使用
    1.如果应用的Broadcast Receiver组件是私有的,或者组件配置了intent filter标签,建议显示设置组件的“android:exported”属性为false
    2.如果组件必须要接收外部应用发送的消息,建议对组件进行权限控制
    3.如果组件要向外发送广播,建议发广播时添加参数声明Receiver所需的权限,即只有接收这个广播权限的才能接收这个广播。
  • 问题描述
    代码保护不足,常会带来以下危害:
    1.被盗版
    2.敏感信息泄露
  • 检测方法
    使用反编译工具查看源代码,看是否进行了代码混淆,是否包括了显而易见的敏感信息,等等。
  • 所用工具
    ApkIDE
  • 检测记录:
    使用ApkIDE加载测试APP,在smali文件夹内打开一个.smali文件,之后选择打开java源码功能,查看源码是否被混淆

    代码未混淆存在漏洞
  • 修复建议:
    对代码进行混淆
  • 安全使用
    开发时对代码进行混淆,或使用加固软件进行安全加固。
    常见混淆方法:
    将代码中的各种元素,如变量、函数、类的名字改写成无意义的名字,比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式,比如将for循环改写成while循环,将循环改写成递归,精简中间变量等。
    打乱代码的格式,比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等。
  • 常见危害
    1.插入自己广告或者删除原来广告;
    2.恶意代码, 恶意扣费、木马等;
    3.修改原来支付逻辑。
  • 所用工具
    ApkIDE
  • 检测方法
    使用ApkIDE工具进行反编译,保存之后,进行打包尝试是否打包成功,若成功安装该Apk检测是否正常运行。
  • 检测记录:
    使用ApkIDE工具进行反编译,保存之后,进行打包尝试是否打包成功

    进行安装尝试

    安装失败,不存在漏洞
  • 防护建议
    程序内部在启动的时候可以通过获取APK本身的签名然后和正确的签名做对比来识别自己是否被二次打包。
  • 问题描述:
    被测应用的开发者证书不规范,导致被测应用的开发者身份信息不详,影响用户体验并影响App上架与版权纠纷问题。
  • 所用工具:
    GDA
  • 检测方法
    使用GDA显示被测应用证书信息,查询开发者证书书写是否规范
  • 检测记录
    被测应用证书书写不规范
  • 修复建议:
    修改或添加证书信息,注意:证书应包含开发者身份信息,避免开发者身份不详。
  • 安全使用
    证书应包含开发者身份信息,避免开发者身份不详。
  • 常见危害
    1.隐藏payload。
    2.访问原来的应用中受保护的数据,比如用户身份证书信息和隐私信息。冒充合法应用的身份还可以绕过杀软等安全解决方案。
    3.下载其他恶意软件的代码
  • 所用工具
    GetApkInfo.jar
  • 检测方法:
    使用命令java -jar GetApkInfo.jar *.apk查看APK信息及签名版本,检测是否启用signature scheme V1 + V2签名机制。
  • 检测记录:

    已采用signature scheme V1签名机制,未采用V2签名机制,存在漏洞
  • 修复建议
    使用signature scheme V1 + V2签名机制
  • 安全使用
    使用signature scheme V1 + V2签名机制
  • 问题描述:
    1.远程代码执行漏洞
    2.UXSS漏洞
    3.密码明文存储漏洞
    4.域控制不严格漏洞
  • 所用工具:
    ApkIDE
  • 检测方法:
    分析是否使用
    WebView 中 addJavascriptInterface() 接口
    Android 4.4之前的WebKi
    WebView 内置导出的 searchBoxJavaBridge_对象
    WebView 内置导出的 accessibility 和 accessibilityTraversalObject 对象
  • 检测记录:
    使用ApkIDE加载测试APP,打开一个.smali文件,打开java源码,查询是否使用addjavascriptInterface、searchBoxJavaBridge_接口函数,查询WebView默认开启密码保存功能

  • 修复建议:
    采用@JavascriptInterface代替addjavascriptInterface
  • 安全使用
    1.在Android 4.2版本之前采用拦截prompt()进行漏洞修复。
    在Android 4.2版本之后采用@JavascriptInterface代替addjavascriptInterface
    2.使用onPageStarted (WebView view, String url, Bitmap favicon)方法在跳转前进行跨域判断
    3.使用最新的Webkit内核,但APK的size会变大,并且后续需要跟进Google Webkit官方进行更新。
    4.客户端对iframe object标签属性进行过滤
    5.删除searchBoxJavaBridge_接口
    6.关闭密码保存提醒:WebSettings.setSavePassword(false)
  • 问题描述:
    将隐私数据明文保存在外部存储。
    将系统数据明文保存在外部存储。
    将软件运行时依赖的数据保存在外部存储。
    将软件安装包或者二进制代码保存在外部存储。
    全局可读写的内部文件存储。
  • 所用工具:
    MT管理器
  • 检测方法:
    运行apk进行一些数据操作(例如输入账号密码点击登录),打开软件安装目录,查询是否有敏感数据。
  • 检测记录:
    MT管理器打开根目录,打开data文件夹,在打开data文件夹内的data文件夹,在此文件夹内查询是否存在敏感信息


    检测到敏感数据以明文形式存储在本地,存在漏洞
  • 修复建议:
    加密储存敏感信息
  • 安全使用
    若无必要,敏感数据禁止存储在本地,若需存储时加密存储数据,避免信息泄露。
  • 问题描述:
    当进行敏感信息操作时,若以明文显示输入数据并未检测是否被录屏、截屏,会导致敏感信息泄露
  • 检测方法
    当进行敏感信息操作时,是否明文显示输入数据并检测是否被录屏、截屏,避免敏感信息泄露
  • 检测记录
    检测到输入账号密码时,无法录屏、截屏,并以特殊符号显示所输入数据。
  • 修复建议
    当进行敏感信息操作时,掩码显示输入数据并检测是否被录屏、截屏,避免敏感信息泄露
  • 问题描述:
    敏感信息泄露
  • 检测方法
    使用adb logcat 命令在终端中打印出所有的日志,查询是否有敏感信息泄露
  • 检测记录
    adb logcat >日志.txt

    泄露操作信息,存在漏洞。
  • 修复建议
    对传输数据进行加密
  • 问题描述:
    App在进行网络传输时,如果使用的是HTTPS SSL加密协议,是否对链路中的SSL加密Cert证书做了合法性的校验checkClientTrusted/checkServerTrusted等函数,以防止传输过程中的数据被解密,从而协议被逆向破解。
  • 所用工具:
    Burp suite
  • 检测方法:
    在传输数据时,进行抓包,分析传输数据是否可以解密
  • 检测记录:
    设置代理,抓取数据包的结果如下:

    https协议传输,可抓取https协议传数据包
    反编译发现存在证书本地明文存储的情况,如下:

    在反编译源码中搜索证书名字,可定位获取到证书密钥,从而导致使用双向校验被绕过,如下:
  • 修复建议:
    加密传输数据
  • 安全使用
    对链路中的SSL加密Cert证书做了合法性的校验checkClientTrusted/checkServerTrusted等函数,以防止传输过程中的数据被解密,从而协议被逆向破解。
  • 问题描述:
    在与服务器端进行数据交互时,传输数据为加密,导致传输数据被拦截时泄露,敏感信息
  • 所用工具:
    Burp suite
    检测方法:
    在与服务器端进行数据交互时,进行抓包,查看是否有敏感信息
  • 检测记录:
    手机连接Burp代理,用Burp进行抓包,APP登录操作: 检测到账号、登录凭证不安全传输。
    密码虽然是MD5散列后的数值,但是传输使用的是http协议,存在被嗅探窃取的可能性,一旦泄漏,黑客能够直接通过该用户名和Password登录。
  • 修复建议:
    加密传输数据
  • 问题描述:
    程序的验证码机制没有验证验证码的正确性,导致验证码名存实亡,起不到保护作用。
  • 所用工具:
    Burp suite
  • 检测方法:
    登录时,修改请求或响应信息,查询是否存在绕过问题
  • 检测记录:
    经测试,App修改手机号需要验证码进行验证,如下:

    通过以下类接口,可直接对手机号进行修改,绕过验证码的验证:https://www.xxx.com/IOT_SBS/a/my/userinfo/phoneModify.do
    当前手机号:

    使用此接口直接进行修改,如下:

    修改成功,如下所示:
  • 修复建议:
    对短信验证码正确性的进行前后端验证
  • 问题描述:
    如果被测应用没有使用有效的token机制,对登陆响应中的服务器返回的鉴权信息进行修改,即可绕过服务器鉴权,直接访问系统内部信息。
  • 所用工具:
    Burp suite
  • 检测方法
    从代理抓包分析,APP登录是会将一个deviceid和用户凭证一起提交,用户登录成功后,该deviceid将作为后续接口调用的凭证,即Token。
    经查,该deviceid为设备中某些公开信息(IMEI、设备型号、操作系统版本等)的Base64编码结果,不具备隐私性,黑客可以通过获取这些公开信息伪造用户身份,如下图所示:
    账号登录时进行抓包

    拦截响应信息并进行修改


    进行修改

    查询是否登录成功,与可进行一些工程操作

  • 修复建议:
    使用有效果的token机制,并在deviceid中加入随机数据
  • 安全使用
    使用有效果的token机制,并在deviceid中加入随机数据。
  • 问题描述:
    用户登录过程中,未对同一用户的登录失败次数做限制,导致存在被暴力破解的风险。
  • 所用工具:
    Burp suite
  • 检测方法
    对登录接口进行暴力破解,错误50次后,输入正确用户名和密码仍然成功登录,表明没有对登录接口做暴力破解防护。
  • 检测记录
    登录时,输入错误的密码,进行抓包

    将其发送到Intruder模块,进行重发包操作,


    输入正确的账号密码检测是否可以正常登录
  • 修复建议:
    限制账号登录错误次数,超过阀值时需要提供验证码机制
  • 安全使用
    限制账号登录错误次数,超过阀值时需要提供验证码机制。
  • 所用工具:
    Burp suite
  • 检测方法
    在使用短信发送功能时,进行抓包,修改请求信息,并进行多次重发包测试
  • 检测记录
    用户选择注册或忘记密码功能时,会触发短信验证码发送,多次调用验证码发送接口,每分钟能收到多条短消息,且没有发现总量限制。
  • 修复建议
    如果已经限制了每个用户每分钟的短信条数(如果没有限制,请做限制处理),建议进一步限制每个用户每天的短信条数。
  • 安全使用
    验证短信发送人是否为指定用户,并限制一段时间段内,可发送的短信数量
  • 问题描述:
    应用存在钓鱼劫持风险。应用程序没有做防钓鱼劫持措施,通过劫持应用程序的登录界面,可以获取用户的账号和密码,可能导致用户账号信息的泄露。
  • 钓鱼原理
    需要理解,Android启动一个Activity时,是这样设计的,给Activity加入一个标志位FLAG_ACTIVITY_NEW_TASK,就能使它置于栈顶并立马呈现给用户。但是这样的设计却有一个缺陷。如果这个Activity是用于盗号的伪装Activity呢?这种现象在XcodeGhost事件中,已经被证实是可以实现的。
    在Android系统当中,程序可以枚举当前运行的进程而不需要声明其他权限,这样的话,就可以编写一个程序,启动一个后台的服务,这个服务不断地扫描当前运行的进程,当发现目标进程启动时,就启动一个伪装的Activity。如果这个Activity是登录界面,那么就可以从中获取用户的账号密码,具体的过程如下图:
    所用工具
    hijackactivity.apk
  • 检测记录:
    打开App劫持工具,选择需要劫持的App对应的包名,打开app检测是否被劫持

    无法被劫持不存在漏洞

    修复建议:
    应用程序自身通过获取栈顶activity,判断系统当前运行的程序,一旦发现应用切换(可能被劫持),给予用户提示以防范钓鱼程序的欺诈。
  • 安全使用
    建议在登录Activity的onpause方法中实现钓鱼劫持防护功能
    使用HTML5架构或android+HTML5混合开发,实现登陆、支付等关键页面,降低被劫持的风险。
  • 《全国移动App风险监测评估报告》
  • 《OWASP Mobile Top 10》
  • 《移动APP渗透测试方案》
  • 《APP安全测评》
  • 逍遥:https://www.xyaz.cn/
  • 夜神:https://www.yeshen.com/

    GDA

    官网:http://www.gda.wiki:9090/

    drozer

    下载:
  • 官网:https://labs.f-secure.com/tools/drozer/
  • GitHub:https://github.com/FSecureLABS/drozer
  • 软件安装:本机根据自身系统安装安装包,模拟器安装drozer Agent.apk
  • 运行
    模拟器打开drozer Agent.apk,点击Embedded Server

    点击Disabled叛变的黑色按钮显示Enabled

  • 端口转发
    因在模拟器使用,需要端口转发才可正常使用
    在模拟器安装目录启用cmd,运行以下命令
    adb forward tcp:31415 tcp:31415

    若报错重新启动模拟器
    在drozer安装目录启用cmd,运行以下命令
    drozer.bat console connect
    (输入drozer console connect命令也可运行,但建议加上文件后缀.bat)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    APP模块的作用说明
    APP模块
    模块名 ------------------------ 作用
    app.activity.forintent : 通过intent查找它的activity
    app.activity.info : 获取activities信息
    app.activity.start : 开启 Activity
    app.broadcast.info : 获取broadcast receivers信息
    app.broadcast.send : 发送广播
    app.broadcast.sniff : 嗅探广播中intent的数据
    app.package.attacksurface :确定安装包的可攻击面
    app.package.backup : 列出可备份的包
    app.package.debuggable: 列出可debug的包
    app.package.info : 获取已安装包的信息
    app.package.launchintent: 获取程序启动的activity信息
    app.package.list : 手机已安装的程序包
    app.package.manifest : 获取程序manifest文件信息
    app.package.native : 列出Native libraries 信息
    app.package.shareduid : 查找拥有共同uid的包和他们所有的权限
    app.provider.columns : 展示content provider URI的各列
    app.provider.delete : 删除content provider URI的内容
    app.provider.download : 使用openInputStream读取指定uri的内容,并下载在电脑中
    app.provider.info : 获取 content providers信息
    app.provider.insert : 插入数据到content provider
    app.provider.query : 查询content provider 内容
    app.provider.read : 使用openInputStream读取指定uri的内容
    app.provider.update : 更新content provider的内容
    app.service.info : 获取services的信息
    app.service.send : 使用 Message攻击暴露的service,其service实现了handleMessage
    app.service.start : 开启服务
    app.service.stop : 停止服务

    Java运行环境

    可运行keytool.exe,以及为ApkIDE提供环境支持。

    adb

    模拟器自带
  • 查询已连接设备/模拟器
    adb devices
  • 查看日志
    adb logcat > 导出名称.txt
  • 其它玩法可用搜索引擎搜索
    案例:https://blog.csdn.net/zhonglunshun/article/details/78362439

    资源管理器

    MT管理器
    资源管理器

    抓包

  • Burp
  • Charles
  • Wireshark
  • Fiddler
    我平常使用Burp进行测试,故案例使用Burp演示,其它软件配置方法类似
  • 配置代理
    选用以下框选区域的内网IP进行设置(此区域的内网IP会变化,Burp关闭后,再次使用建议重新在设置下),端口建议使用8888(很少有于这个冲突的)


    模拟器配置此代理
  • 点击设置
  • 点击WLAN
  • 鼠标左键按住点击已连接的WLAN,例如这里是lskbjqo514,直至弹出如下窗口
  • 点击修改网络-高级选项-代理-手动-根据Burp设置的代理信息进行配置

    若一些地址不想被抓取请在“对以下网址不使用代理”区域进行添加
  • 安装证书
    打开模拟器浏览器或将制作好的证书拖拽到模拟器内进行安装
    访问http://burp/,点击CA Certificate进行下载

    在文件管理器,找的下载的文件,并更改文件后缀为.cer

    点击设置-安全-从SD卡安装证书,找的刚才下载的文件路径,选择安装

    安装证书需设置手机锁,根据提示设置就好

    之后给证书设置一个名称

    成功安装,出现如下提示
  • 测试
    成功访问,为提示证书问题,数据成功抓取

    drony

    因一些问题,请自行网络搜索下载其安装包,推荐使用English版本
    某些App只在WLAN设置代理会抓不到包,故需要一些工具协助进行抓包,平常我使用drony这个工具

  • 抓不到包的原因
    为提高数据安全,App拥有自己的http客户端,不使用系统代理,导致抓不到包。

  • 解决
    方法1.控制DNS解析,通过修改dns的方式让客户端以为我们的代理服务器就是目标服务器。
    方法2.在网络设备上直接做流量转发,将指定终端设备上发往80及443端口的数据直接转发到代理服务器的目标端口上
    方法3.使用某些软件将终端设备的流量转发到代理服务器
  • 我这里采用方法3这样简单些,网上找的这个工具drony,它将手机上的所有流量都重定向到drony自身,这样drony就可以管理所有手机上的网络流量,甚至可以对手机上不同APP的流量进行单独配置。
    安装配置
  • 打开drony,默认处于关闭状态,若需要配置需鼠标按住向左方滑动至设置区域SETTINGS
  • 查看系统代理(因一些原因内网地址变化重新配置了下)
  • SETTINGS-Proxy-Proxy port设置若下图所示

  • [注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

    最后于 2020-11-16 14:00 被梦幻的彼岸编辑 ,原因:
    收藏
    免费 4
    支持
    分享
    打赏 + 2.00雪花
    打赏次数 1 雪花 + 2.00
     
    赞赏  orz1ruo   +2.00 2020/09/22 助人为乐~
    最新回复 (5)
    雪    币: 6067
    活跃值: (12629)
    能力值: ( LV12,RANK:312 )
    在线值:
    发帖
    回帖
    粉丝
    2
    详细
    2020-9-22 08:32
    0
    雪    币: 10944
    活跃值: (7329)
    能力值: ( LV12,RANK:219 )
    在线值:
    发帖
    回帖
    粉丝
    3
    点赞
    2020-9-22 09:49
    0
    雪    币: 1454
    活跃值: (267)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
    感谢分享
    2020-9-22 09:50
    0
    雪    币: 3372
    活跃值: (762)
    能力值: ( LV3,RANK:30 )
    在线值:
    发帖
    回帖
    粉丝
    5
    感谢分享~
    2020-9-22 10:25
    0
    雪    币: 977
    活跃值: (435)
    能力值: ( LV7,RANK:100 )
    在线值:
    发帖
    回帖
    粉丝
    6
    详细
    2020-9-22 15:29
    0
    游客
    登录 | 注册 方可回帖
    返回
    //