第七章 物联网渗透测试之移动应用
0x01 安卓应用程序分析
1. Android apk安装包分析
1.1 Android
Android是一个开源的,基于Linux的移动设备操作系统,如智能手机和平板电脑。它是由谷歌及其他一些公司带领的开放手机联盟发行和开发的。
1.2 Android应用组件
Android开发四大组件分别是:
- 活动(Activity)最基础
- 服务(Service)后台
- 广播接收器(BroadcastReceiver)
- 内容提供者(Content Provider)不同APP之间数据传递共享
1.3 Android安装包
一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个可被系统所能识别的文件
Android设备可以识别的安装包是.APK(Android application package)格式,可用于分发和安装移动应用及中间件。
一个APK安装包内包含:
被编译的源代码文件
文件资源
原生资源文件
证书(签名)
清单文件
2. 静态反编译工具的使用
2.1 工具介绍
高级语言源程序经过编译变成可执行文件,反编译就是逆过程
Apktool
反编译资源和dex文件,并可以将反编译后的项目重新打包成apk
github开源下载
apksigner
apk签名/验证 工具
dex2jar
将dex转化为.jar
github开源下载
jd-gui
查看.jar源码
jadx
一款功能强大的快速安卓反编译工具
3. smali语法简介
Dalvik VM是在Android系统上运行Android程序的虚拟机,其指令集是基于寄存器架构的,执行特有的文件格式(dex字节码)来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。
Smali是用于Dalivk的反汇编程序的实现。Smali支持注解,调试信息,行数信息等基本Java的基本特征,很接近Java编译在JVM上的中间语言。
从Dalvik VM和JVM的编译过程分析,他们的编译过程如下:
JVM:.java -> .class -> .jar
Dalvik VM:.java -> .class -> .dex
3.1 smali的数据类型
3.2 smali函数定义
函数的定义一般为:
1 | 函数名(参数类型1 参数类型2...)返回值类型 |
基本数据类型的参数与参数之间没有任何分隔符,对象数据类型使用;
结束
3.3 smali的寄存器
说明 | ||
---|---|---|
v0 | 第一个本地寄存器 | |
v1 | 第二个本地寄存器 | |
v2 | p0 | 第一个参数寄存器 |
v3 | p1 | 第二个参数寄存器 |
3.4 smali代码举例
0x02 ios应用程序分析
IPA脱壳
从APPStore商店下载安装的APP默认都被苹果加了一层壳,加了壳后我们就无法正常查看程序的运行逻辑了
需要工具:
- 越狱的IOS设备
- Clutch:https://github.com/KJCracks/Clutch/releases
通过ssh远程连接
显示当前应用:Clutch -l
选择指定应用进行脱壳:Clutch -d packageName
将脱壳后的安装包导出
MobSF
MobSF是Mobile Security Framework的缩写,是一个移动端应用安全问题检出的框架和工具,支持Linux/Windows/Mac,能够执行动态和静态的恶意软件的分析和检测,支持Android和ios移动应用。
GitHub仓库地址:https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
0x03 Android动态调试分析工具使用
1. adb调试命令
1.1 ADB
Android调试桥(adb)是一种功能多样的命令行工具,可以让你与设备进行通信。adb命令可用于执行各种设备操作(例如安装和调试应用),并针对Unix shell(可用来在设备上运行各种命令)的访问权限。
它是一种客户端-服务器程序,包含以下三个组件:
- 客户端:用于发送命令。客户端在开发计算机上运行,你可以通过发出adb命令从命令行终端调用客户端。
- 守护程序(adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
- 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。
在设备上启用 adb 调试:
要在通过 USB 连接的设备上使用 adb,必须在设备的系统设置中启用 USB 调试(位于开发者选项下)。
在搭载Android4.2及更高版本的设备上,”开发者选项” 屏幕默认情况下处于隐藏状态。如需将其显示出来,请依次转到 设置 > 关于手机,然后点按版本号7次,返回上一屏幕,在底部可以找到开发者选项。具体请依照不同设备实际为准。
1.2 ADB常用命令
查看设备列表
1 | adb devices |
远程连接
1 | adb connect ip:port |
进入交互式shell模式
1 | adb shell |
查看进程pid号
1 | adb shell "ps | grep 包名" |
查看logcat日志
1 | adb logcat |
移动文件
1 | adb push/push |
安装/卸载 应用
1 | adb install/uninstall |
SHELL查看当前活动的Activity
1 | dumpsys activity top | grep ACTIVITY |
SHELL启动指定Activity/Service
1 | am start/startservice -n 包名/完整类名[-d data] |
端口转发
1 | adb forward tcp:1234 tcp:1234 |
查看系统配置
1 | adb shell getprop |
2. 调试环境搭建
设置为允许调试
- 修改Manifest.xml文件的Application属性
- 将设备属性ro.debuggable设置为1
app配置修改为允许调试:
反编译安装包AndroidManifest.xml,在application内修改或添加 android:debuggable=”true”,并重打包签名。
系统修改为允许所有应用调试:
使用mprop工具来修改
1 | adb push mprop /data/local/tmp/ |
3. Smalidea动态调试
3.1 使用smalidea插件
smalidea是一个Intellij IDEA/Android Studio smali语法插件,可实现动态调试smali代码。支持14.1或以上版本的IDEA。
下载地址:https://github.com/JesusFreke/smali/wiki/smalidea
0x04 安卓/ios应用 网络接口分析
1. Https
1.1 https协议流程
1.2 中间人攻击
2. 设备证书安装
安装Burp suit的证书