MEDUZA:基于Frida,针对越狱iOS系统编写的SSL unpinning工具
导语:这是一个基于Frida的工具,可以替代SSLKillSwitch。
在了解什么是SSL unpinning之前,先了解一下什么是SSL Pinning?SSL Pinning是一种防止中间人攻击(MITM)的技术,主要机制是在客户端发起请求–>收到服务器发来的证书进行校验,如果收到的证书不被客户端信任,就直接断开连接不继续求情。
所以在遇到对关键请求开启SSL Pinning的APP时,我们抓包就只能看到APP上提示无法连接网络或者请求失败之类的提示;而在抓包工具上面,要么就只能看到一排 CONNECT 请求,获取到证书却没有后续了,要么就是一些无关的请求,找不到想要的接口。
什么是MEDUZA,它是如何工作的?
这是一个基于Frida的工具,可以替代SSLKillSwitch。创建它是为了内部使用,但后来开发者决定将其开源。
其工作过程很简单,首先你不需要嗅探就可以运行应用程序并像往常一样使用它。MEDUZA只需打开,收集应用程序连接服务器所使用的证书即可。然后MEDUZA生成一个Frida脚本来伪造(==upnin)收集的证书。因此,你将第二次运行该应用程序,使用生成的脚本,并用mitmproxy捕获流量。
不过局限性在于MEDUZA只能使用iOS系统SSL库解锁应用程序,有些应用程序(例如Instagram)不使用系统SSL库,它们实现了一些第三方自定义SSL堆栈。例如,Instagram使用静态链接到Instagram私有框架的OpenSSL,有关详细信息,请参阅InstagramSSLPinningBypass-iOS。
此外,MEDUZA是基于Frida的,所以它不能在有反Frida保护的应用程序上运行。
那可以使用MEDUZA和其他的SSL绕过工具,例如SSLKillSwitch吗?目前研究人员还没有对它进行测试,但MEDUZA使用了一种不同于SSLKillSwitch和类似工具的方法,因此从理论上讲,它们应该可以一起工作而不会出现问题。但由于没有测试,所以不能百分之百确定。
运行环境设置
装有MacOS Mojave或更高版本的Mac,也许MEDUZA也可以在Windows和Linux上运行,但未经测试。
越狱的iOS设备,MEDUZA已在带有iOS 13.3的iPhone SE 2016和带有iOS 14.0的iPhone 6s上进行了测试,都通过checkra1n越狱了;理论上,MEDUZA也应与其他设备一起使用,但未经测试。Mac和iOS设备上安装了最新的Frida。安装在Mac上的Mitmproxy,MEDUZA没有与其他嗅探器如Charles proxy一起测试,所以还不确定它是否能工作。Mac和iOS设备需要通过USB数据线连接,并连接到相同的WiFi网络。在Mac上使用加密的Python 3(只需pip install cryptography)。
如何嗅探HTTP(s)流量?
一般有两个步骤,首先你需要捕获所有被应用程序锁定的证书,并生成一个脚本来伪造(==unpin)它们,你应该在开始时只执行一次,然后就可以使用生成的脚本嗅探流量。第一步的说明如下:
1.打开Mac上的终端,运行MEDUZA,列出iOS设备上已安装或正在运行的应用程序:
$ python3 meduza.py -l
输出内容如下:
2.切记,确保你的iOS设备WiFi设置“清除”,例如未指定代理/或自定义路由器IP。在第一步,我们不会尝试嗅探流量,所以WiFi网络连接应该是“正常的”。
3.选择应用程序,例如Uber。按如下方式运行MEDUZA
$ python3 meduza.py -s
例如Uber
$ python3 meduza.py -s com.ubercab.UberClient ./unpinUber.js
其中-s表示将重新生成Uber。如果要连接到已经运行的应用程序并且不重新生成它,请使用-a而不是-s。
因此,你应该看到如下内容:
MEDUZA iOS SSL unpinning tool by Dima Kovalenko (@kov4l3nko) ============================================================ [*] Waiting for an iOS device connected to USB... [*] Spawning com.ubercab.UberClient... [*] Attaching to com.ubercab.UberClient... [*] Reading JS payload meduza.js... [*] Injecting JS payload to the process... [*] SecCertificateCreateWithBytes(...) hooked! [*] Resuming the application... [*] Press ENTER to complete (you can do it anytime)... [*] Got another certificate, its raw SHA256 hash: 99b05557bafde776f0afc15bbf6733585b8a03606cbf757158fb96324e01310a crashlytics.com reports.crashlytics.com firebase-settings.crashlytics.com apps-ios.crashlytics.com android-sdk.crashlytics.com api.crashlytics.com settings-api.crashlytics.com download.crashlytics.com distribution-uploads.crashlytics.com cm-us-east-1.crashlytics.com www.crashlytics.com try.crashlytics.com kits.crashlytics.com cm.crashlytics.com apps.crashlytics.com cm-ap-southeast.crashlytics.com settings.crashlytics.com e.crashlytics.com [*] Got another certificate, its raw SHA256 hash: 954a9f7dd9f03784bdc5ca9183484a5bfc278ca9ba9f42b3a82f96cffddf277b [*] Got another certificate, its raw SHA256 hash: 649a4665273e60b353fe9b4db1807d9669f82cb0ee85bd1e562e7c2f33fdec3a *.cfe.uber.com cfe.uber.com cn-dca1.cfe.uber.com [*] Got another certificate, its raw SHA256 hash: eae72eb454bf6c3977ebd289e970b2f5282949190093d0d26f98d0f0d6a9cf17 <...etc, you can see many messages about certificates, it's ok...>
4.在应用程序中执行典型的操作:登录,点击某些按钮,注销……例如就像普通的傻瓜用户一样,每次应用程序使用(固定或未固定)证书连接服务器时,MEDUZA都会捕获并记住该证书。
5.完成预定操作后,请在终端中按ENTER键。 MEDUZA将生成一个脚本(例如上例中的./unpinUber.js)。
第一步完成后,第二步就是使用脚本:
1.在Mac终端运ifconfig | grep "inet ",查看Mac的IP地址。
2.在你的Mac上运行Mitmproxy。
3.在iOS设备上,将Mac的IP和mitmproxy端口(默认为8080)设置为WiFi连接的代理。
4.运行生成的脚本与应用程序。例如重新生成和取消Uber应用程序,运行在Mac终端
$ frida -U -f com.ubercab.UberClient --no-pause -l ./unpinUber.js
具体请参阅Frida文档了解其他选项,例如,连接已经运行的应用程序。
如何保护应用程序免受MEDUZA的攻击?
有很多方法可以做到这一点,例如:
1.Instagram使用一个静态链接的OpenSSL fork而不是iOS系统库来实现SSL栈,这就是为什么MEDUZA不能在Instagram上工作的原因。
2.你可以在你的应用程序中添加一些反Frida保护,MEDUZA是基于Frida的,如果Frida失败,MEDUZA也会失败。
发表评论