2、tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg 这些同样可以理解为别名常量 , 分别代表 1 , 2 , 4 , 8 , 16 , 32 , 64 。 这些数字是如何计算出来的呢?以 tcp-syn 为例 , 你可以参照下面这张图 , 计算出来的值 是就是 2
本文插图
由于数字不好记忆 , 所以一般使用这样的“别名常量”表示 。 因此当下面这个表达式成立时 , 就代表这个包是一个 syn 包 。 tcp[tcpflags] == tcp-syn要抓取特定数据包 , 方法有很多种 。 下面以最常见的 syn包为例 , 演示一下如何用 tcpdump 抓取到 syn 包 , 而其他的类型的包也是同样的道理 。 据我总结 , 主要有三种写法:1、第一种写法:使用数字表示偏移量$ tcpdump -i eth0 "tcp[13] & 2 != 0" 2、第二种写法:使用别名常量表示偏移量$ tcpdump -i eth0 "tcp[tcpflags] & tcp-syn != 0" 3、第三种写法:使用混合写法$ tcpdump -i eth0 "tcp[tcpflags] & 2 != 0"# or$ tcpdump -i eth0 "tcp[13] & tcp-syn != 0" 如果我想同时捕获多种类型的包呢 , 比如 syn + ack 包1、第一种写法$ tcpdump -i eth0 'tcp[13] == 2 or tcp[13] == 16'2、第二种写法$ tcpdump -i eth0 'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'3、第三种写法$ tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0" 4、第四种写法:注意这里是 单个等号 , 而不是像上面一样两个等号 , 18(syn+ack) = 2(syn) + 16(ack)$ tcpdump -i eth0 'tcp[13] = 18'# or$ tcpdump -i eth0 'tcp[tcpflags] = 18'tcp 中有 类似 tcp-syn 的别名常量 , 其他协议也是有的 , 比如 icmp 协议 , 可以使用的别名常量有icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert,icmp-routersolicit, icmp-timx-ceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply,icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply5.2 基于包大小进行过滤若你想查看指定大小的数据包 , 也是可以的$ tcpdump less 32 $ tcpdump greater 64 $ tcpdump <= 1285.3 根据 mac 地址进行过滤例子如下 , 其中 ehost 是记录在 /etc/ethers 里的 name$ tcpdump ether host [ehost]$ tcpdump ether dst [ehost]$ tcpdump ether src [ehost]5.4 过滤通过指定网关的数据包$ tcpdump gateway [host]5.5 过滤广播/多播数据包$ tcpdump ether broadcast$ tcpdump ether multicast$ tcpdump ip broadcast$ tcpdump ip multicast$ tcpdump ip6 multicast【CSDN|肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁】
如何抓取到更精准的包?先给你抛出一个问题:如果我只想抓取 HTTP 的 POST 请求该如何写呢?如果只学习了上面的内容 , 恐怕你还是无法写法满足这个抓取需求的过滤器 。 在学习之前 , 我先给出答案 , 然后再剖析一下 , 这个过滤器是如何生效的 , 居然能让我们对包内的内容进行判断 。 $ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4]'命令里的可选参数 , 在前面的内容里已经详细讲过了 。 这里不再细讲 。 本节的重点是引号里的内容 , 看起来很复杂的样子 。 将它逐一分解 , 我们只要先理解了下面几种用法 , 就能明白
tcp[n]:表示 tcp 报文里 第 n 个字节
tcp[n:c]:表示 tcp 报文里从第n个字节开始取 c 个字节 , tcp[12:1] 表示从报文的第12个字节(因为有第0个字节 , 所以这里的12其实表示的是13)开始算起取一个字节 , 也就是 8 个bit 。 查看 tcp 的报文首部结构 , 可以得知这 8 个bit 其实就是下图中的红框圈起来的位置 , 而在这里我们只要前面 4个bit , 也就是实际数据在整个报文首部中的偏移量 。
推荐阅读
-
[先生]男子新车只开了七千公里,正常行驶中发动机掉了
-
「护理」?胶带竟要单人单用?!这些被忽视的胶带问题很重要
-
集合啦! 动物森友会|NBA壮汉们正商量把女人偷运进隔离区,才13天就憋坏了
-
-
说唱星推荐|乔欣学习冲浪,韩东君说她像老太太过马路,练习动作时,又帅又飒
-
德云社相声春晚开录,时间、地点已确定,特邀嘉宾名单被曝光
-
-
新华网|美国辛辛那提市一夜发生数起枪击事件 至少4人死亡
-
新华网客户端经济呈“U”型反弹将非常缓慢?,英国“解封”艰难迈出第一步
-
|时间整整缩短1000倍,这次终于轮到中国说话,西方:怎么做到的?
-
三国中比诸葛亮还聪明的人是谁?三国里比诸葛亮聪明的人
-
月夜枫YYF|完美拉墙,幻象四杀,可能这就是团战魔术师吧!
-
##50平的小户型复式楼,把楼梯改成娱乐区,还有个大庭院
-
「香港」一位香港妈妈的心声:不想让孩子在香港读书了
-
-
『环球网』 意大利挂起中国和俄罗斯国旗 自发降下欧盟旗帜,
-
-
daoda|昊华能源:2020年前三季度净利润约1.03亿元,同比下降82.83%
-
易车网|涡轮动力+后驱,配独立座椅,8万多落地,能跑山的MPV
-
死神方便:方便不敢迎战UFC世界冠军阿迪萨亚?辟谣:那时候他什么都不是