本章将查看 Android 应用程序或.apk并了解其不同的组件。我们还将使用工具(如 Apktool,dex2jar 和 jd-gui)逆向应用程序。通过逆向和分析源代码,我们将进一步学习如何找到 Android 应用程序中的各种漏洞。我们还将使用一些静态分析工具和脚本来发现和使用它们。
3.1 Android 拆解应用程序
Android 应用程序是在开发应用程序时创建的数据和资源文件的归档文件。Android 应用程序的扩展名是.apk,在大多数情况下,应用程序包包包括以下文件和文件夹:
- Classes.dex(文件)
- AndroidManifest.xml(文件)
- META-INF(文件夹)
- resources.arsc(文件)
- res(文件夹)
- assets(文件夹)
- lib(文件夹)
我们可以使用任何归档管理器应用程序(如 7zip,WinRAR 或任何首选应用程序)简单解压缩应用程序。Linux 或 Mac 上,我们可以简单地使用它unzip如下截图所示:
我们在这里使用-l(list)为了简单地显示压缩包的内容,而不是解压。我们也可以使用它file命令检查它是否是一个有效的压缩袋。
Android 应用程序由各种组件组成,共同创建工作应用程序。这些组件是活动、服务、广播接收器、内容供应商和共享的首选。在继续之前,让我们快速浏览这些不同的组件:
- 活动(Activity):这些是用户可以与之互动的视觉界面。这些可以包括按钮、图像、TextView或其他可视组件。
- 服务(Service):这些 Android 组件在后台运行,并执行开发人员指定的具体任务。这些任务可以包括 HTTP 下载文件,在后台播放音乐。
- 广播接收器(Broadcast Receiver):这些是 Android通过 Android 系统或设备中的其他应用程序监控广播新闻。一旦他们收到广播新闻,他们可以根据预定的条件触发特定的动作。条件可以是收到 SMS,呼叫、电量变化等。
- 共享首选项(Shared Preference):为了为应用程序保存小数据集,应用程序使用这些首选。该数据存储在名称中shared_prefs文件夹。这些小数据集可以包括名值对,如游戏中的用户评分和登录凭证。不建议在共享首选中存储敏感信息,因为它们很容易被数据窃取和泄露。
- 意图(Intent):这两个或两个以上不同的 Android 组件绑定在一起。意图可用于执行启动动作、切换活动和启动服务等各种任务。
- 内容供应器(Content Provider):这些组件用于访问应用程序使用的结构化数据集。应用程序可以使用内容供应器访问和查询自己的数据或存储在手机中的数据。
现在我们知道 Android 我们可以继续逆向 应用程序的内部结构和组成Android 应用程序。.apk这是获取可读源代码和其他数据源的方法。
3.2 逆向 Android 应用
正如我们前面讨论的,Android应用程序只是数据和资源的归档文件。即便如此,我们也不能简单地解决压缩归档包(.apk)获取可读源代码。在这种情况下,我们必须依赖字节代码(例如classes.dex中)转换为可读源代码的工具。
一种将字节码转换为可读文件的方法是使用一个名称 dex2jar 的工具。.dex文件是由 Java 字节码转换的 Dalvik 字节码优化和高效移动平台。这个免费工具只是 Android 存在于应用程序中.dex文件转换为相应的.jar请遵循以下步骤:
在右窗格中,我们可以看到 Java 应用程序的 Java 源代码和所有方法。请注意,重新编译过程将为您提供原始 Java 源代码的近似版本。在大多数情况下,这并不重要; 然而,在某些情况下,您可能会看到转换.jar文件中缺少一些代码。此外,如果应用程序开发人员使用防止反编译的保护,如 proguard 和 dex2jar,使用 dex2jar 或 Apktool 反编译应用程序时,我们看不到准确的源代码; 相反,我们会看到一堆不同的源文件,这不是原始源代码的准确表示。
3.3 使用 Apktool 逆向 Android 应用
另一种逆向 Android应用程序的方法是将.dex文件转换为 smali 文件。smali 是一种语法和称为 的文件格式Jasmine 语言相似。我们现在不会对 有深入的了解smali 文件格式。欲了解更多信息,请参阅在线 wikihttps://code.google.com/p/smali/wiki为了深入了解 smali。
一旦我们下载 Apktool 并配置它。根据前一章的指示,我们都做了进一步的准备。JD-GUI 相比,Apktool 的主要优点是它是双向的。这意味着如果你编译一个应用程序并修改它,然后使用 Apktool 重新编译,可以完美重新编译,生成新的.apk然而,文件。dex2jar 和 JD-GUI 不能做类似的功能,因为它提供类似的代码,而不是准确的代码。
因此,使用 Apktool 我们需要做的是反编译应用程序.apk文件与 Apktool 二进制文件一起传递给命令行。反编译一旦完成,Apktool 将使用应用程序名称创建一个新的文件夹,其中会存储所有的文件。为了反编译,我们只需调用apktool d [app-name].apk。这里,-d标志表示反编译。
在下面的屏幕截图中,我们可以看到使用 Apktool 反编译应用程序:
现在,如果我们进入 smali 文件夹,我们会看到一堆不同的 smali 文件包括在开发应用程序时编写的 文件Java 代码。在这里,我们还可以打开文件,更改一些值,并使用 Apktool 再次构建它。为了从 smali 构建变更应用程序,我们将使用 Apktool 中的b(build)标志。
apktool b [decompiled folder name] [target-app-name].apk但是,为了反编译、修改和重新编译应用程序,我个人建议使用另一个名称 Virtuous Ten Studio(VTS)工具Apktool 类似功能的唯一区别是 VTS 提供了一个美丽的图形界面,使其相对容易使用。该工具的唯一限制是它只在 Windows 在环境中运行。我们可以从官方下载链接http://www.virtuous-ten-studio.com/下载 VTS。以下是同一项目应用的屏幕截图:
3.4 审计 Android 应用
Android 应用程序通常包含许多安全漏洞,主要是由于开发人员的错误和对安全编码实践的忽视。本节将讨论 Android 应用程序的漏洞,以及如何识别和使用它们。
内容供应器泄漏
许多应用程序使用内容供应器来存储和查询应用程序中的数据或来自电话的数据。任何其他应用程序都可以使用应用程序定义的内容供应器来访问应用程序的数据,除非定义内容提供商可以使用访问权限。所有内容供应商都有唯一的统一资源标识符(URI)为了识别和查询。内容提供商 URI 命名标准的惯例是content://开始。
如果 Android API 如果版本低于 17,则内容供应器的默认属性始终导出。这意味着任何应用程序都可以使用应用程序的内容供应器来访问和查询数据,除非开发人员指定权限。所有内容供应商都需要AndroidManifest.xml注册。因此,我们可以使用 Apktool,并通过查看AndroidManifest.xml文件检查内容供应器。
定义内容供应器的一般方法如下:
<provider android:name="com.test.example.DataProvider" android:authorities ="com.test.example.DataProvider"></provider>因此,现在,我们将举一个漏洞应用程序的例子,并尝试使用内容供应商来泄漏漏洞:
3.5 存储不安全文件
一般来说,当开发人员为应用程序存储数据时,没有指定文件的正确文件权限。这些文件有时被标记为全局可读性,可以在没有请求权限的情况下访问任何其他应用程序。
为了检查漏洞,我们需要做的是访问adb shell,之后使用cd进入/data/data/[package name of the app]。
如果我们在这里做一个简单的事情ls -l,您可以看到文件和文件夹的文件权限:
# ls -l /data/data/com.aditya.example/files/userinfo.xml -rw-rw-rw- app_200 app_200 22034年 220342013-11-07 00:01 userinfo.xml我们可以在这里使用find搜索权限。
find /data/data/ -perm [permissions value]若我们执行cat userinfo.xml,它存储用户名和密码。
#grep 'password' /data/data/com.aditya.example/files/userinfo.xml <password>mysecretpassword</password>这意味着任何其他应用程序也可以查看和窃取用户的机密登录凭证。这个漏洞可以通过在开发应用程序时指定正确的文件权限,并计算密码和盐的列来避免。
目录或本地文件包含漏洞
顾名思义,应用程序中的路径遍历漏洞允许攻击者使用漏洞应用程序的供应器读取其他系统文件。
这个漏洞也可以使用我们之前讨论的工具 Drozer 检查。在这里,我们用例子来解释 Seafastian Guerrero 发现的 Adobe Reader Android 应用程序漏洞(http://blog.seguesec.com/2012/09/path-traversal-vulnerability-on-adobe-reader-android-application)。 存在这个漏洞Adobe Reader 10.3.1 中,并在以后的版本中修复。你可以从http://androiddrawer.com下载各种 Android 旧版本的应用程序。
我们将开始 Drozer,并运行app.provider.finduri模块搜索内容供应器 URI。
dz> run app.provider.finduri com.adobe.readerScanning com.adobe.reader...content://com.adobe.reader.fileprovider/content://com.adobe.reader.fileprov一旦我们 URI,我们现在可以用了app.provider.read搜索和使用包含漏洞的本地文件。在这里,我试着从系统中读取一些文件,比如/etc/hosts和/proc/cpuinfo,它们默认存在于所有的 Android 实例是基于 Linux 文件系统。
dz> run app.provider.read content://com.adobe.reader.fileprovider/../../../../etc/hosts 127.0.0.1 localhost正如我们在下面的屏幕截图中看到的,我们已经成功地使用了 Adobe Reader 漏洞内容供应器读取 Android 文件系统中的文件。
客户注入攻击
客户攻击通常发生在未检查用户输入的应用程序中。例如,在 SQLite 数据库的查询期间,应用程序正在解析用户输入,因为它位于查询语句中。
让我们举一个应用程序的例子,检查本地 SQLite 数据库根据登录凭证验证用户。因此,当用户提供用户名和密码时,正在运行的查询如下:
SELECT * FROM 'users' where username='user-input-username' and password='user-input-password'现在,在正常情况下,这将正常工作,用户输入其真正的登录凭证,并根据条件返回查询true或false。
SELECT * FROM 'users' where username='aditya' and password='mysecretpass但是,如果攻击者输入 SQL 语句而非正常用户名怎么办? 请参考以下代码:
SELECT * FROM 'users' where username='1' or '1' = '1' - - and password='mysecretpassword因此,即使用户不知道用户名和密码,他们也可以使用1'or'1'=‘1查询很容易绕过它,在所有情况下都会返回true。因此,应用程序开发人员必须对用户输入进行适当的检查。
也可以用 Drozer 的app.provider.query来利用 SQL 注入漏洞。它的语法看起来像:
run app.provider.query [Content Provider URI] --projection "* FROM SQLITE_MASTER WHERE type='table';- -"现在,这将返回 SQLite 存储在数据库中整个表的列表中的信息SQLITE_MASTER你也可以继续和执行更多的 SQL 查询,从应用程序中提取更多信息。Drozer 利用实战漏洞,可以从https://www.mwrinfosecurity.com/products/drozer/community-edition/下载他们的漏洞应用程序。
3.6 OWASP 移动 Top10
Web 应用程序开放安全项目(OWASP)它是安全和漏洞搜索的标准之一。它还发布了前 10 名漏洞的列表,包括各种平台中最常见和最重要的漏洞。
可以在https://www.owasp.org/index.php/Projects/OWASP_Mobile_Security_Project_-_Top_Ten_Mobile_Risks上找到 OWASP 移动版前 10 指南。如果我们查看 OWASP 移动项目,以下是 10 移动应用的安全问题:
- 服务端弱控制
- 数据存储不安全
- 传输层保护不足
- 意外数据泄漏
- 缺乏授权和认证
- 无效的加密
- 客户端注入
- 通过不可信输入的安全决策
- 会话处理不当
- 缺乏二进制保护
让我们逐一介绍它们,快速了解它们在移动应用程序中的关系,以及我们如何检测它们:
弱控制服务端
第一个 OWASP 漏洞是服务器的弱控制。顾名思义,服务器不安全地将数据从移动应用程序发送到服务器,或在发送数据时暴露一些敏感 API。例如,考虑一个 Android 应用程序将登录凭证发送到服务器进行身份验证,而不验证输入。攻击者可以以这种方式修改凭证,以访问服务器的敏感或未经授权的区域。该漏洞可视为移动应用程序和 Web 应用程序中的漏洞。
数据存储不安全
这只意味着用户可访问的方式存储相关信息。Android 共享应用程序的首选,SQLite存储与用户相关的私人信息或应用程序信息(纯文本格式)或外部存储器。开发人员应始终记住,即使应用程序在数据文件夹(/data/data/package-name)只要手机已经 root,恶意应用程序/攻击者可以访问它。
传输层保护不足
许多 Android 开发人员依赖于通过不安全的网络发送数据,如 HTTP 或未正确实现 SSL 的形式。这使得应用程序容易受到网络上所有不同类型的攻击,如流量拦截、从应用程序向服务器发送数据时的操作参数以及修改响应访问应用程序的锁定区域。
意外数据泄漏
当应用程序将数据存储在易受攻击的位置时,就会出现这个漏洞。这些可能包括剪贴板,URL 缓存,浏览器 Cookie,HTML5DataStorage,统计数据等。例如,用户登录他们的银行应用程序,他们的密码已经复制到剪贴板上。现在,即使是恶意应用程序也可以访问用户剪贴板中的数据。
缺乏授权和认证
如果 Android 如果没有适当的安全措施,尝试基于客户端检查验证或授权用户,这些应用程序最容易受到攻击。应该注意的是,一旦手机已经 root,攻击者可以绕过大多数客户端保护。因此,建议应用程序开发人员使用服务器验证和授权进行适当的检查。一旦验证成功,请使用随机生成的令牌来验证移动设备上的用户。
无效的加密
这只意味着使用不安全的密码函数来加密数据部分。这可能包括一些已知的漏洞算法,如 MD5,SHA1,RC2,定制算法甚至没有适当的安全措施。
客户端注入
这在Android主要原因是使用 SQLite 数据存储。我们将在本书的每一章中注入攻击。
通过不可信输入的安全决策
在移动应用程序中,开发人员应始终过滤和验证用户提供的输入或其他相关输入,不应像在应用程序中那样使用。不可信的输入通常会导致其他安全风险,如客户注入。
会话处理不当
开发人员在会话处理移动应用程序时,需要处理许多因素,如认证 cookie 正常过期,创建安全令牌,cookie 生成和轮换,以及后端会话无效。必须在 Web 应用程序和 Android 在应用程序之间保持正确的安全同步。
缺乏二进制保护
这意味着应用程序不能正确地反向或反编译。Apktool 和 dex2jar 等工具可用于反向 Android 如果应用程序不遵循正确的开发实践,它将暴露应用程序的各种安全风险。为了防止反向攻击分析应用程序,开发人员可以使用 ProGuard 和 DashO 等工具。
总结
本章学会了用各种方法逆转 Android 应用程序并分析源代码。我们还学习了如何修改源代码,然后重新编译应用程序,以避免一些保护。此外,我们还看到了如何使用 Drozer找 等工具Android 应用程序中的漏洞。你还可以通过http://labs.securitycompass.com/exploit-me/亲自尝试 Exploit-Me 实验室中的各种漏洞,由 Security Compass 开发。
在下一章中,我们将进一步尝试 Android 在我们的渗透测试中拦截应用程序的流量。