目录

一、客户端程序安全

1、安装包签名

 2、反编译保护

3、应用完整性校验

4、组件安全 

二、敏感信息安全

 1、数据文件

 2、Logcat日志

三、密码安全

 1、键盘劫持

2、屏幕录像 

四、安全策略 

1、Activity界面劫持


        对于App安全渗透测试来说可将其检测方向分为七大模块,分别是客户端程序安全、敏感信息安全、密码安全、安全策略、进程保护、通信安全和业务安全。

        上面是各部分实际的检测点,以及一些实现方法,接下来将对其较为重要部分的检测步骤展开讲解:

一、客户端程序安全

1、安装包签名

        使用JDK中的jarsigner.exe检查安装包签名。

        首先,使用命令:cd JDK存在路径 进入到JDK所存储的位置,使用以下命令:

jarsigner.exe  -verify  APK 文件路径  -verbose  -certs

        若此时查看到CN=发布方,则判定为无风险;若CN=Debug证书、第三方(开发方)证书则判定为高风险

例如:对Test01 App进行检测 (网上随意下载的APK)
输入命令:

得到结果:

可看到上图CN=发布方,则无风险

 2、反编译保护

        把apk当成zip解压得到classes.dex文件(可能得到不止一个classes.dex文件,但只需使用一个来进行操作),如下图:

        使用 dex2jar 工具,执行命令得到jar文件,命令如下:

dex2jar.bat classes.dex 文件路径

        之后使用jd-gui工具打开生成的jar文件,即可得到Java代码信息。直接打开jd-gui工具,将生成文件直接拖拽进去即可。

        如上图,逆向后发现已经混淆,则认为是安全的。 

        如果代码经过混淆,或有加壳措施,不能完整恢复源代码,都可以判定为安全。再或者代码展示的是复写和接口以外无意义的字段,则认为安全。若大部分代码(包括核心代码)经过混淆,判定为低风险;若部分代码混淆,但可获取核心代码,则判定为高风险

3、应用完整性校验

        使用ApkTool将目标文件解包,命令如下: 

java -jar apktool.jar d -f apk文件路径 -o 解包目标文件夹 

         在解包文件中随意修改任意一项数据(可以是logo图),此处,选择图:inc_bg.9.png进行替换。

         随后,对修改好的文件包进行打包处理(得到未签名的包),使用以下命令:

 java  -jar  apktool.jar  b  -f  待打包文件夹  -o  输出 apk 路径 

        之后,使用SignApk,对未签名的apk文件进行签名操作,命令如下:

java -jar  signapk.jar testkey.x509.pem testkey.pk8  待签名apk文件路径  签名后输出apk路径

 

         签名完成后,重新安装App进行测试。若可正常安装、打开软件,且过程中未存在任何提示,则未进行自校验,测试不通过(一般为中风险);若不可正常安装打开,且存在提示,则测试通过,无风险。

对于风险判定:

  • 若应用进行了完整性校验,校验到App应用不完整,不可安装、进行使用,则判定为无风险
  • 若应用替换新文件时有提示应用完整性验证失败,则判定为低风险
  • 若本地进行校验的基础上只通过 MANIFEST.MF 对客户端原有文件进行校验而忽略新增文件的检验,则判定为中风险
  • 若未进行应用完整性校验,则判定为高风险

4、组件安全 

         Android组件安全漏洞主要集中在Activity、Service、Broadcast Receiver、Content Provider四大组件是否存在被外部调用问题,外部调用时是否存在风险。

        该部分的检测主要是使用ApkTool解包,打开解包目录中的AndroidManifest.xml文件,对其中声明的组件进行判断:

1. 显式声明了 android:exported="true",则可导出;

2. 显示声明了 android:exported="false",则不可导出;

3. 未显示声明 android:exported:

        a) 若组件不是 Content Provider:

               i. 若组件包含<intent-filter>则可导出,反之不可;

         b) 若组件是 Content Provider:

                  i. 若 SDK 版本<17 则可导出,反之不可。  

        从测试的角度上,只能判断是否导出,但能否构成威胁还需详细分析代码,或是跟开发测确定相关组件是否可以导出后才能判定风险等级。 

        由于功能需要,启动Activity和Content Provider 大多是导出组件,一般无需理会。

PS:ApkTool工具解包和直接对Apk安装包进行解压处理,都会得到AndroidManifest.xml文件,但是直接解压得到的 AndroidManifest.xml文件是有损的,文件打开是乱码;所以,还是需要使用ApkTool工具进行解包得到文件。

