共计 2658 个字符,预计需要花费 7 分钟才能阅读完成。
tshark 是 wireshark 网络分析工具下的一个分支,主要用于命令行环境进行抓包、分析,尤其对协议深层解析时,tcpdump 难以胜任的场景中。本系列文章将整理介绍 tshark 相关内容。
基本用法
常用命令
查看 tshark 版本
tshark -v
列出当前存在的网络接口
tshark - D 网卡描述依据 OS 有不同的编号方式,在不了解网络设备及编号情况下,一般先用“tshark -D”查看网络接口的编号以供 - i 参数使用。注: linux 可以结合 ifconfig 命令查看
tshark 对指定网卡监听,抓包
sudo tshark -i <interface>
抓取网卡 eth0 的流量并写入 capture123.pcap
tshark -i eth0 -w capture123.pcap
读取之前的文件 capture123.pcap
tshark -i eth0 -r capture123.pcap
抓取网卡 eth0 的流量 10 分钟
tshark -i eth0 -a duration:600
注: 默认时间单位为秒
抓取网卡 eth0 的 10000 个数据包
tshark -c 10000 -i eth0
抓取网卡 eth0 涉及 192.168.1.1 的流量报文
tshark -i eth0 -f“host 192.168.1.1”注: 与 wireshark、tcpdump 一致,均使用 BPF 过滤表达式
抓取网卡 eth0 指定协议的流量报文
tshark -i eth0 -f“< 协议名 >”协议名可以为:tcp, udp, dns, icmp, http 等
案例
实时打印当前 mysql 查询语句
tshark -s 512 -i eth1 -n -f ‘tcp dst port 3306’ -R ‘mysql.query’ -T fields -e mysql.query
说明:
-s 512 : 只抓取前 512 个字节数据
-i eth0 : 监听 eth0 网卡
-n : 禁止域名解析
-f‘tcp dst port 3306’: 只捕捉协议为 tcp, 目的端口为 3306 的数据包
-R‘mysql.query’: 过滤出 mysql.query 查询语句的报文
-T fields -e mysql.query : 打印 mysql 查询语句
实时打印当前 http 请求的 url(包括域名)
tshark -s 512 -i eth1 -n -f ‘tcp dst port 8000’ -R ‘http.host and http.request.uri’ -T fields -e http.host -e http.request.uri -l | tr -d ‘t’
说明:
-s 512 : 只抓取前 512 个字节数据
-i eth1 : 监听 eth1 网卡
-n : 禁止网络对象名称解析
-f‘tcp dst port 8000’: 只捕捉协议为 tcp, 目的端口为 8000 的数据包
-R‘http.host and http.request.uri’: 过滤出 http.host 和 http.request.uri
-T fields -e http.host -e http.request.uri : 打印 http.host 和 http.request.uri
-l:输出到标准输出
读取之前抓包文件进行报文数据分析
需要从抓包的文件 evidence04.pcap 中提取出报文相关数据信息,如时间、源 IP、目的 IP、协议名、源 Port、標 Port、包大小等信息,最后输出到 csv 文件。
tshark -r evidence.pcap -T fields -e frame.time_relative -e ip.src -e ip.dst -e ip.proto -e tcp.srcport -e tcp.dstport -e frame.len -E header=n -E separator=, -E quote=n -E occurrence=f > output.csv
说明:
-r evidence.pcap 需要分析的报文记录文件(pcap 格式)
-T fields 输出格式,选 fields 按字段,也可以选 json 等其他格式,需结合 -e 及 - E 使用
-e frame.time_relative 取出封包的相对时间
-e ip.src 提取源 IP
-e ip.dst 提取目的 IP
-e ip.proto 提取协议名
-e tcp.srcport 提取源 Port
-e tcp.dstport 提取目的 Port
-e frame.len 提取数据帧大小
-E header=n 是否输出字段名称(cvs 的第 1 行)
-E separator=, 指定分割符,/ t 是 tab,/ s 是一格空格
-E quote=n 指定是否对字段用引号,d 是双引号,s 是单引号,n 是不用
-E occurrence=f 多值时是否保留,f 是第一个值,l 是最后一个值,a 是所有值都列出,默认全部
output.csv 输出文件路径及名称
DNS 报文过滤
使用 tshark 过滤 dns cap 包中源 ip、目的 ip、request 请求
tshark -r test.cap -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name -R ‘udp.dstport==53 || dns’
说明:
-r test.pcap 需要分析的报文记录文件(pcap 格式)
-T fields 输出格式,选 fields 按字段,也可以选 json 等其他格式,需结合 -e 及 - E 使用
-e frame.time 提取数据帧时间
-e ip.src 提取源 IP
-e ip.dst 提取目的 IP
-e dns.qry.name 提取 dns 查询的域名信息
-R ‘udp.dstport==53 || dns’ 显示过滤,仅对 udp 目标端口为 53 或者 dns 协议的报文进行处理
默认直接显示在终端上,不记录文件。
常见问题
tshark: Only read filters, not capture filters, can be specified when reading a capture file.
tshark -r 20190409.pcap -f ‘udp’ -w udp-20190409.pcap
读取文件时只能使用显示过滤,也就是只能使用 - Y 或 -2 - R 过滤
tshark: -R without -2 is deprecated. For single-pass filtering use -Y.
tshark -r 20190409.pcap -R ‘udp’ -w udp-20190409.pcap
显示过滤 - R 参数需要和 - 2 一起使用,或使用 -Y
参考:
tshark 很快,但要怎麼用?
ethereal-filter
使用 tshark 和 shell 脚本分析 DNS pcap 包
系列文章:
网络分析利器 wireshark 命令版:tshark 简介 (1)
网络分析利器 wireshark 命令版:tshark 使用示例 (2)