1. 程式人生 > >通過python對本局域網進行ARP掃描

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

verbose pop 詳細 腳本 socket 操作 wds 單元測試 sock

#!/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)

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