iOS 渗透测试检查项

信息收集

砸壳

  • 从客户端获取 IPA 或从应用程序商店下载 IPA。
  • 应用商店中的 IPA 已加密,因此需要通过从内存中转储二进制文件来对其进行解密。

使用的工具

在设备上安装

  • 使用 iOS 应用签名者签名 IPA,并使用 iOS 部署安装 IPA
  • 如果使用免费的开发者帐户,则需要信任配置文件,并且需要从“常规 > 配置文件和设备管理”中验证该应用程序。
  • 目前,Cydia-impactor 无法可靠运行,您需要安装 Mac 才能在设备上安装该应用程序。

**使用的工具 **

文件系统分析

  • 每个应用都有唯一的 36 个字符的 UUID,代表其应用目录沙箱位置

  • 每个应用程序还具有唯一的 36 个字符的 Data-UUID,其中包含所有应用程序数据。

  • 可在以下位置找到应用程序 IPA 软件包。/private/var/containers/Bundle/Application/UUID/App.App 它包含 IPA 随附的所有资源,因此应始终检查敏感凭据。

  • Info.plist 文件位于以下位置。/private/var/containers/Bundle/Application/UUID/App.App/Info.plist 该文件包含有关该应用程序的所有详细信息,因此还要检查其中是否包含硬编码的机密/凭证。

  • 所有应用程序数据都位于以下位置。/private/var/mobile/Containers/Data/Application/Data-UUID 应该检查此数据位置是否存在本地存储问题,例如以加密格式存储敏感数据并将其存储在 Plist 文件中。

  • 数据保护 API 是一种附加的保护机制,可用于为重要文件(例如财务记录和个人数据)提供附加保护。主要有四个主要的数据保护类。

  • 无保护(NSFileProtectionNone):没有对文件应用保护。

  • 在首次用户身份验证(NSFileProtectionCompleteUntilFirstUserAuthentication)之前受保护:文件在手机解锁时将保持可访问状态,并且在重启之前将保持解锁状态。

  • 除非打开,否则受保护(NSFileProtectionCompleteUnlessOpen):文件在访问时将被解锁,并且将被解锁直到重启。

  • 完全保护(NSFileProtectionComplete):打开文件时将其解锁,然后在锁定设备后短时间内使该文件不可访问。

  • 使用此 frida 代码共享脚本 * 可以列出 App/data 目录中文件的数据保护类别。

    • 当寻找敏感数据在文件系统上的不安全存储时,请关注以下关键领域。
    • 存储在 plist 文件而不是钥匙串中的敏感数据,因为可以在 iTunes 备份中轻松读取它们。
    • 以错误的编码方案(例如 base64)存储的敏感数据。
    • 敏感数据存储在未加密的 SQLite,Core Data 或 RealmDB 数据库中。
    • 应用程序数据目录中的缓存中泄漏了敏感数据。
  • 参考资料以了解更多

  • 使用的工具

网络分析

  • 通过添加 burp CA 并将其信任为根 CA,检查应用程序是否进行 SSL 固定。

  • 设置 burp 代理和转到 http://burp

  • 下载证书,然后转到常规 > 配置文件以安装证书

  • 转到常规 > 关于 > 证书信任设置,通过切换 Portswigger CA 选项将证书信任为根 CA

  • 要进行 API 测试和流量捕获,您需要绕过 SSL 抓包检查(如果已实现)。

  • 从 GitHub 下载 SSL Kill Switch -2 deb 文件。

    • 使用 SSH 将 deb 文件传输到设备
    • 通过以下方式安装:dpkg -i <package>.deb
    • 重启 SpringBoard:killall -HUP SpringBoard
  • 要么

  • 在应用程序运行期间,使用 iOS ssl-pinning disable 从 objetcion 来绕过 SSL ssl-pinning 实施。

  • 参考资料以了解更多

  • 使用的工具

应用问题

  • 检查包含敏感细节的 UI 屏幕是否受到屏幕截图的保护

    此数据位于 /var/mobile/Containers/Data/Application/UUID/Library/Caches/Snapshots/ 敏感信息,不应在屏幕截图中捕获

  • 建议将 iOS 中的敏感数据存储在钥匙串中,但是没有平台 API 可以在应用卸载时清除钥匙串数据。这称为钥匙串持久性。

    • 应用程序应在注销时清除钥匙串项,例如身份验证令牌等。
    • 要测试安装并使用该应用程序填充钥匙串,然后卸载该应用程序。
    • 重新安装该应用程序,以检查您是否仍然可以使用用户登录详细信息访问该应用程序。
  • 文本输入将缓存为 UITextFields 输入,并存储在以下位置以进行语言预测,这可能导致敏感数据(如信用卡信息)泄漏。/private/var/mobile/Library/Keyboard/dynamic-text.dat 在多个位置将数据输入到应用程序中,然后查看它们是否出现在键盘缓存中。

  • URL schemes 是应用程序的一个很好的攻击载体,会造成很大的危害。

    • URL schemes 在应用程序的 Info.plist 文件的 CFBundleURLTypes 项中定义。
    • *[* *openURL*] 在反汇编中跟踪选择器的用法,以了解查询参数和 URL 处理。
    • 确保正确验证了 URL 参数,并丢弃了格式错误的 URL
    • 确保仅打开来自受信任域的 URL。
    • 检查域验证是否正确实施。

使用的工具

webview 应该妥善防止 XSS 和钓鱼攻击。

  • 自 iOS 12 起不推荐使用 UIWebVIew,不建议使用 UIWebVIew,因为无法对其禁用 JavaScript。
  • WXWebView 具有更丰富的 JavaScript 支持,并且默认情况下还启用了 JS,可以将其禁用
  • SFSafariViewContruller 是另一个常见选择,默认情况下启用 JS,并且不能禁用 JS,并且无法与 Apple Safari 共享 cookie 和站点数据。
  • 通过检查 loadFileURL:allowingReadAccessToURL:的值,验证应用是否允许通过加载的 WebView 内容读取本地文件。在应用程序二进制文件的反汇编中。

