linux如何对pcap数据包进行分割与合并、过滤与分析等操作

常用分析工具的安装
安装wireshark,因为editcap是wireshark的一个工具

    editcap, capinfos(wireshark)
    tcpdump

    yum install wireshark tcpdump -y

#wireshark相关工具的使用方法参考:https://wenku.baidu.com/view/428eec321611cc7931b765ce05087632311274b5.html?re=view
#wireshark相关工具的官方说明文档:https://wiki.wireshark.org/Tools
#wireshark相关工具的官方说明文档:https://tshark.dev/edit/editcap/

常用分析工具参数介绍

editcap工具常用参数
    -c <packets per file>   根据统一的数据包计数将数据包输出拆分为不同的文件
    -i <seconds per file>   以时间间隔分割报文文件.-A <start time> 选择输出报文的开始时间(格式:YYYY-MM-DD HH:MM:SS)
    -B <stop time>      选择输出报文的结束时间(格式:YYYY-MM-DD HH:MM:SS)
    -r      反向选择操作
    -C <choplen>    可以直接从数据包上切一截子下来。字面意思已经很明显了,chop就是剁,剁掉数据包中间的一段。
    -D <dup window> 删除重复数据包,并指定比较多少个数据包,范围是(0 to 1000000)(即在多少个数据包内,比较是否有重复的,有的就删除)
    -w <dup time window>    这是指定间隔时间,将间隔时间范围内重复的数据包进行删除,

tcpdump工具用法参考:https://boke.wsfnk.com/archives/42.html

数据包拆分-分割

按packge数量拆分为多个文件(会自动命名,且带有时间参数标识)
    #用法:editcap -c <每个文件的包数> <源文件名> <目的文件名>
    editcap -c 100 in.pcap out.pcap

按间隔时间拆分为多个文件,单位是秒(会自动命名,且带有时间参数标识)
    #用法:editcap -i <每个文件对应的时间长度> <源文件名> <目的文件名>
    editcap -i 600 in.pcap out.pcap

数据包提取-分割

根据时间来拆分,利用-A 起始时间和-B 截止时间来提去某个时间段的数据
    #用法:editcap -A <起始时间> -B <截止时间> <源文件名> -F 数据包类型默认pcapng <目的文件名>
    editcap -A "2020-03-10 12:00:00" -B "2020-03-10 12:10:00" in.cap  -F pcapng out.cap

提取in.pcap中第10个报文到out.pacp中(若是out.pcap不存在,直接会被创建)
    editcap in.pcap o.pcap 10

提取in.pcap中第10个报文之外的所有报文到out.pacp中
    editcap –r in.pcap out.pcap 10

提取in.pcap中除第100到200之外其余所有报文到out.pacp中
    editcap in.pcap out.pcap 100-200

提取in.pcap中第101到200共100个报文到out.pcap中
    editcap -r in.pcap out.pcap 101-200

提取in.pcap中第1 3 5-8 10-13 这些序号的数据包到out.pcap中
    editcap -r in.cap out.cap 1 3 5-8 10-13

将in.pcap中第1 3 5-8 10-13 这些序号的数据包踢去后将剩余数据包放入out.pcap中
    editcap in.cap out.cap 1 3 5-8 10-13

对比,将数据包中前100个中重复的数据包删除
    editcap -D 101 in.pcap out.pcap

========
显示所有数据包的MD5哈希值(并且不生成任何实际输出文件)
    editcap -v -D 0 in.pcap /dev/null

提取数据包中前1000个数据包
    tcpdump -r /root/in.cap -c 1000 -w /root/out.cap

数据包改造处理

将数据包,按照5%的比例随机制造错包
    editcap -E 0.05 capture.pcap capture_error.pcap

将数据包中那些携带802.1q的VLAN tag的包,切掉数据包的第12-15个字节(共4字节),切掉之后对别的数据都不影响,就跟没存在过一样。
    editcap -L -C 12:4 in_vlan.pcap out_no_vlan.pcap        #有点问题,待研究

数据包合并

按数据包中时间戳进行合并,(在wireshark中通过filter过滤出sip信令,mergecap 默认将内部的数据包以时间先后来排序)
#用法:mergecap -w <输出文件> <源文件1> <源文件2> …
    mergecap -w out.pcap in_a.pcap in_b.pcap

忽略时间,仅仅依照指定的数据包顺序进行合并(使用-a)
    mergecap -a -w out.pcap in_a.pcap in_b.pcap

过滤分析(特征&指定)的数据包
参考tcpdump抓包工具简单用法:https://boke.wsfnk.com/archives/42.html

数据包偏移量解释(基于协议的偏移量)
    表达式:proto[expr:size]
    例子:"ip[9] = 6"     #查看第十字节的IP头,协议值为6。注意这里必须使用引号。撇号或引号都可以,
    例子:'tcp[32:4] = 0x47455420'

proto:可以是熟知的协议之一(如ip,arp,tcp,udp,icmp,ipv6),ip则查看IP头,tcp则查看TCP头,以此类推。
expr:字段给出从报文头索引0开始的位移。即:报文头的第一个字节为0,第二字节为1,以此类推。
        表示与指定的协议头开头相关的字节偏移量。有我们熟知的直接偏移量如tcpflags,也有取值常量如tcp-syn,tcp-ack或者tcp-fin。
size:是可选的,表示从字节偏移量开始检查的字节数量。



