1.3 其他流量收集方式
除了前文所述的流量收集方式外,不得不提一下三个重要工具:tcpdump、Wireshark以及其附属工具tshark。此三款工具为网络工程师诊断网络与优化网络的必备工具,同样,安全工程师也离不开网络分析,因此有必要对这三个工具进行使用说明。
1.3.1 tcpdump
tcpdump是一款非常优秀的开源抓包程序,适合在没有图形界面的Linux服务器中使用,通过-w参数,将数据包保存成文件,再使用数据包分析工具对文件进行分析。tcpdump的完整命令格式如下:
tcpdump[-AbdDefhHIJKlLnNOpqStuUvxX#][-Bbuffer_size] [-ccount][-Cfile_size] [-Espi@ipaddralgo:secret,...] [-Ffile][-Grotate_seconds][-iinterface] [--immediate-mode][-jtstamp_type][-mmodule] [-Msecret][--number][--print][-Qin|out|inout] [-rfile][-ssnaplen][-Ttype][--version] [-Vfile][-wfile][-Wfilecount][-ydatalinktype] [-zpostrotate-command][-Zuser] [--time-stamp-precision=tstamp_precision] [expression]
我们简单介绍一些常用参数与表达式。
常用参数如下:
·-i:网卡名,最常用参数,标明要使用哪块网卡抓包,也可以使用-i any抓取全部网卡流量。
·-s:数字,表示要抓取数据包的大小,数字最高为262144,也可以-s 0表示不限制长度。
·-n或-nn:直接显示IP与端口,不进行反向解析,速度更快。
·-v、-vv、-vvv:输出详细度以此递增。
·-D:列出可以抓包的接口。
·-w:文件名,将捕获的数据包保存为文件名。
·-c:数字,捕获多少个数据包。
·-C:数字,捕获指定数据包大小后停止捕获。
表达式用于设置过滤条件,抓取特定的数据包,由以下一个或多个类型构成:
·类型:包括host、net、port、portrange。
·方向:包括src、dst、src or dst、src and dst等。
·协议:包括ip、tcp、udp、ether、arp等。
除以上关键字外,还可以使用less、greater、gateway以及连接词and、or、not。
tcpdump的常用命令介绍如下。
抓取IP为192.168.1.99,并且非端口为22的数据包,示例如下:
tcpdump -i any host 192.168.1.99 and not port 22
抓取目的网络为非192.168.1.0的数据包,并不解析端口与域名,示例如下:
tcpdump not net 192.168.1.0/24 -i any -nn
抓一个目的地址为202.100.1.1的icmp包,示例如下:
tcpdump -i any icmp -c 1 and dst host 202.100.1.1
抓取192.168.1.5主动外连的TCP包并保存为test.cap(用于检测木马外连),示例如下:
tcpdump -i any 'tcp[tcpflags]&(tcp-syn)!=0' and src 192.168.1.5 -w test.cap
以上是一些常用的tcpdump语句,如果想要了解更多tcpdump的使用方法,可以参考官方文档https://www.tcpdump.org/manpages/tcpdump.1.html。
1.3.2 Wireshark
Wireshark是一款非常优秀的开源数据包抓取与分析软件。几乎应该是每个IT人员必备的工具之一。下载安装后打开Wireshark并运行后,出现的界面如图1-7所示。
图1-7 Wireshark主界面
从上至下依次为菜单栏、主工具栏、过滤器工具栏、数据包栏、数据包协议层展示区及原始数据包。这里主要介绍一下过滤器工具及统计功能。
1.Wireshark过滤器工具
过滤器分为捕获过滤器和显示过滤器,前者与tcpdump表达式功能类似,在抓包时用于更加精确地捕获特定的数据包,后者是在显示的时候将符合条件的数据包显示出来。不过两者语法是通用的,如图1-8和图1-9所示。
图1-8 抓包时使用捕获过滤器
图1-9 显示时使用显示过滤器,也可以直接输入过滤表达式
过滤表达式由过滤项、过滤关系、过滤值三项组成,例如ip.addr==192.168.1.1。
(1)过滤项
过滤项即例子中的ip.addr,对于初学者来说,最难的便是不知道都有哪些过滤项。Wireshark的过滤项大多数为协议.协议字段,例如ip.addr、tcp.port、tcp.window_size等,也有少许为协议.协议字段.扩充字段,例如arp.src.hw_mac、tcp.flags.syn等。如果不会写,可以进入数据包协议层展示区,选择希望作为过滤的条件,右击后,在弹出的快捷菜单中选择“作为过滤器应用→选中”命令即可,如图1-10所示。
当然,在输入协议并加“.”后,也可以弹出提示,如果表达式输入正确,整个过滤器会变成绿色,反之为红色,如图1-11所示。
(2)过滤关系
过滤关系就是大于、小于、等于等几种等式关系,可以直接看查官方表格,如图1-12所示。
图1-10 使用过滤器
图1-11 错误或不完全(左)与正确(右)的过滤器提示
图1-12 过滤关系
这里English与C-like写法等价。
(3)过滤值
过滤值即为要判定的值,例如1,0,1000等。也可以用连接词将多个表达式组合使用,连接词如图1-13所示。
图1-13 连接词
另外,新手容易犯的一个错误是连接词使用不当,例如当显示IP地址为192.168.1.99时,可以写为ip.addr==192.168.1.99,这是没有问题的,但是如果希望IP地址不是192.168.1.99时,有可能写ip.addr!=192.168.1.99,这样写是有问题的,原因是对Wireshark而言,会将这个表达式理解为:数据包有ip.addr这个字段,其值与192.168.1.99不同。由于IP数据包包含源地址与目的地址,因此只要两个地址中的一个与192.168.1.99不同,表达式便成立了。示例如图1-14所示。
图1-14 连接词使用不当
过滤器显示为黄色,且状态栏中有意外结果的提醒。
因此,正确的写法应该是!(ip.addr==192.168.1.99),示例如图1-15所示。
另外,可以单击显示过滤器右边的“表达式”按钮,所有过滤项、过滤关系都可以显示出来,如图1-16所示。
图1-15 正确的语法
图1-16 过滤器表达式
2.Wireshark统计功能
Wireshark另一个重要的功能就是其强大的统计功能,包括显示捕获数据包的总体情况,显示解析出的地址、域名、服务等信息,显示协议分布情况,以会话的视角进行统计,并可以直接对地址进行分析,可以统计哪些地址发包过多等,如图1-17所示。
这些统计数据都可以配合显示过滤器使用,利用好这些统计信息,可以在发生网络异常时,找到问题原因。
关于Wireshark的使用,笔者认为,单独出一本甚至几本书都不为过,鉴于市面上已经有非常多的关于如何使用Wireshark的书籍,这里就不再介绍了,读者可以参考各种图书或官方网站https://www.wireshark.org/进行深入研究。
图1-17 根据IP地址统计
1.3.3 tshark
tshark是Wireshark的一个附带工具,使Wireshark的命令行工具也可以进行抓包、数据包分析,笔者更多地将其用于如下场景:如果得到1GB或者更大的数据包,使用Wireshark打开,必定会造成系统资源不足,此时,可以先使用tshark(tcpdump也有这个功能)将符合条件的数据包筛选出来,或只针对需要的字段进行输出,再进行二次处理,这样可以大大缩小处理时间及资源使用。
tshark主要有以下参数:
·-r:读取数据包。
·-Y:设置过滤器。
·-w:保存文件。
·-T fields-e:输出的字段名(也就是上面介绍过的过滤项)。
举例说明:
读取aaa.pcapng文件,保存IP地址为192.168.1.52的文件,示例如下:
tshark -r aaa.pcapng -Y "ip.addr==192.168.1.52" -w test.cap
读取aaa.pcapng文件,显示IP地址为192.168.1.52的目的地址及端口,示例如下:
tshark -r aaa.pcapng -Y "ip.addr==192.168.1.52" -T fields -e ip.addr -e ip.dst -e tcp.dstport
效果如下: