碳基体

奋斗在产品安全第一线的安全妹子

Mercury(Android APP 应用安全评估框架 )安装、启动及使用


Mercury 是一款优秀的开源Android APP应用安全评估框架,它最赞的功能是可以动态的与android设备中的应用进行IPC(组件通信)交互。

一、安装与启动

1. 安装 

(1)windows安装

第一步:下载Mercury 2.2.2 (Windows Installer) 


第二步:在Android设备中安装agent.apk

adb install agent.apk

(2)*inux安装(Debian/Mac)

apt-get install build-essential python-dev python-setuptools

以下步骤mac也适合

easy_install --allow-hosts pypi.python.org protobuf==2.4.1

easy_install twisted==10.2.0 (为了支持Infrastructure模式)

wget https://labs.mwrinfosecurity.com/assets/415/mercury-2.2.2.tar.gz

tar zxvf mercury-2.2.2.tar.gz

easy_install mercury-2.0.0-py2.7.egg


2. 启动

有三种方式

(1)USB方式的

第一步:在PC上使用adb进行端口转发,转发到Mercury使用的端口31415

adb forward tcp:31415 tcp:31415

第二步:在Android设备上开启Mercury Agent

选择embedded server-enable

 

第二步:在PC上开启Mercury console

mercury.bat console connect

 

(2) WIFI方式的

第一步:在Android设备上开启Mercury Agent

选择embedded server,启用enable


第二步:在pc上将server的ip地址设置为Android设备的ip地址来开启Mercury console

mercury console connect --server <Android设备的ip:port>

(3) Infrastructure Mode

这种模式涉及到三个通信方,mercury server、mercury agent(Android 设备中)与mercury console。

其中server与agent,server与console需要网络互通。这种模式的好处是你不需要知道android设备的ip,agent与console的ip段可以隔离的,并且可以支持一个server对应多个设备的操作。


第一步:在pc上开启Mercury console服务端

mercury server

  第二步: 在Android设备上新建一个New Endpoint,修改配置Host为mercury server的ip(上一步PC机的ip),启用该Endpoint


第三步:开启控制台

mercury console connect --server < serverip:port>

 

二、使用

通过Mercury console就可以进行操作了,和msf蛮像的,以下是常用的一些命令


1. 列出目前可用的模块

mercury> list (也可以使用ls)
app.activity.forintent      Find activities that can handle the given intent

app.activity.info           Gets information about exported activities.

app.activity.start          Start an Activity

app.broadcast.info          Get information about broadcast receivers

app.broadcast.send          Send broadcast using an intent

2.查看指定模块的帮助信息

mercury> help app.activity.forintent
usage: run app.activity.forintent [-h] [--action ACTION] [--category CATEGORY]
               [--component PACKAGE COMPONENT] [--data-uri DATA_URI]
               [--extra TYPE KEY VALUE] [--flags FLAGS [FLAGS ...]]
               [--mimetype MIMETYPE]

Find activities that can handle the formulated intent

Examples:
Find activities that can handle web addresses:

    mercury> run app.activity.forintent
                --action android.intent.action.VIEW
                --data https://www.google.com

    Package name: com.android.browser
    Target activity: com.android.browser.BrowserActivity

Last Modified: 2012-11-06
Credit: MWR InfoSecurity (@mwrlabs)
License: MWR Code License

optional arguments:
  -h, --help
  --action ACTION       specify the action to include in the Intent
  --category CATEGORY   specify the category to include in the Intent
  --component PACKAGE COMPONENT
                        specify the component name to include in the Intent
  --data-uri DATA_URI   specify a Uri to attach as data in the Intent
  --extra TYPE KEY VALUE
                        add an field to the Intent's extras bundle
  --flags FLAGS [FLAGS ...]
                        specify one-or-more flags to include in the Intent
  --mimetype MIMETYPE   specify the MIME type to send in the Intent



3. 运行指定模块

(1)例如列出android设备中安装的app

mercury> run app.package.list
android
berserker.android.apps.sshdroid
cn.wps.moffice_eng
com.alipay.android.app
com.android.GPStestSvc
com.android.backupconfirm

(2)例如查看指定app的基本信息(以com.android.browser为例)

mercury> run app.package.info -a com.android.browser
Package: com.android.browser
  Process Name: com.android.browser
  Version: 4.1.1-JLB17.0
  Data Directory: /data/data/com.android.browser
  APK Path: /system/app/Browser.apk
  UID: 10004
  GID: [3003, 1015, 1028]
  Shared Libraries: null
  Shared User ID: null
  Uses Permissions:
  - android.permission.ACCESS_COARSE_LOCATION
  - android.permission.ACCESS_DOWNLOAD_MANAGER
  - android.permission.ACCESS_FINE_LOCATION
  - android.permission.ACCESS_NETWORK_STATE
  - android.permission.ACCESS_WIFI_STATE
  - android.permission.GET_ACCOUNTS
  - android.permission.USE_CREDENTIALS
  - android.permission.INTERNET
  - android.permission.NFC
  - android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
  - android.permission.SET_WALLPAPER
  - android.permission.WAKE_LOCK
  - android.permission.WRITE_EXTERNAL_STORAGE
  - android.permission.WRITE_SETTINGS
  - android.permission.READ_SYNC_SETTINGS
  - android.permission.WRITE_SYNC_SETTINGS
  - android.permission.MANAGE_ACCOUNTS
  - android.permission.READ_PROFILE
  - android.permission.READ_CONTACTS
  - com.android.browser.permission.READ_HISTORY_BOOKMARKS
  - com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
  - com.android.launcher.permission.INSTALL_SHORTCUT
  - android.permission.READ_EXTERNAL_STORAGE
  Defines Permissions:
  - com.android.browser.permission.PRELOAD

(3)与组件交互

Mercury最有用的的功能是协助调试IPC机制,操纵APP的IPC组件(包括Activity,Broadcast receivers,Content providers与Services)。Mercury的app.{activity|broadcast|provider|service}.xx模块可以提供这些功能.


a. 列出APP中的activity组件(以com.android.browser为例)

mercury> run app.activity.info -a com.android.browser
Package: com.android.browser
  com.android.browser.BrowserActivity
  com.android.browser.MiuiShortcutActivity
  com.android.browser.BrowserPreferencesPage
  com.android.browser.BookmarkSearch
  com.android.browser.AddOrEditBookmarkActivity
  com.android.browser.widget.BookmarkWidgetConfigure


b. 开启一个activity,例如运行浏览器打开谷歌页面

mercury> run app.activity.start --action android.intent.action.VIEW --data-uri https://google.com/

c. 查找可以读取的Content Provider

mercury> run scanner.provider.finduris -a com.sina.weibo
Scanning com.sina.weibo...
Able to Query    content://mms
Unable to Query  content://calendar/events
Unable to Query  content://com.sina.weibo.blogProvider/query/home
Able to Query    content://mms/
Unable to Query  content://telephony/apgroups/
Able to Query    content://sms
Unable to Query  content://com.sina.weibo.blogProvider/insert/im
Unable to Query  content://icc/adn
Unable to Query  content://com.sina.weibo.blogProvider/delete/allim/
Unable to Query  content://com.sina.weibo.blogProvider/query/im/
Unable to Query  content://calendar/calendars
Unable to Query  content://com.sina.weibo.blogProvider/
Able to Query    content://com.android.contacts/contacts/
Unable to Query  content://calendar/events/
Able to Query    content://telephony/carriers/preferapn/
Able to Query    content://telephony/carriers/
Able to Query    content://com.android.contacts/contacts
Unable to Query  content://com.android.launcher2.settings/favorites?notify=true/

d. 读取指定Content Provider内容

mercury#> run  app.provider.query content://settings/secure --selection "name='adb_enabled'"
| _id | name        | value |
| 66  | adb_enabled | 1     |

e. 待实现的功能使用Message或Android Interface Description Language 与service组件交互,可参考https://github.com/mwrlabs/mercury/wiki
(4)文件操作

列出指定文件路径里全局可写/可读的文件

mercury> run scanner.misc.writablefiles --privileged /data/data/com.sina.weibo
Discovered world-writable files in /data/data/com.sina.weibo:
  /data/data/com.sina.weibo/shared_prefs/push_settings.xml
  /data/data/com.sina.weibo/shared_prefs/speed_test.xml
mercury> run scanner.misc.readablefiles --privileged /data/data/com.sina.weibo
Discovered world-readable files in /data/data/com.sina.weibo:
  /data/data/com.sina.weibo/lib/libutility.so
  /data/data/com.sina.weibo/shared_prefs/push_settings.xml
  /data/data/com.sina.weibo/shared_prefs/speed_test.xml
  /data/data/com.sina.weibo/shared_prefs/com.sina.weibo_preferences.xml
  /data/data/com.sina.weibo/app_outtmp/private.dex

(5)shell操作

mercury> run shell.start
u0_a80@android:/data/data/com.mwr.droidhg.agent $ su
u0_a80@android:/data/data/com.mwr.droidhg.agent # pwd
/data/data/com.mwr.droidhg.agent

(6)安装busybox

mercury> run tools.setup.busybox

(7) 通过web的方式查看content provider组件的相关内容  

mercury#> list auxiliary
auxiliary.webcontentresolver
                            Start a web service interface to content providers. 

mercury#> help auxiliary.webcontentresolver
usage: run auxiliary.webcontentresolver [-h] [-p PORT]

Start a Web Service interface to Content Providers. This allows you to use web
application testing capabilities and tools to test content providers.

Examples:
mercury> run auxiliary.webcontentresolver --port 8080

    WebContentResolver started on port 8080.
    Ctrl+C to Stop

Last Modified: 2012-11-06
Credit: Nils (@mwrlabs)
License: MWR Code License

optional arguments:
  -h, --help
  -p PORT, --port PORT  the port to start the WebContentResolver on
mercury#> run auxiliary.webcontentresolver
WebContentResolver started on port 8080.
Ctrl+C to Stop
1.0.0.127.in-addr.arpa - - [25/Jul/2013 00:09:19] "GET / HTTP/1.1" 200 -
1.0.0.127.in-addr.arpa - - [25/Jul/2013 00:09:30] "GET /favicon.ico HTTP/1.1" 200 -

 在console所在系统浏览器中访问



参考:

https://labs.mwrinfosecurity.com/tools/2012/03/16/mercury/documentation/

来源:碳基体

iOS与Android的一些区别

前言

总结了在做iOS与Android安全研究时,需要了解的区别。包括系统架构的区别,安装包的区别,文件系统的区别,二进制文件的区别,安全机制的区别与版权保护的区别



一、系统架构的区别(左边iOS,右边Android)


1.iOS架构

分为4层,分别为

(1)cocoa Touch层:包括Foundation Framework,UIkit Framework,Address Book UI Framework

(2)媒体层:包括图像(Quartz,Core Animation,OpenGL ES),音频(Core Audio,OpenAL)和视频技术

(3)核心服务层:例如CoreFoundation.framework是基于C语言的接口集,提供应用的基本数据管理和服务功能;CFNetwork.framework是一组高性能的C语言接口集,提供网络协议的面向对象的抽象。开发者可以使用CFNetwork框架操作协议栈,并且可以访问底层的结构如BSD sockets等;Security.framework提供管理证书,公钥/私钥对和信任策略等的接口来确保应用数据的安全性

(4)核心OS层: 基于Mac操作系统


2.Android架构