二、敏感信息安全

 1、数据文件

        该部分主要是对权限配置文件、SharedPreferences配置文件、数据库文件等进行查看,观察其中是否存放着敏感信息。该部分使用夜神模拟器进行检测。使用命令:adb connect IP连接地址,连接夜神模拟器进行检测工作。

        首先,对权限配置文件进行检测。使用 adb shell 命令进入设备,对数据文件进行查看,一般安卓设备的信息存储在 /data/data/ 文件中。因此,使用 cd /data/data/ 命令进入资源文件目录下,使用 ls 命令对安卓设备中的所有应用程序进行查看,发现本次需要进行检测App应用名称。(若还不知道应用的包名是啥,可以直接下载一个“应用信息查看器”App,直接打开对手机中安装应用的包名进行查看

        使用命令:cd App包名,到检测App目录下,使用 ls -al 对该App相关文件进行查看。当前该检测App文件的配置权限正常。正常的文件权限后三位应为空(类似“ rw-rw---- ”),即除应用自己以外任何人无法读写;目录则允许多一个执行位(类似“ rwxrwx--x ”);lib子目录是应用安装时由Android系统自动生成,可以略过。

        之后,对客户端程序存储在手机的SharedPreferences配置文件进行检测。 在当前检测App的设备目录下,使用命令:cd shared_prefs 进入到 SharedPreferences 配置文件存储目录下,使用 ls -al 对当前目录下文件信息进行查看,一般对xml文件进行查看,可使用命令 cat XXX.xml 对具体文件内容进行查看,观察是否存在敏感信息。

         最后,对数据库文件进行检测。使用命令:cd databases,进入数据库目录,使用 ls -al 查看目录下的数据库文件。随后,使用命令:adb pull 手机中数据库存储位置 将存储至电脑中的位置,得到数据库文件,可使用SQLiteExper进行查看(其他数据库工具也可)。

        若以上数据文件信息中都未存在敏感信息(登录密码、身份信息等),则判定为无风险;否则,判定为高风险。 

 2、Logcat日志

        该部分主要是检查客户端存储在手机中的日志是否存在敏感信息。

adb 可使用命令:
adb devices //查看安卓设备列表
adb -s 设备名称 其它命令 //当连接了多个设备时,选择操作的目标设备,否则会出错
adb pull 手机目录名 PC 目录名 //从安卓设备中复制文件到电脑中
adb shell logcat //持续输出日志,直到 Ctrl+C
adb shell logcat -d //一次性输出日志缓存,不会阻塞
adb shell logcat -c //清空日志缓存

        在连接安卓设备后,使用命令:adb shell logcat -d > 输出文件路径,输出日志信息,对其进行检查。目前检测App日志中记录了登录设备的IP地址,存在敏感隐私信息,判定为高风险。

        若输出日志未存在敏感信息(登录密码、身份信息等),则判定为无风险;否则,判定为高风险。 

三、密码安全

 1、键盘劫持

        该部分主要检测客户端程序在密码等输入框是否使用自定义的软键盘,安卓应用中的输入框默认使用系统软键盘,手机安装木马后,木马可以通过替换系统软键盘,记录手机键盘输过的密码。
        在设备中安装安卓按键记录工具(ns_keylogger.apk),并在设备中下载相关的软键盘程序,随后,在手机系统设置中“语言和键盘设置”选择我们安装的软键盘。

        启动检测App,切换至软键盘输入,输入信息, 发现从DDMS中无法查看到输入信息,按键记录工具无法记录到输入数据。随后,使用命令:adb shell logcat -d 输出文件路径 查看logcat文件是否获取到输入信息,查看后发现logcat文件也无法获取信息,则判定键盘劫持安全。
        若发现可查看(劫持)键盘输入信息,则判定为高风险;反之,判定无风险

2、屏幕录像 

        用户点击键盘产生视觉响应时,安卓木马可以通过连续截屏录屏的方式,对用户点击键盘进行记录,从而获得用户输入信息。

        使用命令: adb shell /system/bin/screencap -p 输出 png 路径(安卓设备中路径)对检测App进行连续截图。使用adb pull命令到处图片,对其进行检查。

        由于检测App的登录界面密码输入使用了隐藏形式,所以在进行连续截图时会发现,密码未显示展示时无法获取到,但并不能排除其风险性。所以,录屏进行检测,使用命令:adb shell screenrecord /sdcard/xxx.mp4(为安卓设备中的保存路径)进行录屏处理,输入命令后录屏开始,此时可以对安卓设备进行操作,操作完成后 ctrl+c 结束录屏工作。随后使用命令:adb pull /sdcard/xxx.mp4(设备中保存路径) F:\xxxx(输出路径) 将视频文件从安卓设备中导出,进行查看。

        若可对客户端输入内容进行截屏或录屏,则判定为中风险当客户端会对截屏或录屏操作进行有效抵抗时(无法截屏或截屏结果为黑屏等无意义图片),则判定为无风险

四、安全策略 

1、Activity界面劫持

        检查是否存在 activity 劫持风险,确认客户端是否能够发现并提示用户存在劫持。

        安装劫持测试工具,使用劫持测试工具对其进行检测。打开drozer agent工具,连接drozer进行检测。使用命令: adb forward tcp:31415 tcp:31415 连接drozer,使用命令: drozer console connect 连接进行操控

        连接成功后,打开需劫持页面,使用run命令:run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity 对其进行检测。经检测发现,检测App的Activity界面可被劫持,判断存在风险。(记得先在手机中安装uihijack.apk

 

         若客户端无法抵抗 Activity 界面劫持攻击时为中风险;若可以抵抗攻击则无风险

以上是App安全测试较为基础部分的检测步骤详解。还有通信安全、业务安全等模块的技巧还未写,应该会再开一篇文章写。 以下提供下部分使用到的工具信息:

链接:https://pan.baidu.com/s/19bxcHWs2d1ZhMUmGmzzg9w 
提取码:7h7x 
--来自百度网盘超级会员V4的分享

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