移动应用渗透测试
不需要会开发应用,知道有哪些问题能测出来就行。
开发方式:
- 原生UI
- 原生UI + Web
- Web
开发语言:
- IOS:Objective-C、Swift
- Android:Java、Koltin
- Other:JavaScriot
常见测试思路
当作 Web 测试:
- SQL Injection
- Direct object reference
- Improper authorization/authentication
- insecure uploads
- ......
在文件系统中寻找登录凭证,就算加密有可能加密方式还在写在代码里。
不安全的链接,没有使用 HTTPS。
使用 strings 命令对二进制程序搜 secret、key、token、S3 bucket url 等关键字
找测试、隐藏接口
找找 AppData 应用缓存,搞不好有敏感数据。
得到源码后找找不安全的加密算法,例如 MD5、SHA-1
检查截图功能,比如一些敏感数据可以被截图,部分 App 不应该存在。
目录
Android
APK 结构
待完善,需要查 Android 官方文档
安卓应用是由 .apk 后缀文件作为安装包,可以当作压缩包解压:
app.apk
├─ AndroidManifest.xml
├─ META-INF
├─ androidsupportmultidexversion.txt
├─ assets
├─ baseInfo.dat
├─ builddef.lst
├─ classes.dex
├─ classes2.dex
├─ classes3.dex
├─ classes4.dex
├─ kotlin
├─ lib
├─ org
├─ res
└─ resources.arsc
里面 .dex 文件是 Java/Koltin 编译后的字节码文件,由 Dalvik 虚拟机执行。
AndroidManifest.xml 是应用程序主要配置文件。
res 和 assets 是存放资源文件。
lib 存放动态链接库。
res/values/strings.xml
使用工具批量进行收集:
- https://github.com/TheKingOfDuck/ApkAnalyser
- https://github.com/dwisiswant0/apkleaks
- https://github.com/charles2gan/GDA-android-reversing-Tool
测试工具
- Apktool,长期更新的 Android 逆向工具
- JEB,商业逆向工具
- dex2jar,.dex 转 jar
d2j-dex2jar.bat -f app.apk
- jd-gui,.class、.jar 反编译为源码保存到文件中用 IDEA 阅读。
jadx,相比 jd-gui 界面更美观。 - Frida,有很多脚本可以用来 hook。
- Android Studio,Android 开发环境包含模拟器
- 模拟器:Genymotion、夜神安卓模拟器、网易mumu、逍遥模拟器
- adb,Android 调试工具,可以用来传文件或是输出日志
adb logcat
,相关教程。
文件系统
应用数据目录在哪儿?
/data/data/<package-name>/shared_prefs/key.xml
动态调试
Android 投屏软件 https://github.com/barry-ran/QtScrcpy
iOS 好像爱思助手就可以。
分析 HTTP 请求
见 App 抓 HTTP 请求常见解决方案 - raingray Blog。
HOOK
见
Activity 组件导出⚒️
切换到 root
adb shell
su
找到 AndroidManifest.xml 搜索 activity 配置。其中 android:name 属性值就是名称。
<activity android:name="om.xxx.login.LoginActivity"
访问 Activity 组件。
am start -n 包名/Activity组件名
直接进入可能会有信息泄露,未授权等缺陷。
还没写什么条件下导出才有危害,测试条件是什么。
静态分析
反编译
apk 手动解压后直接查看 AndroidManifest.xml 是乱码,可以通过 java -jar apktool.jar d app.apk -o destFolder
解压 apk 到指定目录(不存在会自动创建)顺带反编译字节码为 smail 汇编和解码此配置文件。
.dex 可以用 dex2jar 将 dex 反汇编得到 jar:
// For Linux, Mac OSX, Cygwin
sh d2j-dex2jar.sh /home/panxiaobo/someApk.apk
// For Windows
d2j-dex2jar.bat someApk.apk
用 jd-gui 或 jadx 查看或者手动解压 jar 包查看 class 字节码文件
最简单的方式直接用 jadx 和 GDA 这种 GUI 工具打开 .apk,这样直接浏览反汇编后的 java 代码,缺点是不能全部解码 .xml 配置文件。
反混淆与加壳
管于 Android 壳的介绍:
- https://blog.csdn.net/weixin_43900244/article/details/121765370
- https://blog.csdn.net/Qiled/article/details/110453098
ProGuard 做代码混淆。
Frida 脱壳工具:
Xposed 脱壳工具:
- FDex2
- 反射大师
虚拟化脱壳工具:
查壳工具:
常见安全问题
- Cross-App Scripting
- Intent Redirection
- Intent Broadcasting
- Unprotected Activities
- Custom Permission Typos
- Path Traversal,例如 Zip Path Traversal
- Embedded Secrects,取决于你拿到密钥能够造成什么危害,如果啥也干不了就不是安全问题
- OAuth Implicit Grants
敏感信息泄露
多关注 .db、.sqlite 可能存储敏感数据。
使用 http://sqlitebrowser.org/ 打开,或者 Linux 安装 sqlite3 命令:
sqlite3 FileName.sqli
.tables # 查询当前数据库所有表名
SELECT * FROM TableName # 查询表里的数据
逆向 Android APP 后还有个 smali 文件夹,可以写个脚本递归找 .smail 文件,取里面的 URL 链接。这里有个现成工具 TheKingOfDuck 可用。
提取 smali 下 .small 文件中 URL。
apktool d app.apk; cd app;mkdir collection; find . -name \*.smali -exec sh -c 'cp "$1" collection/$(head /dev/urandom | md5 | cut -d" " -f1).smali' _ {} \;; linkfinder.py -i 'collection/*.smali' -o cli
或是用正则。
textgrep -hnrE "\.json" /Users/Gerben/smali/
在 apktool d app.apk
解码 APP 文件内容后,grep 直接筛文件内容关键字获取敏感信息。
grep -EHirn "accesskey|admin|aes|api_key|apikey|checkClientTrusted|crypt|http:|https:|password|pinning|secret|SHA256|SharedPreferences|superuser|token|X509TrustManager|insert into|setJavaScriptEnabled|root|JavascriptInterface|MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE|Pinner|checkServerTrusted|api_secret|api/v1|api/v2" --color APKfolder/
查看 App 日志
获取包名
参考 https://www.raingray.com/archives/4228.html#objection。或者根据应用名称猜测
./adb shell pm list packages -3
查询 第三方包名获取进程 ID
3024 就是 PID
PS D:\gbb\tools\adb> ./adb shell "ps | grep cn.com.chinabond.cloudapp" u0_a285 3024 2034 41903856 377800 0 0 R cn.com.chinabond.cloudapp
获取日志
PS D:\gbb\tools\adb> ./adb shell haydn:/ $ logcat | grep '3024 '
参考文档:
- https://developer.android.google.cn/studio/command-line/logcat,logcat 命令介绍
- https://developer.android.google.cn/studio/debug/am-logcat,日志格式介绍
待看文章(待删除)
https://book.hacktricks.xyz/mobile-apps-pentesting/android-checklist
https://www.youtube.com/playlist?list=PLhEvofbdZibepMtBr6rH7YkuM8mhTmHpE
Checklist
靶子
https://github.com/B3nac/InjuredAndroid
https://www.hacker101.com/sessions/android/hacking_workshop_b3nac
IOS
常见分析思路也是和 Android 一致,解压 .ipa 包二进制分析,或者当作 Web 测试。
App 运行在 arm 上。
目录结构:
Payload
└─ ccdcrs.app
├─ Info.plist
Payload 下 XXX.app 是应用包名叫 bundle dir,安装应用时复制到手机上,XXX 由开发者自定义,目录里面同名文件就是主程序。
_CodeSignature 目录 CodeResources 文件存放着签名,防止运行时应用被篡改。
Info.plist 包含 Meta 数据 通常以二进制、JSON、XML 方式存储,mac 上用 xcode/plutil 打开,Windows 使用 PlistEDPlus。
常见 key 值:
- MinimumOSVersion,应用最低在什么版本的系统上运行。
- CFBundleURLSchemes,URL Schema 内的值都可以通过
Schema://
在 Safari 地址栏输入调用应用。
使用 rabin2 工具对主程序查看权限,分析加密。
rabin2 -x xxx.ipa
查加载了哪些库。
rabin2 -l xxx.ipa
AppStore 上下载的应用拿到安装包以后是加密状态。
文件系统
应用安装目录:
- /var/containers/Bundle/Application/[UUID]
数据存放目录:
/var/mobile/Containers/Data/Application/[UUID]
- Document/,存放用户生成的数据
- Library/,应用生成的数据
- Library/Caches/,缓存数据
- tmp/,临时存放数据的目录,可能会被清空。
UUID 不确定的情况下,grep -ri APPNAME /var/mobile/Containers/Data/Application/*
通过 IPA 包名能确认。
需要越狱查看具体文件:https://www.whiteoaksecurity.com/blog/2019-3-19-apple-ios-13-device-setup-for-penetration-testing/
数据都被 Apple 数据保护的 API 给加密了,使用的好像是用户密码。
待看文章(待删除)
https://cobalt.io/blog/ios-pentesting-101,从介绍到实操文章架构很好
靶子
常见安全问题
https://www.gitbook.com/book/wizardforcel/ios-sec-wiki
https://book.hacktricks.xyz/mobile-apps-pentesting/ios-pentesting
https://book.hacktricks.xyz/mobile-apps-pentesting/ios-pentesting-checklist
Custom URL Schemas
https://www.t00ls.cc/viewthread.php?tid=48898&highlight=IOS
Info.plist 搜索关键字 "URLSchemes"
IOS App URL Schema 跳转缺陷案例
当时这个 App 存在活动页面,抓包打开访问
http://x.x.example.cn/YXMB/v3/api/autologin?nettype=5&backUrl=https%3A%2F%2Fx.x.example.cn%2FYXMB%2Fv3%2Foss%2Ftemplate%2Fqiandao%2Findex.html%3Fproid%3De149e9c89fac4e25
点击签到,页面会自动启动 cn.xx.app://url=https://x.x.example.cn/YXMB/v3/oss/template/qiandao/index.html?proid=e149e9c89fac4e25&checked=true&islogin=false
。
在 Safari 打开 cn.xx.app://url=https://baidu.com
自动跳转至 https://baidu.com
硬编码
使用 strings 命令搜索关键字:crypt、username、api、http://、http:// 等等
strings APP | grep "<?xml"
strings APP | grep crpy
mPaaS 平台
采用阿里 mPaaS 开发,如何识别其特征?
1.相关请求头。
2.数据都走的 mgw.htm 网关
你会发现 Payload 都是乱码是 gzip 压缩了,一般会网关开启加密,在不是加密的情况如果还是乱码,你仔细看请求头 Content-Type: application/json 是 json,而 Content-Encoding: gzip 数据做编码,测试的话就将流量转发到 Flask 代理服务器批量 decode 成明文,之后再由代理服务器再转给 BurpSuite 测试即可。这是最麻烦的。
而 BurpSuite 自带 Gzip 解压,完美解决。
就算得到明文,那么网关开启签名验证 Header 中带有 Sign 也没办法改包,这会是绕过加密后遇到的第二道关卡。
当《App 抓 HTTP 请求常见解决方案》无法解决抓包,可以尝试以下 mPaaS 抓包方法:
- https://github.com/stone2417/MpaasPentestTool,MpassPentestTool 项目。
- https://github.com/r0ysue/r0capture,可以保存为 pacp 分析请求,已经 Android Read MI K40 Pro 真机测试过,好用。
- https://github.com/ehids/ecapture
- 授权渗透测试Mpaas安卓应用,遇到无法抓包和加密问题,怎么解决?
3.离线包
当你第一次点开某个功能,App 自动下载后缀为 .arm 的离线包。
就是压缩文件,改为 .zip 即可解压。里面包含这个模块前端页面,你可以根据此文件审计 JS 等等内容。
另一种是通过 App 加载的静态资源来确认,如:
http://HOST:PORT/mcube/8A4C9BB180952-default/20220530/0.0.0.364_all/nebula/fallback/img/bg-implied-card-right.bf146d42.png
可以猜测 img 同级目录下会有首页。
https://HOST:PORT/mcube/8A4C9BB180952-default/20220530/0.0.0.364_all/nebula/fallback/index.html#/home
在实际测试中不加 index.html 是不会自动寻找首页的。
怎么才能直接下载离线包?
根据 App 入口 loadOfflineNebula
方法确认是配置离线包。
public static final void k(){
MPNebulaOfflineInfo[] mPNebulaOffl;
mPNebulaOffl = new MPNebulaOfflineInfo[1];
mPNebulaOffl[0] = new MPNebulaOfflineInfo("20220530_0.0.0.222.amr", "20220530", "0.0.0.222");
MPNebula.loadOfflineNebula("h5_json.json", mPNebulaOffl);
}
这三个参数分别是 offLineFileName、appId、version。
将获取到的静态资源路径。
http://HOST:PORT/mcube/8A4C9BB180952-default/20220530/0.0.0.364_all/nebula/fallback/
version 替换成配置中的 version,后面加上文件名即可下载离线包。
https://HOST:PORT/mcube/8A4C9BB180952-default/20220530/0.0.0.222_all/nebula/20220530_0.0.0.222.amr
https://HOST:PORT/mcube/8A4C9BB180952-default/20220530/0.0.0.364_all/nebula/20220530_0.0.0.364.amr
参考资料
最近更新:
发布时间: