Android渗透
移动APP大多通过WEB API服务的方式与服务端进行交互,这种模式把移动安全和web安全绑在一起。常见的web漏洞在移动APP中也存在,比如SQL注入,文件上传,中间件/server漏洞等,由于部分APP不是直接嵌入网页在APP中,而是使用api接口返回json数据,导致扫描器爬虫无法爬取链接。
配套装备
- JDK
- SDK
- ADB
- Genymotion模拟器(或真机)
- Drozer
JDK
安装
-
点击下载地址进入Android开发工具下载页面,下载JDK相应版本;
-
解压并配置环境变量;
-
执行java和javac,查看JDK安装情况。
SDK
安装
- 点击下载地址进入Android开发工具下载页面,下载SDK Tools中的相应版本;
- 解压sdk包,再执行如下命令;
进入sdk的tools目录
cd /sdk存放路径/tools
执行android
./android
- 执行./android命令后,会打开SDK Manager窗口,升级SDK(翻墙)。
ADB
原理
ADB:Android Debug Bridge(Android调试桥接器),用于管理真机和模拟器的工具。
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
-
adb client
client是运行在PC端,每发起一个adb命令,就会开启一个client。
当开启一个client时,先检测后台是否有server程序运行,如果没有,则会启动server进程。
所有client都是通过5037端口与adb server进行通信。 -
adb server
server是运行在PC端的后台程序,负责管理adb client进程以及与adb daemon之间的通信。
当server启动时,会自动绑定并监听5037端口,接收client通过该端口发送过来的命令。
同时server还会对5555-5585间的奇数端口进行扫描,对已连接设备的定位。 -
adb daemon(adbd)
daemon是运行在真机/模拟器端的后台程序。
使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这么一个后台进程,并且为其分配了两个连续的端口,比如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
也正因为每个设备都分一组两个端口,所以adb连接手机的最大数量为16。
在这组端口中,其中偶数端口是用于server与设备进行交互的,可以让server直接从设备中读取数据,而奇数端口是用来与设备的adbd进行连接通信的。
安装
-
点击下载地址进入Android开发工具下载页面,下载SDK Platform-Tools中相应的版本;
-
解压,将解压后的platform-tools文件夹放到android sdk根目录下;
-
将adb所在目录添加到系统PATH中;
编辑环境变量文件
vim ~/.bash_profile
added by adb
export PATH="/SDK/android-sdk-macosx/platform-tools:$PATH"
重启环境变量文件,设置才能生效
source ~/.bash_profile
-
运行adb,查看安装情况。
常用命令集
查看当前连接的设备:adb devices
安装软件:adb install *.apk
覆盖安装:adb install -r *.apk
卸载软件:adb uninstall <PACKAGE_NAME>
登录设备shell:adb shell
从电脑上传送文件到手机:adb push
从手机传送文件到电脑上:adb pull
踩过的坑
- 查看Android设备报错
adb devices
报错原因:与genymotion自带的adb产生冲突、IP不在同一网段。
解决方案一:
将genymotion->setting中,将ADB设置成本地的SDK根目录;
解决方案二:
lsof -i tcp:5037
kill -9 **
adb start-server
解决方法三:
如以上两种方法都无法解决,查看模拟器IP地址【设置->关于手机->状态信息->IP地址】是否与本机IP在同一网段,这点很重要。
一般模拟器的IP地址为10.0.3.15。
网上的攻略是修改wifi的IP地址【长按wifi热点->修改网络,将IP设置从“DHCP”改成“静态IP”】,也没折腾好。
解决方法四:
用真机
- 安装APK报错
adb install *.apk
Failure[INSTALL_RAILED_NO_MATCHING_ABIS]
报错原因:由于安装的APP中使用了与当前模拟器CPU架构不一致的native libraries,所以导致报错。
解决办法:下载genymotion-arm-translation,直接将文件拖进模拟器安装再重启模拟器OK。
Genymotion模拟器
安装
- 点击下载地址,下载最新的安装包【注:需要注册genymotion账号】;
- 需要下载VirtualBox,自行百度下载;
- 打开Genymotion模拟器,输入账号及密码登录;
- setting->ADB,选择自己安装的SDK根目录;
- Add,选择需要下载Android虚拟设备,点击next下载即可。
Android渗透工具——Drozer
MacOS安装
- 下载源码
git clone https://github.com/mwrlabs/drozer/
- 编译
cd drozer
python setup.py build
python setup.py install
注:执行最后一条命令时,提示fatal error: ‘yaml.h’ file not found #include <yaml.h>,说明没有安装pyyaml,使用pip install pyyaml。
- 执行drozer,查看安装结果
- 下载agent.apk
Windows安装
- 点击下载地址,windows环境选择drozer (Windows Installer)并下载;
- 解压zip文件,点击setup安装,一路默认安装就行;它会自动安装到C:drozer文件夹下;
- 检测是否安装成功:打开cmd窗口,键入C:drozerdrozer.bat , 如出现如下提示说明安装成功。
Drozer使用
- 安装agent.apk客户端到手机或模拟器
adb devices ###查看android设备
adb install agent.apk ###安装apk
- 安装完成后,在模拟器或手机上启动drozer Agent,点击右下角“OFF”按钮,开启drozer Agent。
- 建立session连接
adb forward tcp:31415 tcp:31415
drozer console connect 或 C:drozerdrozer.bat console connect
#### 查看drozer所有可用模块
list
ls
4. 获取apk信息
1)列出Android设备中安装的所有APK信息
run app.packege.list –f过滤信息
2)查看APK信息
run app.package.info –a apk名
3)查找APK存在的攻击面(activity、contentprovider、service)
run app.package.attacksurface apk名
- 绕过Activity鉴权
1)列出APP中的对外的Activity组件
run app.activity.info –a apk包名
2)构造intent信息绕过鉴权直接运行Activity,测试组件是否存在拒绝服务等漏洞
run app.activity.start --component apk包名 activityName
- 利用Content Provider攻击
1)查找暴露的Content Provider(数据泄露)
run app.provider.info –a apk包名
2)发现暴露的ContentProvider后,可以对数据库进行探测。探测出可以查询的URI
run scanner.provider.finduris –a apk包名
3)查看各个URI的数据(查询到数据说明存在漏洞)
run app.provider.query content://URI --vertical
4)对数据库表进行插入操作
run app.provider.insert URI对应数据表中的字段
5)对数据库表进行删除操作
run app.provider.delete URI --selection "条件"
#### SQL注入
6)查看URI对应的数据库表(报错说明存在SQL注入)
run app.provider.query content://URI --projection "'"
run app.provider.query content://URI --selection "'"
7)可以通过返回的错误信息展示出改Content准备执行的语句,获取数据库中的信息
run app.provider.query content://URI --projection "* From SQLITE_MASTER WHERE type='table';--"
run app.provider.query content://URI --selection "_id = ?"
- 利用broadcast(广播)
预防
- 进行权限控制,对此组件进行exported=“false”或者设置调用需要申请的权限
- SQLite设置
SQLiteStatementsqLiteStatement =db.compileStatement("insertinto chat(fromuid,touid,msg) values(?, ?, ?)");
sqLiteStatement.bindLong(1, 12);
sqLiteStatement.bindLong(2, 13);
sqLiteStatement.bindString(3,text);
long newRowId =sqLiteStatement.executeInsert();