tcpdump 网络抓包工具使用及实例参考

前言

tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。

另外,tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性。tcpdump存在于基本的Linux系统 中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

Tdpdump已得到广泛应用,在网络问题的分析中可提供很多有用的信息,适用场景丰富。

安装

1、介质下载:

http://www.tcpdump.org/release/tcpdump-4.9.3.tar.gz //依赖libpcap 1.9.1,tcpdump的运行需要pcap的支持,所以最好先行安装pcap软件包
http://www.tcpdump.org/release/libpcap-1.9.1.tar.gz
或直接:githut上克隆最新版
git clone https://github.com/the-tcpdump-group/tcpdump.git
git clone https://github.com/the-tcpdump-group/libpcap.git

2、安装前准备

1>ubuntu:
安装c编译所需包:apt-get install build-essential
安装 libpcap的前置:apt-get install flex,apt-get install bison

2>centos
yum -y install flex
yum -y install bison
yum -y install gcc

3、安装

 tar -zxvf libpcap-1.9.1.tar.gz 
 cd libpcap-1.9.1
 ./configure   ##  //生成makefile文件
 make 
 make install  ##库文件默认安装在目录  /usr/lib,头文件默认安装在  /usr/include
 ##
tar -zxvf tcpdump-4.3.0.tar.gz 
cd tcpdump-4.3.0
 ./configure
 make
make install

附录:
yum install wireshark(核心,可以用命令tshark)
yum install wireshark-gnome(界面,可以用命令wireshark)
如果运行tshark报:wireshark: symbol lookup error: wireshark: undefined symbol: gtk_combo_box_text_new_with_entry

请更新安装:yum update gtk2

其中,tshark是WireShark的命令行工具,可以通过命令提取自己想要的数据,可以重定向到文件,也可以结合上层语言来调用命令行,实现对数据的处理。

3、验证

#tcpdump -vv //输出网络信息

4、命令使用

tcpdump的命令格式如下:

tcpdump [ -adeflnNOpqRStuvxX ] [ -c 数量 ] [ -C 文档尺寸 ] [ -F 文档名 ] [ -i 网络接口 ] [ -m 文档名 ] [ -r 文档名 ] [ -s 长度 ] [ -T 类型 ] [ -w 文档名 ] [ -E algo:secret ] [ 表达式 ]

tcpdump [-i 网卡] -nnAX ‘表达式’

【参数说明】:

-a :将网络地址和广播地址转变成容易识别的名字。
-A:以ascii的方式显示数据包,抓取web数据时很有用。
-c: 指定要抓取的包数量,在捕获指定个数的数据包后退出。
-d :将已截获的数据包的代码以人容易理解的格式输出。
-dd :将已截获的数据包的代码以C程式的格式输出。
-ddd :将已截获的数据包的代码以十进制格式输出。
-e: 输出数据链路层的头部信息。
-f :将internet地址以数字形式输出。
-F :从指定的文档中读取过滤规则,忽略命令行中指定的其他过滤规则。
-G <seconds> :按时间分包
-l: 将标准输出变为行缓冲方式。
-n:不将网络地址转换成易识别的主机名,对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析,避免DNS查询。
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。常用,总的是实现以ip和port的方式显示来源主机和目的主机,而不是用主机名和服务。
-s: <数据包大小> 设置每个数据包的大小,0表示全部数据。
-t :不输出时间戳;
-N:不打印出host的域名部分。
-P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、“out"和"inout”,
默认为"inout"。
-r <file>: 从指定的文档中读取数据包(该文档一般通过-w选项产生pcap文件);
-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。
对于要抓取的数据包较大时,长度设置不够可能会产生包截断。
-T: 将截获的数据包直接解释为指定类型的报文,现在支持的类型有cnfp、rpc、rtp、snmp、vat和wb。
-i:interface:指定tcpdump需要监听的接口。
-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。
-q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
-Z <user> :在写文件之前,转换用户
-v:当分析和打印的时候,产生详细的输出。
-vv:产生比-v更详细的输出。
-vvv:产生比-vv更详细的输出。
-w :将截获的数据包直接写入指定的文档中,不对其进行分析和输出;。
-w <数据包文件> :把数据包数据写入指定的文件。按时间分包时,可使用strftime的格式命名,例如 %Y_%m_%d_%H_%M_%S.pcap
-W <cnt> :写满cnt个文件后就不再写入

