通过代码分析pcap文件

4

我正在尝试分析使用tcpdump捕获的数据包文件。首先,我想使用5元组将数据包分类为流。然后,我需要获取每个流中每个数据包的大小和到达时间间隔。我尝试过Wireshark中的“Conversation list”,但它只提供流中数据包的数量,而不是有关流中每个数据包的信息。你有关于任何能够完成此任务的代码建议(C++或Shell脚本)吗? 谢谢


你可能会对 Bro 强大的网络脚本语言感兴趣。它是网络分析领域的 "Python/Ruby"。具体来说,你可以编写一个脚本将 new_packet 事件 钩子到以获取你提到的数字。 - mavam
3个回答

4

UmNyobe,

如果你还没有听说过Scapy,我相信它非常适合你想做的事情。例如,我使用Scapy编写了这个小片段来解析pcap字段,并给出了类似于你所讨论的内容。

#!/usr/bin/python -tt

from scapy import *
import sys
from datetime import datetime

'''Parse PCAP files into easy to read NETFLOW like output\n
   Usage:\n
   python cap2netflow.py <[ pcap filename or -l ]>\n
   -l is live capture switch\n
   ICMP packets print as source ip, type --> dest ip, code'''


def parse_netflow(pkt):  
    # grabs 'netflow-esqe' fields from packets in a PCAP file
    try:
        type = pkt.getlayer(IP).proto
    except:
        pass

    snifftime = datetime.fromtimestamp(pkt.time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[1]

    if type == 6:
        type = 'TCP'
    if type == 17:
        type = 'UDP'
    if type == 1:
        type = 'ICMP'

    if type == 'TCP' or type == 'UDP':
        print( ' '.join([snifftime, type.rjust(4, ' '), str(pkt.getlayer(IP).src).rjust(15, ' ') , str(pkt.getlayer(type).sport).rjust(5, ' ') , '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' ') , str(pkt.getlayer(type).dport).rjust(5, ' ')]))

    elif type == 'ICMP':
        print(' '.join([snifftime, 'ICMP'.rjust(4, ' '),  str(pkt.getlayer(IP).src).rjust(15, ' ') , ('t: '+ str(pkt.getlayer(ICMP).type)).rjust(5, ' '), '-->' , str(pkt.getlayer(IP).dst).rjust(15, ' '), ('c: ' + str(pkt.getlayer(ICMP).code)).rjust(5, ' ')]))

    else:
        pass
if '-l' in sys.argv:
    sniff(prn=parse_netflow)
else:
    pkts = rdpcap(sys.argv[1])
    print(' '.join(['Date: ',datetime.fromtimestamp(pkts[0].time).strftime('%Y-%m-%d %H:%M:%S').split(' ')[0]]))
    for pkt in pkts:
        parse_netflow(pkt)

安装Python和Scapy,然后使用以下内容开始。如果需要帮助理解,请告诉我,如果您了解C ++,那么这将很容易理解。

在此处获取Scapy

http://www.secdev.org/projects/scapy/

这个页面有很多链接指向有用的教程,记住Scapy可以做更多的事情,但要着重关注讲解pcap解析的部分。
希望这能帮到你!
dc

2

我曾经为一个企业开发了一个分析tcp dump的库,但是我不能直接给你。如果你没有找到你要的东西,我的回答可能会有所帮助。Tcpdump只是像玛特里奥什卡娃娃一样的嵌套网络数据,其中pcap层是由tcpdump添加的。

如果你只想处理捕获的数据,那么转储文件的格式在Libpcap文件格式中有详细说明。要获取每个数据包的大小和到达时间,需要使用此规范处理转储文件。

如果你需要更深入地分析,以下是按顺序排列的各个层:

  1. 链路层
  2. 互联网层
  3. 传输层
  4. 应用层

每个层都有一个头部定义。因此,你需要找出你的pcap数据包含哪个协议栈,并解析头部以获取信息。


1
使用该规范处理转储的最简单方法是使用libpcap读取它 - 使用pcap_open_offline()打开它。自己编写处理代码在大多数情况下都是浪费时间;使用libpcap还意味着,可以使用更新版本的libpcap读取许多pcap-ng文件。 - user862787

0

5元组的成员是什么?如果流是TCP或UDP,则源和目标IP地址和端口号,加上可能用于区分两个端点之间多个流的数字将起作用;对于SCTP,它类似,尽管如果流是流,则可能需要更多。

如果5元组的成员都是Wireshark中的“命名字段”,则可以使用带有-T fields选项的TShark,并使用-e选项指定要打印的字段,并选择具有时间戳的字段(frame.time_epoch会给您时间,以秒和自UNIX时代以来的小数表示),适当大小的字段(frame.len为您提供链路层数据包中的原始字节数PLUS任何元数据,例如802.11无线电信息的radiotap头),以及其他字段,然后将TShark的输出馈送到执行所需处理的脚本或程序。这使得TShark可以处理协议层,因此您的程序只需要处理生成的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接