想到什么就随手写点吧,最近刚看完《Android软件安全与逆向分析》。
另外还有一本《Android应用安全防护和逆向分析》,准备开始看。两本书的PDF链接我会放在末尾,需要的自取。
《Android软件安全与逆向分析》书中提到了多种去除Android本地限制的方法,倾向于基础性的安卓破解,比如去内购(不过本书的内购都是围绕着google play来讲的,和国内的内购相差很大,国内的话更多可以参考52pojie的教程帖子)。看完了这本书可以对smail语言更了解,初步接触到IDA这个神器。我看完的感受是基本能看懂smail大概的意思,然后配合jad和IDA能把代码逻辑理清楚,对代码关键点进行修改。(当然里边的实例记得动手,实例在图灵社区就可以下载)不过感觉这对于android安全来说仅仅是开始,更多的想接触加固,脱壳,hook。而这些,在《Android应用安全防护和逆向分析》书中都有涉及。不过这个汇编语言真的是我人生大敌ORZ。。。
组件安全——Activity安全
Activity可以在android:exported进行设置,如果为false则不可以被外部程序调用。
如果要进行外部调用的话,需要使用android:permission进行权限限制。
如果不进行限制,activity可以被劫持。
组件安全——Broadcast Receiver安全
广播信息分无序广播(可以被所有接收者接收到,不能被abortBroadcast()中止)【sendBroadcast()】和有序广播【sendOrdererBroadcast()】。有序广播优先级高的接收者比优先级低接收者先接受,然后依次向下传递。这个时候存在的安全问题就是优先级高的接收者可以对广播内容进行篡改。android:priority属性的参数越大,优先级越高,最高位1000。
安全建议的话是加入intent.setClass(MainActivity.this.DataReceiver.class);对广播权限进行限制,只能由本实例的DataReceiver接受。
组件安全——Service安全
Service一般是系统后台进程控制服务,恶意的service操作可以破解程序的执行环境,直接影响到程序的正常运行。
startService():启动服务。
bindService():绑定服务。
stopService():停止服务,对程序功能进行恶意破坏。
service也是可以进行权限控制的,参数为Android:exported--》false。同样支持多程序间调用的相互权限检查
组件安全——Content Provider安全
数据共享交换服务(比如联系人,短信,账户等)。主要也是对权限进行检查。
组件安全是移动应用安全的基础,同样也是乙方安服渗透测试的基础项。新人不了解移动安全,或者对APP渗透的了解仅限于业务安全的话可以了解下相关的成因和危害,以后在跟客户讲解的时候也可以更有底气。我这算是补坑了吧。
安卓基础项测试分享:
adb connect 127.0.0.1:62001 链接夜神模拟器
adb devices 查看连接
adb logcat 打印logcat
adb install 安装,覆盖安装是-r
adb uninstall卸载
adb push 推送本地文件至 Android 设备
adb pull 推送Android文件至本地
adb shell mount -o remount rw / 修改系统读写权限
adb root 获得root权限
jarsigner -verify -verbose –certs +安卓包
CN字段后为签名信息
检查AndroidManifest.xml文件中的allowBackup属性-- 检查是否显式设置为false(不能是true)
是否可以用killer进行反编译
检查AndroidManifest.xml文件中的debuggable属性-- 检查是否能被调试(应该是false)
反编译后更改原程序代码,资源,重新打包,看是否能正常运行
原理:(待补充)
安装,windows+Android
drozer地址:https://github.com/mwrlabs/drozer/releases
第一步:adb forward tcp:31415 tcp:31415 端口转发
第二步:开启drozer drozer console connect
Activity
>run app.activity.info -a packagename
>run app.activity.start --component com.example.package com.example.package.welcome
Service
>run app.service.info -a com.mwr.example.sieve
>run app.service.start --component com.mwr.example.sieve com.mwr.example.sieve.xxx
Broadcast Recevier
dz> run app.broadcast.info -a com.package.name
dz> run app.broadcast.send --component com.package.name --action android.intent.action.XXX
Content Provider
使用drozer命令run scanner.provider.injection -a APP包名 测试Content Provider -- 检测是否存在SQL注入
使用drozer命令run scanner.provider.traversal -a APP包名 测试Content Provider -- 检测是否存在目录遍历
WebView代码执行检测
>run scanner.misc.checkjavascriptbridge -a 包名
WebView不校验证书检测
搜“onReceivedSslError”,看是否调用了handle.process()方法(在webview组件代码中测试)
WebView密码明文保存检测
搜”setSavePassword”,看是否显式设置为false(在webview组件代码中测试)。
具体可以参考https://www.cnblogs.com/goodhacker/p/3906180.html
检查/data/data/APP包名 路径下的文件以及SD卡中包含APP名称的目录中的文件 -- 检测是否存在敏感信息(如私钥等)、是否加密以及是否能通过修改SD卡文件影响APP正常运行。
分析是否硬编码敏感信息(如账号密码、IP地址、邮箱等)
Adb shell进入文件管理,使用ls –al查看检查/data/data/APP包名 路径下的文件权限。建议将app移动客户端私有目录权限设置为文件权限“rw-rw----”,目录权限为“rwxrwx—x”。
使用adb logcat命令查看APP的日志输出 -- 检测日志信息中是否包含敏感信息。
安装安卓按键记录工具(ns_keylogger.apk),在设置中选择我们的输入法,启动APP,输入框长按空格,选择我们的测试键盘,使用logcat/DDMS查看测试键盘记录 -- 查看APP案件能否被测试键盘记录。
安装memspector.apk,尝试搜索、查看、修改APP内存数据(用户名、密码等数据通常会在/dev/ashmem/dalvik-heap内存段) -- 检测是否有明文的敏感数据、是否能够修改关键数据。
Adb shell中执行busybox netstat -tuanp|grep -Ei 'listen|udp*'
搜DexClassLoader
public DexClassLoader(String dexPath,String optimizedDirectory, String libraryPath, ClassLoader parent)[2]
查看AndroidManifest.xml包package值相对应路径下的文件中是否含有DexClassLoader()函数调用。
链接:https://pan.baidu.com/s/18lQvG1GRLO3AqVfUBod5-A
提取码:tgop