的背景
我正在使用scapy编写Windows操作系统检测脚本。虽然我可以使用其他工具(例如p0f,带有SMB脚本的nmap等),但此功能的一部分只是全部的一小部分,因此我致力于轻松的路线。

问题
作为一个经验丰富的新手,我在确定使用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。

最佳答案

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

我认为更改该更改确实不是很困难,但是您必须为此而深入layers/smb.py(例如,确定必须使用哪个SMB*层,Scapy使用基础字段的值NBTSession层,在通过TCP的SMB中不再存在。

如果要在不依赖SMB的情况下从Scapy识别操作系统,则可以使用p0f模块。尝试一下:

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

关于python - 轻松的SMB/CIFS解码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21329059/

10-09 17:13