无论是开发还是测试,在工作中经常会遇到需要抓包的时候。本篇博客主要介绍如何在各个平台下,高效的抓包。目前的抓包软件总体可以分为两类,一种是设置代理抓取http包,比如Charles、mitmproxy这些软件。另一种是直接抓取经过网卡的所有协议包,其中最出名就是大名鼎鼎的wireshark以及linux自带的抓包软件tcpdump。下面重点介绍一下这四个抓包工具的特点以及使用
wireshark想必大多数程序员都不会陌生。wireshark在各个平台都可以安装使用,它可以抓取经过指定网卡的所有协议。wireshark虽然很强大,但是对初学者其实不是很友好。这也正是由于它太强大,它可以抓取所有包,所以初学者在使用时面对茫茫数据流不知所措。初学者需要认真的去学习怎么过滤得到自己感兴趣的包,但是如果不熟悉wireshark的过滤语法,要过滤数据包将举步维艰。
wireshark的过滤语法总结起来其实也很简单,就是以协议开头,后面可以跟着协议的属性,然后加上一些判断符号,比如contains、==、>、<等等。比如只想展示http的协议内容,则直接在过滤器输入框中输入http即可。如下图:
比如我只想看http协议的请求头中uri包含’/api’的协议,就可以这么写:
如果想通过目标ip或者来源ip来过滤包,就不可以以http协议为前缀了,因为这些是ip协议的相关属性。通过目标ip来过滤可以这么写:
上面表示目标机器的ip是61.135.217.100并且协议是http的包。
wireshark支持很多种协议,我们可以通过右上角的expression来打开搜索支持的协议,还可以找出协议支持的属性,然后填入期待的值,软件会自动为我们构建过滤语句。
优点:
缺点:
tcpdump是linux上自带的一个抓包软件(mac也有),功能强大,也可以抓取经过指定网卡的所有协议包。由于是命令行工具,tcpdump抓取到的包不易于分析,一个常见的做法是将tcpdump抓到的包输出到某个文件,然后将文件拷贝下来用wireshark分析。
下面的语句参考文章:https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
一些简单的过滤参数:
# -i 参数表示抓取指定网卡的内容。具体网卡可以通过 ifconfig 命令查看
# 如果不指定网卡,默认tcpdump只会监视第一个网络接口
tcpdump -i eth1
# 打印所有www.baidu.com相关的包,这个host后面可以填 域名,也可以填ip
tcpdump host www.baidu.com
tcpdump host 192.168.0.1
# 打印 nn1和nn2或nn3 主机间通信的包,这里可以替换成ip
tcpdump host nn1 and \( nn2 or nn3 \)
# 打印nn1和非nn2之间的ip数据包
tcpdump ip host nn1 and not nn2
# 发送者是nn1的数据包
tcpdump -i eth0 src host nn1
# 接受者是nn1的数据包
tcpdump -i eth0 dst host nn1
# 指定tcp端口是23以及host是210.27.48.1数据包
tcpdump tcp port 23 and host 210.27.48.1
抓包内容输出到文件:
# 抓取指定网卡的包输出到test.cap
tcpdump -i en0 -w test.cap
之后我们可以把test.cap直接用wireshark打开,就可以很直观的分析包了。
用tcpdump输出cap文件包:
tcpdump -r test.cap
优点:
缺点:
Charles是一款http抓包工具,它是通过代理来实现的抓包。也就是我们在访问网页时需要配置代理,将代理指向Charles监听的端口,之后我们的http请求都会发向Charles的端口,之后Charles会帮我们转发并记录协议内容。
Charles的使用非常简单,配置好代理后,Charles就开始抓包了。我们可以直接通过Charles的GUi查看包的内容:
上图中的unknown表示https加密后的数据,所以看到不协议的具体内容。我们可以通过安装Charles的证书,让Charles也可以查看https协议的具体内容。
优点:
缺点:
mitmproxy是python写的一款http抓包工具,虽然只支持http抓包,但是它的特性非常强大,它不仅可以抓包,还可以对请求进行拦截、重现等操作。和Charles一样,它的原理也是基于代理,使用的时候需要设置代理指向它。
mitmproxy是命令行工具,但是也自带了mitmweb工具,可以让用户在网页上操作。另外,mitmproxy还支持用户自行编写插件,可以编写脚本对请求进行处理,然后把修改后的请求发出去。
首先需要在机器安装python3以及pip3.之后通过pip3安装
pip3 install mitmproxy
安装python3的教程可以看我的博客:
Centos 安装python3
如果安装mitmproxy过程中报错ModuleNotFoundError: No module named '_ssl'
,就需要安装一下OpenSSL,然后再重新编译安装一下python3
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++
# 去Python3的安装目录再次安装编译一次python3
make && make install
安装好openSSL后再执行pip3 install mitmproxy
安装后,直接在命令行输入mitmproxy
就会进入它的交互界面:
这时候mitmproxy已经开始监听8080端口(默认),接着,我们可以去浏览器设置代理。浏览器设置代理的方式有很多,这里不多做介绍。
设置完代理后,访问浏览器的请求都会被发到mitmproxy上,mitmproxy根据规则对请求进行拦截(不配置拦截规则的话则都不拦截),所有经过的请求都会被输出:
在交互界面上可以通过快捷键操作请求。输入问号’?’,可以查看快捷键的文档。
下面介绍一些常用的快捷键和功能
在请求列表交互界面,按下f键后,可以输入一些过滤规则:
具体的过滤语法可以按下’?‘键后,再按下方向键右’—>'或者l键。
按下i键后,可以对指定的请求进行拦截。按mitmproxy收到指定条件的请求时,不会立马把它转发出去,而是等待我们执行resume操作后,才会把请求转发出去——在这期间我们甚至可以对请求进行手动修改。
红色字体表示该请求被拦截
之后我们可以按入a键来恢复该请求,可以输入A键恢复所有被拦截的请求。
把指示光标移动到某个请求上,按回车可以查看请求的内容。或者鼠标直接点击请求也可以。
之后通过左右方向键可以查看request、response、detail等信息。
如果要编辑请求,可以在这个界面输入e,然后会让我们选择编辑哪块内容:
之后就会进入vim编辑界面编辑相应的内容了(保存后会生效)。
mitmproxy的光标指向某个请求时,按下r键可以重发这个请求(重发前可以对该请求进行编辑)。
按下’:'键后,可以输入命令,这样我们就可以通过过滤规则批量的重发请求
replay.client
是mitmproxy内置的一个命令,我们也可以自行编写命令。命令的编写可以参考官网文档,这里不做介绍。
我们可以编写插件,然后再启动的时候指定插件,mitmproxy处理请求的时候会执行一个插件的链,这样我们就可以对请求进行编辑然后再发送出去了。
借用官网的插件demo:
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]
这个方法对每一个请求进行处理,然后打印序号。通过mitmproxy -s test.py
来让插件生效。通过插件可以绑定各种连接事件。感兴趣的朋友可以自行去mitmproxy官网看文档,这里不多做介绍。
通过w快捷键我们可以把这次抓到的请求包保存到文件上。
通过mitmproxy -r file
可以读取以前抓取的请求信息进行分析。
优点:
缺点:
mitmproxy官方文档地址:
https://docs.mitmproxy.org/stable/
对于这几个抓包神器,我总结了下使用场景: