【问题标题】:scapy SMB/CIFS decodingscapy SMB/CIFS 解码
【发布时间】:2014-01-24 09:33:15
【问题描述】:

背景 我正在使用 scapy 编写 Windows 操作系统检测脚本。虽然我可以使用 p0f、nmap 和 SMB 脚本等其他工具,但这部分功能只是整体的一小部分,所以我致力于 scapy 路线。

问题 作为 scapy 的新手,我在找出使用 SMB 解码器的最佳实践时遇到了一些麻烦。到目前为止,我有:

def disp(pkt):
    print(pkt.getlayer(IP).src)
    if pkt.haslayer(Raw):
        print(SMBSession_Setup_AndX_Request(pkt.getlayer(Raw).load).NativeOS)

foo=sniff(prn=disp,filter="port 445",count=10)

如您所见,我只是通过 SMBSession_Setup_AndX_Request() 类填充“原始”层,希望它会使用“原始”有效负载做正确的事情。

这似乎是功能性的,但返回“Windows 4.0”的 NativeOS 属性的“默认”类设置(嗯,它在我的 scapy 的 smb.py 版本上),有时会将我视为堆栈跟踪,取决于Mac是否在网络上,做CIFS。我盲目地假设我可以抓住 NativeOS 并完成它,这肯定是错误的。

问题 如果我的方法完全错误,那么使用 scapy 的 sniff() 方法进行自定义协议解码的正确方法是什么?

非常感谢您的建议,

sc.

【问题讨论】:

    标签: python security scapy smb


    【解决方案1】:

    简短的回答是 Scapy 的 SMB 层实现不“直接”通过 TCP(基本上是 TCP/445)处理 SMB,而只处理基于 TCP 的 NetBios 上的 SMB(基本上是 TCP/139)。

    我认为改变这一点并不难,但您必须为此深入研究layers/smb.py(例如,要决定必须使用哪个SMB* 层,Scapy 使用字段中的值底层的NBTSession 层,它不再存在于 SMB over TCP 中)。

    如果您想在不依赖 SMB 的情况下从 Scapy 识别操作系统,另一个选择是使用 p0f 模块。试试看:

    >>> load_module('p0f')
    >>> sniff(prn=prnp0f, store=False)
    

    【讨论】:

    • 感谢您的回复 - 我将在某处包含带有 popen 的 tshark 并实施 p0f 以实现腰带和护腕的方法。 HTTP 用户代理也将通过使用 scapy 获得很好的冲击。非常感谢!
    猜你喜欢
    • 2011-04-15
    • 2013-07-21
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2019-04-04
    • 2021-12-05
    • 2017-11-21
    • 2015-03-15
    相关资源
    最近更新 更多