Я использую Scapy для прослушивания SMB-пакетов, поэтому я могу получить слой NBT, а также заголовок и поля SMB:
[ NBT Session Packet ]
TYPE = Session Message
RESERVED = 0
LENGTH = 268
[ SMBNegociate Protocol Request Header ]
Start = '\xfeSMB'
Command = 64
Error_Class= 0
Reserved = 1
Error_code= 0
Flags = 0
Flags2 = 0
PIDHigh = 5
Signature = 3145555
Unused = 0
TID = 5910
PID = 0
UID = 0
MID = 0
WordCount = 255
ByteCount = 254
[ SMB Negotiate Protocol Request Tail ]
BufferFormat= 0
BufferData= '\x01'
[ SMB Negotiate Protocol Request Tail ]
BufferFormat= 0
BufferData=
И после этого я получаю много других запросов. хвостовые слои. [Разве это не должно быть Raw data? ]
После Заголовка есть Создание / Запись / Чтение Запроса / Ответа Заголовка , и мне нужно проверить поля там.
Я могу получить код команды в заголовке, но мне нужны имя файла и другие поля, такие как FID под слоем заголовка. Заголовок Scapy SMB: https://scapy.readthedocs.io/en/latest/api/scapy.layers.smb.html#scapy .layers.smb.SMBNegociate_Protocol_Request_Header
Запрос на создание: https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-cifs/24462104-6b35-4fe4-aeaa-7c30cd727bc9
Нужно ли мне создать пользовательский слой? Я не понимаю эти слои Request Tails
Вот что у меня есть: [нюхает с tcp filter]
if packet[TCP].sport == 445 or packet[TCP].dport == 445:
# SMB2 packet, NBSS and TCP
if not packet[TCP].payload is None:
packet[TCP].decode_payload_as(NBTSession)
else:
return
# Check SMB Header
if SMBNegociate_Protocol_Request_Header in packet:
print("SMB Req Header")
if packet[SMBNegociate_Protocol_Request_Header].Command == 5:
print("Command: %d" % packet[SMBNegociate_Protocol_Request_Header].Command)
print(str(packet.payload.show()))
else:
print(str(packet.payload.show()))
Я довольно новичок в Scapy и Python тоже, может быть, это очевидная проблема. Я открыт для любых предложений. Заранее спасибо!