常用关键字说明:

host(缺省类型): 指明一台主机
net: 指明一个网络地址,net 100.0.0.0指明100.0.0.0是一个网络地址
port: 指明端口号
src: 指定网络源地址
dst: 指定目标网络地址,src,dst,dst or src,dst and src, 这些关键字指明了传输的方向
协议类: 主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether 具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。 其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。

其他重要的关键字如下:gateway, broadcast,less, greater, 还有三种逻辑运算,取非运算是 ‘not ’ ‘! ‘, 与运算是’and’,’&&’;或运算是’or’ ,’||’; 更多man 7 pcap-filter查看。

5、示例

1、过滤掉任何除ARP请求和应答的通信数据:
#tcpdump arp -i eth0 -c 5 -n
上述命令只对ARP的请求和应答信息进行截获,从指定的网络接口截获5个ARP数据包,并且不将网络地址转换成主机名
注:在Tcpdump的输出信息中,请求是“arp who-has”这样的条目,而应答则是“arp reply”这样的条目。
2、获取指定主机的数据头部信息:
#tcpdump -e host server1
20:15:20.735429 eth0
< 08:90:b0:2f:af:46 00:d0:59:bf:da:06 ip 60: .36579 >
tiger.ftp 0:0(0) ack 25565 win 8970 (DF)

在上述输出的信息中,“20:15:20”为截获数据包的时间,“735429”是毫秒数,“eth0 <”表示从网络接口eth0接收该数据包(若为“eth0 >”,则表示从网络接口eth0发送数据包)。“08:90:b0:2f:af:46”是主机server2的MAC地址,指明发送该数据包的源主机为 “server2”,“00:d0:59:bf:da:06”是主机server1的MAC地址,指明该数据包发送的目标主机为“server1”。“ip”表明该数据包 是IP数据包,“60”是数据包的长度,“server2.36579 > server1.ftp”表明该数据包是从主机“server2”的36579端口发往主机“server1”的FTP(21)端口。“ack 25565”表示对序列号为25565的包进行确认,“win 8970”则指明发送窗口的大小为8760。
3、抓取ARP包
使用“tcpdump arp -c 2”命令截获ARP数据包,输出类似如下结果:

20:42:22.713502 eth0

arp who-has mag tell server1
(00:d0:59:bf:da:06)
20:42:22.713907 eth0
< arp reply server12 is-at 08:90:b0:2f:af:46
(00:d0:59:bf:da:06)

在 输出的信息中,“20:42:22”为截获数据包的时间;“713502”和“713907”为毫秒数;“eth0 >”表明从主机发出该数据包;“eth0 <”表明从主机接收该数据包。“arp”表明该数据包是ARP请求,“who-has server2 tell server1 ”表明是主机“server1 ”请求主机“server2”的MAC地址,“00:d0:59:bf:da:06”是主机“server11”的MAC地址。 “reply mag is-at”表明主机“server12”响应“tiger”的ARP请求,“08:90:b0:2f:af:46”是主机“mag”的MAC地址。

4、抓取TCP包:

用Tcpdump截获的TCP包的结果类似如下:

src > dst: flags data-sequno ack window urgent options

其中,“src > dst:”标明从源地址到目的地址;flags是TCP包中的标志信息,包括S(SYN)标志、F(FIN)标志、P(PUSH)标志、R(RST)标志 和“.”(没有标志);data-sequno是数据包中的数据序列号;ack是下次期望的数据序列号;window是接收缓存的窗口大小;urgent 标明数据包中是否有紧急指针;options是可能的选项值。

5、抓取UDP包:

用Tcpdump截获的UDP包结果类似如下:

src.port1 > dst.port31: udp lenth -t

其中,UDP中包含的信息很简单。上面的输出结果表明从主机“src”的“port1”端口发出的一个UDP数据包被送到主机“dst”的“port31”端口,数据包的类型是UDP,其长度为“lenth”,-t : 不显示时间戳。

6、对网卡eth0进行抓包,且只抓所有进入和离开网络地址10.185.10.52的包。

tcpdump -i eth0 net 10.185.10.52

