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 , 也就是实际数据在整个报文首部中的偏移量 。
推荐阅读
-
怎样看待“如果一个男人仅仅是因为你贤惠、勤劳等特质喜欢的你,就很危险了”
-
-
|辛苦花了一年终于搬新家,不安装吊顶,不做电视墙,反而更耐看!
-
-
「公测」“月租”560元!马斯克:SpaceX卫星宽带将公测 延迟仅20MS
-
海外网|日本男子在韩国违反隔离规定被捕 获缓刑2年
-
-
黄轩|黄轩陈赫演绎相爱相杀兄弟情,挑战自己各有难处
-
-
-
王者荣耀|体验服|英雄调整,百里守约伤害机制调整,阿轲迎来加强
-
-
-
-
公司|寒武纪科创板上市:85后中科大博士陈天石身价超300亿
-
『悠悠众口』总结四条面试官常用套路,网友:很实用,小伙面试百家公司
-
【程序员】靠左神这套程序员代码面试指南入职阿里、腾讯、美团、百度不再难
-
《战争之人 2》游戏 8 月 10-14 日开启最后一轮 Beta 测试
-
#ONE科技创意园#iPhone11辉煌不再!沦为跳水机,网友表示本来就不值这个价
-
云南大理鹤庆县发生森林火灾,当地投入扑火力量达600余人