A:基于tcpflags标志位进行过滤
A1、只抓取tcpflags标志位是syn的数据(仅抓新发起tcp连接的第一个数据包)(tcp-syn|tcp-ack|tcp-fin|tcp-rst|tcp-psh|tcp-urg)
    tcpdump -r 123.cap 'tcp[tcpflags] == tcp-syn' -w 123-only-syn.cap
    #tcpdump -r 123.cap "tcp[tcpflags] & (tcp-syn) != 0" -w 123-include-syn.cap     #注意:这是抓取tcp-syn不等于0的,也就是说可以包含syn,或者syn,ack一起的数据(捕获带有syn的数据包)

A2、过滤包含fin标志位的数据包(tcp连接关闭,可以看到谁先关闭连接)
    tcpdump -r 123.cap "tcp[tcpflags] & (tcp-fin) != 0" -w 123-include-fin.cap

A3、过滤tcp的syn和ack数据包(数据量大,基本没啥实际用途)
    tcpdump -r 123.cap "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0" -w 123-include-syn-ack.cap

A4、过滤出tcp标志位是rest的数据包(过滤出重置数据包)
    tcpdump -r 123.cap "tcp[tcpflags] & (tcp-rst) != 0" -w 123-rst.cap
    =上下两个表达式意思完全相同,这里只是引出来告知你还可以指定数字进行过滤tcpflags
    tcpdump -r 123.cap 'tcp[13] & 4 != 0' -w 123-rst.cap

B:基于数据包的大小进行过滤
    tcpdump -r 123.cap 'greater 1400'       #过滤大于1400字节的数据包
    tcpdump -r 123.cap 'less 46'            #过滤小于46字节的数据包
    tcpdump -r 123.cap  '! less 400' and '! greater 540'    #过滤介于400到540字节的数据包

C:综合案例
C1、过滤TTL小于10的包(通常情况下是存在问题或者在使用traceroute,mtr等)
    tcpdump -r 123.cap 'ip[8] < 10'

C2、过滤明文的HTTP GET请求
    tcpdump -r 123.cap 'tcp[32:4] = 0x47455420'

C3、通过横幅文本过滤任意端口的SSH连接
    tcpdump -r 123.cap 'tcp[(tcp[12]>>2):4] = 0x5353482D'

C4、过滤广播和多播报文。
    这一方式常常作为掩码来选择特定比特位。值可以是十六进制。可通过语法&加上比特掩码来指定。
    下例提取从以太网头第一字节开始(即目的地址第一字节),提取低阶比特位,并确保该位不为0:
    tcpdump -r 123.cap 'ether[0] & 1 != 0'

C5、过滤数据包中端口号为22的数据包,并存为新文件
    tcpdump -r in.pcap "tcp port 22" -w out.pcap

C6、过滤出数据包中端口为22, 且含有 FIN 标记的数据包
    tcpdump -r in.pcap "tcp port 22 and (tcp[tcpflags] & tcp-fin != 0)" -w out.pcap

C7、根据应用层数据进行过滤,如HTTP GET的请求路径, 注意tcp[xx:offset]中的偏移最多为4
示例: GET /bidimg/hello
# tcp[24:4]==0x2f626964 匹配 /bid; tcp[28:4]==696d67ef 匹配 img/ 字段; 至于GET字段的匹配,可以自己去尝试!
    tcpdump -r in.pcap "((tcp[24:4]==0x2f626964 and tcp[28:4]==696d67ef) and dst port 80)" -w out.pcap

C8、使用tcpdump抓取HTTP报文(注意tcp[20:2] 其中2应该表示的是两个16进制位)
    tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
    #0x4745 这是十六进制表达式,0x表示十六进制,47=G,45=E,意思是GE
    #0x4854 这是十六进制表达式,0x表示十六进制,48=H,54=T,意思是HT
    #-XvvennSs 0    表示完全显示,就类似wireshark的三分栏

D:过滤畸形流量
D1、过滤同时设置SYN和RST标识的包(这在正常情况下不应该发生)
    tcpdump -r 123.cap 'tcp[13] = 6'

tcpdump问题总结(man pcap-filter,多熟悉下)

特别注意(这两个命令过滤处理的数据包,可能不相同,命令1的内容包含命令2的内容,命令1的内容可能会多链路层的数据包,如多arp相关报文)
    命令1:tcpdump -r in.pcap -w out.pcap "host 192.168.1.1"
    命令2:tcpdump -r in.pcap -w out.pcap "ip host 192.168.1.1"

1、在使用tcpdump或其他工具过特定IP的数据包时,pcap-filter过滤表达式的书写要注意!
2、如果仅仅是想过滤出IP层的特定IP的数据,需要使用ip host X.X.X.X或ip src X.X.X.X或ip dst X.X.X.X
3、如果仅仅是想过滤出ARP或RARP协议的IP数据包时,需要使用arp host X.X.X.X 或 rarp host X.X.X.X

参考文章:http://codeshold.me/2017/08/tcpdump_tshark_note.html
参考文章:http://codeshold.me/2017/01/tcpdump_wrong.html
https://blog.csdn.net/luguifang2011/article/details/72953917
http://www.xumenger.com/tcp-ip-family-20180222/
https://tcpreplay.appneta.com/wiki/installation.html

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/1270.html
微信打赏微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2020/3/18作者: 辣条①号

现在在做什么? 接下来打算做什么? 你的目标什么? 期限还有多少? 进度如何?

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注