|
8 | 8 | """ |
9 | 9 |
|
10 | 10 | from scapy.config import conf |
11 | | -from scapy.packet import Packet, bind_layers |
12 | | -from scapy.fields import StrFixedLenField, LEIntField, LEShortEnumField, \ |
13 | | - ShortEnumField, XLEIntField, LEShortField, FlagsField, LELongField, \ |
14 | | - XLELongField, XNBytesField, FieldLenField, IntField, FieldListField, \ |
15 | | - XStrLenField, ShortField, IntEnumField, StrFieldUtf16, XLEShortField, \ |
16 | | - UUIDField, XLongField, PacketListField, PadField |
| 11 | +from scapy.packet import Packet, bind_layers, bind_top_down |
| 12 | +from scapy.fields import ( |
| 13 | + FieldLenField, |
| 14 | + FieldListField, |
| 15 | + FlagsField, |
| 16 | + IntEnumField, |
| 17 | + IntField, |
| 18 | + LEIntField, |
| 19 | + LELongField, |
| 20 | + LEShortEnumField, |
| 21 | + LEShortField, |
| 22 | + PacketListField, |
| 23 | + PadField, |
| 24 | + ShortEnumField, |
| 25 | + ShortField, |
| 26 | + StrFieldUtf16, |
| 27 | + StrFixedLenField, |
| 28 | + UUIDField, |
| 29 | + XLEIntField, |
| 30 | + XLELongField, |
| 31 | + XLEShortField, |
| 32 | + XLongField, |
| 33 | + XNBytesField, |
| 34 | + XStrLenField, |
| 35 | +) |
17 | 36 |
|
18 | 37 |
|
19 | 38 | # EnumField |
|
35 | 54 |
|
36 | 55 | # FlagField |
37 | 56 | SMB2_CAPABILITIES = { |
38 | | - 30: "CapabilitiesEncryption", |
39 | | - 29: "CapabilitiesDirectoryLeasing", |
40 | | - 28: "CapabilitiesPersistentHandles", |
41 | | - 27: "CapabilitiesMultiChannel", |
42 | | - 26: "CapabilitiesLargeMTU", |
43 | | - 25: "CapabilitiesLeasing", |
44 | | - 24: "CapabilitiesDFS", |
| 57 | + 30: "Encryption", |
| 58 | + 29: "DirectoryLeasing", |
| 59 | + 28: "PersistentHandles", |
| 60 | + 27: "MultiChannel", |
| 61 | + 26: "LargeMTU", |
| 62 | + 25: "Leasing", |
| 63 | + 24: "DFS", |
45 | 64 | } |
46 | 65 |
|
47 | 66 | # EnumField |
@@ -76,6 +95,13 @@ class SMB2_Header(Packet): |
76 | 95 | XNBytesField("Signature", 0, 16), |
77 | 96 | ] |
78 | 97 |
|
| 98 | + def guess_payload_class(self, payload): |
| 99 | + if self.Command == 0x0000: |
| 100 | + if self.Flags.SMB2_FLAGS_SERVER_TO_REDIR: |
| 101 | + return SMB2_Negociate_Protocol_Response_Header |
| 102 | + return SMB2_Negociate_Protocol_Request_Header |
| 103 | + return super(SMB2_Header, self).guess_payload_class(payload) |
| 104 | + |
79 | 105 |
|
80 | 106 | class SMB2_Compression_Transform_Header(Packet): |
81 | 107 | name = "SMB2 Compression Transform Header" |
@@ -270,17 +296,17 @@ class SMB2_Negociate_Protocol_Response_Header(Packet): |
270 | 296 | bind_layers(SMB2_Encryption_Capabilities, conf.padding_layer) |
271 | 297 | bind_layers(SMB2_Compression_Capabilities, conf.padding_layer) |
272 | 298 | bind_layers(SMB2_Netname_Negociate_Context_ID, conf.padding_layer) |
273 | | -bind_layers( |
| 299 | +bind_top_down( |
274 | 300 | SMB2_Header, |
275 | 301 | SMB2_Negociate_Protocol_Request_Header, |
276 | 302 | Command=0x0000, |
277 | | - Flags=lambda f: (f >> 24) & 1 == 0 |
| 303 | + Flags=0 |
278 | 304 | ) |
279 | | -bind_layers( |
| 305 | +bind_top_down( |
280 | 306 | SMB2_Header, |
281 | 307 | SMB2_Negociate_Protocol_Response_Header, |
282 | 308 | Command=0x0000, |
283 | | - Flags=lambda f: (f >> 24) & 1 == 1 |
| 309 | + Flags=2 ** 24 # SMB2_FLAGS_SERVER_TO_REDIR |
284 | 310 | ) |
285 | 311 | bind_layers( |
286 | 312 | SMB2_Negociate_Context, |
|
0 commit comments