Short answer is Scapy's implementation of SMB layers does not handle SMB "directly" over TCP (basically TCP/445) but only SMB over NetBios over TCP (basically TCP/139).
I don't think it would be really hard to change that, but you would have to dive into layers/smb.py
for that (for example, to decide which SMB*
layer has to be used, Scapy uses values from fields of the underlying NBTSession
layer, which no longer exists in SMB over TCP).
Another option if you want to identify OS from Scapy without relying on SMB would be to use the p0f module. To try it:
>>> load_module('p0f')
>>> sniff(prn=prnp0f, store=False)