打开控制台命令行,我这个是MAC,在Linux下是同样的
输入sudo -i 获取权限
紧接着输入ifconfig,我们去查看一下网卡,其中工作的是这个,你也可以看一下自己的是哪个,在我这里是en1
输入命令抓取en1网卡的数据,
输入src过滤,比如我这里ip地址,源是 192.168.1.6
-xx 表示十六进制
-Xs X表示ACISS码 s表示全部数据
这时候我们看到数据就抓到了
这表示从192.168.1.6的IP地址,端口是50043, 到这个域名 hkg12s11-in-f10.1e100.net.https,Flags发送的内容,这是一个TCP的,它的sequence是3888877616, 窗口大小是65535, 所以的参数都在这里了,如果你对整个协议非常熟悉的话,你就知道这是什么意思
它的十六进制实际上就是这些,还包括了头和体
这样的话我们还可以加一个w写到test.cap,这个cap,这个.cap文件是可以用WireShark读出来的
这个时候就开始抓取数据,然后我们按control+C,
输入
ls test.cap
使用vim打开
vim test.cap
我们可以看到二进制文件,什么也看不清
我们输入
:%!xxd
这就表示以16进制的方式将它打开了
输入
:q!
其实这样的数据我们很难看明白,但是如果我用WireShark就比较清楚了,
我们用WireShark打开test.cap文件
其中
Time时间点、
Source源、
Destination目的地址、
Protocol协议、
SrcPort源端口号、
DstPort目的端口、
Length长度、
info具体内容
所以这就是WireShark,WireShark要比tcpdump好用很多
这里是TCP的SYN和ACK,也就是一去一回请求握手,这就是TCP
这里我们就不作过多的讲解了
WireShark中的逻辑运算
我先看一下WireShark包括哪些逻辑运算,这样我们就能进行各种复杂的组合了
与或非
与: and 或 &&
或: or 或 ||
非: not 或!
判断语句
等于:eq 或 ==
小于:lt 或 <
大于:gt 或 >
小于等于: le 或 <=
大于等于: ge 或 >=
不等于:ne 或 !=
这就是WireShark基本的判断语句,有了这些之后,加上WireShark的一些过滤方法可以组合成非常复杂的过滤条件了。
WireShark按协议过滤
stun
tcp
udp
我们打开WireShark这里包括所有的网卡
如果主界面找不到网卡,我们可以点击齿轮查看详情,这里可以看到每一个网卡,选中以后,点击开始监控
这样就能看到很多数据了,这样我们要按照协议去
这样我们要按照协议去抓取数据,比如说输入stun协议,这时候我们是没有任何stun数据的
大家可以打开下列网址(如果打不开你要自己想办法啊)
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
这个工具里会有一些ICE Server,大家可以点击下面的Gather candidates按钮升级所有的候选者,这时候他就会去向turn服务去发数据,这时候我本地的地址以及映射后的地址还有中继的地址都可以捕获到
其中host表示本机地址,
srflx表示映射的地址,映射后的地址表示本地地址出外网,映射后的地址是223.72.62.101,端口是15945,
relay表示中继地址,39.105.185.198表示在turn服务上开通的一个中继地址,端口是50447,
通过这几个我们就可以看的很清楚
这个时候我们通过网络抓取可以看到很多数据
首先我们看到一个Bingding Request,它的协议是STUN协议,点开我们可以看到Message Type就是0x0001就是Bing Request,
它有Length字段,Length是 0所以它的内容就没有,它只有一个包头,Message Cookie是2112a442,在RFC5389里面我们介绍过这个,还有一个Message Transaction ID表示事务ID,
这是请求
下面我们再看看响应
也就是说从192.168.1.6我本机,目的地址是39.105.180.98向这台机子发送了一个Bingding 请求,发送的这个事务ID是4666446f 4875796a344b4754,
这里同样的事务ID4666446f 4875796a344b4754给予了回复
这些回复的是0x0101,并且显示成功响应,长度是68,点开Attributes,
包括了映射地址
我们点开Attribute Type,这里面显示内容是TLV格式,T就是代表类型,后面的长度是8,代表的是一个IP地址和端口,
MAPPED-ADDRESS属性长度也是8, RESPONSE-ORIGIN属性也是8,一共长度就是24个字节
SOFTWARE是26
24加26就是50个字节,这个26是内容,前面两个是4个字节,四四十六,这每一个都是 16,最后还有个padding 2个字节,所以这样就组成了68个字节的包体长度。
所以大家这里就可以看到,我们此前说STUN协议的时候,发送的请求是 0x0001,响应的应该是0x0101。
我们的TURN协议是在STUN协议之上的,所以这里我们也会看到Allocate Request UDP,这是发送了一个分配服务的一个请求,我们记一下这里的事务ID
我们在看响应,是同一个事务ID表示同一个会话,这个Message Type回了一个 0x0113 是个错误,0x0001是绑定请求,0x0002表示加密信息,0x0003表示Allocate,这一次是失败了。
紧接着又发送了一次,这一次成功了
这次回复了一个0x0103,这是一个成功的消息,所以这次在TURN服务上,就把中转服务给开通了。
那么通过WireShark这种分析我就能将之前介绍的协议完全连在一起,说明我们的协议是没有任何问题的。
当然也可以抓取TCP协议或者UDP协议 ,直接在WireShark上面写就可以了。比如我们抓取一些udp
输入栏显示绿色表示抓取条件是对的,红色表示抓取条件是错误的
我们用的STUN协议、DNS都是UPD的,如果我们输入TCP,那些显示STUN的那些都没有了。
这是按协议过滤。
WireShark按IP过滤
ip.dst == 192.168.1.2
ip.dst表示过滤是目的ip,也就是发到192.168.1.2的
ip.src == 192.168.1.2
表示源ip,表示发送端是192.168.1.2
ip.addr == 192.168.1.2
ip.addr表示指定ip,不管是源ip还是目的ip,只要是这个ip地址就可以过滤掉
我们来尝试一下
这就是按ip过滤
WireShark按端口过滤
按照tcp,因为端口实际是定位到应用层了,就是ip层是没有端口的,那tcp是有端口的,udp也有端口
tcp.port == 8080
udp.port == 3478
udp.dtsport == 3478
udp.dtsport表示源端口
udp.srcport == 3478
udp.srcport表示目的端口
我们尝试下
WireShark按长度过滤
udp.length < 30
udp.length < 30
http.content_length < 30
那以上就是WireShark基本的用法。我们讲了与或非和判断语句,还有按协议、Ip、端口、长度、内容过滤,当然对内容来说就涉及到更高级的用法了。可以慢慢摸索。前面的这些只要掌握了,就可以做我们这边简单的网络数据分析了。
我们也可以写一个组合来进行过滤,比如说
与
非
大家可以按自己需要写各种个样的过滤条件
这样我们就可以做各种分析,后面我们会经常用到这个 WireShark去查一下协议的数据发送。