ARP攻击检测工具: 识别网络异常行为

本工具用于检测ARP攻击,并识别网络中的异常主机行为,帮助你保护网络安全。

功能介绍

  • 扫描主机: 自动扫描本地网络中的所有主机,并记录其IP地址和MAC地址。
  • 检测攻击: 通过分析ARP请求和响应包,识别可能存在的ARP攻击行为。
  • 记录日志: 将所有检测到的异常活动记录到日志文件中,方便后续分析。
  • 用户认证: 需要用户登录才能使用该工具,提供基本的账户安全保障。

使用说明

  1. 运行程序,输入用户名和密码登录。
  2. 点击“扫描主机”按钮,扫描本地网络中的主机。
  3. 点击“开始检测”按钮,启动ARP攻击检测功能。
  4. 攻击检测完成后,异常主机的信息将显示在日志文件中。

代码示例

import os
import sys
import time
import logging
import tkinter as tk
from scapy.all import *
from scapy.layers.l2 import ARP, Ether
from tkinter import messagebox

# 设置日志记录器
logging.basicConfig(filename='arp_attack.log', level=logging.INFO)

# 定义异常主机列表
suspicious_hosts = []

# 定义用户账号密码文件
user_file = 'user.txt'

# 定义ARP请求和响应包计数器
ar_req_count = {}
ar_rep_count = {}

