tshark - Dump and analyze network traffic
一.REF
https://www.wireshark.org/docs/man-pages/tshark.html
二.命令
tshark [ -2 ] [ -a <capture autostop condition> ] ... [ -b <capture ring buffer option>] ... [ -B <capture buffer size> ]
[ -c <capture packet count> ] [ -C <configuration profile> ] [ -d <layer type>==<selector>,<decode-as protocol> ] [ -D ] [ -e <field> ]
[ -E <field print option> ] [ -f <capture filter> ] [ -F <file format> ] [ -g ] [ -h ] [ -H <input hosts file> ] [ -i <capture interface>|- ]
[ -j <protocol match filter> ] [ -I ] [ -K <keytab> ] [ -l ] [ -L ] [ -n ] [ -N <name resolving flags> ] [ -o <preference setting> ] ...
[ -O <protocols> ] [ -p ] [ -P ] [ -q ] [ -Q ] [ -r <infile> ] [ -R <Read filter> ] [ -s <capture snaplen> ] [ -S <separator> ]
[ -t a|ad|adoy|d|dd|e|r|u|ud|udoy ] [ -T ek|fields|json|pdml|ps|psml|tabs|text ] [ -u <seconds type>] [ -U <tap_name>] [ -v ] [ -V ]
[ -w <outfile>|- ] [ -W <file format option>] [ -x ] [ -X <eXtension option>] [ -y <capture link type> ] [ -Y <displaY filter> ]
[ -M <auto session reset> ] [ -z <statistics> ] [ --capture-comment <comment> ] [ --list-time-stamp-types ] [ --time-stamp-type <type> ] [ --color ] [ --no-duplicate-keys ] [ --export-objects <protocol>,<destdir> ]
[ --enable-protocol <proto_name> ] [ --disable-protocol <proto_name> ] [ --enable-heuristic <short_name> ] [ --disable-heuristic <short_name> ]
[ <capture filter> ]
命令详解:
1.设置抓包接口类:
1. -i 设置抓包的网络接口,不设置则默认为第一个非自环接口。
2. -D 列出当前存在的网络接口。在不了解OS所控制的网络设备时,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。
3. -f 设定抓包过滤表达式(capture filter expression)。抓包过滤表达式的写法雷同于tcpdump,可参考tcpdump man page的有关部分。
4. -s 设置每个抓包的大小,默认为65535,多于这个大小的数据将不会被程序记入内存、写入文件。(这个参数相当于tcpdump的-s,tcpdump默认抓包的大小仅为68)
5. -p 设置网络接口以非混合模式工作,即只关心和本机有关的流量。
6. -B 设置内核缓冲区大小,仅对windows有效。
7. -y 设置抓包的数据链路层协议,不设置则默认为-L找到的第一个协议,局域网一般是EN10MB等。
8. -L 列出本机支持的数据链路层协议,供-y参数使用。
2.停止抓包条件类:
1. -c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。
2. -a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a duration:5”表示tshark启动后在5秒内抓包然后停止;“-a filesize:10”表示tshark在输出文件达到10kB后停止;“-a files:n”表示tshark在写满n个文件后停止。(windows版的tshark0.99.3用参数“-a files:n”不起作用——会有无数多个文件生成。由于-b参数有自己的files参数,所谓“和-b的其它参数结合使用”无从说起。这也许是一个bug,或tshark的man page的书写有误。
3.文件输出控制类:
1.-b 设置ring buffer文件参数。ring buffer的文件名由-w参数决定。-b参数采用test:value的形式书写。“-b duration:5”表示每5秒写下一个ring buffer文件;“-b filesize:5”表示每达到5kB写下一个ring buffer文件;“-b files:7”表示ring buffer文件最多7个,周而复始地使用,如果这个参数不设定,tshark会将磁盘写满为止。
4.文件输入类:
1.-r 设置tshark分析的输入文件。tshark既可以抓取分析即时的网络流量,又可以分析dump在文件中的数据。-r不能是命名管道和标准输入。
5.处理类:
1. -R 设置读取(显示)过滤表达式(read filter expression)。不符合此表达式的流量同样不会被写入文件。注意,读取(显示)过滤表达式的语法和底层相关的抓包过滤表达式语法不相同,它的语法表达要丰富得多,请参考http://www.ethereal.com/docs/dfref/和http://www.ethereal.com/docs/man-pages/ethereal-filter.4.html。类似于抓包过滤表达式,在命令行使用时最好将它们quote起来。
2. -n 禁止所有地址名字解析(默认为允许所有)。
3. N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析。
4. -d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格。
6.输出类:
1. -w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。
2. -F 设置输出raw数据的格式,默认为libpcap。“tshark -F”会列出所有支持的raw格式。
3. -V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary。
4. -x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据。
5. -T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text。
6. -t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)。
7. -S 在向raw文件输出的同时,将解码结果打印到控制台。
8. -l 在处理每个包时即时刷新输出,即输出到标准输出
9. -X 扩展项。
10. -q 设置安静的stdout输出(例如做统计时)
11. -z 设置统计参数。
三. 举例
1.数据分析
tshark -r 2016-10-13@025018-030919.pcap -V -R 'http.host == "log.snssdk.com"' -T fields -e ip.src -e tcp.srcport |sort -n |uniq
-F pcap
2.显示http请求的域名以及url
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
3.抓取MySql的查询语句
tshark -n -i eth1 -R 'mysql.query' -T fields -e "ip.src" -e "mysql.query"
4.抓取指定类型的Sql查询语句
tshark -n -i eth1 -R 'mysql matches "SELECT|INSERT|DELETE|UPDATE"' -T fields -e "ip.src" -e "mysql.query"
5.统计http的状态
tshark -n -q -z http,stat, -z http,tree
6.实时打印当前http请求的url(包括域名)
tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -R 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t'
7.实时打印mysql的查询语句
tshark -s 512 -i eth0 -n -f 'tcp dst port 3306' -R 'mysql.query' -T fields -e mysql.query
8.实时打印帧数、帧时间、帧长度、协议类型、源ip、目的ip、UDP源端口、TCP源端口
tshark -n -t a -2 -R "tcp || udp" -T fields -e "frame.number" -e "frame.time" -e "frame.len" -e "eth.type" -e "ip.src" -e "ip.dst" -e "ipv6.src" -e "ipv6.dst" -e "udp.srcport" -e "udp.dstport" -e "tcp.srcport" -e "tcp.dstport" -i wlp9s0
四.选项
port 53:抓取发到/来自端口53的UDP/TCP数据流(典型是DNS数据流)
not port 53:抓取除了发到/来自端口53以外的UDP/TCP数据流
port 80:抓取发到/来自端口80的UDP/TCP数据流(典型是HTTP数据流)
udp port 67:抓取发到/来自端口67的UDP数据流(典型是DHCP据流)
tcp port 21:抓取发到/来自端口21的TCP数据流(典型是FTP命令通道)
portrange 1-80:抓取发到/来自端口1-80的所有UDP/TCP数据流
tcp portrange 1-80:抓取发到/来自端口1-80的所有TCP数据流
ip broadcast:抓取广播报文
ip multicast:抓取多播报文
dst host ff02::1:抓取到IPv6多播地址所有主机的数据流
dst host ff02::2:抓取到IPv6多播地址所有路由器的数据流
net 10.3.0.0/16:抓取网络10.3.0.0上发到/来自所有主机的数据流(16表示长度)
net 10.3.0.0 mask 255.255.0.0:与之前的过滤结果相同
ip[2:2]==<number>:ip报文大小
ip[8]==<number>:TTL(Time to Live)值
ip[9]==<number>:协议值
src host 10.3.1.1:抓取来自10.3.1.1的数据流
dst host 10.3.1.1:抓取发到10.3.1.1的数据流
host 10.3.1.1:抓取发到/来自10.3.1.1的数据流
ether dst 02:0A:42:23:41:AC:抓取发到02:0A:42:23:41:AC的数据流
not ether host 00:08:15:00:08:15:抓取除了发到/来自00:08:15:00:08:15以外的所有数据流
ether broadcast或ether dst ff:ff:ff:ff:ff:ff:抓取广播报文
ether multicast:多播报文