01概要
不管是开发还是测试,工作中经常需要抓住包。 本文主要介绍在各平台下,有效抓包的方法。
目前的捕获软件总体上分为两类。
一种方法是设置代理以捕获http数据包,就像Charles、mitmproxy等软件一样。 另一个是直接抓住所有通过网卡的协议包。 其中最有名的是著名的wireshark和linux附带的捕获软件tcpdump。 重点介绍抓住这四个包的工具的特点和使用方法。
02Wireshark
wireshark想必大多数程序员都不会陌生。wireshark在各个平台都可以安装使用,它可以抓取经过指定网卡的所有协议。wireshark虽然很强大,但是对初学者其实不是很友好。
这是因为它强大到可以抓住所有包,所以初学者在使用时对广阔的数据流感到困惑。 初学者需要认真学习如何过滤自己感兴趣的数据包,但是如果不熟悉wireshark的过滤语法,则很难过滤数据包。
总结
过滤语法简单介绍
wireshark的过滤器语法其实也很简单。 可以以协议开头,后跟协议属性,再加上contains,=,等判断符号。 例如,如果只想显示http的协议内容,则直接在过滤器输入框输入http即可。
下图:
例如,如果只想看到http协议的请求标头中uri包含“/API”的协议,可以写如下:
如果使用目标ip或源ip过滤包,则不能使用http协议作为前缀,因为这些是ip协议的属性。 使用目标ip进行过滤后,可以按如下方式进行书写。
上面显示的是目标计算机的ip为61.135.217.100,协议为http的数据包。
wireshark支持各种协议。 可以从右上角的expression中打开搜索支持协议。 也可以找到协议支持的属性,然后输入期望的值。 软件会自动构建过滤器语句。
好处:
功能强大,能够抓住所有协议的包容易分析缺点:
因为在线服务器没有GUI,只有命令行,所以在线服务器无法解析https包。 由于wireshark是通过链路层获取的分组信息,因此获取的https分组是加密数据,无法解析分组的内容。 当然,可以对https包进行解密,但操作会很复杂,可能需要很多时间。
03 TC泵
tcpdump是linux上自带的一个抓包软件mac也有),功能强大,也可以抓取经过指定网卡的所有协议包。
由于是命令行工具,tcpdump抓取到的包不易于分析,一个常见的做法是将tcpdump抓到的包输出到某个文件,然后将文件拷贝下来用wireshark分析。
几个简单的过滤器参数:
将包的内容输出到文件:
然后,可以直接在wireshark中打开test.cap
以很直观的分析包了。
用tcpdump输出cap文件包:
tcpdump-r test.cap
04Charles
Charles是一款http抓包工具,它是通过代理来实现的抓包。也就是我们在访问网页时需要配置代理,将代理指向Charles监听的端口,之后我们的http请求都会发向Charles的端口,之后Charles会帮我们转发并记录协议内容。
Charles的使用非常简单,配置好代理后,Charles就开始抓包了。
我们可以直接通过Charles的GUi查看包的内容:
上图中的unknown表示https加密后的数据,所以看到不协议的具体内容。我们可以通过安装Charles的证书,让Charles也可以查看https协议的具体内容。
优点
使用简单,只需配置一下代理地址就可以要抓取https协议的配置也很简单,只要安装下charles的证书就可以了
05mitmproxy
mitmproxy是python写的一款http抓包工具,虽然只支持http抓包,但是它的特性非常强大,它不仅可以抓包,还可以对请求进行拦截、重现等操作。和Charles一样,它的原理也是基于代理,使用的时候需要设置代理指向它。
mitmproxy是命令行工具,但是也自带了mitmweb工具,可以让用户在网页上操作。另外,mitmproxy还支持用户自行编写插件,可以编写脚本对请求进行处理,然后把修改后的请求发出去。
1、安装
首先需要在机器安装python3以及pip3.之后通过pip3安装
pip3 install mitmproxy
如果安装mitmproxy过程中报错ModuleNotFoundError: No module named ‘_ssl’,就需要安装一下OpenSSL,然后再重新编译安装一下python3。
安装好openSSL后再执行pip3 install mitmproxy
2、使用
安装后,直接在命令行输入mitmproxy就会进入它的交互界面:
这时候mitmproxy已经开始监听8080端口默认),接着,我们可以去浏览器设置代理。浏览器设置代理的方式有很多,这里不多做介绍。
设置完代理后,访问浏览器的请求都会被发到mitmproxy上,mitmproxy根据规则对请求进行拦截不配置拦截规则的话则都不拦截),所有经过的请求都会被输出:
在交互界面上可以通过快捷键操作请求。输入问号’?’,可以查看快捷键的文档。
3、下面介绍一些常用的快捷键和功能
① 请求过滤
在请求列表交互界面,按下f键后,可以输入一些过滤规则:
具体的过滤语法可以按下’?‘键后,再按下方向键右’—>’或者l键。
②请求拦截
按下i键后,可以对指定的请求进行拦截。按mitmproxy收到指定条件的请求时,不会立马把它转发出去,而是等待我们执行resume操作后,才会把请求转发出去——在这期间我们甚至可以对请求进行手动修改。
红色字体表示该请求被拦截,之后我们可以按入a键来恢复该请求,可以输入A键恢复所有被拦截的请求。
③ 查看/编辑请求
把指示光标移动到某个请求上,按回车可以查看请求的内容。或者鼠标直接点击请求也可以。
之后通过左右方向键可以查看request、response、detail等信息。
如果要编辑请求,可以在这个界面输入e,然后会让我们选择编辑哪块内容:
之后就会进入vim编辑界面编辑相应的内容了(保存后会生效)。
④ 重发请求
mitmproxy的光标指向某个请求时,按下r键可以重发这个请求重发前可以对该请求进行编辑)。
按下’:’键后,可以输入命令,这样我们就可以通过过滤规则批量的重发请求
replay.client是mitmproxy内置的一个命令,我们也可以自行编写命令。命令的编写可以参考官网文档,这里不做介绍。
⑤ 插件开发
我们可以编写插件,然后再启动的时候指定插件,mitmproxy处理请求的时候会执行一个插件的链,这样我们就可以对请求进行编辑然后再发送出去了。
借用官网的插件demo:
这个方法对每一个请求进行处理,然后打印序号。通过mitmproxy -s test.py来让插件生效。通过插件可以绑定各种连接事件。感兴趣的朋友可以自行去mitmproxy官网看文档,这里不多做介绍。
⑥ 保存抓到的请求数据
通过w快捷键我们可以把这次抓到的请求包保存到文件上。
通过mitmproxy -r file可以读取以前抓取的请求信息进行分析。
优点:
命令行操作,可以在无GUI界面的服务器上使用
06总 结
对于这几个抓包神器,我总结了下使用场景:
只抓http协议的话:推荐使用mitmproxy。mitmproxy丰富的功能不仅可以满足我们的抓包需求,还可以提升我们的工作效率。比如测试可以抓包后一键重发请求来重现bug,开发调试的时候可以修改请求内容等等如果是在线上的没有GUI的服务器:推荐使用tcpdump,虽然mitmproxy也可以支持命令行抓包,但是生产环境的服务器最好不要乱安装第三方插件。另外,大多数服务器都有装tcpdump。我们可以通过把请求的内容输出到文件,然后拷贝会自己的电脑用wireshark分析。想要抓取http以外的协议的话:直接上wireshark。功能强大。对于Charles,感觉用了mitmproxy之后,就基本用不上Charles了。Charles好像也可以编辑后再发送,但是感觉不是很好用,可能我用的不是很熟吧。