iOS沙盒
iOS沙盒机制简述起来就是,iOS应用程序只能在为该程序创立的文件系统中读取文件,不能够去其余中央拜访,此区域称为沙盒,所有的非代码文件都要保留在此,如图像、图标、声音、映像以及文本文件等。
归纳起来就是以下3点:
1、每个应用程序都有本人的存储空间;2、应用程序不能翻过本人的围墙去拜访别的存储空间的内容;
3、应用程序申请的数据都要通过权限检测,如果不符合条件的话,不会被放行。
当然,越狱的iOS设施不受此束缚。
所有在iOS程序都是在沙箱环境中运行,这种隔离是由操作系统保护,并基于其余四个不同的要害组件,四个组件别离是:
Entitlements、Container、Powerbox和XPC 服务。
Entitlements
Entitlements是包含利用签名在内的一系列属性配置的列表。
为了启动其余性能,如icloud、推送告诉或Apple Pay,咱们须要给应用程序指定相应的权限。
换句话说,应用程序启动的越多,则沙盒外面的内容就越多。
Containers(容器)
咱们晓得,在iOS中,每个程序都在本人的容器中运行。
启动应用程序时,会为应用程序的过程设置两个环境变量:
HOME和CFFIXED_USER_HOME。。通过这种形式,操作系统会让利用认为本人的home目录处在iOS管制之下。
如果应用程序试图拜访真正的零碎用户主目录,沙盒会予以回绝。
Powerbox
如果应用程序试图拜访本人的沙盒以外的文件,零碎会回绝该申请。
而iOS提供了一个称为Powerbox的可信中介过程,应用程序能够调用该过程来表明本人有权拜访本人沙箱之外的某个文件。
在收到相似的拜访申请之后,零碎会提醒用户抉择哪些文件能够被利用拜访。
一旦该用户做出抉择,那么该文件被间接提供给应用程序。
XPC Services
为了容许开发者执行雷同利用组件的特权拆散,iOS启用了一种叫做XPC的过程间通信技术。
单个的XPC服务在本人的沙箱中运行,这也就意味着不同的XPC服务具备不同的权限集。
应用程序的XPC服务只能由应用程序自身拜访,而其寿命则齐全由操作系统管制。
对于越狱(倡议)
为了对应用程序进行彻底的审计,你须要对iOS设施进行越狱操作,尽管说不越狱也能进行测试,但其功力就降落了很多,甚至还会导致有些审查无奈发展(咱们会对须要越狱的局部加以标注)。
对于越狱,本文不做探讨,有趣味的看官能够参考以下地址:
http://resources.infosecinstitute.com/ios-application-security-part-1-setting-up-a-mobile-pentesting-platform/
近程 API
大部分挪动利用都依赖内部Web的API执行用户认证、同步、或者利用的本地数据备份等申请。
为了执行API测试,须要通过以下形式代理挪动应用程序申请:
在管制机上运行代理(比如说Burp)。
要设置该设施的代理申请到另一台主机,请参考官网指南(传送门)。
要在本地挪动应用程序上执行网络通信的查看列表如下:
1.与近程API的纯文本通信;2.短少SSL证书锁定;
3.SSL配置谬误。
与近程API的纯文本通信
首先查看的就是,应用程序应用SSL/TLS进行网络通讯。
如果采纳明文HTTP协定,应用程序在中间人攻打中就会变得异样软弱,一个潜在的攻击者可能截获并批改app与API的网络数据。
短少SLL证书锁定
证书锁定是将主机和预期的SSL证书或公钥相关联的过程。
在iOS设施设置为通过受控代理正确代理网络流量后,启动应用程序并尝试通过登录来生成网络流量。
如果利用回绝了这次连贯,那么证书锁定就曾经被正确设置了,相同,就可能会对挪动应用程序流量执行中间人攻打。
【须要越狱】如果证书锁定被执行了,尝试应用SSL kill Switch(一个黑盒工具,能够在iOS和OS X中组织SSL证书验证),以便更好的理解API端点和利用调用的参数。
SSL配置谬误
在挪动利用开发的过程中,开发者为了可能放慢开发过程,就可能承受任何自签名的SSL证书。
当应用程序部署在Apple Store中时,可能就会遗记对签名进行查看。
所以,子对利用进行审计时,要确保利用能够接管任何类型的自签名证书。
动态剖析
在本文中,咱们用Yelp作为例子来解说。既然是例子,那这个利用是没有任何破绽或者利用的。
抉择它,纯正是为了形容如何进行iOS应用程序的平安审计。
一个应用程序的动态剖析波及审查和撤销应用程序二进制文件。
上面是一些执行的工具和须要审计的列表:
Needle
该工具有如下性能能够失常应用:
容许应用程序二进制文件,存储,动静和动态剖析(前提是,该源代码拜访可用)。
当然,咱们还能够用它将Cycript和Frida进行hooking。
Needle由Python语言汇编而成,很容易就通过shell来启动:
python needle.py
Needle须要一些选项能力连贯到iOS设施(须要在其上运行OpenSSH服务器)。
在上面的例子中,iOS设施的IP是192.168.2.3,并且咱们须要连贯到默认SSH端口22,并应用metadata(元数据)模块提取一些根本的信息。
set IP 192.168.2.3set PORT 22use metadatarun
运行上述命令的后果,显示了应用程序在设施文件系统中的地位、反对的CPU架构以及进行审计所需的最低iOS版本等等。
/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/YelpArchitectures : armv7, arm64Platform Version : 9.3SDK Version : iphoneos9.3Minimum OS : 8.0
利用加密
[须要越狱] 家喻户晓,所有在Apple Store上的利用都受到苹果二进制加密计划的爱护(这也是为什么大家会说苹果利用比安卓利用好用的中央)。
Needle容许对利用进行解密,并拉取本地解密的IPA。
Dumpdecrypted是一个解密iOS应用程序二进制文件的好工具。
应用办法如下:
DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp
Yelp.decrypted 将会被创立.。
为了查看二进制文件反对的架构,咱们能够应用lipo命令
(lipo是一个在Mac OS X中解决通用程序(Universal Binaries)的工具):
lipo -info Yelp.decrypted
将会失去如下的后果:
Architectures in the fat file: /private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp are: armv7 arm64
在苹果中应用otool命令能够失去雷同的成果:
otool -vh Yelp.decrypted
运行otool命令失去的后果
(otool能够提取并显示iOS下指标文件的相干信息,包含头部,加载命令,动静库等,是一个弱小的剖析工具,当然也能够做反汇编工具):
Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC ARM V7 0x00 EXECUTE 116 9800 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE/private/var/mobile/Containers/Bundle/Application/2E2A51E9-B964-41B6-B360-34AD21CE2BE3/Yelp.app/Yelp (architecture arm64):Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flagsMH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 116 10584 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE
lipo也能够用于提取特定架构的可执行文件。
在本例中,将应用armv7:
lipo -thin armv7 -output Yelpv7 Yelp.decrypted
当初,我须要确认新的可执行文件只反对1个架构。
otool -vh Yelpv7
Yelpv7:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC ARM V7 0x00 EXECUTE 116 9800 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES
BINDS_TO_WEAK PIE
抓取可执行文件到本地机器:
scp root@192.168.2.3:/private/var/root/Yelpv7 .
解密过程能够通过加载应用程序手动实现,将gdb附加到过程并将未加密程序的存储器地位转储到文件夹。
当初,咱们曾经能够拜访未加密的可执行文件,但咱们不能用Hopper、IDA或者任何其余的逆向工程工具来查看它。
上面是Hopper的几个截图与之前未加密二进制文件的比照。
查看Plist文件
咱们晓得,应用程序可能会应用Plist文件来存储配置信息。
Plist是XML构造的文本文件,当拜访iOS应用程序时,要查看事件之一就是存储在plist文件中的硬编码凭证。
不须要越狱来拜访这类文件。
这里咱们又要提到另外一个工具——i-funbox,它是一款能够在任何iOS设施的沙盒中嗅探利用数据(包含plist文件)的工具。
对Keychain数据和SQL 数据库的查看
【须要越狱】iOS零碎及第三方利用都会应用Keychain来作为数据长久化存储媒介,或者利用间数据共享的渠道,有了keychain当前,利用就能够存储凭证或者是API拜访token一类的信息了。
Keychain会在数据存储到文件系统前对数据进行加密。
它是一个sqlite数据库,位于/private/var/Keychains/keychain-2.db,其保留的所有数据都是加密过的。
对设施进行越狱操作,能够让利用对存储在keychain中的数据进行无碍拜访。
而在所有工具中,Keychain-Dumper无疑是十分出众的。
顾名思义,该工具就是将所有的keychain数据转储到越狱设施。
当咱们在对一个利用进行评估时,对app在keychain中存储的信息进行查看是有必要的。
倡议应用操作系统提供的Keychain顶部的额定加密来加密存储在Keychain中的数据。
咱们晓得,在iOS中,你能够将数据存储在SQLite数据库中
(SQLite是一款轻型的嵌入式数据库),SQLite文件可在利用沙箱中数据目录中进行拜访。
默认状况下,SQLite数据库是未加密的。但如果你要对这些数据进行加密,怎么办?
SQLcipher就是一个很好的抉择。
当咱们审计一个利用时,肯定要弄清楚利用是否在SQLite中保留了数据,保留了什么类型的数据,这些数据是否曾经加密了等等。
查看HTTP缓存响应
如果应用程序应用内置的NSURLRequest来执行HTTP申请,则响应可能会被缓存在应用程序的Cache.db SQLite文件磁盘上。
它的近程API/Web服务器在响应中不返回Cache-Control头,敏感信息就可能会被存储在设施上。
值得注意的是,存储在此文件中的缓存数据并未加密。
MobFS(工具)
【须要越狱】MobFS是一个对iOS和安卓利用进行动态和动态分析的开源工具。
动态分析
动态分析包含对应用程序过程的运行时
(运行时是苹果提供的纯C语言的开发库,是一种十分牛逼、开发中常常用到的底层技术)
进行操作,以便实现以下目标:
1.绕过越狱检测;2.窃取加密密钥或敏感数据;
3.加载ViewControllers从而绕过某些管制;
4.攻打本地认证(如果存在认证);
5.拜访企业应用程序时能够进入外部网络;
6.查看自定义加密。
Instrumentation(工具)
【须要越狱】存在许多工具来执行所谓的检测,它们次要用于在运行时中批改利用。最常见的工具:
1.Cycript(是大神saurik开发的一个十分弱小的工具,能够让开发者在命令行下和利用交互,在运行时查看和批改利用); 2.Frida(Frida是一款基于python + javascript 的hook与调试框架,通杀androidioslinuxwinosx等各平台,相比xposed和substrace cydia更加便捷); 3.Cydia substrate(Cydia Substrate是一个代码批改平台。它能够批改任何主过程的代码,不论是用Java还是C/C++(native代码)编写的。); 4.GDB; 5.笼罩函数的动静连贯(LD_PRELOAD)。
Cycript
Cycript(传送门)是大神saurik开发的一个十分弱小的工具,能够让开发者在命令行下和利用交互,在iOS运行时查看和批改利用。
这个工具应用了Objective-C和JavaScript的混合模式,能够实时的和利用交互甚至批改利用。
(一种是在越狱的设施上通过MobileSubstrate加装,这样能够在所有的利用里应用;另一种是通过动态库的形式把cycript集成到本人的利用,这样做不要求越狱,当然也只能在本人的利用内应用了。)
Cycript次要是注入你关注的那个利用的线程,而后就能够取得app,取得window,缓缓去取得viewController,逐渐逐渐拨开UI的面纱。
咱们能够通过传递利用名称或PID来启动该工具:
cycript -p Yelp
一旦连贯到该过程,就能够窥探应用程序的组件了:
cy# UIApp#"<UIApplication: 0x1667a760>"cy# [UIApplication sharedApplication]#"<UIApplication: 0x1667a760>"cy# UIApp.keyWindow#"<UIWindow: 0x17bdfd70; frame = (0 0; 768 1024); gestureRecognizers = <NSArray: 0x17f14270>; layer = <UIWindowLayer: 0x17d23150>>"cy# UIApp.keyWindow.rootViewController#"<YPUITabBarViewController_iPad: 0x17c30b90>"cy# UIApp.delegate#"<YPUIApplicationDelegate_iPad: 0x1667fd30>"
有了这个,咱们就能够手动调用某办法,或者批改以后的ViewController(视图管制)等等。
在上面的示例中,咱们假如YPUIApplicationDelegate_iPad类实现了一个名为correctCredentials的办法,该办法验证用户输出的凭据,如果凭证正确,则会返回“true”。
Cycript容许在运行时中从新定义方法。在这种状况下,咱们心愿在调用该办法时始终返回“true”:
cy# YPUIApplicationDelegate_iPad.prototype['correctCredentials'] = function(){return true;}function () {return!0;}
在查看应用程序时,咱们能够在运行时中操作过程来查看能够实现什么类型的绕过。
如果很轻松就能绕开某些性能,那么这个利用设计必定是有问题的。
应用Snoop-it剖析iOS利用
【须要越狱】Snoop-it容许咱们进行运行时剖析和对iOS利用进行黑盒平安评估,它能够查看keychain中存储的数据,还能够浏览你手机上App的类的层级,并且能够查看该App中某个文件的属性和办法。
它有着相当有好的Web界面和丰盛的性能,如下图所示:
Snoop-it文件系统模块
这个模块能够监听利用对文件系统的拜访状况。
如图:
Snoop-it加密模块
该模块用于跟踪常见的加密API的调用,如图:
Snoop-it地址伪造模块
当应用程序申请设施以后的GPS坐标时,此模块容许提供假的地位。
Snoop-it硬件坑骗模块
Snoop-it反对多种运行时批改,包含批改你的硬件标识符比方Mac地址,UDID,设施模型号等等。
Snoop-it Keychain模块
这个模块次要用于跟踪keychain中的数据拜访和存储状况。
Snoop-it办法调用模块
这个模块容许应用程序在运行时调用办法。
Snoop-it办法跟踪模块
这个模块次要是用于跟踪利用执行期间办法的调用状况。
Snoop-it网络模块
这个模块次要跟踪利用对HTTP和HTTPS的调用状况。
image.gif
Snoop-it敏感API模块
你能够看到利用调用的敏感API。
比方在地址簿查找信息,拜访camera,或者拜访设施的UDID。
image.gif
Snoop-it URL模式模块
此模块显示哪种URL模式在应用程序中被应用。
IDB
【须要越狱】IDB是另外一款弱小的开源工具,用Ruby语言编写而成。
虽说不像Snoop-it那样,能够间接调用办法,它还是有着本人的特色性能,比方查看系统日志和粘贴板,含糊URL计划等。
IDB利用信息
追踪剖析利器introspy-ios / introspy-analyzer
【须要越狱】Introspy由ISEC partners开发,Introspy由两个独自的模块组成,一个追踪器,一个分析器。
它是剖析iOS应用程序平安的最弱小工具之一。
introspy-ios有助于主动执行应用程序的运行时剖析,而且还能够发现潜在的平安威逼。
Introspy-ios hook并查看被利用调用的敏感API,它将后果存储在设施的本地SQLite数据库中。
Introspy-Analyzer是一个帮忙格式化跟踪器数据并生成HTML报告的工具。
上面是将工具嵌入Yelp应用程序的示例。
Snapshot
当利用在后盾运行时,只需通过Home键就能够对以后屏幕进行截屏,截屏照片会保留下来。
当咱们在对利用进行审计时,有必要查看该利用是否会展现敏感信息。
如果有显示敏感信息的状况,将程序搁置在后盾并对iOS的截图进行查看。
如果这台设施曾经被越狱了,则能够通过后面介绍的Needle来进行雷同的测试,并且用Needle会主动下载截图。
否则,就只能用i-funbox从应用程序沙盒目录中手动寻找该文件了。
越狱检测
【须要越狱】作为深度的平安测量,应用程序可能会对设施施行越狱检测,如果没有通过越狱检测,则会回绝运行。
如果检测到有敏感数据存储在设施上,应用程序就会革除这些敏感数据(前提是该设施曾经被越狱了)。
在审查应用程序时,有必要查看是否执行越狱检测以及执行带来的结果。
防调试爱护
【须要越狱】作为另一种深度的平安测量,应用程序可能会检测到它正处于调试模式,并且还连贯到了调试器(如GDB),并失常进行运行。
即便经验丰富的人能绕过这类防护形式,对于教训少甚至无教训的人来说,他们只能望洋兴叹,另寻前途了。
键盘缓存
【须要越狱】咱们晓得,在iOS应用程序中输出字段时,数据会被缓存并且进行主动更正,当然,明码类型的文件和特定字符串除外。
咱们在对利用进行审计时,尤其要留神哪些数据存储在缓存中。
缓冲区溢出/格式化字符串/内存损坏
iOS利用很可能会受到内存损坏破绽攻打,比方缓冲区溢出和字符串格式化等。
在咱们做审计时,含糊用户输出和查看应用程序解体都是值得尝试的,通过这些查看,咱们可能会发现这些利用是容易被攻打的。
如果测试设施曾经越狱,则能够通过调试伎俩做进一步的解体剖析。
查看原文