这篇文章记录下此次APP渗透测试过程,包括从0搭建渗透测试环境,程序hook检测绕过,绕过原理。
渗透测试环境搭建
越狱
工具环境
-
IPhone 7,固件版本为12.4.1
-
爱思助手7.0官方最新版本
操作步骤
在进行越狱前,请先确保设备上的重要数据已经备份,比如通讯录等,因为越狱过程无法保证不出现问题,而一旦出现意外设备上的重要数据可能会丢失。
首先连接手机到PC电脑,在手机上弹出的允许设备访问中选择允许访问。
第二步,在爱思助手中选择一键越狱工具。工具箱–>一键越狱。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/8-1640652471.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/10-1640652472.png)
第三步,根据设备的固件版本选择越狱工具,推荐使用第一种越狱方法(unc0ver),笔者在测试过程当中就是用的这种方法,其余两种方法在测试过程中都没有成功,可能跟固件版本有关。
第四步,选择越狱方法,点击开始越狱按钮进行越狱工具安装,这一过程会自动在iphone设备上安装unc0ver app。由于app的设备证书是自签名证书,所以在app安装完成后需要在设备管理当中信任该证书才能继续后面的操作。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/9-1640652472.png)
第五步,app安装完成并信任证书后,进入app页面,点击JailBreak进行越狱(这里由于笔者是已经越狱的设备,所以这里显示是Re-JailBreak)。正常越狱的过程应该是很顺滑的,如果在越狱过程当中出现越狱失败的提示,可以在爱思助手上选择安装不同版本的unc0ver app进行尝试,笔者在测试过程当中,最新版本无法完成设备的越狱,选择低版本的app后,越狱成功。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/7-1640652473.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/10-1640652473.png)
第六步,越狱成功后,设备中会出现Cydia这个应用程序。通过Cydia可以安装第三方的app,这里笔者先安装最新版的frida server端到设备上。在cydia中添加frida源 https://build.frida.re,点击添加源进行添加。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/6-1640652474.png)
添加完成后,在软件页面搜索frida进行安装。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/10-1640652474.png)
第七步,为了方便以后对iphone设备的管理过程,笔者通过Cydia安装了OpenSSH,安装完成后,会自动启动,并且可通过root/mobile和默认密码alpine登录。注意,安装完成后,修改root用户和mobile用户的默认密码。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/4-1640652474.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/6-1640652475.png)
第八步,验证Frida安装情况。frida安装完成后,会自动启动。验证是否安装成功,在命令行输入frida-ps -U,查看进程输出信息。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/5-1640652475.png)
出现上图类似的信息,证明安装成功,可以进行hook操作了。
实战APP流量解密
笔者这次需要测试的APP为一款采用了mpaas sdk加密的应用。在github搜索了相关的解密工具之后,笔者发现一款MpaasPentestTool,正好满足笔者需求(便捷的查看和修改请求包、返回包)。然而,当笔者使用该工具注入app进程后,进程会一段时间后结束运行退出。在经过一番实验之后,笔者确定app在检测到自身OC代码被hook之后,将会自动退出。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/3-1640652476.png)
请注意笔者这里的描述,是检测到自身OC代码被hook。这是因为笔者在尝试hook native库和系统OC库之后,程序并没有检测到,也没有退出。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/9-1640652476.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/3-1640652477.png)
此时笔者大胆猜测,该APP只会检测自身OC代码是否被hook,自身native代码的检测情况这里先不管,因为跑MpaasPentestTool这个工具仅仅需要我们hook OC代码即可。接下来就是想尽办法进行绕过检测了,由于笔者IOS逆向水平处于入门水平,没有用IDA去看脱壳后的程序,分析哪里对frida hook进行了检测,这里笔者从frida hook代码编写上入手,看看能否从hook的地方绕过。
在google搜索和仔细查看了Frida官方的API文档后,笔者发现对OC代码进行hook有两者方式可以实现,一种是MpaasPentestTool采用的基于事件的方式,另一种是对函数直接进行替换。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/8-1640652477.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/5-1640652477.png)
在发现另一种hook方式之后,笔者将MpaasPentestTool原本的hook方式改为对函数直接进行替换的方式。结果出乎意料的是,竟然直接绕过了app对hook的检测。最终实现了MpaasPentestTool作者给出的效果。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/0-1640652477.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/5-1640652477-1.png)
绕过原理分析
app检测frida hook的原理其实是从Hook技术本身出发,检测hook的特征。通过Google学习,笔者了解到OC存在三种HOOK方式,分别是objc_msgSend、inline hook、imp替换hook。笔者分别查看这两种方式Hook前后,imp指针和函数头部指令的变化,确定这两种方式分别是哪种hook技术。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/2-1640652477.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/6-1640652477.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/7-1640652478.png)
分别进行注入,查看输出,最后一窥究竟。
Attach实现方式其实是Inline Hook。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/2-1640652478.png)
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/2-1640652478-1.png)
Implement实现方式是替换IMP指针。
![IOS端渗透测试从0到1 IOS端渗透测试从0到1](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2021/12/9-1640652478.png)
通过分析Hook技术的实现不同,可以大胆猜测,app检测自身是否被hook采用了检测imp指针指向函数的头部指令是否是ldr + br跳转,如果是则认为自身代码被hook,那么将会直接退出程序自身。
参考资料
-
为什么使用汇编可以 Hook objc_msgSend(下)- 实现与分析
-
为什么使用汇编可以 Hook objc_msgSend(上)- 汇编基础
-
Objective-C的hook方案(一): Method Swizzling
-
iOS hook
知识星球介绍:
【一次付费 永久免费,到期联系运营即可免费加入】 星球面向群体:主要面向信息安全研究人员. 更新周期:最晚每两天更新一次. 内容方向:WEB安全|内网渗透|Bypass|代码审计|CTF|免杀|思路技巧|实战分享|原创工具
原文始发于微信公众号(RedCode Team):IOS端渗透测试从0到1