四种绕过iOS SSL验证和证书锁定的方法

x
用微信扫描二维码
分享至好友和朋友圈

  

  几个月前,Cody Wass发布了一篇关于如何绕过Android验证和证书锁定(Certificate Pinning)的文章。由此,我觉得也有必要写一篇关于iOS的。正如Cody在博客中所说的,中间人(MitM)攻击是任何标准渗透测试的重要组成部分。通过中间人攻击,我们能够拦截并模糊处理所有HTTP请求,从而找到安全漏洞。在下面的示例中,我将使用Burp作为我的Web代理。本文假定各位读者已经对iOS、Xcode、手机设置以及Burp如何拦截iOS的移动HTTP流量有基本了解。在本文中,我主要介绍四种绕过iOS中SSL验证和证书锁定的技术:

  1、安装自己的CA证书;

  2、将软件安装到iOS设备;

  3、使用Objection和Frida;

  4、使用反汇编程序修改IPA文件。

  
方法1:安装自己的CA证书

  安装自己的CA证书是绕过SSL报错的第一步。在iOS中,安装CA证书相对比较容易。首先,可以通过电子邮件附件或从网站下载证书的方式,将CA证书放到设备上。在这里,需要配置移动设备和Web代理,以便能够拦截网络流量。具体来说,如果使用Burp Suite,我们只需访问http://burp随后点击“CA Certificate”即可。

  接下来,系统将提示“安装”证书,如下图所示。

  

  点击“安装”,会弹出提示将要把证书添加到受信任证书列表中的警告。

  

  我们可以进入到“设置”-“常规”-“配置文件”来验证证书是否已经被成功安装。

  
方法2:将软件安装到iOS设备

  如果仍然出现SSL错误,或者应用程序卡死在等待连接的状态,那么可能是因为应用程序服务器使用了某种TLS链验证或SSL证书锁定机制。要绕过SSL证书锁定,最简单的方法是安装一个软件来完成这些工作。下面的这两个工具在设置和运行上比较简单:

  SSLKillSwitch:https://github.com/nabla-c0d3/ssl-kill-switch2

  Burp Mobile Assistant:https://portswigger.net/burp/help/mobile_testing

  在工具的主页上,已经详细写出了安装说明。但是,要使用这种方法,首先需要先对iOS设备进行越狱。近年来,随着Apple安全性的不断加强,越高版本的iOS系统越狱就越困难。

  
方法3:使用Objection和Frida

  另一种经过验证的方法,是使用Frida钩子和Objection。Frida是一个非常高级的框架,允许我们在运行时干扰应用程序的代码。具体在这里,就是干扰证书验证的这个功能。同样,该框架仅能运行在越狱后的设备上。但是,我们可以使用具有完整框架库的Frida Gadget,这就不再需要对设备进行越狱了。Objection是这个框架的包装器,同样可以配合实现这种方法。

  首先,我们需要Apple Developer账户的有效配置文件和代码签名证书,可以通过在Xcode中创建测试应用程序来创建有效的配置文件。我们可以在这里注册免费的开发人员账户:https://developer.apple.com/account/ 。

  在创建测试项目后,下一步要设置代码签名证书。首先,打开Xcode首选项,然后选择“账户”(Accounts)。要添加Apple ID账户,需要点击左下角的加号,并登录。然后点击右下角的“管理证书”(Manage Certificates)。

  

  点击该按钮,就会跳转到下面的屏幕。要创建证书,需要点击左下方框中的加号,然后选择“iOS开发”(iOS Development)。加载后,点击“完成”(Done),然后点击“下载手动配置文件”(Download Manual Profiles),然后将证书加载到计算机上。

  

  将代码签名证书加载到计算机上之后,可以通过运行下面的命令找到它:

  NetSPIs-MacBook-Pro:Test netspi\$ security find-identity

  Policy: X.509 Basic

  Matching identities

  1) A[REDACTED]1 "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"

  2) 0[REDACTED]C "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"

  2 identities found

  Valid identities only

  1) A[REDACTED]1 "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"

  2) 0[REDACTED]C "iPhone Developer: [REDACTED]@netspi.com ([REDACTED])"

  2 valid identities found

  我们想要加载Frida Gadget动态库,以便能在运行时修改应用程序。在iOS应用程序的上下文中,我们想要提取IPA文件,修改二进制文件以加载FridaGadget.dylib,对二进制文件和dylib进行代码签名,然后重新打包更新后的IPA文件。如前所述,我们可以使用Objection自动完成所有这些工作。可以通过下面的简单命令来完成,其中-s参数是IPA文件,-c参数是代码签名证书。

  NetSPIs-MacBook-Pro:NetSPI netspi\$ objection patchipa -s netspi_test.ipa -c 0[REDACTED]C

  Using latest Github gadget version: 12.0.3

  Remote FridaGadget version is v12.0.3, local is v12.0.1. Downloading...

  Downloading from: https://github.com/frida/frida/releases/download/12.0.3/frida-gadget-12.0.3-ios-universal.dylib.xz

  Downloading iOS dylib to /Users/netspi/.objection/ios/FridaGadget.dylib.xz...

  Unpacking /Users/netspi/.objection/ios/FridaGadget.dylib.xz...

  Cleaning up downloaded archives...

  Patcher will be using Gadget version: 12.0.3

  No provision file specified, searching for one...

  Found provision file /Users/netspi/Library/Developer/Xcode/DerivedData/test-fbleootdcdwdyafhyzjmvihvfiga/Build/Products/Debug-iphoneos/test.app/embedded.mobileprovision expiring in 307 days, 1:40:03.015176

  Found a valid provisioning profile

  Working with app: NetSPI.app

  Bundle identifier is: com.netspi.test

  Codesigning 13 .dylib's with signature 0[REDACTED]C

  Code signing: libswiftDarwin.dylib

  Code signing: libswiftUIKit.dylib

  Code signing: libswiftCoreImage.dylib

  Code signing: libswiftos.dylib

  Code signing: libswiftObjectiveC.dylib

  Code signing: libswiftCoreGraphics.dylib

  Code signing: FridaGadget.dylib

  Code signing: libswiftCore.dylib

  Code signing: libswiftCoreFoundation.dylib

  Code signing: libswiftMetal.dylib

  Code signing: libswiftQuartzCore.dylib

  Code signing: libswiftFoundation.dylib

  Code signing: libswiftDispatch.dylib

  Creating new archive with patched contents...

  Codesigning patched IPA...

  Cannot find entitlements in binary. Using defaults

  Copying final ipa from /var/folders/1k/mw7w1kfd4c96jkvkw5mp3qfm0000gn/T/netspi_test-frida-codesigned.ipa to current directory...

  Cleaning up temp files...

  一旦命令运行完毕,我们就会得到一个名为netspi_test-frida-codesigned.ipa的新IPA文件,我们可以将其部署到iOS设备上。有一个名为ios-deploy(https://github.com/ios-control/ios-deploy)的便捷工具,适用于未越狱的iOS设备。我们可以使用多种不同的选项,具体取决于想要完成的任务(例如:运行调试器、通过USB部署应用程序等)。

  要使用ios-deploy,我们需要解压缩IPA文件,并运行ios-deploy命令。在下面的示例中,我们指定了需要通过USB(-W)部署应用程序,同时也指定需要部署的包(-b)。

  NetSPIs-MacBook-Pro:NetSPI netspi\$ ios-deploy -W -b ./Payload/NetSPI.app

  [....] Waiting for iOS device to be connected

  [....] Using 3ff9c90d2b23beadeefdf7bc240211730c84adef (P105AP, iPad mini, iphoneos, armv7) a.k.a. 'MAPen's iPad'.

  ------ Install phase ------

  [ 0%] Found 3ff9c90d2b23beadeefdf7bc240211730c84adef (P105AP, iPad mini, iphoneos, armv7) a.k.a. 'MAPen's iPad' connected through USB, beginning install

  [ 5%] Copying /Users/netspi/test/NetSPI/Payload/NetSPI.app/META-INF/ to device

  [TRUNCATED]

  [ 52%] CreatingStagingDirectory

  [ 57%] ExtractingPackage

  [ 60%] InspectingPackage

  [ 60%] TakingInstallLock

  [ 65%] PreflightingApplication

  [ 65%] InstallingEmbeddedProfile

  [ 70%] VerifyingApplication

  [ 75%] CreatingContainer

  [ 80%] InstallingApplication

  [ 85%] PostflightingApplication

  [ 90%] SandboxingApplication

  [ 95%] GeneratingApplicationMap

  [100%] Installed package ./Payload/NetSPI.app

  现在,我们已经在iOS设备上安装了应用程序。接下来,就要打开应用程序,并通过Objection连接到应用上。

  NetSPIs-MacBook-Pro:NetSPI netspi\$ objection explore

  _ _ _ _

  ___| |_ |_|___ ___| |_|_|___ ___

  | . | . | | | -_| _| _| | . | |

  |___|___|_| |___|___|_| |_|___|_|_|

  |___|(object)inject(ion) v1.3.0

  Runtime Mobile Exploration

  by: @leonjza from @sensepost

  [tab] for command suggestions

  com.netspi.test on (iPad: 9.0.1) [usb] #

  现在剩下的工作,就是运行绕过证书验证的内置命令,然后就可以开始代理流量。

  com.netspi.test on (iPad: 9.0.1) [usb] # ios sslpinning disable

  Job: b748974e-ed6d-4aaf-b5ea-3fb35a13720a - Starting

  [3fb35a13720a] [ios-ssl-pinning-bypass] [NSURLSession] Found 1 matches for URLSession:didReceiveChallenge:completionHandler:

  [3fb35a13720a] [ios-ssl-pinning-bypass] [NSURLConnection] Found 5 matches for connection:willSendRequestForAuthenticationChallenge:

  [3fb35a13720a] [ios-ssl-pinning-bypass] Hooking lower level method: SSLSetSessionOption

  [3fb35a13720a] [ios-ssl-pinning-bypass] Hooking lower level method: SSLCreateContext

  [3fb35a13720a] [ios-ssl-pinning-bypass] Hooking lower level method: SSLHandshake

  Job: b748974e-ed6d-4aaf-b5ea-3fb35a13720a – Started

  
方法4:使用反汇编程序修改IPA文件

  如果上述方法都没有成功,或者我们想要挑战自我,那么可以使用反汇编程序来修改IPA文件,从而绕过任何证书验证。对iOS的反汇编已经超出了本文章的讨论范围,但针对于iOS设备,比较常用的反汇编程序是Hopper和IDA。将二进制文件加载到应用程序后,我们需要重点关注应用程序尝试与应用程序服务器建立SSL连接时调用的函数,并弄清其背后的逻辑,就可以顺藤摸瓜找到证书锁定所在的位置。需要提醒大家的是,如果对IPA文件进行修改,很可能会破坏应用程序已有的签名,导致该应用无法再在iOS设备上安装。通过重新设计IPA文件,我们就可以安装应用程序。

  
总结

  如前文所说,查看并修改应用程序发送到服务器的HTTP请求,是渗透测试的重要组成部分。通过这样的测试和分析,测试人员能够全面地掌握应用程序内部的工作原理。本文中所讲解的方法,都是我们在测试过程中使用的方法,用于在出现SSL证书错误或证书锁定情况下进行流量的查看和修改。如果对本文有任何疑问或指正,欢迎与我们一同讨论。

  
参考文章

  [1] https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2015/january/bypassing-openssl-certificate-pinning-in-ios-apps/

  [2] http://dji.retroroms.info/howto/iosfrida

  

  

特别声明:本文为网易自媒体平台“网易号”作者上传并发布,仅代表该作者观点。网易仅提供信息发布平台。

跟贴 跟贴 3 参与 3
© 1997-2019 网易公司版权所有 About NetEase | 公司简介 | 联系方法 | 招聘信息 | 客户服务 | 隐私政策 | 广告服务 | 网站地图 | 意见反馈 | 不良信息举报

嘶吼RoarTalk

不一样的互联网安全新视界

头像

嘶吼RoarTalk

不一样的互联网安全新视界

3044

篇文章

6744

人关注

列表加载中...
请登录后再关注
x

用户登录

网易通行证/邮箱用户可以直接登录:
忘记密码