阅读本篇预计需要 6 分钟
本文来自公众号:DeveloperPython
作者:马超
抓包,我相信很多程序员对这个都不陌生。但真正抓过包或者了解其原理的并没有几个。
所以,这次我分享一篇关于抓包的文章,也算是对之前文章的一个重新梳理。
其中会介绍几款简单易用的工具以及针对目前互联网主流的 Http 和 Https 网络包进行抓取并分析,最后也会分享下手机抓包得技术。
目前市面上比较火的几个抓包工具有:Charles、Fiddler 以及 Wireshark。
1、抓包工具
Fiddler
这个是我之前在 Windows 时代经常用的工具。而且当时的 Fiddler 足以满足了我的简单抓包需求。
话说现在都更新到 Fiddler 4 了,如果用 Windows 的朋友可以试试这个。
Charles
自从换了 Mac 之后我就开始用这个工具,但有一点比较麻烦的就是这个款软件是收费的。
不过在我大天朝,如果你不是土豪那么就找找破解版。
Wireshark
这个工具比较牛逼,不过我不经常用。这工具可以详细的抓包网络请求的三次握手,同时也支持 Spdy、tcp 直连等等的网络协议。
如果你需要对网络做一个比较深的抓取,那么建议使用这个。
(ps: 后台回复对应工具,会拿到破解版的下载地址)
2、抓取 Http、Https 包
2.1、 Http 包的步骤:
2.1.1、 清理 Charles 列表,让抓包更加清晰
image
2.1.2、 以我的 CSDN 为例 (m694449212),在 Chrome 中打开我的博客,抓到需要的包
image
在 Structure 中找到 csdn 的包,如上图。
2.1.3、 分析包
image
2.1.4、查看请求头
image
其中比较重要的是 Cookie 字段,这是网站为了表示用户身份、进行 Session 跟踪而存储在用户本地终端上的数据(通常是加密的)。
其次,Cookie 在我们爬虫的时候也是一个必不可少的东西,那么如何自动获取 Cookie 呢?后面会讲到。
2.1.5、 拿到返回的数据 Response
image
CSDN 博客的返回数据是 Html 的格式,其中每篇文章的地址都是通过跳转 href 来做的,因此我们可以通过正则表达式匹配,或者 XPath 来拿到 Href 再拼接 Host 生成一个绝对路径的地址:
http://blog.csdn.net/m694449212/artlcle/details/31806139.这就是我的Blog中的一篇文章。
2.1.6、获取 Cookie ,我以往的经验:
a. 获取 Cookie 的时候,首先需要保证我们的浏览器环境是干净的,我说的干净其实就是 清除当前浏览器保存的 Cookie,并重启浏览器。b. 重启之后我们访问 www.csdn.net,当前 Host 的 Request 就不会包含Cookie,那么 Cookie 在哪呢?其实细心点的会发现 Cookie 在 Response 的 Headers > set-cookie 字段里面,并在下次请求中使用。 也就是说 Cookie 在大多数情况下都是服务器生成的,然后在首次请求的时候返回给客户端使用。c. 那么,当我们做登录操作的时候携带 Cookie 在请求 Headers 中,登录成功之后这个 Cookie 就会被服务器标记为有效值。之后我们的所有请求都携带这个 Cookie 就可以正常的完成所有请求。
image
提提神,继续看
2.2、Https 包的步骤
2.2.1、 Https 简介
SSL 相信大家都不陌生,其实 Https 就是在 Http 基础上通过 SSl 协议进行加密之后的网络传输。
其中通过非对称和对称加密算法来对密码和数据进行加密。具体看下图:
image
1. Client 明文将自己支持的一套加密规则、一个随机数(Random_c)发送给服务器。
2. Server 返回自己选择的加密规则、CA 证书(服务器地址、加密公钥、以及证书颁发机构),外加一个通过加密规则和 HASH 算法生成的随机数(Random_S)
3. Client 收到 Server 的消息之后会:
a:验证证书(地址是否是正在访问的和机构是否合法) b:自己生成一个随机的密码(Pre_master)并使用CA证书中的加密公钥进行加密生成enc_pre_master c:计算出一个对称加密的enc_key,通过Random_C、Random_S、Pre_master。 d:生成握手信息:使用约定好的Hash算法计算握手信息,并通过enc_key和约定好的加密算法对消息进行加密
4. Client 将 enc_pre_master,加密之后的握手信息发送给 Server
5. Sever 收到消息之后
a: 收到enc_pre_master之后,会通过私钥进行解密(非对称加密算法)得到pre_master b: 通过pre_masrer、Random_C、Random_S计算得到协商密码 enc_key c: 通过enc_key解密握手信息,验证HASH是否和客户端发来的一致 d: 生成握手信息同样使用enc_key和约定好的加密算法
6. Server 发送握手信息给 Client,也就是说 Server 验证通过了 Client,并在此发送信息给 Client 来让其验证自己
7. 客户端拿到握手信息,解密并计算握手信息的 HASH,如果与服务端发来的 HASH 一致,此时握手过程结束
8. 正常加密通信,握手成功之后,所有的通信数据将由之前协商密钥 enc_key 及约定好的算法进行加密解密。
其中,Https 使用到的加密算法如下:
非对称加密: RSA、DSA/DSS
对称加密:AES、RC4、3DES
HASH 算法:MD5、SHA1、SHA256
2.2.2、Charles 抓取 Https 原理
Charles 本身就是一个协议代理工具,在上面的Https 原理上,客户端和服务器的所有通信都被 Charles 捕获到。
如下图:
image
主要步骤如下:
Charles 捕获 Client 发送给 Server 的请求,并伪装成客户端向服务器发送握手请求
服务器响应,Charles 获取到服务器的 CA 证书,并用根证书公钥进行解密,获取到服务器的 CA 证书公钥。然后 Charles 伪造自己的 CA 证书,伪装为服务器的 CA 证书发送给服务器
客户端收到返回之后,和上面讲的过程一样,证书校验、生成密码、并使用 Charles 伪装的证书公钥进行加密,并生成 Https 通信的协商密码 enc_key
Charles 捕获到 Client 发来的重要信息,并使用自己伪造的证书私钥将密文解密,获取到 enc_key,然后 Charles 使用服务器之前返回的证书公钥对明文进行加密并发送给服务器
与之前一样,服务器收到消息之后,用私钥解开并建立信任,然后发送加密的握手信息
Charles 截获服务器发来的握手密文,并用对称密钥解开,再用自己伪造证书的私钥加密传给客户端
客户端拿到加密信息之后,用公钥解开,验证 HASH。握手过程正式完成,客户端和服务器就这样建立了“信任”
其实在整个过程中,最重要的就是 enc_key,由于Charles 从一开始伪造并获取了 enc_key,所以整个通信过程中 Charles 都充当第三者,所有信息对其来讲都是透明的。
其次就是根证书,这是 https 一个信任链的开始。这也是 Charles 伪造的 CA 证书能获得双方信任的关键。
2.2.3、演示 Charles 抓取 https
原理清楚了,其实操作就很简单了,操作的核心点就是根证书。
安装根证书(Charles Root Certificate)
image
让系统信任证书
image
接下来将需要抓的 Https 链接添加到 Charles SSL 代理规则中,443 是 https 的默认端口
image
当然,你也可以像我一样,使用 *.443 来抓取所有的 Https 包。
通过浏览器访问自己要抓的链接,这样所有的 Https 都可以像 HTTP 一样明文的展示在我们面前
image
3、手机抓包
手机抓包的原理其实也很简单,让手机和抓包工具处于同一个局域网,并将手机的 Wifi Proxy 手动代理到电脑的 IP 和 Charles 设置的抓包端口上,具体操作可以参考:http://blog.csdn.net/richer1997/article/details/52198024
我这里主要讲一下手机端抓取 Https 的方式,其实也和浏览器一样:
首先需要安装 Charles 的根证书到手机上
image
点击之后,会弹出让你在手机上配置代理到对一个 ip 和端口,之后通过手机浏览器打开 chls.pro/ssl 来安装
image
使用手机访问该链接之后,会自动被识别为证书,并跳转到安装界面
image
之后就类似于 PC 端抓包原理一样,手机端的证书被作为根证书使用,并通过 Charles 拿到 enc_key 将所有通信过程透明化
4、总结
抓包的用处其实很多,有时候可以用来调试我们的接口、有时候也可以用来做一些对工作有益的事情。
感谢大家阅读本篇。