抓取分析网络数据包?力推默契老搭档——tcpdump&wireshark

一、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”功能

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值