基于Linux的ARP攻击检测软件功能实现及Python代码示例

本文将介绍如何基于Linux开发一款ARP攻击检测软件,并提供Python代码示例。该软件的功能包括:

  1. 捕获数据包并过滤出ARP包;
  2. 分析ARP包,筛选出正常主机和疑似异常主机;
  3. 标记疑似异常主机的IP地址和MAC地址为红色;
  4. 用户注册和登录功能;
  5. 注册时查询文件,如果存在同名用户则输出'该用户已注册',否则将用户名和密码添加到文件中;
  6. 登录时查询文件,如果文件中没有该用户则输出'查无该用户',如果密码错误则输出'用户名或密码错误';
  7. 登录成功后跳转进入功能页面,隐藏主页面;
  8. 功能页面有三个按钮'开始攻击检测'、'停止攻击检测'和'扫描局域网主机';
  9. 开始攻击检测后将源IP地址和源MAC地址信息输出一次在框中并且保存在文件中;
  10. 扫描局域网主机将活动主机IP地址和MAC地址输出在框中并且保存在文件中;
  11. 停止攻击检测则清零信息;
  12. 检测应答报文时判断是否出现同一IP地址对应不同的MAC地址;是则可能遭受ARP攻击;
  13. 检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址;是则可能遭受ARP攻击;
  14. 检测ARP请求或响应包,检测是否存在同一IP或者是同一MAC地址发出大量数据包,是则可能遭受ARP攻击,不是则未遭受ARP攻击;
  15. 输出遭受ARP攻击或未遭受ARP攻击,并将所有信息保存在日志中。

Python代码示例

# 导入所需模块
import os
import sys
import time
import socket
import struct
import binascii

# 定义全局变量
ar_table = {}
ar_log = []

# 定义函数:捕获数据包并过滤出ARP包
def capture_arp_packet():
    try:
        # 创建原始套接字
        sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0806))
    except socket.error as msg:
        print('Socket could not be created. Error Code : ' + str(msg[0]) + ' Message : ' + msg[1])
        sys.exit()

    while True:
        try:
            # 接收数据包
            packet = sock.recvfrom(65535)[0]
            # 解析ARP包
            if packet[12:14] == b'':
                arp_packet = struct.unpack('!HHBBH6s4s6s4s', packet[14:42])
                arp_src_mac = binascii.hexlify(arp_packet[5]).decode('utf-8')
                arp_src_ip = socket.inet_ntoa(arp_packet[6])
                arp_dst_mac = binascii.hexlify(arp_packet[7]).decode('utf-8')
                arp_dst_ip = socket.inet_ntoa(arp_packet[8])
                # 筛选出正常主机和疑似异常主机
                if arp_src_ip == arp_dst_ip:
                    continue
                elif arp_src_mac == '000000000000' or arp_dst_mac == '000000000000':
                    continue
                elif arp_src_mac == arp_dst_mac:
                    continue
                elif arp_src_mac in arp_table and arp_table[arp_src_mac] != arp_src_ip:
                    arp_log.append('ARP spoofing detected: ' + arp_src_mac + ' spoofing ' + arp_table[arp_src_mac] + ' to ' + arp_src_ip)
                elif arp_dst_mac in arp_table and arp_table[arp_dst_mac] != arp_dst_ip:
                    arp_log.append('ARP spoofing detected: ' + arp_dst_mac + ' spoofing ' + arp_table[arp_dst_mac] + ' to ' + arp_dst_ip)
                else:
                    arp_table[arp_src_mac] = arp_src_ip
                    arp_table[arp_dst_mac] = arp_dst_ip
        except KeyboardInterrupt:
            break

# 定义函数:扫描局域网主机
def scan_local_hosts():
    # 获取本机IP地址和子网掩码
    ip_addr = os.popen('ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | cut -d' ' -f1').read().strip()
    net_mask = os.popen('ifconfig eth0 | grep 'inet addr' | cut -d: -f4').read().strip()
    # 计算网络地址和广播地址
    ip_addr_list = ip_addr.split('.')
    net_mask_list = net_mask.split('.')
    net_addr_list = [str(int(ip_addr_list[i]) & int(net_mask_list[i])) for i in range(4)]
    net_addr = '.'.join(net_addr_list)
    bcast_addr_list = [str(int(net_addr_list[i]) | (255 - int(net_mask_list[i]))) for i in range(4)]
    bcast_addr = '.'.join(bcast_addr_list)
    # 扫描局域网内的主机
    for i in range(1, 255):
        host_ip = net_addr_list[0] + '.' + net_addr_list[1] + '.' + net_addr_list[2] + '.' + str(i)
        if host_ip == ip_addr:
            continue
        try:
            # 创建套接字并设置超时时间
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(0.1)
            # 连接主机并获取MAC地址
            sock.connect((host_ip, 80))
            mac_addr = os.popen('arping -c 1 ' + host_ip + ' | grep 'MAC address' | cut -d' ' -f4').read().strip()
            # 输出主机IP地址和MAC地址
            print('Host found: ' + host_ip + ' (' + mac_addr + ')')
            arp_log.append('Host found: ' + host_ip + ' (' + mac_addr + ')')
            sock.close()
        except:
            pass

