1. 1. 移动应用程序渗透
    1. 1.1. Android系统架构与运行机制
    2. 1.2. Android运行机制
  2. 2. Android应用渗透测试与调试
    1. 2.0.1. 工具使用
    2. 2.0.2. 文件格式
  3. 2.1. Android应用渗透测试——客户端数据安全
    1. 2.1.1. 安装包签名校验
      1. 2.1.1.1. 如何校验
    2. 2.1.2. 客户端程序保护
      1. 2.1.2.1. 反编译为Java代码
      2. 2.1.2.2. 反编译为smali代码
      3. 2.1.2.3. 如何阅读smali代码
      4. 2.1.2.4. 应用完整性校验
  4. 2.2. Android应用渗透测试——组件安全
    1. 2.2.1. 判断组件的可导出性
    2. 2.2.2. 使用Drozer对四大组件进行组件攻击
      1. 2.2.2.1. 工具:drozer
      2. 2.2.2.2. Activity
      3. 2.2.2.3. Service
      4. 2.2.2.4. Broadcast Reciever(广播接收器)
      5. 2.2.2.5. Content Provider
      6. 2.2.2.6. 原理和4种拒绝服务攻击
      7. 2.2.2.7. 扩展
  5. 2.3. Android应用渗透测试——WebView
    1. 2.3.1. WebView 任意代码执行
    2. 2.3.2. WebView 密码明文存储
    3. 2.3.3. WebView 域控制不严格
  6. 2.4. Android应用渗透测试——敏感信息安全
    1. 2.4.1. 检查配置文件
    2. 2.4.2. 检查客户端程序包(APK)中是否保存有敏感信息
  7. 2.5. Android应用渗透测试——进程安全
    1. 2.5.1. 内存访问和修改
    2. 2.5.2. 本地端口开放检测
    3. 2.5.3. 外部动态加载DEX安全风险
  8. 2.6. Android应用渗透测试——通信安全
    1. 2.6.1. 抓包
    2. 2.6.2. http协议
    3. 2.6.3. https
      1. 2.6.3.1. 证书未校验
      2. 2.6.3.2. 证书部分校验
      3. 2.6.3.3. https双向校验[TODO]
      4. 2.6.3.4. 扩展-1
    4. 2.6.4. 移动应用数据包常见加密形式
      1. 2.6.4.1. 明文数据包
      2. 2.6.4.2. 参数值加密
      3. 2.6.4.3. POST BODY加密
      4. 2.6.4.4. 参数序列化
      5. 2.6.4.5. Response加密
    5. 2.6.5. 定位关键代码
      1. 2.6.5.1. 静态分析
      2. 2.6.5.2. 扩展-2
  9. 2.7. Android应用渗透测试——业务安全
  10. 2.8. 如何找客户端漏洞?
  11. 2.9. Android应用渗透测试——应用调试
    1. 2.9.1. 调试Smali
    2. 2.9.2. 调试native
    3. 2.9.3. 分析点
  12. 2.10. 移动应用程序渗透测试框架使用
    1. 2.10.1. Xposed框架
      1. 2.10.1.1. 安装及配置
      2. 2.10.1.2. Xposed运行原理[TODO]
      3. 2.10.1.3. 如何写一个Xposed插件[TODO]
    2. 2.10.2. Frida框架[TODO]
      1. 2.10.2.1. Frida实验1——破解登入密码
      2. 2.10.2.2. Frida实验2——解密
      3. 2.10.2.3. 扩展-1

移动应用程序渗透

移动应用程序渗透

Android系统架构与运行机制

  1. 应用层(System Apps)
    用户接触的,应用软件方面的

  2. 应用架构层(Application Framework, API)
    系统开发的,API方面的
    例如有以下的这些管理器:
    活动管理
    位置管理器
    包管理器
    通知管理器
    资源管理器…

  3. 系统运行库层(Native)
    分为两部分,分别是C/C++程序库和Android运行时(Runtime)库

  4. 硬件抽象层(HAL)
    ~位于操作系统内核与硬件电器之间的接口层,其目的在于将硬件抽象化

  5. Linux内核层(Linux Kernel)

