CSDN|肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁( 五 )

2、tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg 这些同样可以理解为别名常量 , 分别代表 1 , 2 , 4 , 8 , 16 , 32 , 64 。 这些数字是如何计算出来的呢?以 tcp-syn 为例 , 你可以参照下面这张图 , 计算出来的值 是就是 2
CSDN|肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁
本文插图
由于数字不好记忆 , 所以一般使用这样的“别名常量”表示 。 因此当下面这个表达式成立时 , 就代表这个包是一个 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 , 也就是实际数据在整个报文首部中的偏移量 。


推荐阅读