跳转到内容

Tshark使用笔记

记录tshark常用命令

查看tshark版本

bash
tshark -v

查看网络接口

bash
tshark -D

实际使用,只需要网络接口对应的序号即可。

不用root和sudo

bash
sudo dpkg-reconfigure wireshark-common

选「是」,然后使用root运行:

bash
usermod -a -G wireshark ht
chmod +x /usr/bin/dumpcap
chmod +s /usr/sbin/tcpdump

chmod的两条命令可选,尝试如果不行再全部执行,可能要注销或重启生效;一般这样执行后就可以直接以普通用户执行tshark命令了。

tshark常用命令

捕获过滤器,存入文件

bash
tshark -nni 1 -f "icmp or port 443" -w packets.pcap

只能手动停止。

注意截图左下角,有显示数据包的数量。

参数解释:

  • -nn 不解析ip和端口,显示原始ip和端口
  • -i 序号为1的网络接口
  • -f 捕获过滤器,在双引号内请遵从BPF的语法。
  • -w 抓包结果存储到文件

指定数据包大小和数量

bash
tshark -nni 1 -f "icmp or port 443" -w packets.pcap -s 100-c 100

-s 指定每个数据包的大小,单位字节 -c 表示数据包的数量,抓够100个数据包会自动停止。

指定文件大小的抓包

bash
tshark -nni 1 -f "icmp or port 443" -w packets.pcap -a filesize:512

抓够512字节后会自动停止。

指定抓包时间

bash
tshark -nni 1 -f "icmp or port 443" -w packets.pcap -a duration:10

抓包10秒就自动停止。

保存为多个大小相同文件

bash
tshark -nni 1 -f "icmp or port 443" -w packets.pcap -b filesize:1024

单位:KB 保存的文件命名为: packets_00001_20240616230331.pcap packets_00002_20240616230353.pcap ...... 只能手动停止。

指定抓包时长保存相同大小

bash
tshark -nni 1 -f "icmp or port 443" -w packets.pcap -b filesize:1024 -a duration:600

抓包10分钟,每个文件1MB

读取数据包

bash
tshark -r packets.pcap -c 50

-c 指定读取数据包的数量,不加即读取全部。

显示过滤输出特定字段

bash
tshark -r packets.pcap -Y dns -T fields -e dns.qry.name -E separator="|"

每个字段前面都用-e参数

修改每个报文的大小并另存

bash
editcap -s 88 packets.pcap new.pcap

tshark统计相关

抓包文件的基本信息

bash
capinfos packets.pcap

包含抓包文件的报文数、文件大小、抓包时长等丰富的信息。它的功能跟 Wireshark 里 Statistics 下拉菜单里的 Capture File Properties 是类似的

专家信息

bash
tshark -r packets.pcap -z expert -q

比较慢,输出信息太多,还是下载pcap文件后使用wireshark GUI打开比较方便。

会话统计

bash
tshark -r packets.pcap -z conv,ip -q

tshark命令实现特定场景需求

找出数据包中所有dns域名

排序并去重示例:

bash
tshark -r 10271418-no-doh-no-proxy.pcapng -Y dns -T fields -e dns.qry.name | sort | uniq

-Y 显示过滤 参数值可以用双引号扩起来 T fields -e 需要显示的字段 参数值可以用双引号扩起来

增加去查询的dns对应的IP:

bash
tshark -r 10271418-no-doh-no-proxy.pcapng -Y dns -T fields -e ip.dst -e dns.qry.name | sort | uniq

这种方式无法区分具体的方向,也就无法去重。

统计总共有多少dns域名请求:

bash
tshark -r 10271418-no-doh-no-proxy.pcapng -Y "dns" -T fields -e dns.qry.name | sort | uniq | wc -l

更多带dns查询的命令:

bash
tshark -r test.cap -T fields -e frame.time -e ip.src -e ip.dst -e dns.qry.name -R 'udp.dstport==53 || dns'

找出所有tls的SNI域名

排序并去重示例:

bash
tshark -r 10271418-no-doh-no-proxy.pcapng -Y tls.handshake.type==1 -T fields  -e tls.handshake.extensions_server_name | sort | uniq

统计tls总共有多少dns域名请求(client hello):

bash
tshark -r 10271418-no-doh-no-proxy.pcapng -Y "tls.handshake.type==1" -T fields  -e "tls.handshake.extensions_server_name" | sort | uniq | wc -l

追加提取目标的ip和端口:

bash
tshark -r 10271418-no-doh-no-proxy.pcapng -Y tls.handshake.type==1 -T fields  -e ipv6.dst -e tcp.dstport -e tls.handshake.extensions_server_name -E separator="|"  | sort | uniq

以上这种写法如果同时有ipv4和ipv6就不适用,都会缺失一部分。

参考资料