【问题标题】:A Problem in Parsing CNAME with Libpcap: some CNAMEs seems missing TLD使用 Libpcap 解析 CNAME 的问题:一些 CNAME 似乎缺少 TLD
【发布时间】:2019-09-03 04:45:44
【问题描述】:

我正在使用 libpcap 编写 DNS 回复解析器,并发现相应的 DNS 数据包负载中似乎缺少一些 CNAME 的 TLD。一个示例显示在示例数据包的 wireshark dissection 中,其中 wireshark 显示实际 CNAME 是

prd-push-access-net5-175542503.us-east-1.elb.amazonaws.com

但我只能找到

prd-push-access-net5-175542503.us-east-1.elb.amazonaws

(即没有“.com”)在有效负载的相应部分。我想知道如何(以及wireshark)如何从这个有效载荷中解析出完整的CNAME(带有“.com”)?

(此外,这个 CNAME 似乎格式不正确,因为根据 RFC1035,有问题的 QNAME 部分应该“以根的空标签的零长度八位字节终止”,我想 CNAME 也是如此?)

【问题讨论】:

  • 数据包有多大?是否全部显示在图像中?突出显示的 URL 有几个部分,连续存储为几个字符串,前面有一个长度字节,没有零终止符字节。也许“com”部分在别处?

标签: c++ dns cname libpcap


【解决方案1】:

DNS 数据包使用名称压缩,请参阅https://www.rfc-editor.org/rfc/rfc1035 第 4.1.4 节

在很多地方(名字出现的地方),每个标签都可以用一个指针来表示,该指针指向数据包中已经出现过的地方,而不是字符串。

在您的示例中,我们可以在数据包前面的myfoscam.com 中清楚地看到com

所以对于内容(仅使用结尾,因为从图像中提取数据很繁琐,您应该将内容复制为文本)03656c6209616d617a6f6e617773c019c02e00 我们必须这样分析它:

  • 03:下面是长度为3的字符串
  • 656c62:这是字符串 elb,广告中的长度为 3
  • 09:下面是长度为9的字符串
  • 616d617a6f6e617773:这是字符串amazonaws
  • c0 :前两位为 1(因为它的值是 192,所以大于或等于 128+64),这意味着它是一个两字节指针的一部分。因此,c019 是指向数据包的十进制偏移 25(十六进制 19)处的指针。

所以如果你从整个数据包开始,并切换到偏移量 25,你应该找到序列03636f6d,即com(前缀长度为 3)。

或者可能是别的东西,因为事实上你有另一个指针:c02e,所以这是消息中的偏移量 46。或者那部分完全是为了其他东西,它实际上取决于前一个指针指向的内容,它是否以空标签结束(如果它在偏移量 25 处是 03636f6d00)。请参阅 RFC 中的示例(和/或在您的问题中以文本形式提供所有数据包内容)

然后它以空标签00 结尾,表示根(任何名称末尾隐藏的.)。

【讨论】:

  • 我明白了。我没有意识到名称压缩可以应用于部分域名。谢谢帕特里克!救生员! (我确认从 DNS 消息的开头偏移 25,即 DNS 标头中 ID 字段的第一个八位字节是“.com”)
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多