基于Linux的ARP攻击检测软件功能实现及Python代码示例
基于Linux的ARP攻击检测软件功能实现及Python代码示例
本文将介绍如何基于Linux开发一款ARP攻击检测软件,并提供Python代码示例。该软件的功能包括:
- 捕获数据包并过滤出ARP包;
- 分析ARP包,筛选出正常主机和疑似异常主机;
- 标记疑似异常主机的IP地址和MAC地址为红色;
- 用户注册和登录功能;
- 注册时查询文件,如果存在同名用户则输出'该用户已注册',否则将用户名和密码添加到文件中;
- 登录时查询文件,如果文件中没有该用户则输出'查无该用户',如果密码错误则输出'用户名或密码错误';
- 登录成功后跳转进入功能页面,隐藏主页面;
- 功能页面有三个按钮'开始攻击检测'、'停止攻击检测'和'扫描局域网主机';
- 开始攻击检测后将源IP地址和源MAC地址信息输出一次在框中并且保存在文件中;
- 扫描局域网主机将活动主机IP地址和MAC地址输出在框中并且保存在文件中;
- 停止攻击检测则清零信息;
- 检测应答报文时判断是否出现同一IP地址对应不同的MAC地址;是则可能遭受ARP攻击;
- 检测请求报文时,是否合法且是否出现不同IP地址对应同一个MAC地址;是则可能遭受ARP攻击;
- 检测ARP请求或响应包,检测是否存在同一IP或者是同一MAC地址发出大量数据包,是则可能遭受ARP攻击,不是则未遭受ARP攻击;
- 输出遭受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()
代码说明
代码分为几个部分:
- 导入所需模块: 导入os、sys、time、socket、struct和binascii模块,用于文件操作、系统交互、时间处理、网络操作、数据结构解析和二进制数据转换。
- 定义全局变量: 定义arp_table字典,用于存储捕获到的ARP包的MAC地址和IP地址对应关系;定义arp_log列表,用于存储检测到的ARP攻击日志。
- 捕获数据包并过滤出ARP包:
capture_arp_packet()函数使用原始套接字捕获网络数据包,并过滤出ARP包。通过解析ARP包的MAC地址和IP地址,判断是否存在ARP攻击。 - 扫描局域网主机:
scan_local_hosts()函数扫描局域网内的主机,获取活动主机的IP地址和MAC地址,并将其输出到框中和日志文件中。 - 开始攻击检测:
start_attack_detection()函数开始捕获ARP包,并进行ARP攻击检测,并将检测结果输出到框中和日志文件中。 - 停止攻击检测:
stop_attack_detection()函数停止捕获ARP包,并清空ARP表和日志。 - 用户注册:
user_registration()函数实现用户注册功能,将用户名和密码写入文件。 - 用户登录:
user_login()函数实现用户登录功能,从文件中读取用户名和密码,进行验证。 - 主页面:
main_page()函数是主程序入口,负责用户注册和登录,以及功能页面的显示和操作。
代码使用说明
- 将代码保存为python文件,例如
arp_detect.py。 - 在Linux系统上运行该文件,例如
python arp_detect.py。 - 按照提示进行用户注册和登录,然后选择功能进行操作。
注意事项
- 该代码仅供参考,实际使用中可能需要根据具体需求进行修改和完善。
- 该代码可能存在安全漏洞,使用时需谨慎。
- 确保运行代码的系统拥有网络数据包捕获权限。
总结
本文介绍了基于Linux的ARP攻击检测软件的功能需求和实现方法,并提供了Python代码示例。该软件可以帮助用户检测ARP攻击,提高网络安全性。
原文地址: https://www.cveoy.top/t/topic/jplc 著作权归作者所有。请勿转载和采集!