文章目录
常用分析工具的安装
安装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/270.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
过滤分析(特征&指定)的数据包
数据包偏移量解释(基于协议的偏移量)
表达式: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
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论