这几天做子域名爆破,看了几个online的app。发现很多软件里都有一个DNS的list,里面一大堆的IP地址。然后我就问了自己一个问题,这里面的难道都是DNS服务器嘛?抱着好奇的心态,我决定试一试,查询一下。那么问题就来了,如何判断一个IP地址是否是DNS服务器呢?
想了想,没有啥好的方法可以直接查询到。最后就是可以用反证法。比如我有一个IP地址是a.a.a.a,然后我假设这个地址是DNS服务器,我用这个地址去(DNS)查询www.baidu.com的IP地址,如果有返回结果,就说明这个地址a.a.a.a是DNS服务器;反之,则说明这个地址不是DNS服务器。
比如在Ternimal里,我们可以看出:
所以,决定用python试一试,去实现这个判断。
首先要安装nslookup的包。link:https://pypi.org/project/nslookup/
pip3 install nslookup
然后大概写了一个例子,假设我有三个IP地址,8.8.8.8是Google的DNS服务器,然后1.1.1.1我随便打的一个地址。最后128.232.132.8是网站www.cam.ac.uk的IP地址。然后有:
from nslookup import Nslookup
domain = "www.st-andrews.ac.uk"
server = "8.8.8.8"
server_test = "1.1.1.1"
server_cam = "128.232.132.8"
def verification_process(ip_address):
dns_query = Nslookup(dns_servers=[ip_address])
try:
result = dns_query.dns_lookup(domain)
return result
except Exception as e:
print(e)
return False
result = verification_process(server)
result1 = verification_process(server_test)
result2 = verification_process(server_cam)
print("======Regarding Server 8.8.8.8=========")
print(result)
print(result.response_full)
print("======Regarding Server 1.1.1.1=========")
print(result1)
print(result1.response_full)
print("======Regarding Server 128.232.132.8=========")
print(result2)
print(result2.response_full)
result是个object,想看具体的内容需要result.response_full。最后的输出结果:
所以,可以看出来,只有用8.8.8.8,也就是Google的DNS服务器查询的时候,才可以查出来www.st-andrews.ac.uk对应的IP地址,其他的都查不出来。所以我们可以判断,IP 8.8.8.8是一个DNS服务器。
最后附上一份,把一个.txt文件里,所有的IP进行检测,看是否是DNS服务器。
import sys
from nslookup import Nslookup
domain = "www.st-andrews.ac.uk"
dns_list = []
not_dns_list = []
def read_file(path):
text_ip_add = open(path,'r')
detail_ip_add = text_ip_add.readlines()
content = []
for i in detail_ip_add:
i = i.strip('\n')
i = i.strip(' ')
content.append(i)
text_ip_add.close()
return content
def dns_verify(ip_address):
dns_query = Nslookup(dns_servers=[ip_address])
try:
result = dns_query.dns_lookup(domain)
if len(result.response_full) > 0:
dns_list.append(ip_address)
else:
not_dns_list.append(ip_address)
except Exception as e:
print(ip_address,"with Exception",e)
def verification_process(content):
for i in content:
dns_verify(i)
print("dns_list is:",dns_list)
print("not_dns_list is:", not_dns_list)
file_path = sys.argv[1]
content = read_file(file_path)
verification_process(content)