不需要会开发应用,知道有哪些问题能测出来就行。

开发方式:

  • 原生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

使用工具批量进行收集:

测试工具

文件系统

应用数据目录在哪儿?

/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 壳的介绍:

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/

https://twitter.com/AmitMDubey/status/1272982285277491200

查看 App 日志

  1. 获取包名

    参考 https://www.raingray.com/archives/4228.html#objection。或者根据应用名称猜测 ./adb shell pm list packages -3 查询 第三方包名

  2. 获取进程 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
  3. 获取日志

    PS D:\gbb\tools\adb> ./adb shell
    haydn:/ $ logcat | grep '3024 '

参考文档:

待看文章(待删除)

https://blog.oversecured.com/

https://book.hacktricks.xyz/mobile-apps-pentesting/android-checklist

https://www.youtube.com/playlist?list=PLhEvofbdZibepMtBr6rH7YkuM8mhTmHpE

Checklist

靶子

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

infi.plist 内容展示.png

常见 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

iOS Hacking Guide.pdf

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.相关请求头。

mPaas mPaasAlive.png

mPaas 请求头说明.png

mPaas 响应头说明.png

2.数据都走的 mgw.htm 网关

mPaas msg 网关.png

你会发现 Payload 都是乱码是 gzip 压缩了,一般会网关开启加密,在不是加密的情况如果还是乱码,你仔细看请求头 Content-Type: application/json 是 json,而 Content-Encoding: gzip 数据做编码,测试的话就将流量转发到 Flask 代理服务器批量 decode 成明文,之后再由代理服务器再转给 BurpSuite 测试即可。这是最麻烦的。

而 BurpSuite 自带 Gzip 解压,完美解决。

BurpSuite Gzip 解压.png

就算得到明文,那么网关开启签名验证 Header 中带有 Sign 也没办法改包,这会是绕过加密后遇到的第二道关卡。

当《App 抓 HTTP 请求常见解决方案》无法解决抓包,可以尝试以下 mPaaS 抓包方法:

3.离线包

当你第一次点开某个功能,App 自动下载后缀为 .arm 的离线包

mPaaS 离线包.png

就是压缩文件,改为 .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 方法确认是配置离线包

App 入口.png

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);
}

mpass 离线包配置文档.png

这三个参数分别是 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

参考资料

最近更新:

发布时间:

摆哈儿龙门阵