gpt4 book ai didi

linux - 了解 Tcpdump 过滤器和位掩码

转载 作者:IT王子 更新时间:2023-10-29 00:11:01 34 4
gpt4 key购买 nike

我正在尝试使用 tcpdump 嗅探 http header 。

这个过滤器很好用,但我看不懂 -

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

我用谷歌搜索过,但找不到任何有用的信息

这是整个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

最佳答案

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

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

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

  • ip[2:2] 指的是 IP header 中的两个字节(即第 3 和第 4 个字节),从字节 2 开始(记住它从偏移量 0 开始)。此总数表示 IP 数据包的总长度,最大长度为 65535 字节。

对于这里的位掩码,为了清楚起见,我在前面加上了一个“0”,所以掩码 0xf 变成了 0x0f。根据下面 GuyHarris 的评论,掩码上的前导“0”被删除。

  • ip[0]&0x0f 指的是 IP header 中字节 0 的后半部分(即第一个字节),它将为您提供 32 位字的 IP header 长度和因此,对于此类计算,通常将其乘以 4。

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

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

您的过滤器应该正在计算:

  • IP 数据包长度(以字节为单位)- IP header 长度- TCP header 长度

并寻找该值为零的值,即类似这样的值

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 的非常好的免费在线指南。

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

关于linux - 了解 Tcpdump 过滤器和位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11757477/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com