使用tshark进行pcap和pcapng的转换
tshark 简介
tshark就是wireshark的命令行之一。WireShark的功能基本都有,还能组合grep/awk等编程处理分析抓包文件。
TShark是一个网络分析工具。它能帮你在实时网络中捕获数据包,或是从预先保存好的捕获文件中读取数据包,或是打印出这些数据包的解码形式到标准输出,再或是把数据包写入到一个文件中。TShark的本地捕获文件格式是pcapng格式,这种pcapng格式也被wireshark和多种其他工具使用。
Wireshark除了能够手动的分析报文之外,还额外的提供了几个命令行工具,方便开发者日常的报文处理需求,比如批量的合并以及编辑报文。这几个命令都是安装wireshark之后能够直接使用的,同时有的有对应的wireshark GUI 的操作。这些命令分别有tshark、tcpdump、capinfos、dumpcap、text2cap、editcap、reordercap、rawshark、mergecap、pcapfix(需单独安装)。
- tshark:基于终端的Wireshark
- tcpdump:使用“tcpdump”捕获以便使用Wireshark查看
- dumpcap:捕获“dumpcap”以便使用Wireshark查看
- capinfos:打印有关捕获文件的信息
- rawshark:转储和分析网络流量。
- editcap:编辑捕获文件
- mergecap:将多个捕获文件合并为一个
- text2pcap:将ASCII hexdumps转换为网络捕获
- reordercap:重新排序捕获文件
- pcapfix: 修复pcap文件
pcap
Wireshark默认的存储方式是pcap格式,最新版本的wireshark默认存储方式是pcapng。ng是next generation 的缩写,pcap和pcapng格式文件有是存在一定的差异。
pcap报文文件结构示意图 https://img1.kiosk007.top/static/images/tshark/pcap_file_format.png
- Global Header是整个文件的文件头,包含文件格式标识,pcap格式版本号等文件指示信息。
- Packet Header是每一片数据报文的头部信息,这些信息都是在形成pcap 报文的过程中由抓包软件wireshark添加的额外信息,例如报文捕获时间等。
- Packet Data是抓取通信过程中的实际数据,包括协议数据和内容数据。
- Wireshark 中对 Global Header 的定义
typedef struct pcap_hdr_s {
guint32 magic_number; /* magic number */
guint16 version_major; /* major version number */
guint16 version_minor; /* minor version number */
gint32 thiszone; /* GMT to local correction */
guint32 sigfigs; /* accuracy of timestamps */
guint32 snaplen; /* max length of captured packets, in octets */
guint32 network; /* data link type */
} pcap_hdr_t;
Wireshark 中对 Packet Header 的定义
typedef struct pcaprec_hdr_s {
guint32 ts_sec; /* timestamp seconds */
guint32 ts_usec; /* timestamp microseconds */
guint32 incl_len; /* number of octets of packet saved in file */
guint32 orig_len; /* actual length of packet */
} pcaprec_hdr_t;
tshark 转换pcapng 为pcap
tshark -F pcap -r origin.pcapng -w output.pcap
tshark 中的常用参数
- -o ${key:value} : 配置首选项中的settings, 一般可配置显示时间戳、是否相关seq number,或者TLS、WPA 解密等。
- -z ${statistics} : 集各种类型的统计信息, 这里面有一些信息是很有用的,如专家信息、时序统计飞行中的报文、时序丢包都需要这个参数
其他参数介绍
# 抓包接口类
-i 设置抓包的网络接口,不设置则默认为第一个非自环接口。
-D 列出当前存在的网络接口。在不了解OS所控制的网络设备时,一般先用“tshark -D”查看网络接口的编号以供-i参数使用。
-f 设定抓包过滤表达式(capture filter expression)。抓包过滤表达式的写法雷同于tcpdump
-s 设置每个抓包的大小,默认为65535,多于这个大小的数据将不会被程序记入内存、写入文件
-p 设置网络接口以非混合模式工作,即只关心和本机有关的流量
# 停止抓包参数
-c 抓取的packet数,在处理一定数量的packet后,停止抓取,程序退出。
-a 设置tshark抓包停止向文件书写的条件,事实上是tshark在正常启动之后停止工作并返回的条件。条件写为test:value的形式,如“-a duration:5”表示tshark启动后在5秒内抓包然后停止;“-a filesize:10”表示tshark在输出文件达到10kB后停止;“-a files:n”表示tshark在写满n个文件后停止。
# 处理类
-R 设置读取(显示)过滤表达式(read filter expression)。不符合此表达式的流量同样不会被写入文件。
-n 禁止所有地址名字解析(默认为允许所有)。
-N 启用某一层的地址名字解析。“m”代表MAC层,“n”代表网络层,“t”代表传输层,“C”代表当前异步DNS查找。如果-n和-N参数同时存在,-n将被忽略。如果-n和-N参数都不写,则默认打开所有地址名字解析。
-d 将指定的数据按有关协议解包输出。如要将tcp 8888端口的流量按http解包,应该写为“-d tcp.port==8888,http”。注意选择子和解包协议之间不能留空格。
# 输出类
-w 设置raw数据的输出文件。这个参数不设置,tshark将会把解码结果输出到stdout。“-w-”表示把raw输出到stdout。如果要把解码结果输出到文件,使用重定向“>”而不要-w参数。
-F 设置输出raw数据的格式,默认为libpcap。“tshark -F”会列出所有支持的raw格式。
-V 设置将解码结果的细节输出,否则解码结果仅显示一个packet一行的summary。
-x 设置在解码输出结果中,每个packet后面以HEX dump的方式显示具体数据。
-T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text。
-E: -E <fieldsoption>=<value>如果-T fields选项指定,使用-E来设置一些属性,比如
header=y|n
separator=/t|/s|<char>
occurrence=f|l|a
aggregator=,|/s|<char>
-t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)。
-S 在向raw文件输出的同时,将解码结果打印到控制台。
-l 在处理每个包时即时刷新输出。
-X 扩展项。
-q 设置安静的stdout输出(例如做统计时)
-z 设置统计参数。
# 其他
-h 显示命令行帮助。
-v 显示tshark的版本信息。
-o 重载选项
tshark 打印pcap
我们通过tcpdump或者wireshark抓到 pcap 文件,接下来就可以利用 tshark 这个强大的命令行工具进行抓包。其中 -o的几个选项可以指定 ssl 解密(需要sslkeylog),-T 指定输出格式,-e 指定都需要输出哪些字段(字段列表参考 https://www.wireshark.org/docs/dfref/)。输出是将每个Package中指定的字段输出。
tshark -o ssl.keylog_file:./sslkeylog.txt \
-o "ssl.desegment_ssl_records: TRUE" \
-o "ssl.desegment_ssl_application_data: TRUE" \
-e ssl.handshake.ciphersuite \
-e tcp.analysis.zero_window \
-e http.host \
-e dns.time \
-e tcp.flags.urg \
-e http.request.line \
-e dns.qry.name \
-e ip.version \
-e tcp.analysis.window_full \
-e ipv6.dst \
-e http.request.version \
-e udp.dstport \
-e dns.flags.response \
.... \
-T json -r "./capturedump.pcap"
其他样例
//打印http协议流相关信息
tshark -s 512 -i eth0 -n -f 'tcp dst port 80' -Y 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l
//实时打印当前mysql查询语句
tshark -s 512 -i eth0 -n -f 'tcp dst port 3306' -Y 'mysql.query' -T fields -e mysql.query
//解析MySQL协议
tshark -r ./mysql-compress.cap -o tcp.calculate_timestamps:true \
-T fields -e mysql.caps.cp -e frame.number \
-e frame.time_epoch -e frame.time_delta_displayed \
-e ip.src -e tcp.srcport -e tcp.dstport -e ip.dst \
-e tcp.time_delta -e frame.time_delta_displayed \
-e tcp.stream -e tcp.len -e mysql.query
//抓取详细SQL语句, 快速确认client发过来的具体SQL内容:
sudo tshark -i any -f 'port 3306' -s 0 -l -w - |strings
sudo tshark -i eth0 -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
dfaf
sudo tshark -i eth0 -Y "ip.addr==11.163.182.137" -d tcp.port==3306,mysql -T fields -e mysql.query 'port 3306'
sudo tshark -i eth0 -Y "tcp.srcport==62877" -d tcp.port==3001,mysql -T fields -e tcp.srcport -e mysql.query 'port 3001'
查看请求目标信息
tshark -r wechat.pcap -o 'gui.column.format:"Source Net Addr","%uns","Dest Net Addr", "%und"' -Y "ip" | sort | uniq
查看丢包、带宽、吞吐、延迟
// 统计 ip 情况
tshark -r wechat.pcap -q -z conv,ip
// 跟踪一条流打印 16进制数据
tshark -r wechat.pcap -q -z "follow,tcp,hex,0"
计算丢包情况
tshark -r wechat.pcap -q \
-z io,stat,1,"COUNT(tcp.analysis.retransmission) tcp.analysis.retransmission","COUNT(tcp.analysis.fast_retransmission) tcp.analysis.fast_retransmission","COUNT(tcp.analysis.duplicate_ack) tcp.analysis.duplicate_ack","COUNT(tcp.analysis.lost_segment) tcp.analysis.lost_segment"
计算上行带宽
tshark -o tcp.desegment_tcp_streams:TRUE -n \
-q -r ./wechat.pcap \
-z io,stat,99999999,"BYTES()(ip.src!=10.0.0.0/8 and ip.src!=172.16.0.0/12 and ip.src!=192.168.0.0/16)"
计算 TCP RTT
tshark -o tcp.desegment_tcp_streams:TRUE -n \
-q -r ./wechat.pcap -z \
io,stat,99999999,"AVG(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt"
分析 tcp.stream id 为 0 的传输带宽
tshark -o tcp.desegment_tcp_streams:FALSE -n \
-q -r wechat.pcapng -z io,stat,1,"BYTES()tcp.stream==0"