基于Linux的ARP攻击检测软件功能实现
基于Linux的ARP攻击检测软件功能实现
本文将介绍如何使用Python开发一个基于Linux的ARP攻击检测软件,该软件能够实时监控网络流量,分析ARP包,识别可能的ARP攻击行为,并提供用户界面方便用户操作。
功能需求
该软件需要实现以下功能:
- 数据包捕获和过滤: 捕获网络数据包,并过滤出ARP包,其他数据包丢弃。
- ARP包分析: 分析ARP包,区分正常主机和疑似异常主机,将疑似异常主机的IP地址和MAC地址标记为红色。
- 用户登录和注册: 提供用户登录和注册功能,保存用户信息并进行身份验证。
- 攻击检测功能: 提供“开始攻击检测”、“停止攻击检测”和“扫描局域网主机”三个按钮,实现以下功能:
- 开始攻击检测: 实时分析ARP包,并输出疑似ARP攻击的信息,包括源IP地址和源MAC地址信息,并保存到文件中。
- 停止攻击检测: 停止ARP包分析和信息输出。
- 扫描局域网主机: 扫描局域网内所有活动主机,并将主机IP地址和MAC地址输出到界面上,并保存到文件中。
- 日志记录: 记录所有检测到的信息,包括正常主机、疑似异常主机、攻击检测结果等,并保存到日志文件中。
实现思路
该软件的实现可以分为以下几个部分:
- 数据包捕获和过滤: 使用Python的
scapy库捕获网络数据包,并根据过滤规则筛选出ARP包。 - ARP包分析: 定义规则分析ARP包,例如:
- 检测应答报文时判断是否出现同一IP地址对应不同的MAC地址;是则可能遭受ARP攻击
- 检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址;是则可能遭受ARP攻击
- 检测ARP请求或响应包,检测是否存在同一IP或者是同一MAC地址发出大量数据包,是则可能遭受ARP攻击,不是则未遭受ARP攻击
- 满足两种规则或以上的就输出遭受ARP攻击,不满足则输出未遭受ARP攻击
- 用户登录和注册: 使用Python的
json库保存用户信息,并实现用户登录和注册功能。 - GUI界面: 使用Python的
tkinter库设计GUI界面,包含按钮和文本框,方便用户进行操作。 - 日志记录: 使用Python的
logging库记录程序运行过程中的信息,包括正常主机、疑似异常主机、攻击检测结果等。
代码实现
由于题目中要求实现的功能比较多,代码实现将分为多个部分,分别实现不同的功能。
1. 捕获ARP包并分析
from scapy.all import *
# 捕获ARP包并分析
def analyze_arp(pkt):
if ARP in pkt:
arp = pkt[ARP]
# 判断是否为请求报文
if arp.op == 1:
if arp.psrc == arp.pdst:
# 同一IP地址对应不同的MAC地址
if arp.hwsrc != get_mac(arp.psrc):
print('[!] Possible ARP attack detected! Same IP address with different MAC address.')
return True
else:
# 不同IP地址对应同一个MAC地址
if arp.hwsrc == get_mac(arp.psrc):
print('[!] Possible ARP attack detected! Different IP address with same MAC address.')
return True
# 判断是否为应答报文
elif arp.op == 2:
# 同一IP地址对应不同的MAC地址
if arp.hwsrc != get_mac(arp.psrc):
print('[!] Possible ARP attack detected! Same IP address with different MAC address.')
return True
return False
# 获取指定IP地址的MAC地址
def get_mac(ip):
ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip), timeout=2, verbose=False)
for s, r in ans:
return r[ARP].hwsrc
return None
2. 用户登录和注册功能
import json
# 注册新用户
def register():
username = input('Please enter your username: ')
password = input('Please enter your password: ')
with open('users.json', 'r') as f:
users = json.load(f)
if username in users:
print('[!] This username has already been registered.')
return
users[username] = password
with open('users.json', 'w') as f:
json.dump(users, f)
print('[+] Registration successful.')
# 用户登录
def login():
username = input('Please enter your username: ')
password = input('Please enter your password: ')
with open('users.json', 'r') as f:
users = json.load(f)
if username not in users:
print('[!] User not found.')
return False
if users[username] != password:
print('[!] Incorrect password.')
return False
print('[+] Login successful.')
return True
3. 功能页面和按钮
import tkinter as tk
class App:
def __init__(self):
self.root = tk.Tk()
# 隐藏主页面
self.root.withdraw()
# 创建功能页面
self.win = tk.Toplevel()
self.win.title('ARP Attack Detection')
self.win.geometry('400x300')
# 创建按钮
self.start_btn = tk.Button(self.win, text='Start Detection', command=self.start_detection)
self.start_btn.pack(pady=10)
self.stop_btn = tk.Button(self.win, text='Stop Detection', command=self.stop_detection)
self.stop_btn.pack(pady=10)
self.scan_btn = tk.Button(self.win, text='Scan LAN Hosts', command=self.scan_hosts)
self.scan_btn.pack(pady=10)
# 创建文本框
self.text = tk.Text(self.win)
self.text.pack(fill=tk.BOTH, expand=True)
self.text.config(state=tk.DISABLED)
# 开始攻击检测
def start_detection(self):
# TODO: 实现开始攻击检测的功能
pass
# 停止攻击检测
def stop_detection(self):
# TODO: 实现停止攻击检测的功能
pass
# 扫描局域网主机
def scan_hosts(self):
# TODO: 实现扫描局域网主机的功能
pass
# 显示文本
def show_text(self, text):
self.text.config(state=tk.NORMAL)
self.text.insert(tk.END, text + '\n')
self.text.config(state=tk.DISABLED)
4. 开始攻击检测
import threading
class App:
def __init__(self):
# ...
self.running = False
# 开始攻击检测
def start_detection(self):
if self.running:
return
self.running = True
# 开启新线程进行攻击检测
self.thread = threading.Thread(target=self.detect_attacks)
self.thread.start()
# 停止攻击检测
def stop_detection(self):
self.running = False
# 检测ARP攻击
def detect_attacks(self):
while self.running:
# 捕获ARP包
pkt = sniff(filter='arp', count=1, timeout=1)
if pkt:
# 分析ARP包
if analyze_arp(pkt[0]):
self.show_text('[!] Possible ARP attack detected!')
5. 扫描局域网主机
import socket
class App:
def __init__(self):
# ...
self.hosts = []
# 扫描局域网主机
def scan_hosts(self):
self.hosts = []
# 获取本机IP地址
ip = socket.gethostbyname(socket.gethostname())
# 发送ARP请求报文扫描局域网主机
ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip+'/24'), timeout=2, verbose=False)
for s, r in ans:
self.hosts.append((r[ARP].psrc, r[ARP].hwsrc))
self.show_text('Host found: IP=%s, MAC=%s' % (r[ARP].psrc, r[ARP].hwsrc))
6. 完整代码
from scapy.all import *
import json
import socket
import threading
import tkinter as tk
# 捕获ARP包并分析
def analyze_arp(pkt):
if ARP in pkt:
arp = pkt[ARP]
# 判断是否为请求报文
if arp.op == 1:
if arp.psrc == arp.pdst:
# 同一IP地址对应不同的MAC地址
if arp.hwsrc != get_mac(arp.psrc):
print('[!] Possible ARP attack detected! Same IP address with different MAC address.')
return True
else:
# 不同IP地址对应同一个MAC地址
if arp.hwsrc == get_mac(arp.psrc):
print('[!] Possible ARP attack detected! Different IP address with same MAC address.')
return True
# 判断是否为应答报文
elif arp.op == 2:
# 同一IP地址对应不同的MAC地址
if arp.hwsrc != get_mac(arp.psrc):
print('[!] Possible ARP attack detected! Same IP address with different MAC address.')
return True
return False
# 获取指定IP地址的MAC地址
def get_mac(ip):
ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip), timeout=2, verbose=False)
for s, r in ans:
return r[ARP].hwsrc
return None
# 注册新用户
def register():
username = input('Please enter your username: ')
password = input('Please enter your password: ')
with open('users.json', 'r') as f:
users = json.load(f)
if username in users:
print('[!] This username has already been registered.')
return
users[username] = password
with open('users.json', 'w') as f:
json.dump(users, f)
print('[+] Registration successful.')
# 用户登录
def login():
username = input('Please enter your username: ')
password = input('Please enter your password: ')
with open('users.json', 'r') as f:
users = json.load(f)
if username not in users:
print('[!] User not found.')
return False
if users[username] != password:
print('[!] Incorrect password.')
return False
print('[+] Login successful.')
return True
class App:
def __init__(self):
self.root = tk.Tk()
self.root.withdraw()
self.win = tk.Toplevel()
self.win.title('ARP Attack Detection')
self.win.geometry('400x300')
self.start_btn = tk.Button(self.win, text='Start Detection', command=self.start_detection)
self.start_btn.pack(pady=10)
self.stop_btn = tk.Button(self.win, text='Stop Detection', command=self.stop_detection)
self.stop_btn.pack(pady=10)
self.scan_btn = tk.Button(self.win, text='Scan LAN Hosts', command=self.scan_hosts)
self.scan_btn.pack(pady=10)
self.text = tk.Text(self.win)
self.text.pack(fill=tk.BOTH, expand=True)
self.text.config(state=tk.DISABLED)
self.running = False
self.hosts = []
# 开始攻击检测
def start_detection(self):
if self.running:
return
self.running = True
self.thread = threading.Thread(target=self.detect_attacks)
self.thread.start()
# 停止攻击检测
def stop_detection(self):
self.running = False
# 检测ARP攻击
def detect_attacks(self):
while self.running:
pkt = sniff(filter='arp', count=1, timeout=1)
if pkt:
if analyze_arp(pkt[0]):
self.show_text('[!] Possible ARP attack detected!')
# 扫描局域网主机
def scan_hosts(self):
self.hosts = []
ip = socket.gethostbyname(socket.gethostname())
ans, unans = srp(Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=ip+'/24'), timeout=2, verbose=False)
for s, r in ans:
self.hosts.append((r[ARP].psrc, r[ARP].hwsrc))
self.show_text('Host found: IP=%s, MAC=%s' % (r[ARP].psrc, r[ARP].hwsrc))
# 显示文本
def show_text(self, text):
self.text.config(state=tk.NORMAL)
self.text.insert(tk.END, text + '\n')
self.text.config(state=tk.DISABLED)
if __name__ == '__main__':
# 检查用户是否已注册
try:
with open('users.json', 'r') as f:
json.load(f)
except FileNotFoundError:
with open('users.json', 'w') as f:
json.dump({}, f)
if not login():
register()
# 运行应用程序
app = App()
app.root.mainloop()
总结
本文介绍了如何使用Python开发一个基于Linux的ARP攻击检测软件,并提供了代码实现。该软件能够实时监控网络流量,分析ARP包,识别可能的ARP攻击行为,并提供用户界面方便用户操作。
注意: 该代码仅供参考,需要根据实际情况进行修改和完善。
原文地址: https://www.cveoy.top/t/topic/jpkZ 著作权归作者所有。请勿转载和采集!