了解Tcpdumpfilter和位掩码

我想通过使用tcpdump嗅探http头。

这个filter工作正常,但我不明白 –

(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) 

我GOOGLE了,但我找不到任何有用的信息

这是整个tcpdump命令

 sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

Solutions Collecting From Web of "了解Tcpdumpfilter和位掩码"

不是BPF过滤器获取http头,而是tcpdump命令中的“-A”开关。

您的tcpdump命令查找到某个目的地的tcp流量,或者从eth0上的特定源查找tcp流量,其中最终的BPF过滤器涉及导致总数不为零的计算。 使用“-A”选项,它将打印每个数据包的ASCII码减去其链接级别标题。

我已经解释了下面的计算,但我相信在实际的过滤器中有一些问题,可能是通过复制和粘贴。 在tcpdump中使用这些过滤器时,您使用的是tcp位掩码,通常用于检查不落在字节边界的字段

  • ip[2:2]表示IP报头中的两个字节(即第3和第4个字节),从字节2开始(记住它从偏移量0开始)。 该总和表示可以是最大65535字节的IP分组的总长度。

对于这里的位掩码,为了清楚起见,我已经预先设置了“0”,所以掩码0xf变为0x0f 。 掩码中的前导'0'将按照下面GuyHarris的评论放弃。

  • ip[0]&0x0f是指IP报头中字节0(即第一个字节)的后半部分,它将给你32位字的IP报头长度,因此,这样的计算通常乘以4 。

  • tcp[12]&0xf0)是指字节12的前半部分(即第11个字节),它是数据偏移字段,其以32位字指定TCP报头的大小,因此,这通常被乘以4进行这样的计算。

您需要将最后2个长度乘以4,因为它们是32位/ 4字节字,因此需要转换为总字节数,以便计算正确

你的过滤器应该是计算:

  • IP数据包长度(以字节为单位) – IP标头长度 – TCP标头长度

并寻找这个价值为零,即这样的事情

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

当你执行减法,你正在寻找一个非零的总和。 这个非零总数意味着有第4层以上的数据,即tcp有效载荷中的数据,通常是应用程序流量。

假设大多数http流量通过端口80,您可能还想要添加端口80。

安全人员通常使用这种过滤器来检测SYN上的数据,这是不正常的,但根据RFC,它是允许的。 所以整个事情看起来像 –

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuide是一个非常好的免费在线指南在TCP / IP btw。

更新:根据Guy Harris的更新,修改位掩码中的“前导零”部分。