分为4层,分别为

(1)应用程序:使用java编写

(2)应用程序框架:

  • 活动管理器:用来管理应用程序生命周期并提供常用的导航回退功能

  • 资源管理器:提供非代码资源的访问,如本地字符串、图形和布局文件

  • 内容提供器:用来存放和获取数据并使用这些数据可以被所有应用程序访问

  • XMPP服务器:基于XML的网络实时通讯协议

(3)系统运行库+Android运行时

系统运行库:android包括一些c/c++库,这些库能被android系统中的不同的组件使用,例如libc是一个从BSD继承来的标准c系统函数库;webkit为Web浏览器引擎,支持Android浏览器(苹果Safari的引擎也是webkit)。SQLite为功能强劲的轻量级关系数据库引擎(iOS也是采用的该数据库引擎)。

Android运行时:包括核心库(基本类库,例如data structure,network,file system等),很多实现代码都来自Apache Harmony项目,主要目的时保证虚拟机的类库能够与Java SE类库最大程度的兼容)与Dalvik虚拟机(用于运行dex:dalvik executable格式二进制可执行文件,该虚拟机较之java虚拟机的最大区别是Dalvik基于寄存器)

(4)linux内核:基于linux 2.6内核


总的来说,如果要深层次挖掘Android的漏洞就要明白linux内核安全,如果要挖身深层次挖掘iOS的漏洞就要了解Mac内核安全(BSD内核安全)。

二、安装包的区别(左边iOS,右边Android)

 总的来说,安装包由可执行文件,资源文件,签名文件,配置文件组成。


 三、文件系统的区别(左边iOS,右边Android)

注意: android的sdcard是不受文件访问控制约束的


四、二进制文件的区别

1. iOS二进制文件格式

mach-o , dylib

 

2.Android二进制文件的区别

dex, so(ELF shared object)


五、安全机制的区别

1. iOS安全机制

(1)安全沙箱

进程隔离,每个程序都有自己的虚拟地址空间。应用程序在安装之后,系统就通过计算得到一个标识,然后基于应用程序的根目录和这个标识构件一个指向应用程序目录的路径,其他应用程序都不能进行访问。iOS 的沙箱是基于TrustBSD策略框架的内核扩展模块,针对每个进程都可以制定特殊的沙箱配置文件,沙箱配置文件编译后以2进制的方式保存在KernelCache文件中(iOS下),需反汇编成可读的文本格式来查看内核中的沙盒规则


(2)代码签名

apple需要所有开发人员对自己的iPhone应用程序使用数字签名技术。这个签名用来标识应用程序的开发者以及保证应用程序在签名之后不被更改和损坏。开发者证书由apple提供(这是与android最大的区别,android是自签名),有以下两类证书:

Developer Certificate:用于本机测试

Distribution Certificate:Ad-hoc用于100台设备以内的测试和共享;app store用于发布应用程序

所有的可执行文件、库文件都需要Apple签名后才可以运行在iOS中,内核会在调用execve之前检测Mach-o文件中的LC_CODE_SIGNATURE段是否有效和可信任的,iOS启动的时候同样也会检测KernelCache的签名是否有效

代码签名的破坏可见《iOS平台游戏安全之IPA破解原理及防御

(3)ASLR(address space layout randomisation)/DEP


PIE: position independent executable


iOS 4.3后开始支持该功能,iOS上的预装应用都开启了该功能

 

ASLR的其他信息可见《ASLR


 

DEP(Data execution Prevention),内核不允许将页面保护标志设置为RWS,并在ARMv6引入XN(execute never)标志位,从而在硬件上支持执行保护。


(4)文件系统加密

 

Data protection APIs

NSFileProtectionNone

NSFileProtectionComplete

NSFileProtectionCompleteUnlessOpen

NSFileProtectionCompleteUntilUserAuthentication

KSecAttrAccessibleAlways

KSecAttrAccessibleWhenUnlocked