# 定义扫描主机函数
def scan_hosts():
    # 获取本机IP地址
    local_ip = os.popen('ifconfig | grep "inet " | awk '{print $2}' -cut -d: -f2').read().strip()
    # 获取本机MAC地址
    local_mac:str = os.popen('ifconfig | grep "ether " | awk '{print $2}'').read().strip()
    # 获取本机网段
    local_network = '.'.join(local_ip.split('.')[:-1]) + '.0/24'
    # 发送ARP请求包扫描主机
    ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=local_network), timeout=2, verbose=False)
    # 将扫描到的主机IP地址和MAC地址存入文件中
    with open('hosts.txt', 'w') as f:
        for send, recv in ans:
            f.write(recv.sprintf('%ARP.psrc% %Ether.src%
'))

# 定义检测ARP攻击函数
def detect_attack():
    # 读取扫描到的主机IP地址和MAC地址
    with open('hosts.txt', 'r') as f:
        hosts = f.readlines()
    # 遍历每个主机
    for host in hosts:
        ip, mac = host.strip().split()
        # 判断是否为本机
        if mac == str:
            continue
        # 判断是否为异常主机
        if ip in suspicious_hosts:
            continue
        # 检测应答报文
        if arp_rep_count.get(ip) and len(arp_rep_count[ip]) > 1:
            macs = set(arp_rep_count[ip])
            if len(macs) > 1:
                suspicious_hosts.append(ip)
                logging.warning('ARP attack detected: same IP address with different MAC addresses - IP: %s, MACs: %s' % (ip, macs))
                continue
        # 检测请求报文
        if arp_req_count.get(mac) and len(arp_req_count[mac]) > 1:
            ips = set(arp_req_count[mac])
            if len(ips) > 1:
                suspicious_hosts.append(ip)
                logging.warning('ARP attack detected: different IP addresses with same MAC address - IP: %s, MAC: %s' % (ips, mac))
                continue
        # 检测大量的ARP请求或响应包
        if arp_req_count.get(ip) and len(arp_req_count[ip]) > 10:
            if len(set(arp_req_count[ip])) == 1:
                suspicious_hosts.append(ip)
                logging.warning('ARP attack detected: same IP address with large amount of ARP requests - IP: %s, MAC: %s' % (ip, mac))
                continue
        if arp_rep_count.get(ip) and len(arp_rep_count[ip]) > 10:
            if len(set(arp_rep_count[ip])) == 1:
                suspicious_hosts.append(ip)
                logging.warning('ARP attack detected: same IP address with large amount of ARP responses - IP: %s, MAC: %s' % (ip, mac))
                continue
        # 更新ARP请求和响应包计数器
        if not arp_req_count.get(mac):
            arp_req_count[mac] = []
        arp_req_count[mac].append(ip)
        if not arp_rep_count.get(ip):
            arp_rep_count[ip] = []
        arp_rep_count[ip].append(mac)

# 定义开始检测函数
def start_detection():
    # 设置定时器,每5秒检测一次
    def timer():
        detect_attack()
        root.after(5000, timer)
    timer()

# 定义停止检测函数
def stop_detection():
    # 清空计数器和异常主机列表
    arp_req_count.clear()
    arp_rep_count.clear()
    suspicious_hosts.clear()

# 定义登录函数
def login():
    # 读取用户账号密码
    with open(user_file, 'r') as f:
        users = f.readlines()
    # 获取用户名和密码
    user = username.get()
    password = passwd.get()
    # 遍历用户账号密码,判断是否匹配
    for u in users:
        u, p = u.strip().split()
        if u == user and p == password:
            # 隐藏登录窗口,显示功能窗口
            login_window.withdraw()
            root.deiconify()
            return
    # 弹出错误提示
    tk.messagebox.showerror('Error', 'Invalid username or password')

# 定义注册函数
def register():
    # 获取用户名和密码
    user = username.get()
    password = passwd.get()
    # 判断用户名是否已存在
    with open(user_file, 'r') as f:
        users = f.readlines()
    for u in users:
        u, p = u.strip().split()
        if u == user:
            # 弹出错误提示
            tk.messagebox.showerror('Error', 'Username already exists')
            return
    # 写入新用户账号密码
    with open(user_file, 'a') as f:
        f.write('%s %s
' % (user, password))
    # 弹出成功提示
    tk.messagebox.showinfo('Success', 'User registered successfully')

# 创建登录窗口
login_window = tk.Tk()
login_window.title('Login')
login_window.geometry('200x100')
login_window.resizable(False, False)

# 创建用户名和密码输入框
username_label = tk.Label(login_window, text='Username:')
username_label.grid(row=0, column=0, padx=5, pady=5)
username = tk.Entry(login_window)
username.grid(row=0, column=1, padx=5, pady=5)
passwd_label = tk.Label(login_window, text='Password:')
passwd_label.grid(row=1, column=0, padx=5, pady=5)
passwd = tk.Entry(login_window, show='*')
passwd.grid(row=1, column=1, padx=5, pady=5)

# 创建登录和注册按钮
login_button = tk.Button(login_window, text='Login', command=login)
login_button.grid(row=2, column=0, padx=5, pady=5)
register_button = tk.Button(login_window, text='Register', command=register)
register_button.grid(row=2, column=1, padx=5, pady=5)

# 创建功能窗口
root = tk.Tk()
root.title('ARP Attack Detection')
root.geometry('400x300')
root.resizable(False, False)

# 创建开始检测、停止检测和扫描主机按钮
start_button = tk.Button(root, text='Start Detection', command=start_detection)
start_button.pack(side='left', padx=5, pady=5)
stop_button = tk.Button(root, text='Stop Detection', command=stop_detection)
stop_button.pack(side='left', padx=5, pady=5)
scan_button = tk.Button(root, text='Scan Hosts', command=scan_hosts)
scan_button.pack(side='left', padx=5, pady=5)

# 创建主机列表框
listbox = tk.Listbox(root)
listbox.pack(fill='both', expand=True, padx=5, pady=5)

# 隐藏功能窗口
root.withdraw()

# 运行程序
login_window.mainloop()
root.resizable(False, False)

# 创建开始检测、停止检测和扫描主机按钮
start_button = tk.Button(root, text='Start Detection', command=start_detection)
start_button.pack(side='left', padx=5, pady=5)
stop_button = tk.Button(root, text='Stop Detection', command=stop_detection)
stop_button.pack(side='left', padx=5, pady=5)
scan_button = tk.Button(root, text='Scan Hosts', command=scan_hosts)
scan_button.pack(side='left', padx=5, pady=5)

# 创建主机列表框
listbox = tk.Listbox(root)
listbox.pack(fill='both', expand=True, padx=5, pady=5)

# 隐藏功能窗口
root.withdraw()

# 运行程序
login_window.mainloop()

注意

  • 该工具仅供学习和研究使用,请勿用于任何非法活动。
  • 使用该工具需要安装scapy库,可以使用pip install scapy命令进行安装。
  • 该工具仅支持在Linux系统上运行,在Windows系统上可能无法正常使用。

免责声明

本工具仅供学习和研究使用,使用者需自行承担使用该工具所带来的任何风险和责任。作者对因使用该工具所产生的任何损失不承担任何责任。

希望本工具能够帮助你更好地理解ARP攻击,并提高你的网络安全意识。

ARP攻击检测工具: 识别网络异常行为

原文地址: https://www.cveoy.top/t/topic/jpjB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录