ARP攻击检测工具: 识别网络异常行为
ARP攻击检测工具: 识别网络异常行为
本工具用于检测ARP攻击,并识别网络中的异常主机行为,帮助你保护网络安全。
功能介绍
- 扫描主机: 自动扫描本地网络中的所有主机,并记录其IP地址和MAC地址。
- 检测攻击: 通过分析ARP请求和响应包,识别可能存在的ARP攻击行为。
- 记录日志: 将所有检测到的异常活动记录到日志文件中,方便后续分析。
- 用户认证: 需要用户登录才能使用该工具,提供基本的账户安全保障。
使用说明
- 运行程序,输入用户名和密码登录。
- 点击“扫描主机”按钮,扫描本地网络中的主机。
- 点击“开始检测”按钮,启动ARP攻击检测功能。
- 攻击检测完成后,异常主机的信息将显示在日志文件中。
代码示例
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攻击,并提高你的网络安全意识。
原文地址: https://www.cveoy.top/t/topic/jpjB 著作权归作者所有。请勿转载和采集!