我正在尝试为Diameter消息执行scapy / python嗅探器并解析Diameter部分以从Raw.load获取AVP。 一些失败后,我回到基本的python / scapy脚本,如下所示: 来自scapy.all import *
def pkt_diam(pkt):
raw = pkt.getlayer(Raw).load
print raw
# pkt.show()
sniff(iface="eth0", filter="port 3868", store=0, prn=pkt_diam)
通过打印raw.load,我收到了一些AVP,但非常难以理解。如果我使用 pkt.show() 我收到整个数据包,以太网,IP,TCP和原始部分,但Raw.load几乎无法使用。
###[ Raw ]###
load = '\x01\x00\x00\xec@\x00\x01/\x01\x00\x00\x00\x07K\x12\xca\x07K\x12\xca\x00\x00\x01\x07@\x00\x00 00000001;000001;61de2650\x00\x00\x01\x04@\x00\x00 \x00\x00\x01\n@\x00\x00\x0c\x00\x00(\xaf\x00\x00\x01\x02@\x00\x00\x0c\x01\x00\x00\x00\x00\x00\x01\x15@\x00\x00\x0c\x00\x00\x00\x01\x00\x00\x01\x08@\x00\x00\x1dtest.a-server.org\x00\x00\x00\x00\x00\x01(@\x00\x00\x14a-server.org\x00\x00\x01)@\x00\x00 \x00\x00\x01\n@\x00\x00\x0c\x00\x00(\xaf\x00\x00\x01*@\x00\x00\x0c\x00\x00\x13\x89\x00\x00\x02t\x80\x00\x008\x00\x00(\xaf\x00\x00\x01\n@\x00\x00\x0c\x00\x00(\xaf\x00\x00\x02u\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x01\x00\x00\x02v\x80\x00\x00\x10\x00\x00(\xaf\x00\x00\x00\x05'
我需要一些帮助来解析和解码Diameter Raw.load消息。 Thx提前
答案 0 :(得分:0)
最好的方法是define the Diameter header yourself,按照我刚给你的链接,这是Scapy主要文档的一部分,详细介绍了如何构建自己的协议的分步指南type(header)。
一旦正确定义了Diameter()标头,解剖Diameter数据包将变得轻而易举。
wikipedia page on the Diameter protocol似乎是关于Diameter数据包标头的非常好的参考。
答案 1 :(得分:0)
作为当前Scapy pull请求https://bitbucket.org/secdev/scapy/pull-requests/的一部分,数字#109提供对Diameter层的支持(解析和生成)。
下载最新的Scapy源文件和diameter.py文件,该文件应放在“贡献”目录中(此文件不能与当前的2.3.1 Scapy版本完全兼容)
答案 2 :(得分:0)
scapy非常有用。
from scapy.all import *
packets = rdpcap('/path/to/rx.pcap')
def generatePacket():
'''
Generate a packet.
'''
IP()/TCP()/DiamG()
def dissectPacket():
'''
dissect a packet.
'''
packet[0][DiamG]
上面显示了这个想法。您可以使用print(repr(packet[0][DiamG]))
查看结果。当然,为了检查数据包是否为Diameter数据包,您可能首先需要像这样检查:
x = packet[0]
while x.payload:
x = x.payload
if x.name == 'Diameter' # it has diameter message.
# dissect it like above.
以及如何集成和发送Diameter数据包,可以检查: building diameter message