可以用tcpdump + wireshark的完美组合,来实现在 Linux 里抓包,然后在Windows 里分析包。
一、tcpdump
1、基本语法
tcpdump功能非常强大,详细可以参看
这里,但这里只介绍常用功能。
tcpdump的基本语法格式是:
tcpdump+参数+关键字
参数和关键字都可以指定多个,关键字之间可以用关系运算符来组合。
(1)常用参数
-s:指定要监听数据包的长度,默认是68个字节,设置为0意味着让tcpdump自动选择合适的长度来抓取数据包,比如:-s 0
-w:指定将监听到的数据包写入文件中保存,比如:-w a.cap
-A:指定将每个监听到的数据包以ACSII可见字符打印
-r:指定从某个文件中读取数据包,比如:-r a.cap
------------------------------------------------------------------------------------------------------------------------------------------------------
-i:指定tcpdump监听的网络接口
-c:指定要监听的数据包数量,达到指定数量后自动停止抓包
-C:file-size (nt: 此选项用于配合-w file 选项使用),该选项使得tcpdump 在把原始数据包直接保存到文件中之前,检查此文件大小是否超过file-size,如果超过了,将关闭此文件,另创一个文件继续用于原始数据包的记录,新创建的文件名与-w 选项指定的文件名一致,但文件名后多了一个数字,该数字会从1开始随着新创建文件的增多而增加,file-size的单位是百万字节(这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1K, 1024K字节为1M计算所得, 即1M=1024*1024=1,048,576)
-n:指定将每个监听到数据包中的域名转换成IP地址后显示
-nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-e:指定将监听到的数据包链路层的信息打印出来,包括源mac和目的mac,以及网络层的协议
-p:将网卡设置为非混杂模式,不能与host或broadcast一起使用
-S:指定打印每个监听到的数据包的TCP绝对序列号而非相对序列号
(2)关键字
tcpdump支持的关键字很多,但从功能上来分主要包括三种类型:
第一种是关于类型的关键字,主要包括host、net、port。
第二种是确定传输方向的关键字,主要包括src、dst、src or dst、src and dst,这些关键字指明了传输的方向。
第三种是协议关键字,包括fddi、ip、arp、rarp、tcp、udp、imcp等。
(3)关系运算符
支持的关系运算如下:
否 (`!' 或 `not')
与(`&&' 或 `and')
或(`||' 或 `or')
否运算符的优先级最高,与和或运算符的优先级相同, 并且二者的结合顺序是从左到右。
2、应用举例
(1)抓包
执行如下命令开始抓包:
#tcpdump -s 0 -w a.cap host 8.8.8.8
上面例子表示抓取到主机8.8.8.8的网络数据包,并写入a.cap,每条数据的抓取长度由tcpdump来自动选择。
Ctrl+C可以结束抓取,此时在指定目录下会产生a.cap文件,这里是当前目录下。
(2)解析
执行如下命令解析抓取的数据包:
#tcpdump -s 0 -A -r a.cap
上面例子表示从文件a.cap读取数据并以ACSII格式解析数据,解析出来的数据显示格式如下:
src > dst: flags data-seqno ack window urgent options
src和dst是源和目的IP地址以及相应的端口。
flags标志由S(SYN)、F(FIN)、P(PUSH)、R(RST)等组成,单独一个'.'表示没有flags标志。
数据段顺序号(data-seqno)描述了此包中数据所对应序列号空间中的一个位置(整个数据被分段,
每段有一个顺序号, 所有的顺序号构成一个序列号空间).
ack描述的是同一个连接,同一个方向,下一个本端应该接收的(对方应该发送的)数据片段的顺序号。
window是本端可用的数据接收缓冲区的大小(也是对方发送数据时需根据这个大小来组织数据)。
urg(urgent)表示数据包中有紧急的数据。
options描述了tcp的一些选项, 这些选项都用尖括号来表示(如
)。
二、wireshark
1、解析数据
用wireshark选择File-->Open打开a.cap就可以看到如下界面了:
非常简单,剩下的事情就是wireshark自己的功能了。
2、过滤规则
因为你抓取到的数据可能非常大,所以用好wireshark的关键是灵活使用各种过滤条件和Flow Graph。
过滤规则无非是对IP、Port、Mac、协议结合关系运算符进行组合操作来实现的。
(1)过滤IP
ip.src eq 8.8.8.8 or ip.dst eq 8.8.8.8
ip.addr eq 8.8.8.8
ip.addr == 8.8.8.8
上面显示来源IP或者目标IP等于8.8.8.8的所有数据
(2)过滤端口
tcp.port eq 80
udp.port == 80
tcp.srcport == 21
tcp.dstport eq 21
上面表示端口相等过滤
tcp.port >= 1 and tcp.port <= 80
上面表示端口范围过滤
(3)MAC过滤
eth.dst == A0:00:00:00:B0:11
上面表示过滤目标MAC
eth.src eq A0:00:00:00:B0:11
上面表示过滤来源MAC
eth.addr eq A0:00:00:00:B0:11
上面表示过滤来源和目标MAC
(4)包长过滤
udp.length == 26
表示UDP数据包长
tcp.len >= 47
表示TCP数据包长
ip.len == 94
表示IP数据包长
frame.len == 119
表示整个数据包长
(5)协议过滤
1)HTTP过滤:
http.request.method == "GET"
http.request.method == "POST"
http.request.uri == "/img/logo.gif"
http contains "GET"
http contains "HTTP/1.1"
http.request.method == "GET" && http contains "Host:"
http.request.method == "POST" && http contains "User-Agent:"
http contains "HTTP/1.1 200 OK" && http contains "Content-Type:"
2)TCP过滤
tcp.flags.syn == 0x02
显示包含TCP SYN标志的包
tcp.window_size == 0 && tcp.flags.reset != 1
3、图形显示
选择Statistics-->Flow Graph,保持默认选项即可:
上图显示完整的数据流程图,包括TCP和HTTP。
阅读(945) | 评论(0) | 转发(0) |