检查 LocalAuthentication 机制(如 TouchID/FaceID 是否正确执行。

  • 使用 LocaAuthentication 框架查找任何受生物特征识别锁保护的敏感数据。
  • 使用 iOS ui biometric_bypass 从 objection 自动化测试工具来检查我们是否能够绕过生物识别认证。

使用的工具

总是检查应用程序二进制硬编码的凭证

  • 许多开发人员在应用程序中对凭据进行硬编码,搜索秘密,加密,私有,令牌等。
  • 许多应用程序使用第三方后端系统,分析并使用。JSON 和。xml 文件获取凭据。
  • 许多应用程序都包含隐藏功能,可以在应用程序二进制文件中搜索开发,调试,伪造,测试。
  • 参考文章 iOS 硬编码凭证

使用的工具

检查应用日志是否包含开发人员在开发过程中可能留下的任何敏感数据,并忘记删除日志

  • 要检查日志,请将设备连接到 Mac。
  • 打开 Xcode-> 设备和模拟器 -> 查看设备日志以查看日志
  • Grep 日志中的敏感数据文件

检查越狱检测实施

  • 如果未显示有关越狱设备的任何警报或未阻止该应用程序运行,请将该应用程序安装在越狱设备上。那么它就不会受到越狱检测的保护

**Android 渗透测试检查项 **

**APK 文件和信息收集 **

获取 APK 文件并收集信息

  • 直接从客户端获取应用程序

  • 从 Play 商店下载该应用程序,然后使用 ADB(rooted Android device/non-rooted devices)将其 pull 拉到本机。

  • 在 Play 商店中搜索该应用并下载

    • adb shell pm list packages -f | grep app_name

    • 他会显示应用包名

    • 要么

    • 从包列表中查看

    • adb shell pm path com.package_name.

    • adb pull/data/App/com.package_name..apk

  • 检查应用程序生态系统

  • React Native 应用程序

    • AndroidManifest.xml 文件中的 com.Facebook.com.react 条目
  • Flutter 应用程序

    • io.flutter 文件夹反编译应用程序
    • AndroidManifest.xml 文件中的 flutter.embedding 条目
  • 下载器

使用的工具

在设备上安装

  • 从 Play 商店安装。
  • 如果主机系统上使用 apk “adb install application.apk”
  • 注意:请确保并注意移动设备在安装时弹出的权限。

使用的工具

逆向工程与分析

通过逆向工程分析 APk 文件

  • APK 软件包文件包含应用程序的代码。(类似于 zip 文件)。它包含 assets,res,lib,META-INF,AndroidManifest.xml,classes.dex(Dalvik 二进制字节码)

  • 要查看所有这些内容,请将。apk 文件转换为。zip 文件,然后将其提取(解压缩)。

  • 要阅读 AndroidManifest.xml,请使用 Apktool

    Apktool d application.apk

    cd application

    使用文本编辑器打开 AndroidManifest.xml 去分析它。

  • 逆向工程 DEX 字节码:

    • 重命名 application.apk to application.zip 并解压缩您将获得 classes.dex 文件
    • 使用 d2 j-dex2 jar -f classes.dexfile 获取 Java 类文件。
    • JD-GUI(java decompiler)从 Java 类文件中读取 Java 源代码。
  • 参考资料以了解更多

使用的工具

静态分析(手动和自动)

  • 获取 Java 源代码后,对其进行分析并查找硬编码为密码,API 密钥等代码的敏感信息
  • 案例研究:https://hackerone.com/reports/351555
  • 使用 MobSF 进行静态分析可加快过程

使用的工具

检查应用程序是否可调试

  • Android 允许全系统备份,其中包括可调试的应用程序数据
  • 攻击者可以通过 adb 备份可调试应用程序
  • 检查 AndroidManifest.xml 文件中的 Android:debuggable 属性
  • 如果属性值为 true,则其为有问题

在 Android 清单文件中的自定义权限中检查 Typos

  • 开发人员可以对仅允许经过授权的应用程序使用 Android 组件使用自定义权限
  • 使用与声明的自定义权限不匹配的自定义权限的错字可能会被未经授权的应用程序滥用
  • 案例研究:https://hackerone.com/reports/440749

测试导出的 Activity 活动组件

默认情况下,不导出 Android 活动,但如果定义了意图过滤器,则通常将其导出 非导出活动也可以由导出活动执行,请检查是否可以通过使用 adb 导出的活动来控制非导出活动的执行

使用的工具

MobSF

测试导出的广播接收器

在 AndroidManifest.xml 文件中检查导出的广播接收器 检查攻击者是否可以将有效负载发送到此导出的广播接收器,或者输入是否由 apk 以任何方式处理

使用的工具

MobSF

网络分析

检查 SSL 抓包检测及其绕过

  • 设置 burp 代理(或其他类似的代理),请转到 Http://burp

  • 转到 Settings > additional settings > privacy > certificates >install certificates from sd card(选择下载的位置)以安装为根 CA 证书

  • 捕获应用流量

  • 要么

  • 如果启用了 SSL 证书固定,则需要绕过它以捕获和分析应用流量。

    • 使用 Frida 和 objection 绕过

    • 在主机上安装 Frida 客户端,并在移动设备上运行 Frida 服务器(使用以下方法在移动设备上放置 Frida 服务器:

    • >adb push Frida-server/data/local/tmp/
      
    • > adb shell
      
    • > cd/data/local/tmp/
      
    • > chmod +x frida-server (make it executable )
      
    • > ./frida-server &
      
    • 要么

    • > adb shell "chmod 755/data/local/tmp/frida-server"
      
    • > adb shell "/data/local/tmp/frida-server &"
      
    • 使用以下命令测试 Frida 服务器是否正常运行:

    • > Frida-ps -Ua
      
  • 使用 objection 绕过 ssl-pinning

  • > objection -g com.package_name explore
    
  • > Android sslpinning disable
    
  • 参考资料以了解更多

使用的工具

动态分析

使用 pidcat 工具分析应用日志

  • 显示来自特定应用程序包的进程的日志条目
  • pidcat target-App-package-name

使用的工具

检查应用程序用户界面不受敏感信息屏幕截图的保护

  • adb shell/system/bin/screencap/sdcard/img.PNG
    

    屏幕截图是用于截取设备屏幕截图的命令行实用程序。

  • 使用下载 adb pull/sdcard/img.PNG

  • 使用 display img.PNG 读取(在 Linux 上)

  • 注意(不应在截图中捕获敏感信息)
    

检查 root 检测机制是否已实现

  • 如果该应用程序未显示有关该已 rooted 设备的警报或未阻止该应用程序运行,请在该 rooted 设备上安装该应用程序。然后,它不会受到根检测的保护。

检查 shared preferences 以进行持久登录

  • 首次登录时,该应用要求输入用户名和密码,之后不再要求输入用户名和密码,而是将登录密钥以共享的首选项存储在 login_account.xml 中,其他应用也可以将其窃取。攻击者可以使用它

检查键盘缓存

  • 位置 /data/data/com.Android.providers.userdictionary/databases/user_dict.db
    • 使用 SQLite 读取它(user_dict.db)

使用的工具

测试易受攻击的广播接收器

  • 检查广播发送的意图(可以是用户输入), 并检查 AndroidManifest 文件以获取具有 Android export =“true”的广播接收器(不安全的方式)
  • 并根据应用功能开发漏洞利用

测试意图嗅探

  • 应用程序可以发送广播意图而无需指定广播目标
  • 任何恶意应用程序都可以拦截这些隐式广播
  • sendBroadcast 反编译代码中的搜索功能
  • 案例研究:https://hackerone.com/reports/56002

测试深层链接漏洞

  • 深度链接是可将用户直接导航到应用程序中特定内容的 URL
  • 要定义深层链接,在 AndroidManifest.xml 文件中定义了意图过滤器
  • 意图过滤器还必须包含具有 DEFAULT 或 BROWSABLE 值的类别
  • 检查方案,主机和参数是否正确验证

测试 WebView 漏洞

  • 它允许将网页显示为活动
  • 在 smali 代码中查找这些字符串
  • @JavascriptInterface ,setJavaScriptEnabled ,setWebViewClient
  • 检查危险的 WebView 设置,例如 setAllowFileAccess(true)

测试本地加密问题

  • 如果使用了弱加密密码日志

    • 易受攻击的算法/过时密码:例如 DES 和 3 DES,RC2,RC4,MD5 和 SHA1,Dual_EC_DRBG 和 SHA1 PRNG,LOWFISH
    • 检查应用程序代码以检查使用的加密算法实例
  • 常见配置问题

    • 检查对称加密是否与硬编码加密密钥一起使用。
    • 如果应用程序使用两种方式的 ssl,请在本地检查客户端 SSL 证书密码(不应在本地存储)

从 Android 清单文件中查找存储问题

通过查看来检查外部存储

  • 使用权限:Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"

  • 检查用于文件权限关键字/API 的代码,以存储以下数据:MODE_WORLD_READABLE 或 MODE_WORLD_WRITABLE(这两个允许任何应用读取文件并写入该文件)

  • 检查外部存储中是否存储了敏感信息(您可以分析代码以了解更多类似以上的信息)

  • cd/mnt/sdcard
    
  • use ls and ls -l file_name_found_from_source_code
    
  • Note : In unix files starting with . are ignored by the ls command
    
  • so use ls -l file_name_to_check
    

查找类和函数

  • SharedPreferences class(他存储键值对)
  • FileOutPutStream class(它使用内部或外部存储),getExternal * 函数(使用外部存储))`
  • getReadableDatabase function(返回一个 SQLiteDatabase 进行读取)
  • getCacheDir and getExternalCacheDirs(使用缓存文件)`
  • 检查用于加密文件的错误做法
  • getWritableDatabase function(返回一个 SQLiteDatabase 进行写入)

检查 secrets 位置

- res/values/strings.xml - build configs like - local.properties, gradle.properties -/data/misc/keystore/

检查输入验证问题

  • 例如:登录页面,尝试不使用用户名和密码(vai SQLinjection)登录,继续检查应用程序日志,您可能会看到 SQli 错误

  • URI 方案的输入验证检查:

  • 使用“file:///path_of_file”架构读取存储在 SD 卡或内部存储中的应用文件,以读取文件

  • file:///sdcard/。file_name.txt
    
  • 要么

  • file:///data/data/com.App.name/shared_prefs/app_preferences.xml
    

检查访问控制问题

  • 如果未正确保护某些组件,则其他应用程序可以访问这些组件。诸如 activities,services,content providers 之类的组件
  • 例如,在一个应用程序中,一个活动显示应用程序内部的 API 密钥和密码(该活动可能处理一些其他敏感信息)。请尝试从应用程序外部获取相同的信息。注意:检查活动/组件是否已导出,应用是否允许访问外部的信息应用程序。然后这是个问题
  • 检查使用 adb shell am start com.app_name/。Activity_name(导出并具有敏感信息的活动) 它将启动活动 adb shell am start -n com.app_name/。Activity_name -a com.app_name.action.VIEW_Action_name-a 它指定了意图操作,而上面的命令将启动活动

参考