Python网络扫描与攻击检测:解决活动主机信息未保存问题
以下代码实现了一个简单的网络扫描工具,可以获取网络中活动主机的IP地址和MAC地址,并检测常见的网络攻击,例如ICMP洪泛攻击、TCP攻击和ARP欺骗攻击。
import socket
import struct
import fcntl
import time
ETH_P_ALL = 3
# 扫描网络并获取活动主机信息
def scan_network(ifname):
active_hosts = {}
for i in range(1, 255):
dst_ip = '192.168.197.' + str(i)
send_arp_request(ifname, '192.168.197.1', get_mac_address(ifname), dst_ip)
time.sleep(0.1)
response = send_arp_reply(ifname, dst_ip, get_mac_address(ifname), '192.168.197.1', get_mac_address(ifname))
if response is not None:
active_hosts[response['src_ip']] = response['src_mac']
return active_hosts
# 保存记录到本地文件
def save_records():
active_hosts = scan_network(ifname)
with open('records.txt', 'w') as f:
f.write('活动主机IP地址\t\tMAC地址\n')
for ip, mac in active_hosts.items():
f.write(ip + '\t' + mac + '\n')
f.write('\n攻击源IP地址\t\tMAC地址\n')
for ip, mac in attack_source_dict.items():
f.write(ip + '\t' + mac + '\n')
f.write('\nICMP Flood攻击:' + detect_icmp_flood() + '\n')
f.write('TCP攻击:' + detect_tcp_attack() + '\n')
f.write('ARP欺骗攻击:' + detect_arp_spoofing() + '\n')
f.write('')
def get_mac_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', bytes(ifname[:15], 'utf-8')))
return ':'.join(['%02x' % b for b in info[18:24]])
# 发送ARP请求
def send_arp_request(ifname, src_ip, src_mac, dst_ip):
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind((ifname, ETH_P_ALL))
dst_mac = 'ff:ff:ff:ff:ff:ff' # 广播地址
arp_packet = struct.pack('!6s6s2s2s1s1s2s6s4s6s4s', bytes(dst_mac.replace(':', ''), 'utf-8'), bytes(src_mac.replace(':', ''), 'utf-8'), bytes.fromhex('08 06'), bytes.fromhex('00 01'), bytes.fromhex('08'), bytes.fromhex('00'), bytes.fromhex('06 04'), bytes.fromhex('00 01'), socket.inet_aton(src_ip), bytes.fromhex('00 00 00 00 00 00'), socket.inet_aton(dst_ip))
s.send(arp_packet)
# 发送ARP回复
def send_arp_reply(ifname, src_ip, src_mac, dst_ip, dst_mac):
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(ETH_P_ALL))
s.bind((ifname, ETH_P_ALL))
arp_packet = struct.pack('!6s6s2s2s1s1s2s6s4s6s4s', bytes(dst_mac.replace(':', ''), 'utf-8'), bytes(src_mac.replace(':', ''), 'utf-8'), bytes.fromhex('08 06'), bytes.fromhex('00 02'), bytes.fromhex('08'), bytes.fromhex('00'), bytes.fromhex('06 04'), bytes.fromhex('00 01'), socket.inet_aton(src_ip), bytes.fromhex('00 00 00 00 00 00'), socket.inet_aton(dst_ip))
s.send(arp_packet)
return None # TODO: 实现接收ARP回复
# 检测ICMP洪泛攻击
def detect_icmp_flood():
# TODO: 实现检测ICMP洪泛攻击
return '未实现'
# 检测TCP攻击
def detect_tcp_attack():
# TODO: 实现检测TCP攻击
return '未实现'
# 检测ARP欺骗攻击
def detect_arp_spoofing():
# TODO: 实现检测ARP欺骗攻击
return '未实现'
# 主程序
if __name__ == '__main__':
ifname = 'eth0'
save_records() # 添加此行代码
问题分析:
代码中 save_records() 函数定义了保存记录到文件的逻辑,但是它并没有在主程序中被调用,因此活动主机的信息无法保存到文件中。
解决方案:
在主程序中添加 save_records() 函数的调用语句,例如:
if __name__ == '__main__':
ifname = 'eth0'
save_records() # 添加此行代码
注意:
- 以上代码示例仅供参考,实际应用中还需要根据具体需求进行修改和完善。
- 该代码仅用于学习和研究目的,请勿用于任何非法活动。
下一步:
- 完成
send_arp_reply()函数的实现,使其能够接收并解析ARP回复,以获取活动主机的MAC地址信息。 - 实现
detect_icmp_flood()、detect_tcp_attack()和detect_arp_spoofing()函数,以检测相应的网络攻击。 - 在
save_records()函数中增加对攻击信息的记录,以记录检测到的攻击类型和攻击源IP地址和MAC地址。 - 可以考虑使用图形界面或命令行界面来提升用户体验。
- 进一步完善代码功能,例如添加端口扫描功能、支持自定义扫描范围、增加日志记录等。
希望本篇文章能够帮助您更好地理解Python网络扫描与攻击检测的原理,并鼓励您尝试编写自己的网络安全工具。
原文地址: https://www.cveoy.top/t/topic/jm87 著作权归作者所有。请勿转载和采集!