Python 中的数据包嗅探(Windows)

Posted

技术标签:

【中文标题】Python 中的数据包嗅探(Windows)【英文标题】:Packet sniffing in Python (Windows) 【发布时间】:2010-10-02 12:34:07 【问题描述】:

使用 Python 嗅探网络数据包的最佳方法是什么?

我从几个地方听说最好的模块是一个名为 Scapy 的模块,不幸的是,它使 python.exe 在我的系统上崩溃。我认为这只是我如何安装它的问题,除了许多其他人告诉我它在 Windows 上运行得不是特别好。 (如果有人感兴趣,我正在运行 Windows Vista,这可能会影响事情)。

有人知道更好的解决方案吗?

更新:

在阅读了告诉我安装 PyPcap 的答案后,我搞砸了一点,发现我尝试使用的 Scapy 也告诉我安装 PyPcap,除了它是一个修改版本供它使用.显然,正是这个修改后的 PyPcap 导致了问题,因为答案中的示例也导致了挂起。

我安装了 PyPcap 的原始版本(来自 Google 的网站),并且 Scapy 开始正常工作(我没有尝试很多东西,但至少在我开始嗅探时它没有崩溃)。我向 Scapy 开发人员发送了一张新的缺陷票:http://trac.secdev.org/scapy/ticket/166,希望他们能用它做点什么。

不管怎样,我只是想让你们知道。

【问题讨论】:

FTR 这是一篇非常过时的帖子。 Scapy 不再需要这些过时的库了,看看scapy.readthedocs.io 【参考方案1】:

艰难的路

您可以使用原始套接字嗅探所有 IP 数据包。 原始套接字是以二进制形式发送和接收数据的套接字。 python 中的二进制表示在一个字符串中,看起来像这样\x00\xff...每个\x.. 都是一个字节。 读取IP包需要根据IP协议对接收到的包进行二进制解析。

这是 IP 协议格式的图像,每个标头的大小以比特为单位。

本教程可能会帮助您了解理解原始数据包并将其拆分为标头的过程:http://www.binarytides.com/python-packet-sniffer-code-linux/

简单的方法

另一种很容易嗅探 IP 数据包的方法是使用 scapy 模块。

from scapy.all import *
sniff(filter="ip", prn=lambda x:x.sprintf("IP:%IP.src% -> %IP.dst%\n"))

此代码将为您打印每个 IP 数据包的源 IP 和目标 IP。 您可以通过阅读此处的文档来使用 scapy 做更多事情:http://www.secdev.org/projects/scapy/doc/usage.html

这取决于您要实现的目标,但如果您需要构建一个项目,其功能是嗅探 IP 数据包,那么我建议使用 scapy 以获得更稳定的脚本。

【讨论】:

你缺少括号sniff(filter="ip", prn=lambda x:x.sprintf("IP:%IP.src% -> %IP.dst%\n"))【参考方案2】:

使用pypcap:

import dpkt, pcap
pc = pcap.pcap()     # construct pcap object
pc.setfilter('icmp') # filter out unwanted packets
for timestamp, packet in pc:
    print dpkt.ethernet.Ethernet(packet)

输出样本:

Ethernet(src='\x00\x03G\xb2M\xe4', dst='\x00\x03G\x06h\x18', data=IP(src='\n\x00\x01\x1c',
dst='\n\x00\x01\x10', sum=39799, len=60, p=1, ttl=128, id=35102, data=ICMP(sum=24667,
type=8, data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))

Ethernet(src='\x00\x03G\x06h\x18', dst='\x00\x03G\xb2M\xe4', data=IP(src='\n\x00\x01\x10',
dst='\n\x00\x01\x1c', sum=43697, len=60, p=1, ttl=255, id=64227, data=ICMP(sum=26715,
data=Echo(id=512, seq=60160, data='abcdefghijklmnopqrstuvwabcdefghi'))))

【讨论】:

确实是最方便的工具 不过自 2008 年以来就没有正式更新过。诸如 Scapy 之类的替代品可能是最新的..【参考方案3】:

使用python-libpcap。

import pcap

p = pcap.pcapObject()
dev = pcap.lookupdev()
p.open_live(dev, 1600, 0, 100)
#p.setnonblock(1)
try:
    for pktlen, data, timestamp in p:
        print "[%s] Got data: %s" % (time.strftime('%H:%M', 
                                                   time.localtime(timestamp)),
                                     data)
except KeyboardInterrupt:
    print '%s' % sys.exc_type
    print 'shutting down'
    print ('%d packets received, %d packets dropped'
           ' %d packets dropped by interface') % p.stats()

【讨论】:

【参考方案4】:

您可以使用原始套接字,以及您的接口 IP 地址(在管理员模式下),

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)
s.bind(("YOUR_INTERFACE_IP",0))
s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
while True:
   data = s.recvfrom(10000)
   print data

【讨论】:

【参考方案5】:

如果scapy,请尝试以下方法。 (适用于 Windows 10)

# -*- coding: utf-8 -*-

# pip install scapy

"""
['name': 'Intel(R) 82574L Gigabit Network Connection',
  'win_index': '4',
  'description': 'Ethernet0',
  'guid': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
  'mac': '00:0C:29:5C:EE:6D',
  'netid': 'Ethernet0']
"""

from pprint import pprint
from scapy.arch.windows import get_windows_if_list
from scapy.all import *


# disable verbose mode
conf.verb = 0


def parse_packet(packet):
    """sniff callback function.
    """
    if packet and packet.haslayer('UDP'):
        udp = packet.getlayer('UDP')
        udp.show()


def udp_sniffer():
    """start a sniffer.
    """
    interfaces = get_windows_if_list()
    pprint(interfaces)

    print('\n[*] start udp sniffer')
    sniff(
        filter="udp port 53",
        iface=r'Intel(R) 82574L Gigabit Network Connection', prn=parse_packet
    )


if __name__ == '__main__':
    udp_sniffer()

【讨论】:

【参考方案6】:

另一个选项是pypcap。

要解析结果,Construct 非常灵巧。

【讨论】:

构造死了吗?一年多以来似乎没有任何新版本... 虽然 Construct 主页提到了 ethereal,但所有教程都是关于使用 Construct 构建解析器,而不是使用它来解析网络数据包。

以上是关于Python 中的数据包嗅探(Windows)的主要内容,如果未能解决你的问题,请参考以下文章

Scapy 数据包嗅探器触发对每个嗅探数据包的操作

python 进行抓包嗅探

致命异常:主要用于数据包嗅探应用程序

基于Libpcap实现一个网络数据包嗅探器

安全牛学习笔记抓包嗅探

《Python黑帽子:黑客与渗透测试编程之道》读书笔记:原始套接字和流量嗅探