我试图分析包含使用tcpdump的捕获的数据包文件。 我首先要对数据包分类为使用5元组流。 然后,我需要得到每个流的每个数据包的大小和到达时间间隔。 我试着会话列表中Wireshark的,但它仅给出了在流动不是在流的每个数据包的信息包的数量。 对于任何一个代码(C ++或shell脚本),可以做的工作有何建议? 谢谢
Answer 1:
走了,
如果你还没有听说过Scapy的的但我beleive你正在尝试做的将是一个近乎完美的结合。 例如,我写了这个小片段来解析PCAP场,给我像你说的是使用Scapy的东西。
#!/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
Answer 2:
我曾在一个库来分析TCP转储,但它是一个业务,所以我不能只是给你。 如果你没有找到你在找什么,然后我的回答可以帮助您。 甲tcpdump的只是象嵌套网络数据俄罗斯套娃 ,其中PCAP层通过加入tcpdump的。
如果你只是想在捕捉工作,转储的格式在指定Libpcap的文件格式 。 为了得到你需要使用这个规范来处理转储每个数据包到达的大小和时间。
如果您在分析这些都是为了下面层深究下去
- 链路层
- 网络层
- 传输层
- 应用层
每一层有一个头定义。 所以,你需要找到其协议栈的PCAP数据包含和解析头获取信息。
Answer 3:
什么是5元组的成员? 如果流是TCP或UDP,源和目的IP地址和端口号,加,也许,一个人数超过两个端点将工作之间的时间区分多个流动; 对于SCTP,这将是类似的,但如果一个流是液流,你可能需要更多。
如果5元组在Wireshark的都是“命名字段”的成员,你可以使用tshark的与-T fields
选项,并使用-e
选项来指定哪些字段打印,并与时间戳选择一个字段( frame.time_epoch
会给你的时间作为自UN * X划时代秒和秒的分数),现场适当大小( frame.len
给你的原始数量的链路层数据包的字节PLUS任何元数据如radiotap头802.11无线电信息),以及其他字段,然后tshark的的输出馈送到已经做了你想要做的处理的脚本或程序。 这让tshark的执行协议层的处理,让你的程序只需要处理结果数据。