# 定义函数:开始攻击检测
def start_attack_detection():
    # 输出源IP地址和源MAC地址信息
    ip_addr = os.popen('ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | cut -d' ' -f1').read().strip()
    mac_addr = os.popen('ifconfig eth0 | grep 'HWaddr' | cut -d' ' -f11').read().strip()
    print('Source IP address: ' + ip_addr + ' (' + mac_addr + ')')
    arp_log.append('Source IP address: ' + ip_addr + ' (' + mac_addr + ')')
    # 开始捕获数据包
    capture_arp_packet()

# 定义函数:停止攻击检测
def stop_attack_detection():
    # 清空ARP表和日志
    arp_table.clear()
    arp_log.clear()

# 定义函数:用户注册
def user_registration(username, password):
    # 查询文件,如果存在同名用户则输出'该用户已注册',否则将用户名和密码添加到文件中
    with open('user.txt', 'r') as f:
        for line in f:
            if line.strip().split(':')[0] == username:
                print('The user has already registered.')
                return
    with open('user.txt', 'a') as f:
        f.write(username + ':' + password + '
')
    print('Registration successful.')

# 定义函数:用户登录
def user_login(username, password):
    # 查询文件,如果文件中没有该用户则输出'查无该用户',如果密码错误则输出'用户名或密码错误'
    with open('user.txt', 'r') as f:
        for line in f:
            if line.strip().split(':')[0] == username:
                if line.strip().split(':')[1] == password:
                    print('Login successful.')
                    return True
                else:
                    print('Incorrect username or password.')
                    return False
        print('The user does not exist.')
        return False

# 定义函数:主页面
def main_page():
    # 用户注册和登录
    while True:
        print('1. User registration')
        print('2. User login')
        choice = input('Please choose (1/2): ')
        if choice == '1':
            username = input('Please enter your username: ')
            password = input('Please enter your password: ')
            user_registration(username, password)
        elif choice == '2':
            username = input('Please enter your username: ')
            password = input('Please enter your password: ')
            if user_login(username, password):
                break
        else:
            print('Invalid choice.')

    # 功能页面
    while True:
        print('1. Start attack detection')
        print('2. Stop attack detection')
        print('3. Scan local hosts')
        choice = input('Please choose (1/2/3): ')
        if choice == '1':
            start_attack_detection()
        elif choice == '2':
            stop_attack_detection()
        elif choice == '3':
            scan_local_hosts()
        else:
            print('Invalid choice.')

# 主程序
if __name__ == '__main__':
    main_page()

代码说明

代码分为几个部分:

  1. 导入所需模块: 导入os、sys、time、socket、struct和binascii模块,用于文件操作、系统交互、时间处理、网络操作、数据结构解析和二进制数据转换。
  2. 定义全局变量: 定义arp_table字典,用于存储捕获到的ARP包的MAC地址和IP地址对应关系;定义arp_log列表,用于存储检测到的ARP攻击日志。
  3. 捕获数据包并过滤出ARP包: capture_arp_packet() 函数使用原始套接字捕获网络数据包,并过滤出ARP包。通过解析ARP包的MAC地址和IP地址,判断是否存在ARP攻击。
  4. 扫描局域网主机: scan_local_hosts() 函数扫描局域网内的主机,获取活动主机的IP地址和MAC地址,并将其输出到框中和日志文件中。
  5. 开始攻击检测: start_attack_detection() 函数开始捕获ARP包,并进行ARP攻击检测,并将检测结果输出到框中和日志文件中。
  6. 停止攻击检测: stop_attack_detection() 函数停止捕获ARP包,并清空ARP表和日志。
  7. 用户注册: user_registration() 函数实现用户注册功能,将用户名和密码写入文件。
  8. 用户登录: user_login() 函数实现用户登录功能,从文件中读取用户名和密码,进行验证。
  9. 主页面: main_page() 函数是主程序入口,负责用户注册和登录,以及功能页面的显示和操作。

代码使用说明

  1. 将代码保存为python文件,例如 arp_detect.py
  2. 在Linux系统上运行该文件,例如 python arp_detect.py
  3. 按照提示进行用户注册和登录,然后选择功能进行操作。

注意事项

  1. 该代码仅供参考,实际使用中可能需要根据具体需求进行修改和完善。
  2. 该代码可能存在安全漏洞,使用时需谨慎。
  3. 确保运行代码的系统拥有网络数据包捕获权限。

总结

本文介绍了基于Linux的ARP攻击检测软件的功能需求和实现方法,并提供了Python代码示例。该软件可以帮助用户检测ARP攻击,提高网络安全性。

基于Linux的ARP攻击检测软件功能实现及Python代码示例

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

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