一、tcpdump抓取网络数据包
(一)tcpdump简介
tcpdump是一个在linux环境下常用的抓包工具,它能够捕获并打印网络接口上的数据包,支持多种过滤条件以帮助用户快速定位网络问题。使用tcpdump时,可以通过指定接口、设置过滤条件等来捕获所需的数据包。
(二)tcpdump参数说明
-i [interface] 指定入站网卡
-w [filename] 将包数据输出至文件(二进制文件,只能用-r选项阅读),使用wareshark软件也可
-r [filename] 阅读-w选项输出的包文件
-n 表示不解析域名,直接显示ip
-nn 不解析域名和端口
-X 同时用 hex 和 ascii 显示报文的内容
-XX 同 -X,但同时显示以太网头部
-S 显示绝对的序列号(sequence number),而不是相对编号
-v, -vv, -vvv 显示更多的详细信息,比如显示IP数据报中的生存周期和服务类型
-c [number] 截取 number 个报文,然后结束
-q 简要的输出,仅显示时间、源Ip、目标ip、协议、端口、包大小
-A 只使用 ascii 打印报文的全部数据,不要和 -X 一起使用,截取 http 请求的时候可以用 sudo tcpdump -nSA port 80!
icmp 只捕获 ICMP 数据包,icmp:Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
dst host [hostname] 指定目标主机
src host [hostname] 指定来源主机,ip和域名均可
dst net [network] 指定目标网段/24或ip
src net [network] 指定来源网段/24或ip,比如:tcpdump net 192.168.10.0/24
port [port] 指定端口,不管是目标端口还是来源
tcp port [port] 指定tcp端口,不管是目标端口还是来源
udp port [port] 指定tcp端口,不管是目标端口还是来源 dst port [port] #指定目标端口 src port [port] 指定来源端口
portrange 21-23 查找任意范围的端口
# 对于一些常见协议的默认端口,我们还可以直接使用协议名,而不用具体的端口号
比如 http == 80,https == 443 等可以采用以下命令:
tcpdump tcp port http
ether host [mac地址] 指定MAC地址
# 筛选数据包长度:
less [length] 筛选大于length的数据包
greater [length] 筛选大于length的数据包
# 也可以使用比较符号:>,=
tcpdump > 32
tcpdump <= 128
(三)tcpdump使用
1、抓取指定网卡网络数据包
tcpdump -i 网卡名 -w 抓包路径及导出文件名
例:
tcpdump -i ens33 -w /home/test.pacp
2、抓取指定网卡指定IP地址网络数据包
tcpdump -i 网卡名 -w 抓包路径及导出文件名 -nnv IP1
例:
tcpdump -i ens33 -w /home/test.pacp -nnv host 192.168.1.13
3、抓取指定网卡指定IP地址带vlan标签的网络数据包
tcpdump -i 网卡名 -w 抓包路径及导出文件名 -nnv '(vlan and (IP1 or IP2)) and ((IP1 or IP2))'
例:
tcpdump -i ens33 -w /home/test.pacp -nnv '(vlan and (host 192.168.1.13 or host 192.168.1.14)) and ((host 192.168.1.13 or host 192.168.1.14))'
4、持续抓包某节点IP
nohup tcpdump -i any -s0 -C50 -nnv -w xxx.pcap '(host 69.12.212.20 or host 69.12.212.21)' &
5、从数据包文件读取数据包
tcpdump -r input.pcap
(四)tcpdump实践中遇到的问题及解决方式
1、Tcpdump -C参数报权限错误 Permission denied
报错内容:
This is not a bug. tcpdump drops its privileges *before* creating the first file:Note that when used with -Z option (enabled by default), priv-ileges are dropped before opening first savefile.
So it cannot write anywhere where pcap cannot write. See the "-Z" option for a workaround.
解决方式:
使用-Z参数
tcpdump -Z root -i p1p1 -C 200 -w ~/tcp.pcap -vv
2、Tcpdump如何在AIX系统抓包
AIX系统:是IBM基于AT&T Unix System V开发的一套类UNIX操作系统。
tcpdump -w /home/ebank.pcap -i eth2 -s 0 host 192.168.240.15
如果提示tcpdump permission deny 请增加 -Z root
3、Tcpdump抓取不到指定主机的网络流量
排查步骤:
①使用tcpdump捕获指定主机的网络流量,却没有输出结果,首先检查抓包命令是否书写正确
tcpdump -i ethX -s0 -vnn host 1.1.1.1
②如果确认命令正确,需要考虑流量中是否带有vlan标签,使用以下命令进行检查
tcpdump -i ethX -s0 -vnn vlan and (host 1.1.1.1)
③如果上述检查还没有输出结果,那就是其它原因引起的,直接使用tcpdump -i ethX -s0 -vnn输出全量流量,发现是有指定主机的流量访问关系输出的
④为什么不加具体的host主机地址就有流量输出呢?原因就在于GRE方式
⑤接下来,我们使用tcpdump -i ethX -s0 -vnn抓取一段时间的数据包,用wireshark打开查看,发现在制定主机的TCP层外又封装了一层TCP,这就是典型的GRE流量,事实上,目标主机的流量已经送达抓包网卡了
GRE协议:全称为通用路由封装协议,定义了在一种网络层协议上封装另一种协议,属于三层隧道协议。
4、使用tcpdump | grep出现的时间间隔问题
使用tcpdump | grep出现时间间隔问题,大概隔一定的时间会跳出n条信息。是因为tcpdump的管道是buffered缓冲,所以会出现这个问题。
解决办法:
是使用 -l 参数来取消buffered
tcpdump -lni eth1 tcp and port 80 -s 0 -nnA | grep 'hao123'
tcpdump -i ens33 -vvn -l | grep ssh
用awk表达式时同理
tcpdump -i ens33 -vvn -l |awk '{print $1}'
二、wireshark分析网络数据包
(一)wireshark简介
Wireshark(前称Ethereal)是一个网络封包分析软件。网络分包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
1. 过滤器
过滤器是通过wireshark的报文过滤表达式快速定位目标数据包的功能。之所以需要使用过滤器,是因为通常一个样本包内的数据包数量是非常多的,而我们需要分析的目标数据包仅占其中的一部分甚至一小部分,如果没有过滤器的帮助,无异于大海捞针。
过滤器的位置(该位置就是填写过滤表达式的地方)
2、常用过滤表达式
(1)根据IP和端口过滤
ip.addr ==
ip.src ==
ip.dst ==
tcp.port ==
tcp.dstport ==
tcp.srcport ==
例如,要找出目标IP地址是192.168.1.102的数据包,则应使用的过滤表达式为
ip.dst==192.168.1.102,其它同理。
(2)根据特定的字符串或16进制数据过滤
tcp[20:] contains “要查找的字符”
该过滤语法的核心其实是contains关键字,前面的tcp[20:]表示从tcp报文的第21个字节开始查找(即跳过前20个字节)。
如此,如果我们要在IP报文的第21字节到第1000字节内查找字符串“POST /webapp/”,则相应的过滤表达式为:
ip[20:980] contains “POST /webapp/”
即,协议类型[起始位置:深度]
除了查找字符串,该语法另外一个用处是查找16进制数据,这在应对非明文报文时非常有用。
协议类型[起始位置:深度] contains xx-xx-xx-xx-xx
例如,我们要在tcp载荷中查找包含16进制数据 0x1a 0x0f 0x33的数据包,则过滤表达式为
tcp[20:] contains 1a-0f-33
(3)根据正则表达式过滤
协议类型[起始位置:深度] matches “正则表达式”
同contains语法类似,matches表示在指定的范围内匹配正则表达式。例如,我们想找出所有获取html文件的http get请求数据包,则对应的过滤表达式可以是:
tcp[20:] matches “GET \\S*\\.html”
注意如果用到了转义字符,需要两个斜杠\\
上面讲到的是单独的过滤表达式,它们之间可以通过逻辑运算符组合起来使用。
(4)根据时间过滤
过滤15:23:57.932344000s这一时刻的报文,过滤条件可写为:
frame.time == "May 27, 2019 15:23:57.932344000"
过滤15:23:57 s 这一秒之后的报文,过滤条件可写为:
frame.time >= "May 27, 2019 15:23:57.0"
过滤15:23:57s到15:23:58s 这一秒内的报文,过滤条件可写为:
frame.time >= "May 27, 2019 15:23:57.0" && frame.time < "May 27, 2019 15:23:58.0"
(5)Wireshark过滤器支持的逻辑运算符
&& 与
|| 或
! 非
除此以为,还有圆括号()可以改变表达式的运算优先级。
这里我们举一个综合性的例子,写出符合下图拓扑的过滤表达式
(ip.addr==10.1.56.21||ip.addr==10.1.56.22)&&ip.addr==10.1.44.1&&tcp.srcport==1428&&tcp.dstport==1428
3. 会话分析器
会话分析器的作用是展现和分析当前数据包内所包含的TCP会话
普通情况下,它会列出当前数据包内所包含的所有TCP会话,不过我们在使用的过程中更常用到的是结合过滤器分析TCP会话,如上所示,首先在wireshark中使用过滤器查找目标数据包,然后在会话分析器中勾选“limit to display filter(显示过滤器的限制)”,这样会话分析器就仅列出符合过滤条件的TCP会话了。
怎样方便的查看TCP载荷内容?使用“follow tcp stream”功能