Loading... ### tcpdump详解 #### 1.前言 由于本人目前在网络团队,工作中tcpdump抓包用的还是比较多的。这里记录一下该工具的使用。 一般情况下抓应用层的包用fiddler或者charlse之类的就足够了,但是有时候需要抓传输层的包,就需要wiresharks或者tcpdump。其中wiresharks主要用在windows上,并且有图形界面,而tcpdump事宜命令行的形式,更多的用在windows系统上,并且在不同的发行版上也略有差别,具体查看tcpdump的原始文档可以通过man tcpdump进行使用。 ```shell # 安装命令 yum install tcpdump -y ``` 一般情况下都是使用到需要具体的命令和过滤条件临时去找文档和资料,但是tcpdump这个命令不同于很多linux的命令,在过滤包的时候略有复杂。通常我们常用的命令的形式为: ```shell tcpdump -key val -key val # 亦或是 tcpdump key val -key=val val # 或者是 tcpdump val ``` 但是如果这样思考很多时候就难以理解某一个过滤条件,例如: ```shell # 监听捕获hostip为11.11.11.11的所有数据包 tcpdump host 11.11.11.11 # 监听捕获原地址为11.11.11.11的数据包 tcpdump src host 11.11.11.11 # 监听捕获原地址为11.11.11.11的icmp数据包 tcpdump icmp src host 11.11.11.11 ``` 加之还会有很多的表达式可以更加高效的对数据包进行过滤。所以理解参数的含义,而不是生硬的使用,对于解决实际问题很有价值。 #### 2.数据包的格式 通过tcpdump抓到的数据包虽然看上去非常杂乱,但是其实是有规律的。在本机上我随便输入一条命令: ```shell sudo tcpdump -vvv ``` 可以看到不一会儿就有一连串的输出了: ![image-20221203171908586](/Users/liuliujie/Library/Application Support/typora-user-images/image-20221203171908586.png) 看上去比较乱,其实一共有7列,并且每一列都有其含义,复制一行出来: ```shell 17:06:47.564458 IP (tos 0x0, ttl 255, id 4560, offset 0, flags [none], proto UDP (17), length 72) 192.168.0.106.55265 > yueme.bbrouter.domain: [udp sum ok] 29646+ PTR? 100.0.168.192.in-addr.arpa. (44) ``` - 17:06:47.564458 表示时间 - IP (tos 0x0, ttl 255, id 4560, offset 0, flags [none], proto UDP (17), length 72) 这一长串表示IP协议,也可以是UDP ARP等如上图 - 192.168.0.106.55265 源IP和源端口 - ">" 箭头表示数据的流向 - yueme.bbrouter.domain 目标的ip和端口 也可以是域名 - ":"冒号 作用为分隔符 冒号后面就是具体的包内容 - [udp sum ok] 29646+ PTR? 100.0.168.192.in-addr.arpa. (44) 数据内容 #### 3.数据过滤的规则 这里就要说一下前言中提到的tcpdump参数的格式了,如图所示(该图来源百度图片,侵删): ![1.jpg](https://www.morningsunflowers.cn/usr/uploads/2022/12/3333372574.jpg) 其中Options表示可选的各种参数,proto表示网络协议,可以选择要抓的包协议名,dir其实是direction,表示抓包数据的流向,默认发出去的或者接收到的包都会进行拦截。最后一个是类过滤器,后面还需要跟参数的值。在写规则的时候要明确是否符合这个表达式,这样就会越来越得心应手。 ##### 1. 后三项过滤规则 这个名字的主要原因在于暂时先不考虑options,因为options是最直接的,需要的时候直接查询即可,例如: ```shell # 对eth0的数据包进行监听 -i eth0 # 输入详细信息 -vvv # 每行的输出不输出时间 -t ``` 等等。主要是最后三个选择项需要更加注意。这些过滤表达式一般都写在末尾,下面用几个例子来说明。 ```shell # 过滤主机ip 只有type tcpdump host 192.168.1.103 # 也可以过滤网段 tcpdump net 192.168.10.0/24 # 过滤源或目标ip dir和type tcpdump src and dst host 192.168.1.103 # 过滤tcp的源或目标ip以及端口 proto dir和type皆有 tcpdump tcp src and dst host 192.168.1.103 ``` 看到这其实大多可以自己写出来了,就按照proto、dir、type的顺序写就可以,没有可以省略,并且为了方便,出现了很多简洁的写法。 ```shell # eth0写成0 由于dst port 80 or port 443省略了第二个port 并且由于有括号防止shell对括号的错误解析 # 需要用引号(也可以转义) tcpdump -i 0 'src host 192.168.1.103 and (dst port 80 or 443)' # 多个参数合并写 这个在linux命令中很常见 tcpdump -nnevv host 192.168.1.103 # 输出host1和host2或host3之间的数据包 tcpdump host host1 and \( host2 or host3 \) # 输出host1和其他主机的数据包但是不包括host2(无论src还是dst) tcpdump ip host host1 and not host2 ``` 在过滤的时候,除了and和or逻辑运算符还是不够的,有时候还需要判断等于或不等于,也可以使用大于、小于,还可以使用移位运算等运算符,甚至还能用sort、cut等函数功能。比如: ```shell # 打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数# 据包 tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' ``` 解释(来源于参考文献2的博客): > ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度,(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit,要换算成字节数需要乘以4,即左移2。(tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit,换算成比特数为 ((tcp[12]&0xf0) >> 4) << 2,即 ((tcp[12]&0xf0)>>2)。 ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着,ip数据包中确实是有数据。 ##### 2. options参数介绍 option参数其实可以通过--help得到,这里主要是进行一下翻译。 ```shell -a 将网络地址和广播地址转变成名字; -d 将匹配信息包的代码以人们能够理解的汇编格式给出; -dd 将匹配信息包的代码以c语言程序段的格式给出; -ddd 将匹配信息包的代码以十进制的形式给出; -e 在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议; -f 将外部的Internet地址以数字的形式打印出来; -l 使标准输出变为缓冲行形式; -n 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字; -nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示 -t 在输出的每一行不打印时间戳; -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; -vv 输出详细的报文信息; -vvv 输出更加详细的报文信息; -c 在收到指定的包的数目后,tcpdump就会停止; -F 从指定的文件中读取表达式,忽略其它的表达式; -i 指定监听的网络接口; -p:将网卡设置为非混杂模式,不能与host或broadcast一起使用 -r 从指定的文件中读取包(这些包一般通过-w选项产生); -w 直接将包写入文件中,并不分析和打印出来; -s snaplen snaplen表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。 -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;) -X 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。 ``` 说到最后,其实并非一定要严格按照这样的顺序,只是这样更直观,实际上只要语义正确option参数和后三项过滤条件并无先后顺序之分,比如这样。 ``` tcpdump -ni eth0 host 192.168.200.100 -e ``` #### 参考文献 1. [百度-CSDN](https://baijiahao.baidu.com/s?id=1671144485218215170&wfr=spider&for=pc) 2. [TCP使用详解](https://www.cnblogs.com/lvdongjie/p/10911564.html) 最后修改:2022 年 12 月 03 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏
17 条评论
《说老公坏话》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/30913.html
《肆意放纵》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/15291.html
《波湾阴谋》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/162460.html
《四大名捕2012》动作片高清在线免费观看:https://www.jgz518.com/xingkong/123034.html
《走来走去》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/113561.html
《安得广厦千万间》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/103120.html
《新抱喜相逢国语》香港剧高清在线免费观看:https://www.jgz518.com/xingkong/96089.html
《春水长流》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/85489.html
《九九艳阳天》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/84727.html
《抖包袱大会》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/1894.html
《希尔玛》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/72826.html
哈哈哈,写的太好了https://www.cscnn.com/
不错不错,我喜欢看 www.jiwenlaw.com
想想你的文章写的特别好https://www.ea55.com/
不错不错,我喜欢看 https://www.237fa.com/
叼茂SEO.bfbikes.com
叼茂SEO.bfbikes.com