最近这几天写了一个解析pcap文件的程序。功能就是把pcap文件里面不同的会话分开,存为一些小的pcap文件,然后再提取里面的负载。然后想在上面拓展一下,比如直接监听本机的端口,将得到的数据动态解析为pcap文件,提取负载等。然后发现了一个在lunix可以捕获数据包的工具–tcpdump。这个工具十分强大,所以就顺便学习了一些用法,如下:
首先我们看一个十分简单的命令
sudo tcpdump # 需要在root权限下运行
然后你就会发现你电脑正在传输的各种报文了,然而它的牛逼之处在于它的选项以及过滤的能力。首先谈谈tcpdump的一些常用的参数选项。首先我们的电脑都有几个网卡,这些可以通过ifconfig来查看,然后如果你想监听某个特定的网卡怎么办,于是有了一个 -i的参数
sudo tcpdump -i wlp8s0
一般显示三个,一个是有线网卡,一个是本地环回(就是localhost),一个是无线网卡(本文捕获的数据全都是无线网卡的)。
假设我们想捕获特定个数的数据包怎么办,这时候就要用到 -c 参数了。
sudo tcpdump -i wlp8s0 -c 10
这个就是说我想捕获10条数据包。
我们看一下报文的头部输出是什么(数据部分仅展示第一条)
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp8s0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:51:25.454828 ARP, Request who-has 10.11.178.55 tell 10.11.178.55,length 28
......
第一个是建议可以用 -v -vv 来查看详细的协议的编码信息,主要就是数据部分的信息。第二个就是以太网的链路层信息,第三行就是具体捕获的数据包。但是内容很简略,如果想要详细一点的怎么办?第一个可以使用 -v 得到的信息格式如下:
tcpdump: listening on wlp8s0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:59:39.967212 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.12.113.254 tell 10.12.113.193, length 28
16:59:39.971915 IP (tos 0x0, ttl 64, id 6011, offset 0, flags [DF], proto UDP (17), length 72)
10.11.177.216.52914 > dns.hust.edu.cn.domain: [udp sum ok] 29723+ PTR? 254.113.12.10.in-addr.arpa. (44)
这样把ttl等各种信息都展示出来了,然有一个参数可以改为展示以太网头部的帧信息。那就是 -e
sudo tcpdump -c 10 -e
展示效果如下:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp8s0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:59:53.228185 b0:e2:35:2f:d0:6a (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 10.12.113.254 tell 10.12.113.193, length 28
这样可以看到这是一个广播(Broadcast)的信息。
接下来的这个参数很重要了,目的就是把捕获的数据包原封不动的写到一个pcap文件里面去,这样你可以用wireshark等工具可以直接查看(当然你也可以直接使用wireshark捕获)。这两个参数就是 -r(从文件里面读取) -w(保存到文件中),比如如下命令:
sudo tcpdump -c 10 -w data
然后就可以发现data文件里面10个数据包了。
前面讲的都是一些选项,假设我对数据包有要求怎么办,比如我只想要TCP报文,不想要UDP报文。这就是所谓的过滤参数了,
sudo tcpdump "tcp"
这样就会一直读取TCP报文写到data,直到你按下 ctrl+c 。
tcpdump 支持的协议类型有
假设我对端口有要求呢? 比如可以使用 “port 80” 来指定捕获HTTP报文
还有一些参数如下(都放在双引号里面即可):
1 host:指定主机名或IP地址,例如’host baidu.com’或’host 111.111.111.111′
2 net :指定网络段,例如’arp net 128.3’或’dst net 128.3′
3 portrange:指定端口区域,例如’src or dst portrange 6000-6008′
还有很多复杂的参数和过滤条件可以使用 man tcpdump 和 man pcap-filter 查看。