Android运行机制

1.简化版:init启动 —— Zygnote进程启动—— Systemserver进程启动

2.Init启动
总:电源键——系统启动——bootlooder——Linux内核——init进程启动

  • 在启动init进程中,会进入system/core/init/init.cpp文件的main方法中
  • 创建和挂载目录
  • 初始化和启动属性服务(键对值)
    Linux内核——盘古,开天地,产生女娲(Zygote)

3.Zygote进程启动(被称为孵化器,一切的开始)
总:app_main——AndroidRuntime——Zygoteinit

  • socket
  • 加载了一些类
  • 启动systemserver类
    Zygote——女娲,造出亚当(SystemServer)

4.SystemServer进程启动

  • frameworks/base/core/java/com/android/intermal/os/Zygote,.java
  • frameworks/base/core/java/com/android/intermal/os/RuntimeInit.java
  • frameworks/base/core/java/com/android/server/SystemServer.java 这个是各种进程的父类
    SystemServer——亚当,用肋骨造夏娃(其他进程)

Android应用渗透测试与调试

工具使用

  1. Android Debug Bridge(ADB,要添加到系统环境变量)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    adb kille-server
    adb start-server
    adb root
    # push 把文件从电脑推送到Android上
    adb push
    # pull 把文件从Android下载到电脑上
    adb pull
    adb connect
    adb shell
    adb install -t
    # 查看日志
    adb logcat
    # 应用截屏
    adb exec-out screencap -p > sc.png
  2. Apktool(Smali语言,打包,解包)
  3. Frida(可以把自己的脚本注入到应用程序的运行进程中)
  4. Jadx(一件反编译,反编译为Java代码;可以在GitHub上下载)
  5. Android Studio(如何写Xpose插件;logcat,找flag)
  6. Android Killer

文件格式

  1. Lib——程序依赖的native库
    一般会有三类:
  • arm
  • arm-v7a
  • x86
    根据不同的虚拟机版本,下载Xpose框架(酷安;官网),注意不同的框架是使用不同的汇编等方式的
  1. META-INF目录——存放应用程序签名和证书的目录
  2. Res目录——存放应用程序的资源
  3. AndroidMainfest.xml——应用程序的配置文件
    相当于书本的目录,上面有很多的信息
  4. Classes.dex——Dex可执行文件
  5. Resource.arsc——资源配置文件

Android应用渗透测试——客户端数据安全

安装包签名校验

如何校验

1
$ jarsigner -verify APK_PATH

主要提供完整性integrity的保护

1
$ jarsigner -verify -verbose -certs APK_PATH

使用Google提供的开发者签名进行重签名。
要读懂Java代码,Smali代码。

客户端程序保护

反编译为Java代码

使用jadx,Androidkiller(综合使用前两者,但不能同时打开同一个文件),jeb等工具进行反编译

反编译为smali代码

1
2
$ apktool d APK_PATH
$ apktool b Uncompressed_APK_PATH

如何阅读smali代码

对比Java学习

smali类型

smali对象

smali

1
2
3
4
5
6
# smali注释
.method 表示方法开始
.local 1 表示locals的寄存器数量
.line 8 表示对于的Java代码行数
invoke-XXX 表示各种方法
invoke-super(p0,p1) p0,p1表示寄存器


图:smali代码阅读示例

应用完整性校验

1
aoktool d APK_PATH

注意res/文件夹

Android应用渗透测试——组件安全

判断组件的可导出性

  1. 根据AndroidMainfest.xml,判断以下组件是否可以导出

使用Drozer对四大组件进行组件攻击

工具:drozer

根据PPT中的代码进行实验测试。
https://blog.csdn.net/jianglianye21/article/details/80667346

Activity

1
2
# 使用工具drozer,自动会进行DoS攻击
$ run app.activity.info -a packagename

Service

1
$ run app.service.info -a packagename

