背景--我正在使用编写一个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()类填充“原始”层,希望它能够正确地处理“原始”有效负载。
这看起来确实是功能性的,但是返回NativeOS属性“Windows4.0”的“默认”类设置(嗯,它在我的smb.py版本中),有时还会对我进行堆栈跟踪,这取决于网络上的Mac是否在执行CIFS。我盲目地认为我只需要抓住NativeOS并完成它,这肯定是错误的想法。
问题,如果我的方法完全错误,那么使用scapy的sniff()方法进行自定义协议解码的正确方法是什么?
非常感谢你的建议,
sc。
发布于 2014-01-24 13:08:22
简单地说,Scapy的SMB层实现并不是在TCP上“直接”处理SMB (基本上是TCP/445),而是只有SMB在NetBios上处理TCP (基本上是TCP/139)。
我不认为要更改它真的很难,但是您必须深入到layers/smb.py中(例如,为了决定必须使用哪个SMB*层,Scapy使用底层NBTSession层的字段中的值,SMB中不再存在这些值)。
如果您想在不依赖SMB的情况下从Scapy中识别OS,另一个选择是使用p0f模块。试试看:
>>> load_module('p0f')
>>> sniff(prn=prnp0f, store=False)https://stackoverflow.com/questions/21329059
复制相似问题