KSecAttrAccessibleAfterFirstUnlock

KSecAttrAccessibleAlwaysThisdeviceOnly

KSecAttrAccessibleWhenUnlockedThisDeviceOnly

KSecAttrAccessibleAfterFirstUnlockThisDeviceOnly


2.Android安全机制

(1)安全沙箱

每一个Android应用程序(apk文件)会在安装时分配一个独有的linux用户ID(即一个用户id识别一个应用程序),这就为它建立了一个沙箱,使其不能与其他应用程序进行接触。这个用户ID在安装时分配,并在该设备上一直保持同一个数值。所有存储在应用程序中的数据都会赋予该应用程序的用户ID,使其他应用程序无法访问这些数据(如需要访问,见(4)文件访问控制)。


(2)代码签名

采用自签名机制,不需要权威机构签名和审核,完全由用户自行判断是否信任该程序(与iOS区别很大)。签名是为了:

  • 识别代码的作者

  • 检测应用程序是否发生了变化

  • 在应用程序之间建立信任:使用相同数字签名签署的两个应用程序可以相互授予权限来反问基于签名的API,如果他们共享用户ID,那么也可以运行在同一进程中,从而允许访问对方的代码和数据(见(4)文件访问控制)。

代码签名的详细机制可见《Android签名与签名校验


(3)manifest权限管理

Android要求用户在使用API时进行申明,称为permission,对一些敏感API的使用在安装时就可以给用户风险提示,由用户确定是否安装,例如READ_CONTACTS为读取通讯录数据权限。权限在AndroidManifest.xml文件里进行设置,通过<manifest../>元素添加<uses-permission.../>子元素,如下图所示


 

permission分为4个保护等级:normal,dangerous,signature,signatureorsystem。不同的保护级别代表程序要使用此权限时的认证方式。

normal:只要申请就可以使用

dangerous:在安装时需要用户确认才可以使用,最经常使用的权限

signature:告诉android系统这个权限只能授予拥有同样数字签名并且定义了该权限的应用程序

signatureorsystem:需要开发者的应用和系统使用同一个数字证书,即需要系统或者平台签名,真实手机中的系统签名只有厂商知道


应用程序也可以定制权限以保护自己的资源,当前ita应用程序想要访问一个应用程序的受保护资源时,就必须通过它们自己的manifest文件请求适当的权限

 

(4)文件访问控制

因为安全沙箱的存在导致不同应用程序之间的数据(文件)是隔离的。在通过

getSharedPreferences(filename,operatingMode)

openFileOutput(filename,operatingMode)

openOrCreateDatabase(filename,operatingMode, SQLiteDatabase.CursorFactory)

等方法来创建一个新文件时,可以通过指定文件的存储方式operationMode来进行文件的访问控制,android文件存储有以下4种方式:

Context.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容

Context.MODE_APPEND:代表该文件是私有数据,只能被应用本身访问,在该模式下,会检查文件是否存在,存在就往文件追加内容,否则就创建新文件

Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取

Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。


除了使用Context.MODE_WORLD_READABLE/Context.MODE_WORLD_WRITEABLE标识位来使两个程序相互访问对方的资源。还可以通过设置AndroidManifest.xml文件的manifest标签中的sharedUserId属性,来使得不同的应用程序共用同一个用户ID,并且这些应用程序还使用同一个签名签署,在满足以上两个条件(共同的sharedUserID,共同的签名)的情况下就可以实现不同应用程序相互资源的访问了,如下图所示


 

(5)ASLR

android 4.1后才开始支持完整版功能


六、版权保护的区别

1. iOS

App store,采用FairPlay DRM保护商店下载应用

2. Android

(1)google play store,采用Android License Verification Library保护商店下载应用

(2)Amazon Appstore DRM

(3)其他


参考:

《移动互联网之智能终端安全揭秘》Android与iOS章

来源:碳基体