APP安全_Android渗透环境

Android渗透

移动APP大多通过WEB API服务的方式与服务端进行交互,这种模式把移动安全和web安全绑在一起。常见的web漏洞在移动APP中也存在,比如SQL注入,文件上传,中间件/server漏洞等,由于部分APP不是直接嵌入网页在APP中,而是使用api接口返回json数据,导致扫描器爬虫无法爬取链接。

配套装备

  • JDK
  • SDK
  • ADB
  • Genymotion模拟器(或真机)
  • Drozer

JDK

安装

  1. 点击下载地址进入Android开发工具下载页面,下载JDK相应版本;

  2. 解压并配置环境变量;

  3. 执行java和javac,查看JDK安装情况。

SDK

安装

  1. 点击下载地址进入Android开发工具下载页面,下载SDK Tools中的相应版本;
  2. 解压sdk包,再执行如下命令;

    进入sdk的tools目录

    cd /sdk存放路径/tools

    执行android

    ./android
  3. 执行./android命令后,会打开SDK Manager窗口,升级SDK(翻墙)。

ADB

原理

ADB:Android Debug Bridge(Android调试桥接器),用于管理真机和模拟器的工具。
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。

  1. adb client
    client是运行在PC端,每发起一个adb命令,就会开启一个client。
    当开启一个client时,先检测后台是否有server程序运行,如果没有,则会启动server进程。
    所有client都是通过5037端口与adb server进行通信。

  2. adb server
    server是运行在PC端的后台程序,负责管理adb client进程以及与adb daemon之间的通信。
    当server启动时,会自动绑定并监听5037端口,接收client通过该端口发送过来的命令。
    同时server还会对5555-5585间的奇数端口进行扫描,对已连接设备的定位。

  3. adb daemon(adbd)
    daemon是运行在真机/模拟器端的后台程序。
    使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这么一个后台进程,并且为其分配了两个连续的端口,比如:
    Emulator 1, console: 5554
    Emulator 1, adb: 5555
     也正因为每个设备都分一组两个端口,所以adb连接手机的最大数量为16。
     在这组端口中,其中偶数端口是用于server与设备进行交互的,可以让server直接从设备中读取数据,而奇数端口是用来与设备的adbd进行连接通信的。

安装

  1. 点击下载地址进入Android开发工具下载页面,下载SDK Platform-Tools中相应的版本;

  2. 解压,将解压后的platform-tools文件夹放到android sdk根目录下;

  3. 将adb所在目录添加到系统PATH中;

    编辑环境变量文件

    vim ~/.bash_profile

    added by adb

    export PATH="/SDK/android-sdk-macosx/platform-tools:$PATH"

    重启环境变量文件,设置才能生效

    source ~/.bash_profile

  4. 运行adb,查看安装情况。

常用命令集

查看当前连接的设备:adb devices
安装软件:adb install *.apk
覆盖安装:adb install -r *.apk
卸载软件:adb uninstall <PACKAGE_NAME>
登录设备shell:adb shell
从电脑上传送文件到手机:adb push
从手机传送文件到电脑上:adb pull

踩过的坑

  1. 查看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”】,也没折腾好。
解决方法四
用真机

  1. 安装APK报错
adb install *.apk
Failure[INSTALL_RAILED_NO_MATCHING_ABIS]

报错原因:由于安装的APP中使用了与当前模拟器CPU架构不一致的native libraries,所以导致报错。
解决办法:下载genymotion-arm-translation,直接将文件拖进模拟器安装再重启模拟器OK。

Genymotion模拟器

安装

  1. 点击下载地址,下载最新的安装包【注:需要注册genymotion账号】;
  2. 需要下载VirtualBox,自行百度下载;
  3. 打开Genymotion模拟器,输入账号及密码登录;
  4. setting->ADB,选择自己安装的SDK根目录;
  5. Add,选择需要下载Android虚拟设备,点击next下载即可。

Android渗透工具——Drozer

MacOS安装

  1. 下载源码
    git clone https://github.com/mwrlabs/drozer/
  2. 编译
cd drozer
python setup.py build
python setup.py install

注:执行最后一条命令时,提示fatal error: ‘yaml.h’ file not found #include <yaml.h>,说明没有安装pyyaml,使用pip install pyyaml。

  1. 执行drozer,查看安装结果
  2. 下载agent.apk

Windows安装

  1. 点击下载地址,windows环境选择drozer (Windows Installer)并下载;
  2. 解压zip文件,点击setup安装,一路默认安装就行;它会自动安装到C:drozer文件夹下;
  3. 检测是否安装成功:打开cmd窗口,键入C:drozerdrozer.bat , 如出现如下提示说明安装成功。

Drozer使用

  1. 安装agent.apk客户端到手机或模拟器
adb devices    ###查看android设备
adb install agent.apk    ###安装apk
  1. 安装完成后,在模拟器或手机上启动drozer Agent,点击右下角“OFF”按钮,开启drozer Agent。
  2. 建立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名
  1. 绕过Activity鉴权
1)列出APP中的对外的Activity组件
   run app.activity.info –a apk包名

2)构造intent信息绕过鉴权直接运行Activity,测试组件是否存在拒绝服务等漏洞
   run app.activity.start --component apk包名 activityName
  1. 利用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 = ?"
  1. 利用broadcast(广播)

预防

  1. 进行权限控制,对此组件进行exported=“false”或者设置调用需要申请的权限
  2. 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();
原文地址:https://www.cnblogs.com/yoyoyang/p/11815338.html