【发布时间】:2013-03-26 13:20:15
【问题描述】:
在关于 DNS 的 RFC 1035 中,它是这样写的:
4.2.2。 TCP 使用情况
通过 TCP 连接发送的消息使用服务器端口 53(十进制)。这 消息以两个字节长度字段为前缀,该字段给出 消息长度,不包括两个字节长度字段。这个长度 字段允许低级处理组装完整的消息 在开始解析之前。
我想用 TCP 发送一个 DNS 请求,但我不知道如何在 DNS 请求之前添加这两个字节。我尝试使用该代码:
from scapy.all import *
ip=IP(dst="216.239.32.10")
request = DNS(rd=1, qd=DNSQR(qname = "google.be", qtype="A")) #size = 27(dec) = 1b (hex)
twoBytesRequestSize = "\x1b\x00"
completeRequest = str(request) + twoBytesRequestSize
SYN=ip/TCP(sport=RandNum(1024,65535), dport=53, flags="S", seq=42)
SYNACK=sr1(SYN)
ACK=ip/TCP(sport=SYNACK.dport, dport=53, flags="A", seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ACK)
DNSRequest = ip/TCP(sport=SYNACK.dport, dport=53, flags="PA", seq=SYNACK.ack, ack=SYNACK.seq + 1) / completeRequest
DNSReply = sr1(DNSRequest, timeout = 1)
但我的 paquet 被解释为没有 DNS 层的简单 TCP 数据包。
您有没有在 DNS 请求前添加这两个字节前缀的想法?
谢谢!
【问题讨论】:
-
您实际上想要完成什么?只需查找 DNS A 记录?如果是这样,还有更简单的方法。
-
不确定它是否会有所帮助,但互联网协议通常是大端的,这意味着您需要
\x00\x1b而不是\x1b\x00。 -
John,我需要检索 DNS 服务器的时间戳,但我无法在 SYNACK 响应中获取它,因为 SYNCOOKIES 的某些实现使用了时间戳选项。阿明,它有效,你是今天的人!我很确定我已经尝试过大端。谢谢。
-
@Comtention 您可以通过向其发送带有无效 TSIG 密钥的 (UDP) 查询来获取服务器的时间;-)
标签: python tcp dns scapy rfc1035