*本文原创作者: 薛定谔的大表哥 , 本文属CodeSec原创奖励计划,未经许可禁止转载
0×00前言App安全审计对于安全人员是一项苦逼的工作,但对于厂商却非常重要,因为App属于客户端产品,一旦出现漏洞由于更新推送需要时间、且新版本更新率等原因,导致其不能像服务端程序那样很短时间内修复,对于App的漏洞应该尽量控制在发布之前发现并解决。
目前世面已有的漏洞扫描工具还远没有达到替代人工审计的地步,无法解放劳动力;然而App安全审计经常需要安全人员在手机端和pc端来回切换操作,造成大量而又毫无意义的重复劳动,如果没有积累、没有总结就会让这项工作变得无味,而且对审计人员的能力提升非常小。
年底,我写了个iOS App审计工具,用于辅助人工审计,这个工具不是漏洞扫描器,旨在简化或替代安全审计中的各种乱七八糟的繁琐操作,将所有的工作合并在一个shell中进行,免去来回切换shell的过程。也算是帮忙建设移动端工具链了。
工具介绍相对于Android,iOS上的安全问题要少很多,笼统的可以分为本地和网络两大块,网络端已有burp suite和fiddler等非常好用的工具,因此这个工具主要是针对本地问题。
下面以一个简化的安全审计步骤来介绍如何使用该工具。
一般来说iOS App安全审计只需要拿到一个ipa包就够了,能拿到源码当然更好,这时候可能连ipa的bundleID都不知道,甚至都没签名;还有更坑的是告诉你一个应用的名字,让你自己去App Store上下载(嗯,目前没遇到要自己付费下载进行安全审计的情形)。
1.1使用环境开发环境:Mac OS X with python2.7
测试设备:iPhone4 withiOS6;
iPhone5 with iOS8;
iPhone5s with iOS9
目前没在linux和windows下测试过,因为我太烂了……而且我也不建议在Linux或windows下进行iOS安全研究。最最最重要的是,该工具的部分功能仅支持Mac OS X。
1.2安装前的一些命令启动工具,命令为pythonmain.py,启动之后如图1。
图 1 审计工具主界面
该工具是建立在ssh连接上的,通过ssh连接执行命令并获取结果。因此首先必须连接手机设备,连接命令有两个:usb和ssh。使用usb命令连接必须先使用usb线连接pc和手机,ssh命令连接只需要知道手机的IP地址就好了,不过我还是强烈建议使用usb连接,网络连接有的时候会很卡很卡。连接命令的使用如图2。
图 2 连接设备
使用help或help [cmd]命令可查看所有命令,以及命令介绍、使用说明、使用举例,如图3。图 3 help命令
如果ipa未签名,首先使用resign命令对ipa文件进行签名(当然就算这个ipa是已经签名过的,这个命令也会对其进行重签名),如图4。要用自己的证书进行签名当然得有自己的证书,这里多提一句,关于iOS的签名机制已经有文章讲的非常透彻了,比如: http://objccn.io/issue-17-2/ 。
图 4 重签名
如果在审计的过程中需要注入一个dylib到ipa文件进行测试,可以使用命令dlinj,使用方法如图5。
图 5 注入dylib
注入之后肯定是需要重签名的,不然是安装不上去的,当然,对于我这种懒人,我一定会做一个命令把注入和重签名合并在一起,就是dlini命令,如图6。
图 6 注入并重签名
好的,扯了这么多,终于可以安装ipa了,安装命令是iipa,使用示例如图7。
图 7安装ipa
当然,对于我这种懒人,我一定会做一个命令把注入、重签名和安装合并在一起,就是dlinji命令,如图8。
图 8注入签名安装
1.3获取应用信息安装好ipa之后,开始获取应用的一些信息,比如bundleID之类的,命令la可以列举所有第三方应用,如图9,从这里应该能看出自己手机上哪个是刚安装的应用吧,如果真看不出来,那就安装前后都用la命令对比下吧。
图 9 列举第三方应用
确定了bundleID,就好比打枪有了靶子,又好比打飞机有了飞机……诶,扯远了……然后咱就可以分析应用的binary文件,如图10;获取应用的详细信息了,如图11。
图 10粉笔binary
图 11获取应用详细信息
说明:ab命令后面没有跟bundleID,是因为工具对bundleID做了缓存,如果某个命令需要bundleID但却没有输入,则会使用上一次使用的bundleID。
1.4真正的审计一般来说,我建议首先进行网络端的各种安全测试,不管是中间人也好,重放攻击,xss,爆接口,验证码接口短信轰炸啥的都好,等网络端的所有测试完成之后,这个应用的大部分功能都已经使用过一遍,肯定会在本地应用目录生成一堆的文件,这时候再做本地的安全测试比较科学。
比如,我可以使用las列举该应用的所有存储文件路径,如图12,目前仅发现db、sqlite3、plist文件。
图 12 列举所有存储文件
再比如,我设置了一个密码,我想看看应用有没有在本地明文存储这个密码,可以使用gs命令对该应用所有存储文件进行特征字符搜索,如图13搜索特征串字符“DTSDKName”。
图 13搜索特征字符串
图12发现了很多的文件,我想查看某个plist文件的内容,或者是在所有plist文件中搜索特征字符串,如图14、15。
图 14查看plist文件内容
图 15 plist中搜索特征字符串
对于db文件,可以完成类似sqlite3的所有功能,如查看db文件内容、列举db文件所有表名、查看单个表的内容、搜索特征字符串等; 对于keychain,一样也有增删改查的功能,可以dump keychain所有条目,对单个条目进行编辑等,限于篇幅,这里就不截图了,各位看官自己试试就好。
对于设备可以证书管理,有安装证书、列举所有证书如图16、删除证书如图17、导入证书如图18,导出证书如图如图19等。
图 16 列举证书
图 17删除证书
图 18导入证书
图 19导出证书
当然啦,对于某些有怪癖的选手……哦,对不起,是对于某些有特殊爱好的安全从业人员,我还提供了打包下载整个应用目录、打包下载应用所有存储文件的功能,如图20、21。
图 20打包下载应用
图 21打包下载所有存储文件
当然,对于我这种懒人,我一定会……诶,这话好耳熟……我做了一个超级贴心的功能,就是懒人模式,做一些简单配置,就可以一个命令把上面几乎所有的命令搞定了……如图22、23(在使用该功能之前,请先对globals.py的lazy mode区域进行配置)。
图 22配置
图 23懒人模式
1.5其他贴心功能比如动态监视pasteboard,如图24。
图 24监视paste board
针对只给一个应用名,自己去AppStore下载的这种大坑情形,我们强势推出了dump ipa、dump binary的功能,如图25、26。
图 25 dump ipa
图 26 dump binary
还有啥了,让我想想……
嗯,对了,为了不让大伙用小手去手机上点开一个应用,还可以用命令远程启动一个app,如图27。
图 27远程启动应用
dumpbinary之后,多半这个binary是fat头,你还可以用nonfat命令处理一哈。
还有好多功能,比如 端口映射、远程调试应用、文件上传下载、class dump、weak class dump、获取应用pid、获取panic log 啥的,有点多,我实在不想写了,因为我太懒了,各位看官自己去折腾吧……
0×02最重要的事情现在来说最重要的事情,这个项目已经开源了,开源地址: https://github.com/alibaba/iOSSecAudit
如果各位小伙伴在使用的时候发现bug怎么办?
1.自己改改得了( 强烈建议 )
2.直接在github项目提issue(不推荐)
3.联系我的gmail邮箱,地址在图1里面(不推荐)
4.微博艾特我:@ylxz幽林晓筑(推荐粉我,但不推荐提bug)
5.艾特我:@Junejuly(推荐粉我,但不推荐提bug)
0×03写在最后其实还有很多功能想做,但时间不太够(这是借口,其实还是太烂了),各位有想到啥好用的功能可以fork之后自己加上去,或者通过0×02章节的联系方式找我帮忙加,我有空会加上去(不过肯定没空的)。
我也知道某些代码写的很蠢,不过我就是懒的改,咬我啊。
你可能会吐槽这些命令太傻X,也真是太特么难记了,这一点我承认哈……所有命令都定义在globals.py文件里面,你可以进去改,想改成啥就改成啥,就这了。
*本文原创作者: 薛定谔的大表哥 , 本文属CodeSec原创奖励计划,未经许可禁止转载