基于Linux的ARP攻击检测软件功能实现

本文将介绍如何使用Python开发一个基于Linux的ARP攻击检测软件,该软件能够实时监控网络流量,分析ARP包,识别可能的ARP攻击行为,并提供用户界面方便用户操作。

功能需求

该软件需要实现以下功能:

  1. 数据包捕获和过滤: 捕获网络数据包,并过滤出ARP包,其他数据包丢弃。
  2. ARP包分析: 分析ARP包,区分正常主机和疑似异常主机,将疑似异常主机的IP地址和MAC地址标记为红色。
  3. 用户登录和注册: 提供用户登录和注册功能,保存用户信息并进行身份验证。
  4. 攻击检测功能: 提供“开始攻击检测”、“停止攻击检测”和“扫描局域网主机”三个按钮,实现以下功能:
    • 开始攻击检测: 实时分析ARP包,并输出疑似ARP攻击的信息,包括源IP地址和源MAC地址信息,并保存到文件中。
    • 停止攻击检测: 停止ARP包分析和信息输出。
    • 扫描局域网主机: 扫描局域网内所有活动主机,并将主机IP地址和MAC地址输出到界面上,并保存到文件中。
  5. 日志记录: 记录所有检测到的信息,包括正常主机、疑似异常主机、攻击检测结果等,并保存到日志文件中。

实现思路

该软件的实现可以分为以下几个部分:

  1. 数据包捕获和过滤: 使用Python的scapy库捕获网络数据包,并根据过滤规则筛选出ARP包。
  2. ARP包分析: 定义规则分析ARP包,例如:
    • 检测应答报文时判断是否出现同一IP地址对应不同的MAC地址;是则可能遭受ARP攻击
    • 检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址;是则可能遭受ARP攻击
    • 检测ARP请求或响应包,检测是否存在同一IP或者是同一MAC地址发出大量数据包,是则可能遭受ARP攻击,不是则未遭受ARP攻击
    • 满足两种规则或以上的就输出遭受ARP攻击,不满足则输出未遭受ARP攻击
  3. 用户登录和注册: 使用Python的json库保存用户信息,并实现用户登录和注册功能。
  4. GUI界面: 使用Python的tkinter库设计GUI界面,包含按钮和文本框,方便用户进行操作。
  5. 日志记录: 使用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攻击行为,并提供用户界面方便用户操作。

注意: 该代码仅供参考,需要根据实际情况进行修改和完善。

基于Linux的ARP攻击检测软件功能实现

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

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