【问题标题】:scapy sniff and decode diameterscapy 嗅探和解码直径
【发布时间】:2018-10-21 13:44:18
【问题描述】:

我正在尝试对 Diameter 消息进行 scapy/python 嗅探器并解析 Diameter 部分以从 Raw.load 获取 AVP。 在一些失败后,我回到基本的 python/scapy 脚本,如下所示: 从 scapy.all 导入 *

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 消息。 提前谢谢

【问题讨论】:

    标签: python decode scapy


    【解决方案1】:

    最好的方法是define the Diameter header yourself,按照我刚刚给你的链接,这是主要 Scapy 文档的部分,详细介绍了如何构建自己的协议类型的分步指南(标题)。

    一旦正确定义了 Diameter() 标头,剖析 Diameter 数据包将变得轻而易举。

    wikipedia page on the Diameter protocol 似乎是关于 Diameter 数据包标头的一个很好的参考。

    【讨论】:

    • 自己定义 Diameter 标头是否足以看到 Diameter 消息?
    • 我已尝试按照您的建议定义 Diameter 标头,但没有成功。我想我做错了,我无法在带有“ls()”的 scapy shell 中看到直径。我应该在这里发布一个新问题还是粘贴我的定义?
    • @user1627588 我认为最好更新您的问题以表明您已尝试自己实现标头。请务必显示定义 Diameter 标头()的 Python 代码。如果你执行 pkt = Ether() / IP() / TCP() / Diameter(),然后执行 pkt.show(),它会显示一个类似于真实 Diameter 数据包的数据包吗?应该只是一个一个地正确定义字段的问题。
    • 再次感谢人。我当然要自己试试。我正在浏览您在第一个答案中发送给我的链接,到目前为止,在我看来,我已经取得了一些进展。如果我有货,我当然会用代码更新我的问题
    【解决方案2】:

    作为当前 Scapy 拉取请求 https://bitbucket.org/secdev/scapy/pull-requests/ 的一部分,编号 #109 提供对 Diameter 层(解析和生成)的支持。

    下载最新的 Scapy 源代码和应该放在 'contribution' 目录中的 diameter.py 文件(该文件不能完全与当前的 2.3.1 Scapy 版本一起使用)

    【讨论】:

    • 看起来很有希望,您能否显示示例输出(您的答案并没有说明您链接的补丁是否会提供比 OP 获得的更具可读性的输出)?
    【解决方案3】:

    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])) 查看结果。当然,为了检查数据包是直径数据包,您可能首先要检查:

    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

    【讨论】:

    • 正确。记得load_contrib(“diameter”)from scapy.contrib.diameter import * 导入直径模块。此外,使用DiamG in x 然后使用x[DiamG] 比使用while 循环更简洁)
    猜你喜欢
    • 2015-04-09
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多