让我们编写Swift代码来拦截SSL固定HTTPS请求

在iOS应用中检查HTTPS请求的一种流行方法是中间人MITM )攻击。 此技术要求将一台机器用作客户端的代理服务器。 为此,客户端必须将代理服务器的证书安装到设备全局信任存储中。 通过这样做,客户端将证书列入白名单,因此允许与代理服务器进行HTTPS通信。

这是一个用于检查CNN iOS应用程序的mitmproxy的示例。 在此之前,我已经在设备上安装了代理服务器的证书。 可以在mitmproxy网站上找到说明

SSL证书固定

保护您的应用免受MITM侵害的一种方法是使用SSL证书固定。 这涉及将可信任服务器证书的副本打包到您的iOS应用程序中,以及一些其他代码,以确保该应用程序仅与使用该特定证书的服务器通信。 当SSL证书固定功能处于活动状态时,该应用程序将不允许任何请求发送到任何不受信任的服务器。 因此,由于请求不是通过安全网络通道发送的,因此MITM代理服务器将无法接收请求。

Twitter iOS应用将SSL证书固定作为安全功能,用于发送到https://api.twitter.com的请求。 像mitmproxy和Charles Proxy这样的MITM工具将无法检查任何Twitter api请求。

解决SSL证书固定问题的一种解决方案是尝试在通过安全HTTPS通道发送请求之前拦截请求。 此技术要求我们将代码植入应用程序中,以便我们可以直接访问要检查的URLRequest对象。 因此,让我们首先访问Apple的URL加载系统。

URLProtocol —苹果的URL加载系统

在Apple的URL加载系统中,定义了不同的URLProtocol来处理不同类型的URL。 这是创建我们自己的自定义URLProtocol子类的步骤。

1.每个URLProtocol子类别都应至少定义以下内容

嗯,我想我不喜欢某人的Tinder个人资料。 api请求“通过”某人。

您还将注意到,Tinder也向Facebook Api发送了请求。 这是因为Tinder在应用程序中嵌入了FacebookSDK并使用了登录功能。

遗憾的是,未在Tinder应用程序上启用SSL证书固定。 任何人都可以轻松使用MITM工具来检查所有请求。 因此,让我们找到另一个应用程序。

Twitter的API请求

如前所述,由于SSL证书固定,MITM工具将无法在控制台上看到任何api.twitter.com请求。 由于该应用引发验证错误并且不允许通过网络发送请求,因此尝试登录Twitter将会失败。

注入我们的框架并禁用我们的代理后,我们可以看到登录api请求“ /auth/1/xauth_password.json”,其中包括我们的ID和密码值(请参阅Slack频道消息中显示的第二行) )。

请注意,成功登录Twitter后,该应用程序崩溃,原因是该应用程序检测到我正在使用自己的开发配置文件对应用程序进行签名,并且该应用程序的签名与KeyChain安全性发生冲突。 这是一个微不足道的问题,但是对于这篇中等职位,我不希望在我们的主要主题之外进一步分享特定于应用程序的漏洞。

技术讲座2018

这是我于2018年5月30日在新加坡发表的iOS Dev Scout Meetup演讲。 最后,我展示了即使SSL固定处于活动状态时如何检查Twitter应用程序的HTTPS请求。

拦截网络请求– iOS Dev Scout – Engineers.SG
发言人:肯尼斯·潘(Kenneth Poon)–编写快速代码以拦截https请求–甚至使用SSL都可以拦截https请求… engineering.sg

GitHub存储库参考

欺骗/网络拦截器
NetworkInterceptor –有关如何在iOS应用程序 github.com 上拦截传出网络请求的演示项目 depoon / iOSDylibInjectionDemo
iOSDylibInjectionDemo –使用此存储库演示如何将动态库注入破解的ipa文件中以供监禁…… github.com

结尾

希望本文能给您一些见识。 随意尝试代码,并在您最喜欢的iOS应用中检查请求。 如果您成功获得成功或需要其他帮助以使其正常工作,请给我发送电子邮件de_poon@hotmail.com

@de_poon肯尼思