移动应用程序渗透
移动应用程序渗透
Android系统架构与运行机制
应用层(System Apps)
用户接触的,应用软件方面的应用架构层(Application Framework, API)
系统开发的,API方面的
例如有以下的这些管理器:
活动管理
位置管理器
包管理器
通知管理器
资源管理器…系统运行库层(Native)
分为两部分,分别是C/C++程序库和Android运行时(Runtime)库硬件抽象层(HAL)
~位于操作系统内核与硬件电器之间的接口层,其目的在于将硬件抽象化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应用渗透测试与调试
工具使用
- Android Debug Bridge(ADB,要添加到系统环境变量)
1
2
3
4
5
6
7
8
9
10
11
12
13
14adb 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 - Apktool(Smali语言,打包,解包)
- Frida(可以把自己的脚本注入到应用程序的运行进程中)
- Jadx(一件反编译,反编译为Java代码;可以在GitHub上下载)
- Android Studio(如何写Xpose插件;logcat,找flag)
- Android Killer
文件格式
- Lib——程序依赖的native库
一般会有三类:
- arm
- arm-v7a
- x86
根据不同的虚拟机版本,下载Xpose框架(酷安;官网),注意不同的框架是使用不同的汇编等方式的
- META-INF目录——存放应用程序签名和证书的目录
- Res目录——存放应用程序的资源
- AndroidMainfest.xml——应用程序的配置文件
相当于书本的目录,上面有很多的信息 - Classes.dex——Dex可执行文件
- 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 | $ apktool d APK_PATH |
如何阅读smali代码
对比Java学习
smali类型
smali对象
smali
1 | # smali注释 |
图:smali代码阅读示例
应用完整性校验
1 | aoktool d APK_PATH |
注意res/文件夹
Android应用渗透测试——组件安全
判断组件的可导出性
- 根据AndroidMainfest.xml,判断以下组件是否可以导出
使用Drozer对四大组件进行组件攻击
工具:drozer
根据PPT中的代码进行实验测试。
https://blog.csdn.net/jianglianye21/article/details/80667346
Activity
1 | # 使用工具drozer,自动会进行DoS攻击 |
Service
1 | $ run app.service.info -a packagename |
Broadcast Reciever(广播接收器)
e.g. 电池电量低的提示
1 | $ run app.broadcast.info -a packagename |
Content Provider
可能存在目录遍历漏洞,SQL注入漏洞
1 | $ run app.provider.info -a packagename |
原理和4种拒绝服务攻击
intent本身可以在不同组件间调用[TODO]
- intent本地DoS攻击检测
getIntent()
Intent.getXXXExtra() - 4种拒绝服务攻击的类型
[TODO]
- NullPointerException异常导致的拒绝服务
- ClassCastException异常导致的拒绝服务
- ClassNotFoundException异常导致的拒绝服务
- IndexOutOfBoundsException异常导致的拒绝服务
扩展
扩:学习smali代码时,可以结合实例直接阅读学习,不建议从头开始学
扩:渗透测试的主要方向:
- 通过研读本地应用程序(黑/白盒测试)
- 通过网络抓包进行分析
扩:找到能导出的各个组件,一一确认其安全性
Android应用渗透测试——WebView
如何检测和判断[TODO ]
WebView 任意代码执行
漏洞点:addJavaScriptInterface()
WebView 密码明文存储
使用方法:Sqlite databases broswer,可以把密码明文可视化显示
WebView 域控制不严格
域校验不严格,跨过同源策略进行跨域访问
setAllowFileAccess
setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURL
Android应用渗透测试——敏感信息安全
CTF中可能比较重要的出题点
检查配置文件
CTF的重点检查内容
- 检查客户端程序存储在手机中的 SharedPreferences 配置文件
- 检查客户端程序存储在手机中的 SQLite 数据库文件
- 检查客户端程序存储在手机中的 SharedPreferences 配置文件,在检测 SQLite 数据库文件,在私有目录及其子目录下查找以.db 结尾的数据库文件。
通常是对本目录(data/data/packagename)下的文件内容 (一般是 xml)进行检查,看是否包含敏感信息。
检查客户端程序包(APK)中是否保存有敏感信息
- 证书文件
- 逻辑js文件
- 图片文件
- 其他文件(把文件存储到SD卡,或者不是同一个package下)
- logcat日志(AS上使用,并且安装Xinstaller)
Android应用渗透测试——进程安全
内存访问和修改
安装插件Memspector [TODO]
通过对客户端内存的访问,有可能会得到保存在内存中的敏感信 息(如登录密码,帐号等)。测试客户端内存中是否存在的敏感信息(卡号、明文密码等等)。
本地端口开放检测
e.g. socket的一些管理缺陷,查找端口,连接端口,获取验证码信息
外部动态加载DEX安全风险
风险位置:
public DexClassLoader(String dexPath,String optimizedDirectory, String libraryPath, ClassLoader parent)查看 AndroidManifest.xml 包 package 值相对应路径下的文件中是否含有DexClassLoader()函数调用
Android应用渗透测试——通信安全
抓包
- http协议
- https协议
- 校验不严格
- 双向校验
- 其他协议
应用程序可能会有设置,防止被抓包
http协议
比较常规的,Android设置代理,BP抓包
参考教程:链接
https
抓https包需要设置证书,Android7.0以上需要把证书安装在系统上,7.0以下..[TODO]
证书未校验
证书部分校验
https双向校验[TODO]
单向认证
双向认证
增加了服务端认证客户端的过程,添加第4步步骤
- 找到证书导入到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加密
定位关键代码
静态分析
重点是:定位关键字
关键字——搜索参数[key]
[key]:需要关注的参数
使用双引号, “&”, “=”等字符,辅助定位关键字——搜索接口
以接口作为关键字全局搜索 目录、接口、双引号辅助搜索关键字——搜索header
用header中各种标志性的字符做关键字 全局搜索
HOST、标志性的head字符
e.g. okhttp/3.8.0关键字——搜索加密算法
AES、RSA、DES、SM(国密,2020年刚开始实行)等常见加密算法做为关键字,用双引号、/等符号辅助,精确定位关键字——从日志中获取关键字
Logcat中获取现成的关键字,传输的信息可能加密,但日志信息(开发时方便调试所开启的)没有加密。Javascript加密
扩展-2
- 使用Xpose插件:Inspeckage,直接在Xpose软件里下载
Android应用渗透测试——业务安全
- 二维码不校验
- url跳转
- 任意文件读取
不具体展开,和Web业务安全同样的。
如何找客户端漏洞?
都在上述的知识点中
Android应用渗透测试——应用调试
调试Smali
[TODO]
调试native
找到native方法
找到.so文件
IDA Pro 打开
发现export处[TODO]
中文乱码设置:
alt + a,然后进行如下设置
使用IDA Pro进行分析
push android_x86_server 到 data/local/tmp
分析点
在输入的参数(比如用户名、密码)处下断点,通过查看运行时信息(终端显示的),分析其加密方式。不仅如此,证书校验等都可以使用这个动态调试的方法。
移动应用程序渗透测试框架使用
Xposed框架
安装及配置
[TODO]
Xposed运行原理[TODO]
- Dalvik虚拟机在执行java层代码时如何识别JNI方法?
- 类型标识(accessFlags)
- 过程
- 怎样才能将java层普通方法注册成JNI方法?
- Xposed框架做了什么?
如何写一个Xposed插件[TODO]
打开AS在项目app目录下新建lib目录并将XposedBridgeApi-54.jar放到lib目录下 右键Add As Library将 jar包添加进依赖。
打开app目录下的build.gradle 将
compile files(‘lib/XposedBridgeApi-54.jar’)
更改为
compileOnly files(‘lib/XposedBridgeApi-54.jar’)打开项目分支src/main目录下的AndroidManifest.xml 在application标签里面添加内容
新建Hook入口类HookMain 实 现 xposed的接的IXposedHookLoadPackage 并重写方法 handleLoadPackage ,这个写法格式是固定的。
在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