首页 > 编程知识 正文

Python网络嗅探器简介及实现

时间:2023-11-19 21:56:24 阅读:288358 作者:OOFN

本文将会介绍如何使用Python实现一个基础的网络嗅探器。网络嗅探器可以帮助我们捕获网络数据包,分析数据包中的协议、数据等信息,对于网络安全与网络分析都有很大的帮助。

一、安装必要的模块

在Python中实现网络嗅探器需要使用到Scapy模块,因此我们需要先安装Scapy模块。

pip install scapy

安装完成后,我们就可以在Python中导入Scapy模块,并使用其中提供的相关功能。

二、捕获和分析数据包

当想要对网络数据包进行嗅探时,需要首先通过Scapy模块创建一个嗅探器。下面的代码演示了如何使用Scapy模块创建一个简单的嗅探器:

from scapy.all import *

def packet_callback(packet):
    print(packet.show())

sniff(prn=packet_callback)

在上面的代码中,我们使用了Scapy中的sniff()函数创建了一个嗅探器。该嗅探器可以监听网络中传输的每个数据包,并将其作为参数传递给packet_callback()函数。函数内使用packet.show()方法打印出当前捕获的数据包的详细信息。

当运行上面的代码后,我们将会看到类似如下格式的数据包详细信息:

###[ Ethernet ]###
  dst= 88:e9:fe:51:e4:8e
  src= 18:03:73:0d:01:03
  type= IPv4
###[ IP ]###
     version= 4
     ihl= 5
     tos= 0x0
     len= 328
     id= 28959
     flags= DF
     frag= 0
     ttl= 128
     proto= tcp
     chksum= 0xac16
     src= 192.168.1.101
     dst= 192.168.1.1
     options= []
###[ TCP ]###
        sport= 45810
        dport= http
        seq= 2535467182
        ack= 947184360
        dataofs= 5
        reserved= 0
        flags= A
        window= 926
        chksum= 0x6799
        urgptr= 0
        options= [('NOP', None), ('NOP', None), ('Timestamp', (44950773, 400814063))]
###[ Raw ]###
           load= 'nn301 Moved Permanentlynn

Moved Permanently

n

The document has moved

我们可以看到该数据包的二进制格式,可以根据需要来解析其中的各个字段。

三、过滤数据包

在实际应用中,我们并不能对所有的数据包进行捕获和分析,因为有一些数据包可能是无用的或者危险的。因此,Scapy提供了过滤机制,使我们可以过滤掉不需要的数据包。

过滤数据包可以使用Scapy提供的filter参数,可以使用BPF(Filter)语法进行更精细的过滤。下面的例子演示了如何只捕获目标IP地址为192.168.1.1的数据包:

sniff(filter="ip host 192.168.1.1", prn=packet_callback)

四、使用嗅探器进行攻击检测

通过嗅探和监控网络数据包,我们可以检测到一些网络攻击,比如说ARP欺骗、恶意代码攻击等。

下面的示例代码使用Scapy模块实现了一个简单的ARP欺骗检测,它会通过不断地嗅探网络中的ARP数据包,如果发现有两个不同的主机MAC地址对应了同一个IP地址,则可能存在ARP欺骗攻击。

import time
from scapy.all import *

def get_mac(ip):
    ans, _ = arping(ip)
    for pkt in ans:
        return pkt[1].src

def arp_display(pkt):
    if pkt.haslayer(ARP):
        if pkt[ARP].op == 1:  # ARP request
            cur_mac = pkt[ARP].hwsrc
            cur_ip = pkt[ARP].psrc
            prev_mac = cache.get(cur_ip)

            if prev_mac and prev_mac != cur_mac:
                print("[!] Detected ARP spoofing attack from " + cur_mac + " to " + cur_ip)

            cache[cur_ip] = cur_mac

cache = {}
sniff(prn=arp_display, filter="arp", store=0)

在上面的代码中,我们使用了Scapy模块提供的情况下包含IP的ARP请求。如果我们发现一个新的主机响应ARP请求,并且其MAC地址与之前已知的MAC地址不同,那么可能存在ARP欺骗攻击。

五、使用嗅探器进行流量分析

通过对网络数据包进行嗅探和分析,我们可以了解到网络上每个主机的使用情况,比如说哪个主机最忙、哪些程序正在运行等等。

下面的示例代码演示了如何通过嗅探和分析TCP数据包,得到某个主机连接外部服务的情况,以及连接的次数和时间详情。

from datetime import datetime
from scapy.all import *

def get_dst_from_packet(packet):
    return packet.getlayer(IP).dst

def get_size_from_packet(packet):
    return packet.getlayer(IP).len - 20 - get_packet_hlen(packet)

def get_packet_hlen(packet):
    return packet.getlayer(IP).ihl * 4 + packet.getlayer(TCP).dataofs * 4

def packet_callback(packet):
    if packet.haslayer(TCP) and packet.getlayer(TCP).flags & 2:
        cur_time = datetime.now()
        size = get_size_from_packet(packet)
        dst = get_dst_from_packet(packet)
        if dst not in connections:
            connections[dst] = [(cur_time, size)]
        else:
            connections[dst].append((cur_time, size))

connections = {}
sniff(prn=packet_callback)
for dst, details in connections.items():
    total_size = sum([size for _, size in details])
    total_time = (details[-1][0] - details[0][0]).seconds
    print(f"Destination: {dst} - Packets: {len(details)} - Bytes: {total_size} - Total time: {total_time}s")

以上的代码演示了如何使用python实现一个TCP数据流量分析器。当我们执行上面的代码后,将会看到每个连接目标的IP地址、连接次数、连接总字节数以及连接总时间等相关信息。通过这些数据,我们可以了解到哪些主机最常访问外部服务,以及他们每次连接都使用了多少传输带宽等信息。

小结

本文向大家提供了一些网络嗅探器的实现思路和核心代码。通过这些代码,我们可以更好的去理解网络嗅探器的实现原理,从而对网络安全和网络调试都有一定的帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。