以下代码实现了一个简单的网络扫描工具,可以获取网络中活动主机的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网络扫描与攻击检测的原理,并鼓励您尝试编写自己的网络安全工具。

Python网络扫描与攻击检测:解决活动主机信息未保存问题

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

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