通過python對本局域網進行ARP掃描獲取MAC

#!/usr/local/bin/python3
"""
對本局域網進行ARP掃描 ARP (Address Resolution Protocol,ARP);

以太網MAC地址識別(如下):
主機在整個局域網廣播ARP請求消息,該ARP請求中包含目標設備的IP地址;
局域網上的每一臺設備都會檢查該ARP請求,看該ARP請求中的IP地址是不是自己;
只有符合該IP地址的設備纔會發送ARP響應;
ARP響應該中包涵了ARP請求中的IP地址及對應的MAC地址;
"""
"""
這裏需要Scapy這個模塊
https://pypi.org/project/  去這裏下載scapy
或者去它官網https://scapy.net/ 下載

Scapy是一個功能強大的交互式包操作程序.它能夠僞造或解碼大量的協議包,
還有能發送,捕獲,匹配及回覆各種大量的協議包.它還能輕鬆的處理大量的經典任務,
如掃描,跟蹤,探測,單元測試,×××或網斷掃描;
並且它還能處理其它其它工具所無法處理的任務,如發送無效幀及注入自己的802.11幀,
還有一些結合技術(如VLAN跳轉+ARP緩存中毒,WEP加密信道上的VoIP解碼等),
總之就是很強大

執行本腳本時 ,如果需要用sudo來執行
"""

"""
ls() 列出所有的協議及協議選項
lsc()  列出所有scapy的命令函數
"""

"""
/操作符在兩層之間起到一個組合的作用。當使用該操作符時,
下層可以根據其上層,使它的一個或多個默認字段被重載。
本例中需要用的下面幾個函數
>>>ls(Ether)
dst        : DestMACField                        = (None)
src        : SourceMACField                      = (None)
type       : XShortEnumField                     = (36864)
#dst  目標mac地址  6字節 48位  dst設置爲ff:ff:ff:ff:ff:ff 爲廣播設置
#src  源mac地址    6字節 48位
#type  以太網類型,用於標識上一層使用的是什麼協議;比如0800是IP協議,0806是ARP協議,8035是RARP協議

>>>ls(ARP)
hwtype     : XShortField                         = (1)
ptype      : XShortEnumField                     = (2048)
hwlen      : FieldLenField                       = (None)
plen       : FieldLenField                       = (None)
op         : ShortEnumField                      = (1)
hwsrc      : MultipleTypeField                   = (None)
psrc       : MultipleTypeField                   = (None)
hwdst      : MultipleTypeField                   = (None)
pdst       : MultipleTypeField                   = (None)
#hwtype 硬件地址的類型,硬件地址不只以太網一種,是以太網類型時此值爲1
#ptype 標識上一層使用的是什麼協議
#op 是操作類型字段,值爲1,表示進行ARP請求;值爲2,表示進行ARP應答;值爲3,表示進行RARP請求;值爲4,表示進行RARP應答。
#hwsrc 源mac地址
#psrc 源ip地址
#hwdst 目標mac地址
#pdst 目標ip地址

>>> srp1(pkt,timeout=1,verbose=0 )
#srp1 在第二層協議上發送及接收包並返回第一次的應答
#pkt       構建包的變量
#timeout=1 超時1秒就丟棄,實際時間看程序處理能力而定
#verbose=0 不顯示詳細信息

"""
from scapy.all import *
import sys,getopt,socket

def get_local_net():
    #獲取主機名
    hostname = socket.gethostname()
    #獲取主機的局域網ip
    localip = socket.gethostbyname(hostname)
    localipnums = localip.split('.')
    localipnums.pop()
    localipnet = '.'.join(localipnums)
    return localipnet

def get_vlan_ip_and_mac():
    localnet = get_local_net()
    result = []
    for ipFix in range(1,254):
        ip =localnet+"."+str(ipFix)
        #組合協議包
        arpPkt=Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip)
        res = srp1(arpPkt,timeout=1,verbose=0)
        if res:
            result.append({"localIP":res.psrc,"mac":res.hwsrc})
    return result

result = get_vlan_ip_and_mac()

print(result)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章