1
2
3
4
5 import array
6 import unittest as unt
7 import pike.crypto as crypto
8 import pike.digest as digest
9 import pike.netbios as netbios
10 import pike.smb2 as smb2
11 from binascii import unhexlify, hexlify
12
15 return self._signing_key
16
17 - def encryption_context(self, *args, **kwds):
18 return self._encryption_context
19
22
32
34 - def __init__(self, session_key, pre_auth_integrity_value, ciphers):
43
46 self.hash = array.array('B', "\0"*64)
51
54 h = PAIntegrity()
55 negotiate_request = array.array('B', unhexlify(
56 "FE534D4240000100000000000000800000000000000000000100000000000000FFFE000000000000"
57 "00000000000000000000000000000000000000000000000024000500000000003F000000ECD86F32"
58 "6276024F9F7752B89BB33F3A70000000020000000202100200030203110300000100260000000000"
59 "010020000100FA49E6578F1F3A9F4CD3E9CC14A67AA884B3D05844E0E5A118225C15887F32FF0000"
60 "0200060000000000020002000100"))
61 h.update(negotiate_request)
62 exp_pae_1 = array.array('B', unhexlify(
63 "DD94EFC5321BB618A2E208BA8920D2F422992526947A409B5037DE1E0FE8C7362B8C47122594CDE0"
64 "CE26AA9DFC8BCDBDE0621957672623351A7540F1E54A0426"))
65 self.assertEqual(h.hash, exp_pae_1)
66 negotiate_response = array.array('B', unhexlify(
67 "FE534D4240000100000000000000010001000000000000000100000000000000FFFE000000000000"
68 "000000000000000000000000000000000000000000000000410001001103020039CBCAF329714942"
69 "BDCE5D60F09AB3FB2F000000000080000000800000008000D8DAE5ADCBAED00109094AB095AED001"
70 "80004001C00100006082013C06062B0601050502A08201303082012CA01A3018060A2B0601040182"
71 "3702021E060A2B06010401823702020AA282010C048201084E45474F455854530100000000000000"
72 "60000000700000007C7CC0FD06D6362D02DDE1CF343BFE292900F49750B4AA97934D9C4296B26E51"
73 "FD370471B235E15A50DAE15BD5489C87000000000000000060000000010000000000000000000000"
74 "5C33530DEAF90D4DB2EC4AE3786EC3084E45474F4558545303000000010000004000000098000000"
75 "7C7CC0FD06D6362D02DDE1CF343BFE295C33530DEAF90D4DB2EC4AE3786EC3084000000058000000"
76 "3056A05430523027802530233121301F06035504031318546F6B656E205369676E696E6720507562"
77 "6C6963204B65793027802530233121301F06035504031318546F6B656E205369676E696E67205075"
78 "626C6963204B6579010026000000000001002000010060A3C3B95C3C7CCD51EC536648D9B3AC74C4"
79 "83CA5B65385A251117BEB30712E50000020004000000000001000200"))
80 h.update(negotiate_response)
81 exp_pae_2 = array.array('B', unhexlify(
82 "324BFA92A4F3A190E466EBEA08D9C110DC88BFED758D9846ECC6F541CC1D02AE3C94A79F36011E99"
83 "7E13F841B91B50957AD07B19C8E2539C0B23FDAE09D2C513"))
84 self.assertEqual(h.hash, exp_pae_2)
85 session_setup_request = array.array('B', unhexlify(
86 "FE534D4240000100000000000100800000000000000000000200000000000000FFFE000000000000"
87 "00000000000000000000000000000000000000000000000019000001010000000000000058004A00"
88 "0000000000000000604806062B0601050502A03E303CA00E300C060A2B06010401823702020AA22A"
89 "04284E544C4D5353500001000000978208E200000000000000000000000000000000060380250000"
90 "000F"))
91 h.update(session_setup_request)
92 exp_pae_3 = array.array('B', unhexlify(
93 "AC0B0F2B9986257700365E416D142A6EDC96DF03594A19E52A15F6BD0D041CD5D432F8ED42C55E33"
94 "197A50C9EC00F1462B50C592211B1471A04B56088FDFD5F9"))
95 self.assertEqual(h.hash, exp_pae_3)
96 session_setup_response = array.array('B', unhexlify(
97 "FE534D4240000100160000C00100010001000000000000000200000000000000FFFE000000000000"
98 "190000000010000000000000000000000000000000000000090000004800B300A181B03081ADA003"
99 "0A0101A10C060A2B06010401823702020AA281970481944E544C4D53535000020000000C000C0038"
100 "00000015828AE20D1D8BA31179D008000000000000000050005000440000000A0092270000000F53"
101 "005500540033003100310002000C0053005500540033003100310001000C00530055005400330031"
102 "00310004000C0053005500540033003100310003000C0053005500540033003100310007000800A1"
103 "A1F5ADCBAED00100000000"))
104 h.update(session_setup_response)
105 exp_pae_4 = array.array('B', unhexlify(
106 "2729E3440DFDDD839E37193F6E8F20C20CEFB3469E453A70CD980EEC06B8835740A7376008563336"
107 "4C8989895ECE81BF102DEEB14D4B7D48AFA76901A7A38387"))
108 self.assertEqual(h.hash, exp_pae_4)
109 session_setup_response2 = array.array('B', unhexlify(
110 "FE534D4240000100000000000100800000000000000000000300000000000000FFFE000000000000"
111 "1900000000100000000000000000000000000000000000001900000101000000000000005800CF01"
112 "0000000000000000A18201CB308201C7A0030A0101A28201AA048201A64E544C4D53535000030000"
113 "001800180090000000EE00EE00A80000000C000C00580000001A001A0064000000120012007E0000"
114 "001000100096010000158288E2060380250000000FECAC77A5F385A8BF9C38C706EEEDDCD3530055"
115 "005400330031003100610064006D0069006E006900730074007200610074006F0072004400520049"
116 "0056004500520033003100310000000000000000000000000000000000000000000000000063078E"
117 "B639FE03E20A231C3AE3BF23080101000000000000A1A1F5ADCBAED001BC4AD05F223CC90F000000"
118 "0002000C0053005500540033003100310001000C0053005500540033003100310004000C00530055"
119 "00540033003100310003000C0053005500540033003100310007000800A1A1F5ADCBAED001060004"
120 "00020000000800300030000000000000000000000000300000B61FEFCAA857EA57BF1EDCEBF8974B"
121 "8E0EBA5A6DFD9D07A31D11B548F8C9D0CC0A00100000000000000000000000000000000000090016"
122 "0063006900660073002F005300550054003300310031000000000000000000000000003B9BDFF38F"
123 "5EE8F9663F11A0F4C03A78A31204100100000063775A9A5FD97F0600000000"))
124 h.update(session_setup_response2)
125 exp_pae_5 = array.array('B', unhexlify(
126 "0DD13628CC3ED218EF9DF9772D436D0887AB9814BFAE63A80AA845F36909DB7928622DDDAD522D97"
127 "51640A459762C5A9D6BB084CBB3CE6BDADEF5D5BCE3C6C01"))
128 self.assertEqual(h.hash, exp_pae_5)
129 session_key = array.array('B', unhexlify("270E1BA896585EEB7AF3472D3B4C75A7"))
130 signing_key = digest.derive_key(
131 session_key,
132 'SMBSigningKey',
133 h.hash)[:16]
134 exp_signing_key = array.array('B', unhexlify("73FE7A9A77BEF0BDE49C650D8CCB5F76"))
135 self.assertEqual(signing_key, exp_signing_key)
136
138 session_key = array.array('B', unhexlify("B4546771B515F766A86735532DD6C4F0"))
139 session_id = 0x8e40014000011
140 conn = bogus_300_connection(session_key)
141 exp_encryption_key = unhexlify("261B72350558F2E9DCF613070383EDBF")
142 self.assertEqual(conn.encryption_context().keys.encryption,
143 exp_encryption_key)
144
145
146 nb = netbios.Netbios()
147 th = crypto.TransformHeader(nb)
148 th.nonce = array.array('B', unhexlify("66E69A111892584FB5ED524A744DA3EE"))
149 th.session_id = session_id
150 th.encryption_context = conn.encryption_context()
151
152 smb_packet = smb2.Smb2(nb, conn)
153 smb_packet.credit_charge = 1
154 smb_packet.credit_request = 64
155 smb_packet.channel_sequence = 0
156 smb_packet.flags = smb2.SMB2_FLAGS_SIGNED
157 smb_packet.message_id = 4
158 smb_packet.tree_id = 1
159 smb_packet.signature = "\0"*16
160 smb_packet.session_id = session_id
161 write_req = smb2.WriteRequest(smb_packet)
162 write_req.file_id = (0x200003900000115, 0x23900000001)
163 write_req.buffer = "Smb3 encryption testing"
164 write_req.write_channel_info_offset = 0x70
165
166 exp_serialized = array.array('B', unhexlify(
167 "FE534D4240000100000000000900400008000000000000000400000000000000"
168 "FFFE0000010000001100001400E4080000000000000000000000000000000000"
169 "3100700017000000000000000000000015010000390000020100000039020000"
170 "00000000000000007000000000000000536D623320656E6372797074696F6E20"
171 "74657374696E67"))
172 serialized = smb_packet.serialize()
173 self.assertEqual(serialized, exp_serialized)
174
175 transformed_serial = th.serialize()
176
177 exp_encrypted = array.array('B', unhexlify(
178 "25C8FEE16605A437832D1CD52DA9F4645333482A175FE5384563F45FCDAFAEF3"
179 "8BC62BA4D5C62897996625A44C29BE5658DE2E6117585779E7B59FFD971278D0"
180 "8580D7FA899E410E910EABF5AA1DB43050B33B49182637759AC15D84BFCDF5B6"
181 "B238993C0F4CF4D6012023F6C627297075D84B7803912D0A9639634453595EF3"
182 "E33FFE4E7AC2AB"))
183 self.assertEqual(th.ciphertext, exp_encrypted)
184
185 exp_transformed = array.array('B', unhexlify(
186 "FD534D4281A286535415445DAE393921E44FA42E66E69A111892584FB5ED524A"
187 "744DA3EE87000000000001001100001400E4080025C8FEE16605A437832D1CD5"
188 "2DA9F4645333482A175FE5384563F45FCDAFAEF38BC62BA4D5C62897996625A4"
189 "4C29BE5658DE2E6117585779E7B59FFD971278D08580D7FA899E410E910EABF5"
190 "AA1DB43050B33B49182637759AC15D84BFCDF5B6B238993C0F4CF4D6012023F6"
191 "C627297075D84B7803912D0A9639634453595EF3E33FFE4E7AC2AB"))
192 self.assertEqual(transformed_serial, exp_transformed)
193
195 session_key = array.array('B', unhexlify("B4546771B515F766A86735532DD6C4F0"))
196 session_id = 0x8e40014000011
197 conn = bogus_300_connection(session_key)
198 exp_decryption_key = unhexlify("8FE2B57EC34D2DB5B1A9727F526BBDB5")
199 self.assertEqual(conn.encryption_context().keys.decryption,
200 exp_decryption_key)
201 transform_message = array.array('B', unhexlify(
202 "FD534D42A6015530A18F6D9AFFE22AFAE8E66484860000000000000011000014"
203 "00E4080050000000000001001100001400E40800DBF46435C5F14169293CE079"
204 "E344479BF670227E49873F458672C3098DAC467DD5809F369D67409166515787"
205 "1483E01F7BECD02064EAC3E235F913668BBC2F097980D4B378F1993EFF6E60D1"
206 "77309E5B"))
207 nb = netbios.Netbios()
208 th = crypto.TransformHeader(nb)
209 th.encryption_context = conn.encryption_context()
210 th.parse(transform_message)
211 exp_smb_message = array.array('B', unhexlify(
212 "FE534D4240000100000000000900210009000000000000000400000000000000"
213 "FFFE0000010000001100001400E4080000000000000000000000000000000000"
214 "11000000170000000000000000000000"))
215 self.assertEqual(nb[0].buf, exp_smb_message)
216
218 session_key = array.array('B', unhexlify("419FDDF34C1E001909D362AE7FB6AF79"))
219 pre_auth_integrity_hash = array.array('B', unhexlify(
220 "B23F3CBFD69487D9832B79B1594A367CDD950909B774C3A4C412B4FCEA9EDDDBA7DB256BA2EA30E9"
221 "77F11F9B113247578E0E915C6D2A513B8F2FCA5707DC8770"))
222 session_id = 0x100000000025
223 ciphers = [crypto.SMB2_AES_128_GCM]
224 conn = bogus_311_connection(session_key,
225 pre_auth_integrity_hash,
226 ciphers)
227 exp_encryption_key = unhexlify("A2F5E80E5D59103034F32E52F698E5EC")
228 self.assertEqual(conn.encryption_context().keys.encryption,
229 exp_encryption_key)
230
231
232 nb = netbios.Netbios()
233 th = crypto.TransformHeader(nb)
234 th.nonce = array.array('B', unhexlify("C7D6822D269CAF48904C664C"))
235 th.session_id = session_id
236 th.encryption_context = conn.encryption_context()
237
238 smb_packet = smb2.Smb2(nb, conn)
239 smb_packet.credit_charge = 1
240 smb_packet.credit_request = 1
241 smb_packet.channel_sequence = 0
242 smb_packet.flags = smb2.SMB2_FLAGS_SIGNED
243 smb_packet.message_id = 5
244 smb_packet.tree_id = 1
245 smb_packet.signature = "\0"*16
246 smb_packet.session_id = session_id
247 write_req = smb2.WriteRequest(smb_packet)
248 write_req.file_id = (0x400000006, 0x400000001)
249 write_req.buffer = "Smb3 encryption testing"
250 write_req.write_channel_info_offset = 0x70
251
252 exp_serialized = array.array('B', unhexlify(
253 "FE534D4240000100000000000900010008000000000000000500000000000000FFFE000001000000"
254 "25000000001000000000000000000000000000000000000031007000170000000000000000000000"
255 "0600000004000000010000000400000000000000000000007000000000000000536D623320656E63"
256 "72797074696F6E2074657374696E67"))
257 serialized = smb_packet.serialize()
258 self.assertEqual(serialized, exp_serialized)
259
260 transformed_serial = th.serialize()
261
262 exp_encrypted = array.array('B', unhexlify(
263 "6ECDD2A7AFC7B47763057A041B8FD4DAFFE990B70C9E09D36C084E02D14EF247F8BDE38ACF6256F8"
264 "B1D3B56F77FBDEB312FEA5E92CBCC1ED8FB2EBBFAA75E49A4A394BB44576545567C24D4C014D47C9"
265 "FBDFDAFD2C4F9B72F8D256452620A299F48E29E53D6B61D1C13A19E91AF013F00D17E3ABC2FC3D36"
266 "C8C1B6B93973253852DBD442E46EE8"))
267 self.assertEqual(th.ciphertext, exp_encrypted)
268
269 exp_transformed = array.array('B', unhexlify(
270 "FD534D42BD73D97D2BC9001BCAFAC0FDFF5FEEBCC7D6822D269CAF48904C664C0000000087000000"
271 "0000010025000000001000006ECDD2A7AFC7B47763057A041B8FD4DAFFE990B70C9E09D36C084E02"
272 "D14EF247F8BDE38ACF6256F8B1D3B56F77FBDEB312FEA5E92CBCC1ED8FB2EBBFAA75E49A4A394BB4"
273 "4576545567C24D4C014D47C9FBDFDAFD2C4F9B72F8D256452620A299F48E29E53D6B61D1C13A19E9"
274 "1AF013F00D17E3ABC2FC3D36C8C1B6B93973253852DBD442E46EE8"))
275 self.assertEqual(transformed_serial, exp_transformed)
276
278 session_key = array.array('B', unhexlify("419FDDF34C1E001909D362AE7FB6AF79"))
279 pre_auth_integrity_hash = array.array('B', unhexlify(
280 "B23F3CBFD69487D9832B79B1594A367CDD950909B774C3A4C412B4FCEA9EDDDBA7DB256BA2EA30E9"
281 "77F11F9B113247578E0E915C6D2A513B8F2FCA5707DC8770"))
282 session_id = 0x100000000025
283 ciphers = [crypto.SMB2_AES_128_GCM]
284 conn = bogus_311_connection(session_key,
285 pre_auth_integrity_hash,
286 ciphers)
287 exp_decryption_key = unhexlify("748C50868C90F302962A5C35F5F9A8BF")
288 self.assertEqual(conn.encryption_context().keys.decryption,
289 exp_decryption_key)
290
291 transform_message = array.array('B', unhexlify(
292 "FD534D42ACBE1CB7ED343ADF1725EF144D90D4B0E06831DD2E8EB7B4000000000000000050000000"
293 "00000100250000000010000026BBBF949983A6C1C796559D0F2C510CB651D1F7B6AC8DED32A2A0B8"
294 "F2D793A815C6F6B848D69767A215841A42D400AE6DDB5F0B44173A014973321FDD7950DA6179159B"
295 "82E03C9E18A050FF0EA1C967"))
296 nb = netbios.Netbios()
297 th = crypto.TransformHeader(nb)
298 th.encryption_context = conn.encryption_context()
299 th.parse(transform_message)
300 exp_smb_message = array.array('B', unhexlify(
301 "FE534D4240000100000000000900010001000000000000000500000000000000FFFE000001000000"
302 "25000000001000000000000000000000000000000000000011000000170000000000000000000000"))
303 self.assertEqual(nb[0].buf, exp_smb_message)
304
305 if __name__ == "__main__":
306 unt.main()
307