47 KiB
Android 应用程序渗透测试
从零开始学习 AWS 黑客技术,成为专家 htARTE(HackTricks AWS 红队专家)!
支持 HackTricks 的其他方式:
- 如果您想看到您的公司在 HackTricks 中做广告或下载 PDF 版本的 HackTricks,请查看订阅计划!
- 获取官方 PEASS & HackTricks 商品
- 探索PEASS 家族,我们的独家NFTs
- 加入 💬 Discord 群组 或 电报群组 或在 Twitter 🐦 @carlospolopm** 上关注**我。
- 通过向 HackTricks 和 HackTricks Cloud github 仓库提交 PR 来分享您的黑客技巧。
加入 HackenProof Discord 服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解
参与深入探讨黑客的刺激和挑战的内容
实时黑客新闻
通过实时新闻和见解及时了解快节奏的黑客世界
最新公告
了解最新的赏金任务发布和重要平台更新
加入我们的 Discord,立即与顶尖黑客合作!
Android 应用程序基础知识
强烈建议阅读此页面,了解与 Android 安全相关的最重要部分以及 Android 应用程序中最危险的组件:
{% content-ref url="android-applications-basics.md" %} android-applications-basics.md {% endcontent-ref %}
ADB(Android 调试桥)
这是连接到 Android 设备(模拟或实际)所需的主要工具。
ADB 允许从计算机控制设备,可以通过USB或网络连接。此实用程序使文件双向复制、应用程序安装和卸载、执行 shell 命令、备份数据、读取日志等功能成为可能。
查看以下ADB 命令列表,了解如何使用 adb。
Smali
有时修改应用程序代码以访问隐藏信息(例如经过良好混淆的密码或标志)是很有趣的。然后,可能需要对 apk 进行反编译、修改代码并重新编译。
在本教程中,您可以学习如何反编译 APK、修改 Smali 代码并重新编译 APK,添加新功能。这在动态分析期间的多个测试中可能非常有用。因此,始终记住这种可能性。
其他有趣的技巧
- 欺骗 Play 商店中的位置
- 下载 APK:https://apps.evozi.com/apk-downloader/、https://apkpure.com/es/、https://www.apkmirror.com/、https://apkcombo.com/es-es/apk-downloader/
- 从设备中提取 APK:
adb shell pm list packages
com.android.insecurebankv2
adb shell pm path com.android.insecurebankv2
package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
adb pull /data/app/com.android.insecurebankv2- Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
静态分析
首先,要分析一个APK,你应该使用反编译器查看Java代码。
请在这里阅读有关不同可用反编译器的信息。
寻找有趣的信息
仅仅查看APK的字符串,你就可以搜索密码,URLs (https://github.com/ndelphit/apkurlgrep),API密钥,加密,蓝牙UUIDs,令牌以及任何有趣的内容... 甚至查找代码执行后门或身份验证后门(应用中硬编码的管理员凭据)。
Firebase
特别注意Firebase URL,并检查其是否配置不当。在这里了解有关Firebase是什么以及如何利用它的更多信息。
应用程序的基本理解 - Manifest.xml,strings.xml
对应用程序的_Manifest.xml_和_strings.xml_文件进行检查可以揭示潜在的安全漏洞。可以使用反编译器访问这些文件,或者将APK文件扩展名重命名为.zip,然后解压缩它。
从Manifest.xml中识别的漏洞包括:
-
可调试应用程序:在_Manifest.xml_文件中设置为可调试(
debuggable="true"
)的应用程序存在风险,因为它们允许可能导致利用的连接。要进一步了解如何利用可调试应用程序,请参考有关在设备上查找和利用可调试应用程序的教程。 -
备份设置:对于处理敏感信息的应用程序,应明确设置
android:allowBackup="false"
属性,以防止通过adb进行未经授权的数据备份,特别是在启用USB调试时。 -
网络安全:在_res/xml/_中的自定义网络安全配置(
android:networkSecurityConfig="@xml/network_security_config"
)可以指定安全详细信息,如证书固定和HTTP流量设置。一个示例是允许特定域的HTTP流量。 -
导出的活动和服务:在清单中识别导出的活动和服务可以突出可能被滥用的组件。在动态测试期间进一步分析可以揭示如何利用这些组件。
-
内容提供程序和文件提供程序:暴露的内容提供程序可能允许未经授权访问或修改数据。还应仔细审查文件提供程序的配置。
-
广播接收器和URL方案:这些组件可能被利用进行利用,特别关注URL方案的管理方式以防输入漏洞。
-
SDK版本:
minSdkVersion
,targetSDKVersion
和maxSdkVersion
属性指示支持的Android版本,强调不支持过时、易受攻击的Android版本的重要性。
从strings.xml文件中,可以发现诸如API密钥、自定义模式和其他开发者注释等敏感信息,强调需要仔细审查这些资源。
Tapjacking
Tapjacking是一种攻击,其中启动一个恶意应用程序,并将其定位在受害者应用程序的顶部。一旦它明显遮挡了受害者应用程序,其用户界面被设计成以一种方式欺骗用户与之交互,同时将交互传递给受害者应用程序。
实际上,它使用户无法知道他们实际上是在受害者应用程序上执行操作。
在以下找到更多信息:
{% content-ref url="tapjacking.md" %} tapjacking.md {% endcontent-ref %}
任务劫持
launchMode
设置为singleTask
且未定义任何taskAffinity
的活动容易受到任务劫持的影响。这意味着,如果安装了一个应用程序,并在真正的应用程序之前启动它,它可能劫持真正应用程序的任务(因此用户将与恶意应用程序交互,以为自己在使用真正的应用程序)。
在以下找到更多信息:
{% content-ref url="android-task-hijacking.md" %} android-task-hijacking.md {% endcontent-ref %}
不安全的数据存储
内部存储
在Android中,存储在内部存储中的文件设计为仅由创建它们的应用程序访问。这一安全措施由Android操作系统强制执行,通常足以满足大多数应用程序的安全需求。然而,开发人员有时会使用MODE_WORLD_READABLE
和MODE_WORLD_WRITABLE
等模式,以允许文件在不同应用程序之间共享。然而,这些模式不限制其他应用程序(包括潜在恶意应用程序)访问这些文件。
- 静态分析:
- 确保仔细审查对
MODE_WORLD_READABLE
和MODE_WORLD_WRITABLE
的使用。这些模式可能会使文件面临意外或未经授权的访问。
- 动态分析:
- 验证应用程序创建的文件设置的权限。特别是,检查是否有任何文件被设置为全球可读或可写。这可能构成重大安全风险,因为它将允许设备上安装的任何应用程序读取或修改这些文件,而不考虑其来源或意图。
外部存储
处理外部存储(如SD卡)上的文件时,应采取一些预防措施:
- 可访问性:
- 外部存储上的文件是全局可读和可写的。这意味着任何应用程序或用户都可以访问这些文件。
- 安全问题:
- 鉴于访问的便利性,建议不要在外部存储上存储敏感信息。
- 外部存储可以被移除或任何应用程序访问,使其不太安全。
- 处理来自外部存储的数据:
- 始终对从外部存储检索的数据执行输入验证。这是至关重要的,因为数据来自不受信任的来源。
- 强烈建议不要在外部存储上存储可执行文件或类文件以进行动态加载。
- 如果您的应用程序必须从外部存储检索可执行文件,请确保在动态加载之前对这些文件进行签名和加密验证。这一步对于维护应用程序的安全完整性至关重要。
外部存储可以在/storage/emulated/0
,/sdcard
,/mnt/sdcard
中访问。
{% hint style="info" %} 从Android 4.4(API 17)开始,SD卡具有目录结构,限制应用程序对专门用于该应用程序的目录的访问。这可以防止恶意应用程序读取或写入另一个应用程序的文件。 {% endhint %}
明文存储的敏感数据
- 共享首选项:Android允许每个应用程序轻松保存xml文件在路径
/data/data/<packagename>/shared_prefs/
中,有时可以在该文件夹中找到明文存储的敏感信息。 - 数据库:Android允许每个应用程序轻松保存sqlite数据库在路径
/data/data/<packagename>/databases/
中,有时可以在该文件夹中找到明文存储的敏感信息。
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
破解加密
密钥管理流程不佳
一些开发人员会将敏感数据保存在本地存储中,并使用在代码中硬编码/可预测的密钥进行加密。这样做是不应该的,因为一些逆向工程可能会使攻击者提取机密信息。
使用不安全和/或已弃用的算法
开发人员不应使用已弃用的算法来执行授权检查,存储或发送数据。一些这些算法包括:RC4、MD4、MD5、SHA1... 如果用于存储密码的哈希,应使用具有盐的哈希抗暴力攻击。
其他检查
- 建议对APK进行混淆,以增加对逆向工程的难度。
- 如果应用程序很敏感(如银行应用程序),应该执行自己的检查以查看手机是否已获取root权限,并相应地采取行动。
- 如果应用程序很敏感(如银行应用程序),应检查是否正在使用模拟器。
- 如果应用程序很敏感(如银行应用程序),应在执行之前检查自身的完整性,以查看是否已被修改。
- 使用APKiD来检查构建APK时使用的编译器/打包程序/混淆器
React Native 应用程序
阅读以下页面,了解如何轻松访问React应用程序的JavaScript代码:
{% content-ref url="react-native-application.md" %} react-native-application.md {% endcontent-ref %}
Xamarin 应用程序
阅读以下页面,了解如何轻松访问Xamarin应用程序的C#代码:
{% content-ref url="../xamarin-apps.md" %} xamarin-apps.md {% endcontent-ref %}
超级打包应用程序
根据这篇博客文章,超级打包是一种将应用程序内容压缩到单个文件中的元算法。该博客讨论了创建一个可以解压这些应用程序的应用程序的可能性... 以及一种更快的方法,涉及执行应用程序并从文件系统中收集解压后的文件。
自动静态代码分析
工具mariana-trench能够通过扫描应用程序的代码来发现漏洞。该工具包含一系列已知源(指示工具用户控制的输入位置)、漏洞(指示工具危险位置,恶意用户输入可能造成损害)和规则。这些规则指示了源-漏洞的组合,指示了漏洞。
有了这些知识,mariana-trench将审查代码并找出可能存在的漏洞。
泄露的机密信息
应用程序可能包含内部的机密信息(API密钥、密码、隐藏的URL、子域...),您可能会发现这些信息。您可以使用诸如https://github.com/dwisiswant0/apkleaks之类的工具。
绕过生物识别身份验证
{% content-ref url="bypass-biometric-authentication-android.md" %} bypass-biometric-authentication-android.md {% endcontent-ref %}
其他有趣的功能
- 代码执行:
Runtime.exec(), ProcessBuilder(), native code:system()
- 发送短信:
sendTextMessage, sendMultipartTestMessage
- 声明为
native
的本机功能:public native, System.loadLibrary, System.load
- 阅读此内容以了解如何反向执行本机功能
其他技巧
{% content-ref url="content-protocol.md" %} content-protocol.md {% endcontent-ref %}
加入HackenProof Discord服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解
参与深入探讨黑客活动的刺激和挑战
实时黑客新闻
通过实时新闻和见解及时了解快节奏的黑客世界
最新公告
随时了解最新的赏金任务发布和重要平台更新
加入我们的 Discord,立即与顶尖黑客合作!
动态分析
首先,您需要一个可以安装应用程序和所有环境(主要是Burp CA证书、Drozer和Frida)的环境。因此,极力推荐使用已获取root权限的设备(模拟器或非模拟器)。
在线动态分析
您可以在https://appetize.io/创建一个免费账户。该平台允许您上传和执行APK文件,因此非常适合查看APK的行为方式。
您甚至可以在网络中查看应用程序的日志,并通过adb进行连接。
通过ADB连接,您可以在模拟器中使用Drozer和Frida。
本地动态分析
使用模拟器
- Android Studio(您可以创建x86和arm设备,根据此最新的x86版本支持ARM库而无需使用速度较慢的arm模拟器)。
- 了解如何在此页面中设置:
{% content-ref url="avd-android-virtual-device.md" %} avd-android-virtual-device.md {% endcontent-ref %}
- Genymotion (免费版本:个人版,您需要创建一个帐户。_建议下载带有_VirtualBox的版本以避免潜在错误。)
- Nox(免费,但不支持Frida或Drozer)。
{% hint style="info" %} 在任何平台上创建新模拟器时,请记住屏幕越大,模拟器运行速度越慢。因此,如果可能,请选择小屏幕。 {% endhint %}
要在Genymotion中安装谷歌服务(如应用商店),您需要单击以下图像中标有红色标记的按钮:
此外,请注意,在Genymotion中的Android VM配置中,您可以选择桥接网络模式(如果您将从具有工具的不同VM连接到Android VM,则这将非常有用)。
使用物理设备
您需要激活调试选项,如果可能的话最好获取root权限:
- 设置。
- (从Android 8.0开始)选择系统。
- 选择关于手机。
- 按版本号 7次。
- 返回,您将找到开发人员选项。
安装应用程序后,您应该首先尝试并调查其功能、工作方式,并熟悉它。
我建议使用MobSF动态分析+pidcat执行此初始动态分析,这样我们将能够了解应用程序的工作方式,同时MobSF将捕获许多您稍后可以查看的有趣数据。
非预期数据泄露
日志记录
开发人员应谨慎地公开调试信息,因为这可能导致敏感数据泄露。建议使用pidcat和adb logcat
等工具来监视应用程序日志,以识别和保护敏感信息。Pidcat因其易用性和可读性而备受推崇。
{% hint style="warning" %}
请注意,从Android 4.0之后的版本开始,应用程序只能访问自己的日志。因此,应用程序无法访问其他应用程序的日志。
无论如何,仍建议不记录敏感信息。
{% endhint %}
复制/粘贴缓存
Android的基于剪贴板的框架使应用程序能够进行复制粘贴功能,但存在风险,因为其他应用程序可以访问剪贴板,可能会暴露敏感数据。对于应用程序的敏感部分(如信用卡详细信息),禁用复制/粘贴功能至关重要,以防止数据泄露。
崩溃日志
如果应用程序崩溃并保存日志,这些日志可以帮助攻击者,特别是当无法对应用程序进行逆向工程时。为减轻此风险,请避免在崩溃时记录日志,如果必须通过网络传输日志,则确保通过SSL通道发送以确保安全性。
作为渗透测试人员,尝试查看这些日志。
发送给第三方的分析数据
应用程序通常集成诸如Google Adsense之类的服务,由于开发人员的不当实施,可能会无意中泄露敏感数据。为了识别潜在的数据泄露,建议拦截应用程序的流量,检查是否向第三方服务发送了任何敏感信息。
SQLite数据库
大多数应用程序将使用内部SQLite数据库保存信息。在渗透测试期间,查看已创建的数据库、表和列的名称以及所有保存的数据,因为您可能会发现敏感信息(这将是一个漏洞)。
数据库应位于/data/data/the.package.name/databases
,如/data/data/com.mwr.example.sieve/databases
如果数据库保存了机密信息并且已加密,但您可以在应用程序中找到密码,这仍然是一个漏洞。
使用.tables
列出表,并使用.schema <table_name>
列出表的列。
Drozer(利用活动、内容提供程序和服务)
来自Drozer文档:Drozer允许您扮演Android应用程序的角色,并与其他应用程序进行交互。它可以执行任何已安装应用程序可以执行的操作,例如利用Android的进程间通信(IPC)机制并与底层操作系统进行交互。
Drozer是一个有用的工具,可用于利用导出的活动、导出的服务和内容提供程序,您将在以下部分中了解更多信息。
利用导出的活动
阅读此内容以了解什么是Android活动。
还要记住,活动的代码从**onCreate
**方法开始。
授权绕过
当活动被导出时,您可以从外部应用程序调用其屏幕。因此,如果具有敏感信息的活动被导出,您可以绕过****身份验证机制访问它。
您还可以从adb启动导出的活动:
- PackageName为com.example.demo
- 导出的ActivityName为com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity
注意:MobSF 将检测在活动中使用 android:launchMode
作为 singleTask/singleInstance
的行为为恶意,但由于 此问题,显然这只在旧版本(API 版本 < 21)上存在危险。
{% hint style="info" %} 请注意,授权绕过并不总是漏洞,这取决于绕过的方式以及暴露了哪些信息。 {% endhint %}
敏感信息泄露
活动也可以返回结果。如果您找到一个已导出且未受保护的活动调用了 setResult
方法并返回敏感信息,那么就存在敏感信息泄露。
点击劫持
如果未防止点击劫持,您可以滥用已导出的活动来使用户执行意外操作。有关 点击劫持是什么,请查看链接 获取更多信息。
利用内容提供程序 - 访问和操纵敏感信息
如果您想了解内容提供程序是什么,请阅读此内容。
内容提供程序基本上用于共享数据。如果应用程序有可用的内容提供程序,您可能能够从中提取敏感数据。还值得测试可能的SQL 注入和路径遍历,因为它们可能存在漏洞。
利用服务
如果您想了解服务是什么,请阅读此内容。
请记住,服务的操作始于 onStartCommand
方法。
服务基本上是可以接收数据,处理它并返回(或不返回)响应的东西。因此,如果应用程序正在导出某些服务,您应该检查代码以了解其功能,并动态测试以提取机密信息、绕过身份验证措施等...
学习如何使用 Drozer 利用服务。
利用广播接收器
如果您想了解广播接收器是什么,请阅读此内容。
请记住,广播接收器的操作始于 onReceive
方法。
广播接收器将等待某种类型的消息。根据接收器处理消息的方式,它可能存在漏洞。
学习如何使用 Drozer 利用广播接收器。
利用方案 / 深层链接
您可以手动查找深层链接,使用像 MobSF 这样的工具或类似 此工具 的脚本。
您可以使用 adb 或 浏览器 打开声明的 scheme:
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
{% endcode %}
请注意,您可以省略包名称,手机将自动调用应该打开该链接的应用程序。
{% code overflow="wrap" %}
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
{% endcode %}
执行的代码
要找到在应用中执行的代码,请转到由深度链接调用的活动,并搜索名为**onNewIntent
**的函数。
敏感信息
每次找到一个深度链接,请检查它是否通过URL参数接收敏感数据(如密码),因为任何其他应用程序都可以冒充深度链接并窃取这些数据!
路径中的参数
您还必须检查任何深度链接是否在URL路径中使用参数,例如:https://api.example.com/v1/users/{username}
,在这种情况下,您可以强制进行路径遍历,访问类似于:example://app/users?username=../../unwanted-endpoint%3fparam=value
。
请注意,如果您在应用程序中找到正确的端点,您可能会导致开放式重定向(如果路径的一部分用作域名)、账户接管(如果您可以修改用户详细信息而无需CSRF令牌,并且易受攻击的端点使用了正确的方法)和任何其他漏洞。有关此内容的更多信息,请单击此处。
更多示例
一个关于链接的有趣的漏洞赏金报告(/.well-known/assetlinks.json)。
传输层检查和验证失败
- Android 应用程序通常未正确检查证书。这些应用程序通常忽略警告并接受自签名证书,或在某些情况下回退到使用HTTP连接。
- SSL/TLS 握手期间的协商有时很薄弱,使用不安全的密码套件。此漏洞使连接容易受到中间人(MITM)攻击的影响,允许攻击者解密数据。
- 当应用程序使用安全通道进行身份验证,然后通过非安全通道进行其他交易时,私人信息泄霏是一个风险。这种方法未能保护敏感数据,如会话 cookie 或用户详细信息,免受恶意实体的拦截。
证书验证
我们将重点放在证书验证上。必须验证服务器证书的完整性以增强安全性。这是至关重要的,因为不安全的 TLS 配置和通过未加密通道传输敏感数据可能会带来重大风险。有关验证服务器证书和解决漏洞的详细步骤,**此资源**提供了全面的指导。
SSL Pinning
SSL Pinning 是一种安全措施,应用程序会将服务器的证书与应用程序内部存储的已知副本进行验证。这种方法对于防止 MITM 攻击至关重要。强烈建议处理敏感信息的应用程序实施 SSL Pinning。
流量检查
要检查 HTTP 流量,必须安装代理工具的证书(例如 Burp)。如果不安装此证书,加密流量可能无法通过代理查看。有关安装自定义 CA 证书的指南,请单击此处。
针对API 级别 24 及以上的应用程序需要修改网络安全配置以接受代理的 CA 证书。这一步对于检查加密流量至关重要。有关修改网络安全配置的说明,请参考此教程。
绕过 SSL Pinning
当实施 SSL Pinning 时,绕过它以检查 HTTPS 流量变得必要。有多种方法可用于此目的:
- 使用apk-mitm自动修改 apk 以绕过 SSLPinning。这种选择的最大优势是,您无需 root 权限即可绕过 SSL Pinning,但您需要删除应用程序并重新安装新应用程序,而且这并不总是有效。
- 您可以使用 Frida(下文讨论)绕过此保护。这里有一个使用 Burp+Frida+Genymotion 的指南:https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/
- 您还可以尝试使用objection自动绕过 SSL Pinning:
objection --gadget com.package.app explore --startup-command "android sslpinning disable"
- 您还可以尝试使用 MobSF 动态分析(下文解释)自动绕过 SSL Pinning
- 如果您仍然认为有一些流量未被捕获,您可以尝试使用 iptables 将流量转发到 burp。阅读此博客:https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62
寻找常见 Web 漏洞
还重要的是在应用程序中寻找常见的 Web 漏洞。有关识别和缓解这些漏洞的详细信息超出了本摘要的范围,但在其他地方有广泛的覆盖。
Frida
Frida 是一个供开发人员、逆向工程师和安全研究人员使用的动态检测工具包。
您可以访问正在运行的应用程序并在运行时挂钩方法以更改行为、更改值、提取值、运行不同代码...
如果您想对 Android 应用程序进行渗透测试,您需要了解如何使用 Frida。
- 学习如何使用 Frida:Frida 教程
- 一些用于与 Frida 交互的“GUI”:https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security
- Ojection 是自动化使用 Frida 的好工具:https://github.com/sensepost/objection , https://github.com/dpnishant/appmon
- 您可以在这里找到一些出色的 Frida 脚本:https://codeshare.frida.re/
Dump Memory - Fridump
检查应用程序是否在内存中存储不应存储的敏感信息,如密码或助记词。
使用Fridump3可以倾倒应用程序的内存:
# With PID
python3 fridump3.py -u <PID>
# With name
frida-ps -Uai
python3 fridump3.py -u "<Name>"
这将在./dump文件夹中转储内存,然后您可以使用类似以下方式进行grep:
{% code overflow="wrap" %}
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
Keystore中的敏感数据
在Android中,Keystore是存储敏感数据的最佳位置,但是即使有足够的权限,仍然可能访问它。由于应用程序倾向于在此处以明文形式存储敏感数据,因此渗透测试应该以root用户或者某些具有物理访问权限的人员能够窃取这些数据。
即使应用程序将数据存储在keystore中,数据也应该被加密。
要访问keystore中的数据,您可以使用这个Frida脚本:https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
指纹/生物识别绕过
使用以下Frida脚本,可能可以绕过Android应用程序可能正在执行的用于保护某些敏感区域的指纹认证:
{% code overflow="wrap" %}
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
{% endcode %}
背景图片
当您将应用程序置于后台时,Android会存储该应用程序的快照,因此当应用程序恢复到前台时,它会在加载应用程序之前加载图像,使得应用程序看起来加载得更快。
然而,如果此快照包含敏感信息,那么可以访问快照的人可能会窃取这些信息(请注意,您需要 root 权限才能访问)。
这些快照通常存储在:/data/system_ce/0/snapshots
Android提供了一种方法,即通过设置FLAG_SECURE布局参数来防止截屏。通过使用此标志,窗口内容被视为安全内容,防止其出现在截屏中或在非安全显示器上查看。
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Android应用程序分析器
这个工具可以帮助您在动态分析过程中管理不同的工具:https://github.com/NotSoSecure/android_application_analyzer
Intent注入
开发人员经常创建代理组件,如活动、服务和广播接收器,用于处理这些Intent并将它们传递给诸如startActivity(...)
或sendBroadcast(...)
等方法,这可能存在风险。
危险在于允许攻击者触发非导出的应用组件或通过误导这些Intent访问敏感内容提供者。一个显著的例子是WebView
组件通过Intent.parseUri(...)
将URL转换为Intent
对象,然后执行它们,可能导致恶意Intent注入。
主要要点
- Intent注入类似于Web的开放重定向问题。
- 攻击涉及将
Intent
对象作为额外参数传递,可以重定向以执行不安全的操作。 - 它可以使非导出组件和内容提供者暴露给攻击者。
WebView
的URL转换为Intent
可以促成意外操作。
Android客户端注入和其他漏洞
您可能已经从Web了解到这种类型的漏洞。在Android应用程序中,您必须特别注意以下漏洞:
- **SQL注入:**处理动态查询或内容提供者时,请确保使用参数化查询。
- **JavaScript注入(XSS):**验证任何WebViews是否已禁用JavaScript和插件支持(默认情况下已禁用)。更多信息请参见此处。
- **本地文件包含:**WebViews应禁用对文件系统的访问(默认情况下已启用)-
(webview.getSettings().setAllowFileAccess(false);)
。更多信息请参见此处。 - **永久cookie:**在几种情况下,当Android应用程序结束会话时,cookie未被撤销,甚至可能被保存到磁盘上。
- Cookie中的安全标志
加入HackenProof Discord服务器,与经验丰富的黑客和赏金猎人交流!
黑客见解
参与深入探讨黑客行为的刺激和挑战的内容
实时黑客新闻
通过实时新闻和见解了解快节奏的黑客世界
最新公告
通过最新的赏金计划发布和重要平台更新保持信息更新
加入我们的 Discord 并开始与顶尖黑客合作!
自动分析
MobSF
静态分析
使用一个漂亮的基于Web的前端对应用程序进行漏洞评估。您还可以执行动态分析(但需要准备环境)。
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
请注意,MobSF可以分析Android(apk)、IOS(ipa)和Windows(apx)应用程序(Windows应用程序必须从安装了MobSF的Windows主机中进行分析)。
此外,如果您创建一个包含Android或IOS应用程序源代码的ZIP文件(转到应用程序的根文件夹,选择所有内容并创建一个ZIP文件),MobSF也可以分析它。
MobSF还允许您进行差异/比较分析,并集成VirusTotal(您需要在_MobSF/settings.py_中设置您的API密钥并启用它:VT_ENABLED = TRUE
VT_API_KEY = <Your API key>
VT_UPLOAD = TRUE
)。您还可以将VT_UPLOAD
设置为False
,然后将哈希而不是文件上传。
使用MobSF进行辅助动态分析
MobSF在Android中进行动态分析时也非常有帮助,但在这种情况下,您需要在主机上安装MobSF和genymotion(虚拟机或Docker将无法工作)。注意:您需要先启动genymotion中的虚拟机,然后再启动MobSF。
MobSF动态分析器可以:
- 转储应用程序数据(URL、日志、剪贴板、您制作的屏幕截图、由“导出活动测试器”制作的屏幕截图、电子邮件、SQLite数据库、XML文件和其他创建的文件)。所有这些都是自动完成的,除了屏幕截图,您需要在需要屏幕截图时按下或按下“导出活动测试器”以获取所有导出活动的屏幕截图。
- 捕获HTTPS流量
- 使用Frida获取运行时信息
从Android 版本大于5开始,它将自动启动Frida并将全局代理设置为捕获流量。它只会捕获被测试应用程序的流量。
Frida
默认情况下,它还将使用一些Frida脚本来绕过SSL绑定、root检测和调试器检测,以及监视有趣的API。
MobSF还可以调用导出的活动,抓取它们的屏幕截图并为报告保存它们。
要开始动态测试,请按下绿色按钮:“开始仪器化”。按下“Frida实时日志”以查看Frida脚本生成的日志,“实时API监视器”以查看所有挂钩方法的调用、传递的参数和返回值(在按下“开始仪器化”后会出现)。
MobSF还允许您加载自己的Frida脚本(要将您的Friday脚本的结果发送到MobSF,请使用函数send()
)。它还有几个预写脚本可供加载(您可以在MobSF/DynamicAnalyzer/tools/frida_scripts/others/
中添加更多),只需选择它们,按下“加载”,然后按下“开始仪器化”(您将能够在“Frida实时日志”中看到该脚本的日志)。
此外,您还有一些辅助的Frida功能:
- 枚举加载的类:它将打印所有加载的类
- 捕获字符串:在使用应用程序时打印所有捕获的字符串(非常嘈杂)
- 捕获字符串比较:可能非常有用。它将显示正在比较的两个字符串以及结果是True还是False。
- 枚举类方法:输入类名(如“java.io.File”),它将打印类的所有方法。
- 搜索类模式:按模式搜索类
- 跟踪类方法:跟踪整个类(查看该类的所有方法的输入和输出)。请记住,默认情况下,MobSF跟踪几个有趣的Android Api方法。
选择要使用的辅助模块后,您需要按下“开始仪器化”,然后您将在“Frida实时日志”中看到所有输出。
Shell
Mobsf还为您提供了一个带有一些adb命令、MobSF命令和常见shell命令的shell,位于动态分析页面的底部。一些有趣的命令:
help
shell ls
activities
exported_activities
services
receivers
HTTP工具
当捕获到http流量时,您可以在“HTTP(S) Traffic”底部看到捕获流量的丑陋视图,或者在“Start HTTPTools”绿色按钮中看到更好的视图。从第二个选项中,您可以将捕获的请求发送到诸如Burp或Owasp ZAP之类的代理。
要这样做,启动Burp --> 关闭拦截 --> 在MobSB HTTPTools中选择请求 --> 按下“Send to Fuzzer” --> 选择代理地址 (http://127.0.0.1:8080\)。
完成与MobSF的动态分析后,您可以按“Start Web API Fuzzer”来对http请求进行模糊测试并寻找漏洞。
{% hint style="info" %} 在使用MobSF进行动态分析后,代理设置可能会配置错误,您将无法从GUI中修复它们。您可以通过以下方式修复代理设置:
adb shell settings put global http_proxy :0
{% endhint %}
使用 Inspeckage 进行辅助动态分析
您可以从 Inspeckage 获取该工具。
此工具将使用一些 Hooks,让您了解在执行 动态分析 时应用程序中发生了什么。
Yaazhini
这是一个使用 GUI 执行静态分析的 绝佳工具
Qark
该工具旨在查找几种 与安全相关的 Android 应用程序漏洞,无论是在 源代码 还是 打包的 APK 中。该工具还 能够创建一个可部署的“概念验证”APK 和 ADB 命令,以利用发现的一些漏洞(暴露的活动、意图、点击劫持等)。与 Drozer 一样,无需对测试设备进行 root 处理。
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
qark --java path/to/parent/java/folder
qark --java path/to/specific/java/file.java
ReverseAPK
- 显示所有提取的文件,便于参考
- 自动将APK文件反编译为Java和Smali格式
- 分析AndroidManifest.xml以查找常见漏洞和行为
- 针对常见漏洞和行为进行静态源代码分析
- 设备信息
- 以及更多
reverse-apk relative/path/to/APP.apk
SUPER Android Analyzer
SUPER是一个命令行应用程序,可在Windows、MacOS X和Linux中使用,用于分析.apk文件以寻找漏洞。它通过解压APK并应用一系列规则来检测这些漏洞。
所有规则都集中在rules.json
文件中,每个公司或测试人员都可以创建自己的规则来分析他们需要的内容。
从下载页面下载最新的二进制文件。
super-analyzer {apk_file}
StaCoAn
StaCoAn是一个跨平台工具,可帮助开发人员、漏洞赏金猎人和道德黑客对移动应用程序进行静态代码分析。
其概念是您将移动应用程序文件(一个.apk或.ipa文件)拖放到StaCoAn应用程序上,它将为您生成一个可视化和便携的报告。您可以调整设置和单词列表以获得定制化体验。
下载最新版本:
./stacoan
AndroBugs
AndroBugs Framework 是一个 Android 漏洞分析系统,帮助开发人员或黑客发现 Android 应用程序中潜在的安全漏洞。
Windows releases
python androbugs.py -f [APK file]
androbugs.exe -f [APK file]
Androwarn
Androwarn 是一个工具,其主要目的是检测并警告用户有关 Android 应用程序可能存在的恶意行为。
检测是通过对应用程序的 Dalvik 字节码进行静态分析来完成的,该字节码表示为 Smali,使用 androguard
库。
该工具寻找**"坏"应用程序的常见行为**,例如:泄露电话标识符、拦截音频/视频流、修改 PIM 数据、执行任意代码...
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
MARA Framework
MARA 是一个Mobile Application Reverse engineering 和 Analysis Framework。它是一个工具,汇集了常用的移动应用程序逆向工程和分析工具,以帮助测试移动应用程序抵御OWASP移动安全威胁。其目标是使移动应用程序开发人员和安全专业人员更容易友好地执行此任务。
它能够:
- 使用不同工具提取Java和Smali代码
- 使用以下工具分析APK:smalisca, ClassyShark, androbugs, androwarn, APKiD
- 使用正则表达式从APK中提取私人信息。
- 分析清单。
- 使用以下工具分析发现的域:pyssltest, testssl 和 whatweb
- 通过apk-deguard.com对APK进行反混淆
Koodous
用于检测恶意软件:https://koodous.com/
代码混淆/反混淆
请注意,根据您用于混淆代码的服务和配置,秘密可能会或可能不会被混淆。
ProGuard
来自Wikipedia:ProGuard 是一个开源命令行工具,用于收缩、优化和混淆Java代码。它能够优化字节码,检测并删除未使用的指令。ProGuard是自由软件,根据GNU通用公共许可证第2版分发。
ProGuard作为Android SDK的一部分分发,并在发布模式下构建应用程序时运行。
DexGuard
在https://blog.lexfo.fr/dexguard.html找到逐步指南以对APK进行反混淆
(来自该指南)上次我们检查时,Dexguard的操作模式是:
- 将资源作为InputStream加载;
- 将结果提供给继承自FilterInputStream的类以解密;
- 进行一些无用的混淆以浪费逆向者的几分钟时间;
- 将解密结果提供给ZipInputStream以获取DEX文件;
- 最后使用
loadDex
方法将生成的DEX作为资源加载。
DeGuard
DeGuard 反转了Android混淆工具执行的混淆过程。这使得可以进行多种安全分析,包括代码检查和预测库。
您可以将混淆的APK上传到他们的平台。
Simplify
这是一个通用的Android反混淆工具。 Simplify 虚拟执行应用程序 以了解其行为,然后尝试优化代码 使其行为相同,但更容易让人理解。每种优化类型都是简单且通用的,因此不管使用了什么具体类型的混淆,都不重要。
APKiD
APKiD提供有关APK是如何制作的的信息。它识别许多编译器、打包工具、混淆工具和其他奇怪的东西。这是Android的PEiD。
手动
实验室
Androl4b
AndroL4b是一个基于ubuntu-mate的Android安全虚拟机,包括来自不同安全极客和研究人员的最新框架、教程和实验室,用于逆向工程和恶意软件分析。
参考资料
- https://owasp.org/www-project-mobile-app-security/
- https://appsecwiki.com/#/ 这是一个资源丰富的资源列表
- https://maddiestone.github.io/AndroidAppRE/ Android快速课程
- https://manifestsecurity.com/android-application-security/
- https://github.com/Ralireza/Android-Security-Teryaagh
- https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec
尚未尝试
加入HackenProof Discord 服务器,与经验丰富的黑客和漏洞赏金猎人交流!
黑客见解
参与深入探讨黑客的刺激和挑战的内容
实时黑客新闻
通过实时新闻和见解了解快节奏的黑客世界
最新公告
通过最新的漏洞赏金发布和重要平台更新保持信息更新
加入我们的 Discord 并开始与顶尖黑客合作!