7、对网卡eth0进行抓包,且只抓所有进入和离开网络地址10.185.10.52的包,且源端口号为443。

tcpdump –i eth0 net 10.185.10.52 and srcport 443

8、对网卡eth0进行抓包,且只抓所有进入和离开网络地址10.185.10.52的包,抓包个数指定为10000个,并写入52.pcap。

tcpdump -i eth0 net 10.185.10.52 -c 10000 -w 52.pcap

9、Sql语句是通过网络以文本方式传输到mysql服务器端的。因此可以通过tcpdump把页面交互的所有的sql语句捕获到。

tcpdump -i eth0 -A -s 3000 port 3306 -w mysql.cap

10、想要截获10.185.10.52的主机上所有收到的和发出的的数据包,使用命令。

tcpdump host 10.185.10.52

11、想要截获主机 10.185.10.52和主机10.185.10.53 或10.185.10.54的通信,使用命令。

tcpdump host 10.185.10.52 and (10.185.10.53 or 10.185.10.54 )

变种:
tcpdump src host 10.185.10.52 #抓取所有源IP为10.185.10.52的数据包
tcpdump dst host 10.185.10.52 #抓取所有目的IP为10.185.10.52的数据包
tcpdump port 1234 #抓取所有端口为1234的网络数据
tcpdump src port 1234 #抓取所有源端口为1234的网络数据
tcpdump dst port 1234 #抓取所有目的端口为1234的网络数据
tcpdump udp #抓取UDP协议的数据包
tcpdump -i eth0 -nn ‘icmp’ #抓取ICMP协议的数据包
tcpdump -i eth0 -nn ‘src host 192.168.1.1’
tcpdump -i eth0 -nn ‘dst host 192.168.1.1’
tcpdump -i eth0 -nnA ‘port 80’
tcpdump -i eth0 -nnA ‘port 80 and src host 192.168.1.1’

12、如果想要获取主机10.185.10.52除了和主机10.185.10.53之外所有主机通信的ip包,使用命令。

tcpdump ip host 10.185.10.52 and !10.185.10.53

13、如果想要获取主机10.185.10.52接收或发出的telnet包,使用命令。

tcpdump tcp port 23 host 10.185.10.52

14、进行后台抓包, 控制台退出也不会影响,不影响执行其他操作。

nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap & //把导出来对cap包,放到Wireshark中分析即可

15、抓取所有经过网卡eth1的SYN类型数据包

#tcpdump -i eth1 ‘tcp[tcpflags] = tcp-syn’

抓取经过网卡eth1的所有DNS数据包(默认端口)
#tcpdump -i eth1 udp dst port 53

16、抓取所有经过网卡eth1,目的网络是172.16,但目的主机不是192.168.1.1的TCP数据

#tcpdump -i eth1 ‘((tcp) and ((dst net 172.16) and (not dst host 192.168.1.1)))’
17、抓取本地环路数据包

tcpdump -i lo udp 抓取UDP数据
tcpdump -i lo udp port 1234 抓取端口1234的UDP数据
tcpdump -i lo port 1234 抓取端口1234的所有数据

18、抓取HTTP包

#tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 -w /tmp/http

其中,0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT";上述命令意思是说将HTTP请求及GET请求的数据包放到/tmp/http文件中。

或者:tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

19、tcpdump -D //获取全部的网卡列表

指定源ip和端口进行过滤

tcpdump -i eth0 -w abc.pcap src net ip and port port

指定目的ip和端口进行过滤

tcpdump -i eth0 -w abc.pcap dst net ip and port port

指定源和目的的ip和端口进行过滤

tcpdump -i eth0 -w abc.pcap s0 net ip and port port //s0表防止包截断

tcpdump -i eth0 -w abc.pcap s0 host ip and port port

20、打印所有通过网关beijigw的ftp数据包

tcpdump ‘gateway beijigw and (port ftp or ftp-data)’
注意, 上述命令中表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析

#tcpdump -i eth0 gateway Gatewayname //监视通过指定网关的数据包:

变种:

打印长度超过576字节, 并且网关地址是snup的IP数据包

tcpdump ‘gateway snup and ip[2:2] > 576’

21、打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机
tcpdump ‘tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net 127.0.0.1’

22、打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包

tcpdump ‘tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)’

其中,ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度,(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2(2^2位置上). (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) <<2, 即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的’Payload Length’ 与 'tcp头的长度’的差值, 并且其中表达方式’ip[]‘需换成’ip6[]’.)

23、打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报

tcpdump ‘ether[0] & 1 = 0 and ip[16] >= 224’

24、打印除’echo request’或者’echo reply’类型以外的ICMP数据包( 比如,需要打印所有非ping 程序产生的数据包时可用到此表达式 .
(注: ‘echo reuqest’ 与 ‘echo reply’ 这两种类型的ICMP数据包通常由ping程序产生))

tcpdump ‘icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply’

25、抓取内网192.168.1.0/24流出eth1的非ssh流量
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

发散:
tcpdump -n -i eth0 dst 192.168.31.147 or 192.168.31.157 and tcp -c 100 -w /tmp/target.pcap

6、过滤表达式 :正则表达式

cpdump的过滤表达式中一般有如下几种类型的关键字:

◆ 类型关键字

这类关键字用于指定主机、网络或端口,包括host、net和port三个关键字

例如,能够用“host 9.185.10.57”来标明监听的主机;用“net 9.185.0.0”来标明监听的网络;用“port 23”来标明监听的端口。假如没有在表达式中指明类型,则缺省的类型为host。

◆ 方向关键字

这类关键字用于指定截获的方向,包括dst、src、dst or src、dst and src四个关键字。

例如,能够用src 9.185.10.57来指明截获的数据包中的源主机地址;用“dst net 9.185.0.0”来指明截获的数据包中的目标网络地址。假如没有在表达式中指明方向,则缺省的方向为“dst or src”,即两个方向的数据包都将被捕获。对于数据链路层协议(如SLIP和PPP),使用inbound和outbound来定义方向。

◆ 协议关键字

这类关键字用于指定要截获的数据包所属的协议,包括ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp和udp等关键字。 关键字fddi指明在FDDI(分布式光纤数据接口网络)上的特定网络协议。实际上他是ether的别名。fddi和ether具备类似的源地址和目标地址,所以能够将fddi协议包当作ether的包进行分析和处理。其他几个关键字只是指定了所要截获的协议数据包。假如没有在表达式中指明协议,则 Tcpdump会截获任何协议的数据包。

除了上述三种类型的关键字外,Tcpdump的过滤表达式中还能够指定的一些重要关键字

包括 gateway、broadcast、multicast、less、greater。

在Tcpdump的过滤表达式中,各类关键字之间还能够通过布尔运算符来构成组合表达式,以满足实际运用时的需要。

布尔运算符包括取非运算符(not 或!)、和运算符(and或&&)、或运算符(or或||),使用布尔运算符能够将表达式组合起来构成强大的组合条件,从而能够对 Tcpdump的过滤器做进一步细化。

  1. 假如想要截获主机“10.185.10.52”任何收到和发出的数据包,能够使用如下命令:
    #tcpdump host 10.185.10.52
  2. 假如想要截获在主机“10.185.10.52”和主机“10.185.10.53”或“10.185.10.54”之间传递的数据包,能够使用如下命令:

#tcpdump host 10.185.10.52 and10.185.10.53or9.185.10.54

注意:在使用布尔运算符构成组合表达式时,有时需要使用括号来表达复杂的逻辑关系。假如要在命令行中使用括号,一定要用转义字符(“\”)对括号进行转义,否则命令行解释器将给出语法错误的提示。

  1. 假如想要截获主机“10.185.10.52”和除主机“10.185.10.53”外任何其他主机之间通信的IP数据包:

#tcpdump ip host 10.185.10.52 and !10.185.10.53

  1. 假如想要截获主机“10.185.10.52”接收或发出的FTP(端口号为21)数据包:

#tcpdump tcp port 21 and host 10.185.10.52

  1. 假如怀疑系统正受到拒绝服务(DoS)攻击,通过截获发往本机的任何ICMP包,来确定现在是否有大量的ping指令流向服务器,此时就能够使用下面的命令:

#tcpdump icmp -n -i eth0

猜你喜欢

转载自blog.csdn.net/ximenjianxue/article/details/108738074