+ SMB2 Header

= SMB2 Header dissecting

# OK test
rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00'
pkt = IP(rawpkt)
# Check layers
assert TCP in pkt
assert NBTSession in pkt
assert pkt[NBTSession].LENGTH == 236
assert SMB2_Header in pkt
smb2 = pkt[SMB2_Header]
# Check header values
print(smb2.show())
assert smb2.Start == b'\xfeSMB'
assert smb2.HeaderLength == 64
assert smb2.CreditCharge == 1
assert smb2.ChannelSequence == 0
assert smb2.Command == 0
assert smb2.CreditsRequested == 0
assert smb2.Flags == 0
assert smb2.ChainOffset == 0
assert smb2.MessageID == 0
assert smb2.ProcessID == 0
assert smb2.TreeID == 0
assert smb2.SessionID == 0
assert smb2.Signature == 0xffeeddccbbaa99887766554433221100

# KO test
rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xf0\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00'
pkt = IP(rawpkt)
# Check layers
assert TCP in pkt
assert NBTSession in pkt
assert pkt[NBTSession].LENGTH == 236
# Should not have a proper SMB2 Header as magic is \xf0SMB (not valid)
assert SMB2_Header not in pkt

# KO test with compression header
rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xfc\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00'
pkt = IP(rawpkt)
# Check layers
assert TCP in pkt
assert NBTSession in pkt
assert pkt[NBTSession].LENGTH == 236
# Should not have a proper SMB2 Header as magic is \xfcSMB (compressed version)
assert SMB2_Header not in pkt


= SMB2 Header assembling

pkt = IP() / TCP() / NBTSession() / SMB2_Header()
assert pkt[NBTSession].TYPE == 0x00         # session message
smb2 = pkt[SMB2_Header]
assert smb2.Start == b'\xfeSMB'

+ SMB2 Negociate Procotol Request Header dissecting

= Common fields in header

# OK test
rawpkt = b'\x45\x00\x01\x18\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xec\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x04\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x70\x00\x00\x00\x04\x00\x00\x00\x10\x02\x00\x03\x02\x03\x11\x03\x00\x00\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00'
pkt = IP(rawpkt)
# Check layers
assert TCP in pkt
assert NBTSession in pkt
assert pkt[NBTSession].LENGTH == 236
assert SMB2_Header in pkt
assert SMB2_Negociate_Protocol_Request_Header in pkt
nego_req = pkt[SMB2_Negociate_Protocol_Request_Header]
# Check field values
assert nego_req.StructureSize == 0x24
assert nego_req.DialectCount == 4
assert nego_req.SecurityMode == 0
assert nego_req.Capabilities == 0x7f000000 
assert str(nego_req.ClientGUID) == 'f1849e59-619d-99ce-1f50-5c044474b10a'
assert nego_req.NegociateContextOffset == 0x70
assert nego_req.NegociateCount == 4
for dialect in nego_req.Dialects:
    assert dialect in SMB_DIALECTS.keys()

# Check SMB 2.1
assert 0x210 in nego_req.Dialects
# Check SMB 3.0
assert 0x300 in nego_req.Dialects
# Check SMB 3.0.2
assert 0x302 in nego_req.Dialects
# Check SMB 3.1.1
assert 0x311 in nego_req.Dialects
assert len(nego_req.NegociateContexts) == nego_req.NegociateCount

= SMB2 Negociate Context in Request - type PREAUTH - disassemble

preauth = nego_req.NegociateContexts[0]
assert preauth.ContextType == 0x1
assert preauth.DataLength == 38
assert preauth.HashAlgorithmCount == 1
assert preauth.SaltLength == 32
assert preauth.Salt == b'\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18'
assert len(preauth.HashAlgorithms) == 1
assert preauth.HashAlgorithms[0] == 0x1

= SMB2 Negociate Context in Request - type ENCRYPTION disassemble

enc = nego_req.NegociateContexts[1]
assert enc.ContextType == 0x2
assert enc.DataLength == 6
assert enc.CipherCount == 2
assert len(enc.Ciphers) == 2
assert enc.Ciphers[0] == 1
assert enc.Ciphers[1] == 2


= SMB2 Negociate Context in Request - type COMPRESSION

comp = nego_req.NegociateContexts[2]
assert comp.ContextType == 0x3
assert comp.DataLength == 16
assert comp.CompressionAlgorithmCount == 4
assert len(comp.CompressionAlgorithms) == 4
assert comp.CompressionAlgorithms[0] == 1
assert comp.CompressionAlgorithms[1] == 2
assert comp.CompressionAlgorithms[2] == 3
assert comp.CompressionAlgorithms[3] == 4


= SMB2 Negociate Context in Request - type NETNAME NEGOCIATE

netname = nego_req.NegociateContexts[3]
assert netname.ContextType == 0x5
assert netname.DataLength == 28
assert netname.NetName == '192.168.178.21'

= test SMB2 Negociate Protocol Request Header - assembling

pkt = IP() / TCP() / NBTSession() / SMB2_Header() / SMB2_Negociate_Protocol_Request_Header()
pkt = IP(raw(pkt))
assert SMB2_Negociate_Protocol_Request_Header in pkt

= Request with no 0x0311 in dialects

preauth = SMB2_Preauth_Integrity_Capabilities()
preauth_context = SMB2_Negociate_Context(ContextType = 1, DataLength = len(preauth)) / preauth

pkt = SMB2_Negociate_Protocol_Request_Header(Dialects=[0x0202], NegociateContexts=[preauth_context])
assert pkt.__class__(raw(pkt)).NegociateContexts is None

+ SMB2 Negociate Protocol Response Header dissecting

= Common fields in header

rawpkt = b'\x45\x00\x02\x3e\x84\xa6\x40\x00\x80\x06\x0b\x74\xc0\xa8\xfe\x07\x91\xdc\x18\x13\x01\xbd\x9d\x76\xa3\xca\x83\xd2\x37\x06\x5f\x72\x50\x18\x04\x01\xe3\x14\x00\x00\x00\x00\x02\x12\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x41\x00\x01\x00\x11\x03\x03\x00\x53\x6d\xdd\x1c\x30\x1f\x44\x42\xa5\xc8\x88\x73\x7a\x68\x05\xe1\x2f\x00\x00\x00\x00\x00\x80\x00\x00\x00\x80\x00\x00\x00\x80\x00\xe9\xbe\x9e\x6c\xa4\xf8\xd5\x01\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x40\x01\xc0\x01\x00\x00\x60\x82\x01\x3c\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x82\x01\x30\x30\x82\x01\x2c\xa0\x1a\x30\x18\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x1e\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x82\x01\x0c\x04\x82\x01\x08\x4e\x45\x47\x4f\x45\x58\x54\x53\x01\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x70\x00\x00\x00\x11\x70\xff\xd0\xfa\xf1\x4f\xa2\x6f\x40\x5c\x94\x55\x68\x53\xcf\xa1\x77\x02\x7a\x32\xa9\x62\x78\x0a\x21\xfb\x9e\x2c\x5e\xe9\x78\xeb\xab\xee\x91\xfd\xfc\xda\x0f\xc5\x91\x03\x6e\xf8\xfd\x4c\x08\x00\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x33\x53\x0d\xea\xf9\x0d\x4d\xb2\xec\x4a\xe3\x78\x6e\xc3\x08\x4e\x45\x47\x4f\x45\x58\x54\x53\x03\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\x98\x00\x00\x00\x11\x70\xff\xd0\xfa\xf1\x4f\xa2\x6f\x40\x5c\x94\x55\x68\x53\xcf\x5c\x33\x53\x0d\xea\xf9\x0d\x4d\xb2\xec\x4a\xe3\x78\x6e\xc3\x08\x40\x00\x00\x00\x58\x00\x00\x00\x30\x56\xa0\x54\x30\x52\x30\x27\x80\x25\x30\x23\x31\x21\x30\x1f\x06\x03\x55\x04\x03\x13\x18\x54\x6f\x6b\x65\x6e\x20\x53\x69\x67\x6e\x69\x6e\x67\x20\x50\x75\x62\x6c\x69\x63\x20\x4b\x65\x79\x30\x27\x80\x25\x30\x23\x31\x21\x30\x1f\x06\x03\x55\x04\x03\x13\x18\x54\x6f\x6b\x65\x6e\x20\x53\x69\x67\x6e\x69\x6e\x67\x20\x50\x75\x62\x6c\x69\x63\x20\x4b\x65\x79\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x09\x33\xe9\xe8\xcb\xf4\x8a\x5c\x61\x4d\x38\x42\xa1\x53\x41\x18\x1b\xeb\x99\x78\x0b\x19\x6f\x5c\xef\xdd\x02\x51\x07\x3b\xc6\xcc\x00\x00\x02\x00\x04\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x03\x00\x0a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00'
pkt = IP(rawpkt)
# Check layers
assert TCP in pkt
assert NBTSession in pkt
assert pkt[NBTSession].LENGTH == 530
assert SMB2_Header in pkt
assert SMB2_Negociate_Protocol_Response_Header in pkt
nego_resp = pkt[SMB2_Negociate_Protocol_Response_Header]
# check field values
print(nego_resp.show())
print(repr(nego_resp.SecurityMode))
print(dir(nego_resp.SecurityMode))
assert nego_resp.StructureSize == 0x41
assert str(nego_resp.SecurityMode) == 'Signing Enabled'
assert nego_resp.Dialect == 0x0311
assert nego_resp.NegociateCount == 0x3
assert str(nego_resp.ServerGUID) == '1cdd6d53-1f30-4244-a5c8-88737a6805e1'
assert nego_resp.Capabilities == 0x2f000000
assert nego_resp.MaxTransactionSize == 0x00800000
assert nego_resp.MaxReadSize == 0x00800000
assert nego_resp.MaxWriteSize == 0x00800000
assert nego_resp.SecurityBufferOffset == 0x00000080
assert nego_resp.SecurityBufferLength == 320
assert nego_resp.NegociateContextOffset == 0x1c0
assert nego_resp.SecurityBuffer == b"`\x82\x01<\x06\x06+\x06\x01\x05\x05\x02\xa0\x82\x0100\x82\x01,\xa0\x1a0\x18\x06\n+\x06\x01\x04\x01\x827\x02\x02\x1e\x06\n+\x06\x01\x04\x01\x827\x02\x02\n\xa2\x82\x01\x0c\x04\x82\x01\x08NEGOEXTS\x01\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00p\x00\x00\x00\x11p\xff\xd0\xfa\xf1O\xa2o@\\\x94UhS\xcf\xa1w\x02z2\xa9bx\n!\xfb\x9e,^\xe9x\xeb\xab\xee\x91\xfd\xfc\xda\x0f\xc5\x91\x03n\xf8\xfdL\x08\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\3S\r\xea\xf9\rM\xb2\xecJ\xe3xn\xc3\x08NEGOEXTS\x03\x00\x00\x00\x01\x00\x00\x00@\x00\x00\x00\x98\x00\x00\x00\x11p\xff\xd0\xfa\xf1O\xa2o@\\\x94UhS\xcf\\3S\r\xea\xf9\rM\xb2\xecJ\xe3xn\xc3\x08@\x00\x00\x00X\x00\x00\x000V\xa0T0R0'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key0'\x80%0#1!0\x1f\x06\x03U\x04\x03\x13\x18Token Signing Public Key"
assert len(nego_resp.NegociateContexts) == 3

= SMB2 Negociate Context in Response - Type PREAUTH

preauth = nego_resp.NegociateContexts[0]
assert preauth.ContextType == 0x0001
assert preauth.DataLength == 38
assert preauth.HashAlgorithmCount == 1
assert preauth.SaltLength == 32
assert preauth.Salt == b"\x09\x33\xe9\xe8\xcb\xf4\x8a\x5c\x61\x4d\x38\x42\xa1\x53\x41\x18\x1b\xeb\x99\x78\x0b\x19\x6f\x5c\xef\xdd\x02\x51\x07\x3b\xc6\xcc"
assert len(preauth.HashAlgorithms) == 1
assert preauth.HashAlgorithms[0] == 0x1

= SMB2 Negociate Context in Response - Type ENCRYPTION

enc = nego_resp.NegociateContexts[1]
assert enc.ContextType == 0x0002
assert enc.DataLength == 4
assert enc.CipherCount == 1
assert len(enc.Ciphers) == 1
assert enc.Ciphers[0] == 1

= SMB2 Negociate Context in Response - Type COMPRESSION

comp = nego_resp.NegociateContexts[2]
assert comp.ContextType == 0x0003
assert comp.DataLength  == 10
assert comp.CompressionAlgorithmCount == 1
assert len(comp.CompressionAlgorithms) == 1
assert comp.CompressionAlgorithms[0] == 1

= SMB2 Negociate Protocol Response Header assembling

pkt = IP() / TCP() / NBTSession() / SMB2_Header() / SMB2_Negociate_Protocol_Response_Header()
pkt = IP(raw(pkt))
assert SMB2_Negociate_Protocol_Response_Header in pkt

= Response with dialect different from 0x0311

preauth = SMB2_Preauth_Integrity_Capabilities()
preauth_context = SMB2_Negociate_Context(ContextType = 1, DataLength = len(preauth)) / preauth

pkt = SMB2_Negociate_Protocol_Response_Header(Dialect=0x0202, NegociateContexts=[preauth_context])
assert pkt.__class__(raw(pkt)).NegociateContexts is None

+ SMB2 Negociate Procotol Request Header with 1 dialect

= Common fields in header

# OK test
rawpkt = b'\x45\x00\x01\x10\x16\x2c\x40\x00\x37\x06\xc4\x14\x91\xdc\x18\x13\xc0\xa8\xfe\x07\x9d\x76\x01\xbd\x37\x06\x5e\x82\xa3\xca\x83\xd2\x50\x18\x01\xf6\x11\x5b\x00\x00\x00\x00\x00\xe4\xfe\x53\x4d\x42\x40\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff\x24\x00\x01\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x59\x9e\x84\xf1\x9d\x61\xce\x99\x1f\x50\x5c\x04\x44\x74\xb1\x0a\x68\x00\x00\x00\x04\x00\x00\x00\x11\x03\x00\x00\x01\x00\x26\x00\x00\x00\x00\x00\x01\x00\x20\x00\x01\x00\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18\x00\x00\x02\x00\x06\x00\x00\x00\x00\x00\x02\x00\x01\x00\x02\x00\x00\x00\x03\x00\x10\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x1c\x00\x00\x00\x00\x00\x31\x00\x39\x00\x32\x00\x2e\x00\x31\x00\x36\x00\x38\x00\x2e\x00\x31\x00\x37\x00\x38\x00\x2e\x00\x32\x00\x31\x00'
pkt = IP(rawpkt)
# Check layers
assert TCP in pkt
assert NBTSession in pkt
assert pkt[NBTSession].LENGTH == 228
assert SMB2_Header in pkt
assert SMB2_Negociate_Protocol_Request_Header in pkt
nego_req = pkt[SMB2_Negociate_Protocol_Request_Header]
# Check field values
assert nego_req.StructureSize == 0x24
assert nego_req.DialectCount == 1
assert nego_req.SecurityMode == 0
assert nego_req.Capabilities == 0x7f000000
assert str(nego_req.ClientGUID) == 'f1849e59-619d-99ce-1f50-5c044474b10a'
assert nego_req.NegociateContextOffset == 0x68
assert nego_req.NegociateCount == 4
for dialect in nego_req.Dialects:
    assert dialect in SMB_DIALECTS.keys()

# Check SMB 3.1.1
assert 0x311 in nego_req.Dialects
assert len(nego_req.NegociateContexts) == nego_req.NegociateCount

= SMB2 Negociate Context in Request - type PREAUTH - disassemble

preauth = nego_req.NegociateContexts[0]
assert preauth.ContextType == 0x1
assert preauth.DataLength == 38
assert preauth.HashAlgorithmCount == 1
assert preauth.SaltLength == 32
assert preauth.Salt == b'\x75\x06\x05\xed\x60\x88\x9e\xcb\x5e\x79\xbb\xe8\x44\x59\xc5\x5c\xd2\x82\x51\x06\x32\x7a\x6e\x2e\x41\xc5\xa8\x3f\xdd\xf2\xc5\x18'
assert len(preauth.HashAlgorithms) == 1
assert preauth.HashAlgorithms[0] == 0x1

= SMB2 Negociate Context in Request - type ENCRYPTION disassemble

enc = nego_req.NegociateContexts[1]
assert enc.ContextType == 0x2
assert enc.DataLength == 6
assert enc.CipherCount == 2
assert len(enc.Ciphers) == 2
assert enc.Ciphers[0] == 1
assert enc.Ciphers[1] == 2


= SMB2 Negociate Context in Request - type COMPRESSION

comp = nego_req.NegociateContexts[2]
assert comp.ContextType == 0x3
assert comp.DataLength == 16
assert comp.CompressionAlgorithmCount == 4
assert len(comp.CompressionAlgorithms) == 4
assert comp.CompressionAlgorithms[0] == 1
assert comp.CompressionAlgorithms[1] == 2
assert comp.CompressionAlgorithms[2] == 3
assert comp.CompressionAlgorithms[3] == 4


= SMB2 Negociate Context in Request - type NETNAME NEGOCIATE

netname = nego_req.NegociateContexts[3]
assert netname.ContextType == 0x5
assert netname.DataLength == 28
assert netname.NetName == '192.168.178.21'

+ SMB2 Negociate Protocol Request Header default values

= Default DialectCount

pkt = SMB2_Negociate_Protocol_Request_Header()
assert len(pkt.Dialects) == pkt.__class__(raw(pkt)).DialectCount

= Default NegociateCount

preauth = SMB2_Preauth_Integrity_Capabilities()
preauth_context = SMB2_Negociate_Context(ContextType = 1, DataLength = len(preauth)) / preauth

pkt = SMB2_Negociate_Protocol_Request_Header(Dialects=[0x0311], NegociateContexts=[preauth_context], NegociateContextOffset=0x68)
assert len(pkt.NegociateContexts) == pkt.__class__(raw(pkt)).NegociateCount

+ Negociate Request without manual padding of Negociate Contexts

= SMB2 Negociate Context in Request - type PREAUTH - disassemble

preauth = SMB2_Preauth_Integrity_Capabilities()
preauth_context = SMB2_Negociate_Context(ContextType = 1, DataLength = len(preauth)) / preauth

enc = SMB2_Encryption_Capabilities()
enc_context = SMB2_Negociate_Context(ContextType = 2, DataLength = len(enc)) / enc

comp = SMB2_Compression_Capabilities()
comp_context = SMB2_Negociate_Context(ContextType = 3, DataLength = len(comp)) / comp

netname = SMB2_Netname_Negociate_Context_ID("192.168.178.21".encode("utf-16le"))
netname_context = SMB2_Negociate_Context(ContextType = 5, DataLength = len(netname)) / netname

pkt = SMB2_Header() / SMB2_Negociate_Protocol_Request_Header(Dialects=[0x0311], NegociateContexts=[preauth_context, enc_context, comp_context, netname_context], NegociateContextOffset=0x68)

pkt = SMB2_Header(raw(pkt))

nego_req = pkt[SMB2_Negociate_Protocol_Request_Header]

preauth_dissected = nego_req.NegociateContexts[0]
assert preauth_dissected.ContextType == preauth_context.ContextType
assert preauth_dissected.DataLength == preauth_context.DataLength
assert preauth_dissected.HashAlgorithmCount == preauth_context.HashAlgorithmCount
assert preauth_dissected.SaltLength == preauth_context.SaltLength
assert len(preauth_dissected.HashAlgorithms) == len(preauth_context.HashAlgorithms)
assert preauth_dissected.HashAlgorithms[0] == preauth_context.HashAlgorithms[0]

= SMB2 Negociate Context in Request - type ENCRYPTION disassemble

enc_dissected = nego_req.NegociateContexts[1]
assert enc_dissected.ContextType == enc_context.ContextType
assert enc_dissected.DataLength == enc_context.DataLength
assert enc_dissected.CipherCount == enc_context.CipherCount
assert len(enc_dissected.Ciphers) == len(enc_context.Ciphers)
assert enc_dissected.Ciphers[0] == enc_context.Ciphers[0]

= SMB2 Negociate Context in Request - type COMPRESSION

comp_dissected = nego_req.NegociateContexts[2]
assert comp_dissected.ContextType == comp_context.ContextType
assert comp_dissected.DataLength == comp_context.DataLength
assert comp_dissected.CompressionAlgorithmCount == comp_context.CompressionAlgorithmCount
assert len(comp_dissected.CompressionAlgorithms) == len(comp_context.CompressionAlgorithms)

= SMB2 Negociate Context in Request - type NETNAME NEGOCIATE

netname_dissected = nego_req.NegociateContexts[3]
assert netname_dissected.ContextType == netname_context.ContextType
assert netname_dissected.DataLength == netname_context.DataLength
assert netname_dissected.NetName == netname_context.NetName
