wireshark基于命令行tshark分析数据包

wireshark是人人熟知的抓包分析工具,但它仅仅通过用户界面来操作,执行,比较直观,但是假如一些分析过程比较持久,分析的数据包文件比较庞大,或者想糅合其它操作,通过基于命令行模式的tshark镶嵌在scripts来实现分析可能更方便

在linux下比较出名的是tcpdump,一般安装linux系统只要你没把它去掉不安装,默认都是会自带的,基于libpcap,但是习惯了wireshark那些操作方法和过滤条件,更愿意命令行上有一个wireshark一样规则的工具,它就是tshark

安装

Ubuntu:sudo apt-get install wireshark

CentOS/Fedora:sudo yum install wireshark

RHEL:挂载本地yum进行安装,或者下载源代码编译,安装,由于耗时十分久,编译时假如是多核机器,最好make -jN加快速度

安装之后通过which tshark检查已经安装成功

一般主要通过tshark -r XX.pcap得到每个包的信息,或者更详细的添加一个大V选项得到完整数据包信息,类似于wireshark,包括十六进制信息,tshark -r XX.pcap -V

 

我最喜欢的几种用法

1:针对协议输出

比如你不想得到每个包的信息,而是基于每一条完整tcp流,得到上下行的包统计

tshark -r XXX.pcap -q -z conv,tcp

这样就能得到每一条tcp连接,包括srcip,srcport,dstip,dstport,in/out bytes,pkts等

同样如果想得到ip层信息,只需要

tshark -r XXX.pcap -q -z conv,ip

具体还有那些选项信息可以得到,可以tshark -r XXX.pcap -q -z conv进行查看,或者直接查看man手册

2:针对过滤条件输出

wireshark的过滤条件十分丰富,tshark可以将它们运用起来,个人十分热衷,具体命令:

tshark -r XXX.pcap -T fields -e XXX

-e后面带的就是wireshark里过滤框设置的过滤条件

比如想得到包的编号以及对应的包头里的源ip地址,可以:

[lihui@script]$ tshark -r one.pcap -T fields -e frame.number -e ip.src
1 192.168.1.100
2 143.248.142.36
3 192.168.1.100
4 192.168.1.100
5 143.248.142.36
6 143.248.142.36
7 192.168.1.100
8 143.248.142.36
9 192.168.1.100
10 192.168.1.100
11 143.248.142.36
12 192.168.1.100
13 143.248.142.36
14 143.248.142.36
15 192.168.1.100
16 143.248.142.36
17 192.168.1.100
18 192.168.1.100
19 143.248.142.36

也就是想添加任何域,想得到任何域,只需要添加一个-e选项得到,不仅如何,就算是7层host,url等也可以通过-e http.host等来dump出对应的信息,进而进行二次分析

下面可以通过实现一个分析trace的函数,功能是输出所占的流量从大到小的dstport

sub Ports_traffic {

my $four_trace_file = shift;

my %ports_traffic;
my $ports;
my $total_traffic;

open $FOUR, “tshark -r $four_trace_file -T fields -e tcp.dstport -e frame.len |”;
while(<$FOUR>){
if(/(\d+)\s+(\d+)/){
$ports = $1;
$ports_traffic{$ports} += $2;
$total_traffic += $2;
}
}
close($FOUR);
foreach my $key (sort { $ports_traffic{$b} <=> $ports_traffic{$a} } keys %ports_traffic ){
my $traffic_rate = $ports_traffic{$key} * 100 / $total_traffic;
print “$key : $ports_traffic{$key} => $traffic_rate% \n”;
}
}

将pcap格式的文件作为参数传到函数中,添加一个函数调用,脚本执行结果类似如下:

[lihui@script]$ ./ports_traffic.pl six.pcap
58074 : 43064 => 34.3585692971748%
58073 : 36127 => 28.823890790429%
80 : 22950 => 18.310634529309%
58072 : 15646 => 12.483145439894%
54988 : 6223 => 4.96501432138953%
58094 : 896 => 0.714872703192194%
38650 : 431 => 0.343872918611424%

第一列代表端口号,第二列表示流量字节数,后面是占比

至于程序中通过正则表达式还是split分给数组来处理看个人爱好或者从性能角度考虑自行选择

3:边监听网口抓包边过滤分析

sudo tshark -i ethX -R “过滤条件“

基本wireshark过滤框里能设置的过滤条件都能在这里适用,其实-f选项也行,只不过没有-R丰富,具体可参考man手册或者手动实验一下

总之基本wireshark能够过滤基本信息都能通过命令行tshark输出,多man一下或者多尝试下过滤条件,总能找到答案

发表评论