Broadcast Reciever(广播接收器)

e.g. 电池电量低的提示

1
$ run app.broadcast.info -a packagename

Content Provider

可能存在目录遍历漏洞,SQL注入漏洞

1
2
3
4
5
$ run app.provider.info -a packagename
# 检测SQL注入(SQLite)
$ run scanner.provider.injection -a com.mwr.example.sieve
# 检测目录遍历
$ run scanner.provider.traversal -a com.mwr.example.sieve

原理和4种拒绝服务攻击

intent本身可以在不同组件间调用[TODO]

  1. intent本地DoS攻击检测
    getIntent()
    Intent.getXXXExtra()
  2. 4种拒绝服务攻击的类型

[TODO]

  • NullPointerException异常导致的拒绝服务
  • ClassCastException异常导致的拒绝服务
  • ClassNotFoundException异常导致的拒绝服务
  • IndexOutOfBoundsException异常导致的拒绝服务

扩展

扩:学习smali代码时,可以结合实例直接阅读学习,不建议从头开始学

扩:渗透测试的主要方向:

  1. 通过研读本地应用程序(黑/白盒测试)
  2. 通过网络抓包进行分析

扩:找到能导出的各个组件,一一确认其安全性

Android应用渗透测试——WebView

如何检测和判断[TODO ]

WebView 任意代码执行

漏洞点:addJavaScriptInterface()

WebView 密码明文存储


使用方法:Sqlite databases broswer,可以把密码明文可视化显示

WebView 域控制不严格

域校验不严格,跨过同源策略进行跨域访问
setAllowFileAccess
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURL

Android应用渗透测试——敏感信息安全

CTF中可能比较重要的出题点

检查配置文件

CTF的重点检查内容

  1. 检查客户端程序存储在手机中的 SharedPreferences 配置文件
  2. 检查客户端程序存储在手机中的 SQLite 数据库文件
  3. 检查客户端程序存储在手机中的 SharedPreferences 配置文件,在检测 SQLite 数据库文件,在私有目录及其子目录下查找以.db 结尾的数据库文件。
    通常是对本目录(data/data/packagename)下的文件内容 (一般是 xml)进行检查,看是否包含敏感信息。

检查客户端程序包(APK)中是否保存有敏感信息

  1. 证书文件
  2. 逻辑js文件
  3. 图片文件
  4. 其他文件(把文件存储到SD卡,或者不是同一个package下)
  5. logcat日志(AS上使用,并且安装Xinstaller)

Android应用渗透测试——进程安全

内存访问和修改

安装插件Memspector [TODO]

通过对客户端内存的访问,有可能会得到保存在内存中的敏感信 息(如登录密码,帐号等)。测试客户端内存中是否存在的敏感信息(卡号、明文密码等等)。

本地端口开放检测

e.g. socket的一些管理缺陷,查找端口,连接端口,获取验证码信息

外部动态加载DEX安全风险

  1. 风险位置:
    public DexClassLoader(String dexPath,String optimizedDirectory, String libraryPath, ClassLoader parent)

  2. 查看 AndroidManifest.xml 包 package 值相对应路径下的文件中是否含有DexClassLoader()函数调用

Android应用渗透测试——通信安全

抓包

  1. http协议
  2. https协议
  3. 校验不严格
  4. 双向校验
  5. 其他协议

应用程序可能会有设置,防止被抓包

http协议

比较常规的,Android设置代理,BP抓包

参考教程:链接

https

抓https包需要设置证书,Android7.0以上需要把证书安装在系统上,7.0以下..[TODO]

证书未校验

证书部分校验

https双向校验[TODO]

  1. 单向认证

  2. 双向认证
    增加了服务端认证客户端的过程,添加第4步

  3. 步骤

  • 找到证书导入到burp
  • 寻找包里的证书库文件(敏感信息泄漏)
  • 尝试证书转换

  • 找到证书库文件
  • 找到证书库密码
  • 把密码导入(尝试证书转换)

扩展-1

扩:漏洞,不是攻击点,通常都是攻击链
扩:使用Everything工具,添加到右键,方便搜索文件(Windows)
扩:证书管理工具Portecle
扩:使用所有手段都没有抓到包,该怎么办?[TODO,老师私货,重要]
使用aptables进行流量转发

1
iptables -t nat -A OUTPUT -p tcp -dport 目标端口 -j DANT --to burpip和端口

移动应用数据包常见加密形式

明文数据包

e.g. 参数 info整个不加密

参数值加密

e.g. 参数 info后面的值加密

POST BODY加密

e.g. post的所有数据都加密

参数序列化

Response加密

定位关键代码

静态分析

重点是:定位关键字

  1. 关键字——搜索参数[key]
    [key]:需要关注的参数
    使用双引号, “&”, “=”等字符,辅助定位

  2. 关键字——搜索接口
    以接口作为关键字全局搜索 目录、接口、双引号辅助搜索

  3. 关键字——搜索header
    用header中各种标志性的字符做关键字 全局搜索
    HOST、标志性的head字符
    e.g. okhttp/3.8.0

  4. 关键字——搜索加密算法
    AES、RSA、DES、SM(国密,2020年刚开始实行)等常见加密算法做为关键字,用双引号、/等符号辅助,精确定位

  5. 关键字——从日志中获取关键字
    Logcat中获取现成的关键字,传输的信息可能加密,但日志信息(开发时方便调试所开启的)没有加密。

  6. Javascript加密

扩展-2

  1. 使用Xpose插件:Inspeckage,直接在Xpose软件里下载

Android应用渗透测试——业务安全

  1. 二维码不校验
  2. url跳转
  3. 任意文件读取

不具体展开,和Web业务安全同样的。

如何找客户端漏洞?

都在上述的知识点中

Android应用渗透测试——应用调试

调试Smali

[TODO]

调试native

  1. 找到native方法

  2. 找到.so文件

  3. IDA Pro 打开
    发现export处[TODO]

中文乱码设置:
alt + a,然后进行如下设置

  1. 使用IDA Pro进行分析

  2. push android_x86_server 到 data/local/tmp

分析点

在输入的参数(比如用户名、密码)处下断点,通过查看运行时信息(终端显示的),分析其加密方式。不仅如此,证书校验等都可以使用这个动态调试的方法。

移动应用程序渗透测试框架使用

Xposed框架

安装及配置

[TODO]

Xposed运行原理[TODO]

  1. Dalvik虚拟机在执行java层代码时如何识别JNI方法?
  • 类型标识(accessFlags)
  • 过程
  1. 怎样才能将java层普通方法注册成JNI方法?
  2. Xposed框架做了什么?

如何写一个Xposed插件[TODO]

  1. 打开AS在项目app目录下新建lib目录并将XposedBridgeApi-54.jar放到lib目录下 右键Add As Library将 jar包添加进依赖。

  2. 打开app目录下的build.gradle 将
    compile files(‘lib/XposedBridgeApi-54.jar’)
    更改为
    compileOnly files(‘lib/XposedBridgeApi-54.jar’)

  3. 打开项目分支src/main目录下的AndroidManifest.xml 在application标签里面添加内容

  4. 新建Hook入口类HookMain 实 现 xposed的接的IXposedHookLoadPackage 并重写方法 handleLoadPackage ,这个写法格式是固定的。

  5. 在src/main/assets下新建文件xposed_init并将HookMain类并将hook的主入口类以包名+类名的格式写进去。
    com.example.myapplication.HookMain

Frida框架[TODO]

Frida是一个动态代码执行工具包。
通过Frida你可以把一段JavaScript注入到一个进程中去,或者把一个动态库加载到另一个进程中去,并且 Frida 是跨平台的,也就是说,你可以对Windows, macOS, GNU/Linux, iOS, Android以及QNX系统上的进程进行上述操作。

Frida实验1——破解登入密码

Frida实验2——解密

扩展-1

注意:安装Frida时,一定要安装Frida tools