iOS系统抓包入门实践之短链

2,697 阅读7分钟

前言

作为爬虫工程师的基本功,抓包是经常遇到且非常重要的技能之一,尤其是现在的移动端的发展,更是在App抓包这里做了很多防护措施,本文主要是针对iOS系统App的数据包抓取进行大概总结,主要是针对常规App数据包抓取、突破路由直连抓包以及通过简单的逆向Hook手段突破SSL Ping防护抓取数据包。

常规抓包

对于常规无抓包防护的App数据抓取,可以直接在手机上通过设置HTTP代理的方式,配合Charles便可以抓取到目标App的数据包,不需要使用其他复杂的或者逆向Hook技术进行辅助。

  • 设备:iPhone 5s、Mac
  • Mac抓包工具:Charles

抓包实践

手机和电脑连接同一个wifi,在一个局域网即可。

  • Mac安装Charles之后,按照图示操作,设置抓包端口为8888 image.png
  • 查看Mac端的内网ip image.png
  • 手机端设置抓包代理。 wifi找到连接的网络-打开配置代理-切换到手动-输入Charles的ip 192.168.43.16和端口8888

image.png Charles会提示有新的连接,允许即可。

  • 对于使用HTTP方式传输的数据包,经过上述操作便可顺利抓取到其内容。不过对于一些使用HTTPS方式传输数据的APP,要想看到加密前的明文数据就需要做一些额外操作。HTTPS可以理解为HTTP+SSL/TLS, 它是在HTTP基础上加入SSL层,提高安全系数。这里我们使用Charles的证书进行解密流量,下面是安装Charles SSL证书的步骤: 手机浏览器打开 chls.pro/ssl ,点击允许下载描述文件之后,在设置里面安装并信任该证书,在iOS新版中有两个地方需要操作
    • 安装描述文件:设置-通用-描述文件,安装刚才的描述文件即可。
    • 信任证书:设置-通用-证书信任-找到该证书,并且信任。
    • 打开Charles,代理-SSL代理设置-启用SSL代理-包括的位置添加主机为*,端口为443
  • 然后可以在Charles上看看到App的数据包。

路由直连

防护介绍

路由直连是客户端流量直接到达服务器而不经过代理或者未设置代理服务器。参考ZXRequestBlock项目:

+(NSURLSession *)zx_sessionWithConfiguration:(NSURLSessionConfiguration *)configuration
                                    delegate:(nullable id<NSURLSessionDelegate>)delegate
                               delegateQueue:(nullable NSOperationQueue *)queue{
    if (!configuration){
        configuration = [[NSURLSessionConfiguration alloc] init];
    }
    if(isDisableHttpProxy){//开启防代理抓包
        configuration.connectionProxyDictionary = @{};//设置代理为空字典
    }
    return [self zx_sessionWithConfiguration:configuration delegate:delegate delegateQueue:queue];
}

发现该项目是将connectionProxyDictionary设置空字典,从而绕过中间人代理的数据抓取分析。 关于connectionProxyDictionary在官方文档中这样描述: 也就是说:这个属性可以设置网络代理,默认值是 NULL,使用系统的代理设置。 该示例App也就是通过将connectionProxyDictionary设置为空字典,从而绕过Charles等抓包软件的抓取。即App中的所有网络请求正常,但是所有的网络请求不经过Charles代理软件,针对这样的抓包防护,可以通过建立虚拟网卡的方式进行数据流量抓取。

抓包实践

  • 在手机端借助代理软件App,按照如下设置。打开代理软件App-首页右上角的加号
  • 类型选择HTTP,地址选择Charles的ip:192.168.43.16,端口也是Charles的端口8888,其他地方不用填写。
  • 新建一个HTTPS的代理类型,其他同HTTP代理。 首页的全局路由选择代理
  • 打开开关,即可抓到示例App的数据包。

在Mac上通过Shell连接到手机,查看手机端的网卡信息。

  • 未开启代理软件:
  • 开启代理软件:

可以看到代理软件给在手机上建立了一个虚拟网卡,然后将流量转发到Charles上边,从而抓到该示例App的数据包。

Frida绕过iOS SSL Pinning

SSL Pinning防护介绍

SSL Pinning称为证书锁定(SSL/TLS Pinning)也就是SSL证书绑定,顾名思义,将服务器提供的SSL/TLS证书内置到移动端开发的App客户端中,当客户端发起请求时,通过比对内置的证书和服务器端证书的内容,以确定这个连接的合法性。 SSL Pinning又分为单向证书校验和双向证书校验:

  • 单向证书校验是App应用对服务端证书进行校验,但是服务端不会对App的证书进行校验。
  • 双向证书校验是App应用对服务端证书进行校验,服务端也会对App的证书进行校验。 如今,不少应用程序已在其移动应用中实现了SSL Pinning,具体表现抓包的时候,App显示无法连接网络或者请求失败之类的提示,这样的防护是无法完成具体的抓包分析,抓包成了分析的第一座壁垒。这层壁垒在本文中使用Frida和基于Frida开发的工具objection进行突破。 这里使用应用商店作为案例,突破单向证书校验。
  • 设备: 越狱的iPhone 5s、Mac
  • Mac抓包工具:Charles

安装Frida

  • Frida是一个很常用的开源Hook工具,只需要编写一段Javascript代码就能对指定的函数进行Hook,而且它基本上可以主流平台全覆盖,除了iOS,还有Android和PC端的应用也可以用它来进行Hook,非常方便。

  • 启动 Cydia 然后通过 Manage -> Sources -> Edit -> Add 这个操作步骤把 build.frida.re 这个代码仓库加入进去。然后在Cydia里面找到Frida的安装包,最终将iOS设备插入电脑,并开始使用 Frida。

  • 电脑上使用python3环境,然后pip install frida-tools

Frida Hook 应用商店

电脑usb连接手机,并打开应用商店,然后在Mac上的终端输入frida-ps -Ua,可以看到该应用商店的信息了。

打开该应用商店,并进行数据包抓取,可以清楚的发现该应用无网络,很清晰的看到SSL Pinning的特征。

Frida脚本:

/*
 *  Description: iOS 12 SSL Bypass based on blog post https://nabla-c0d3.github.io/blog/2019/05/18/ssl-kill-switch-for-iOS12/
 *  Author: 	@macho_reverser
 */

// Variables
var SSL_VERIFY_NONE = 0;
var ssl_ctx_set_custom_verify;
var ssl_get_psk_identity;

/* Create SSL_CTX_set_custom_verify NativeFunction
 *  Function signature https://github.com/google/boringssl/blob/7540cc2ec0a5c29306ed852483f833c61eddf133/include/openssl/ssl.h#L2294
 */
ssl_ctx_set_custom_verify = new NativeFunction(
    Module.findExportByName("libboringssl.dylib", "SSL_CTX_set_custom_verify"),
    'void', ['pointer', 'int', 'pointer']
);

/* Create SSL_get_psk_identity NativeFunction
 * Function signature https://commondatastorage.googleapis.com/chromium-boringssl-docs/ssl.h.html#SSL_get_psk_identity
 */
ssl_get_psk_identity = new NativeFunction(
    Module.findExportByName("libboringssl.dylib", "SSL_get_psk_identity"),
    'pointer', ['pointer']
);

function custom_verify_callback_that_does_not_validate(ssl, out_alert) {
    return SSL_VERIFY_NONE;
}

var ssl_verify_result_t = new NativeCallback(function (ssl, out_alert) {
    custom_verify_callback_that_does_not_validate(ssl, out_alert);
}, 'int', ['pointer', 'pointer']);

function bypassSSL() {
    console.log("[+] Bypass successfully loaded ");

    Interceptor.replace(ssl_ctx_set_custom_verify, new NativeCallback(function (ssl, mode, callback) {
        ssl_ctx_set_custom_verify(ssl, mode, ssl_verify_result_t);
    }, 'void', ['pointer', 'int', 'pointer']));

    Interceptor.replace(ssl_get_psk_identity, new NativeCallback(function (ssl) {
        return "notarealPSKidentity";
    }, 'pointer', ['pointer']));

}

bypassSSL();

上边脚本保存为killSSL.js文件,使用Frida加载脚本进行Hook:frida -U --no-pause -f com.***.AppStore -l killSSL.js 打开该应用商店之后即可抓包。

该脚本主要是通过Hook更App中ssl_ctx_set_custom_verifyssl_get_psk_identity,替换其回调函数,从而不会去检查服务端的证书链。

使用objection快速绕过SSL Pinning

objection 是基于Frida开发的并且功能强大、命令众多,而且不用写一行代码,便可实现诸如内存搜索、类和模块搜索、方法 Hook 打印参数返回值调用栈等。

objection Hook SSL Pinning实践

上述脚本适用于iOS12系统,但在iOS9、iOS10、iOS11等系统无法使用,objection正好进行了整合,在objection的源码中(具体路径objection/blob/master/agent/src/ios/pinning.ts)可以看到它对iOS的多个版本以及Framework等,通过观察查看源码,发现objection是通过Hook AFNetworking等常用库和一些底层的methods实现绕过证书绑定。 在Mac终端执行pip install objection 再去执行 objection -g com.**.AppStore explore,此时objection已经附加在该应用商城了,然后在objecton的终端执行 ios sslpinning disable 就可以快速过绕过SSL Pinning,当然该命令是否能奏效还要视具体的App而定。 最后效果同Frida绕过SSL Pinning。

小结

iOS端的短链抓包在很多App上面都没有做相关防护,从而使抓包变得更容易,但是针对有抓包防护的App,都可以根据其抓包中出现的现象进行逐一突破,目前常用的也就是本文中提到的路由直连以及SSL Pinning,都可以使用代理软件或者逆向Hook技术进行突破。

参考