繁体   English   中英

带有 scapy 的 DNS 请求(Python)

[英]DNS request with scapy (Python)

我编写了一个代码来创建一个 dns 数据包并发送它。 例如,该数据包模拟nslookup -type=soa facebook.com 8.8.8.8命令。 但由于某种原因,我得到的答案与“nslookup”命令返回的答案不同。

我的代码 dns 服务器输出:“a.ns.c10r.facebook.com”

来自nslookup -type=soa facebook.com 8.8.8.8命令的 dns 服务器:“a.ns.facebook.com”

  • 我的最终目标是获得一个站点 dns 服务器,这样我就可以通过 dns 数据包获得站点 IP 地址的权威答案。

这是我的代码:

from scapy.all import *
from scapy.layers.dns import DNS, DNSQR
from scapy.layers.inet import IP, UDP

def main():
    dns_server_request = IP(dst='8.8.8.8') / UDP(dport=53) / DNS(rd=1, qd=DNSQR(qname='www.facebook.com', qtype='SOA'))
    ans = sr1(dns_server_request, verbose=0)
    ans.show()

if __name__ == "__main__":
    main()

有人知道我做错了什么,我该如何解决?

  • (顺便说一下,我的代码提供的 dns 服务器无法正常工作)

tl;dr:您想查询顶级域 facebook.com,而不是 www。


我究竟做错了什么

(1.) 好吧,对于初学者,您使用的是nslookup :-)

当然,只要稍加注意,就可以从该工具中获得有用的结果。 但我强烈建议您更喜欢dig进行所有交互式查询。 这有点像使用tcpdump port domain ,因为它默认显示给定名称服务器返回的所有内容。

(2.) 您查询的域很重要。

请注意,“www”是指向 star-mini.c10r.facebook.com 的 CNAME。 由于 FB 是一家大型机构,事实证明有一个区域切割来支持命名空间的这一部分,所以它有自己的 bailiwick。

$ dig +noadd any c10r.facebook.com @d.ns.c10r.facebook.com | grep '^c10r' | sort
c10r.facebook.com.  300 IN  SOA a.ns.c10r.facebook.com. dns.facebook.com. 1715184742 300 600 600 300
c10r.facebook.com.  3600    IN  NS  a.ns.c10r.facebook.com.
c10r.facebook.com.  3600    IN  NS  b.ns.c10r.facebook.com.
c10r.facebook.com.  3600    IN  NS  c.ns.c10r.facebook.com.
c10r.facebook.com.  3600    IN  NS  d.ns.c10r.facebook.com.

好问题! 感谢为我们提供了一个可爱的MRE 很清楚你在做什么,不需要澄清评论。


值得注意的是,SOA 中的 MNAME 不需要响应您的查询。 它是严格意义上的私有安排 AXFR 详细信息,恰好在查询结果中公开。 许多区域将有一个所谓的“隐藏主控”,它响应 NS 集的成员,但不会响应一般的 inet 客户端。

当您发现一个新区域时,就像您发布的 SOA 结果一样,最合适的做法是查询该区域的 NS 集并询问其委托的名称服务器。 您当然也可以查询 MNAME 名称服务器,但如果它没有回答或发回 REFUSED,请不要感到惊讶。

请注意, dig +trace +norecurse可以非常有助于确定哪些域名服务器位于 bailiwick 中以获取一些深度嵌套的区域名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM