rex 2.0.5 → 2.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rex/exploitation/egghunter.rb +4 -6
  3. data/lib/rex/exploitation/powershell/psh_methods.rb +9 -0
  4. data/lib/rex/java/serialization.rb +2 -1
  5. data/lib/rex/java/serialization/builder.rb +94 -0
  6. data/lib/rex/java/serialization/model.rb +29 -18
  7. data/lib/rex/java/serialization/model/annotation.rb +2 -2
  8. data/lib/rex/java/serialization/model/field.rb +2 -2
  9. data/lib/rex/java/serialization/model/new_array.rb +8 -3
  10. data/lib/rex/java/serialization/model/new_class_desc.rb +3 -3
  11. data/lib/rex/java/serialization/model/new_enum.rb +4 -4
  12. data/lib/rex/java/serialization/model/new_object.rb +17 -10
  13. data/lib/rex/ole/direntry.rb +1 -1
  14. data/lib/rex/ole/samples/create_ole.rb +0 -0
  15. data/lib/rex/ole/samples/dir.rb +0 -0
  16. data/lib/rex/ole/samples/dump_stream.rb +0 -0
  17. data/lib/rex/ole/samples/ole_info.rb +0 -0
  18. data/lib/rex/parser/foundstone_nokogiri.rb +1 -1
  19. data/lib/rex/parser/fs/ntfs.rb +252 -0
  20. data/lib/rex/parser/openvas_nokogiri.rb +2 -0
  21. data/lib/rex/payloads/win32/kernel.rb +3 -3
  22. data/lib/rex/post/meterpreter/client_core.rb +172 -64
  23. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +3 -2
  24. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +12 -10
  25. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +64 -37
  26. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +8 -2
  27. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +15 -3
  28. data/lib/rex/post/meterpreter/packet.rb +41 -38
  29. data/lib/rex/post/meterpreter/packet_dispatcher.rb +7 -1
  30. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +17 -4
  31. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +11 -4
  32. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +1 -1
  33. data/lib/rex/proto.rb +2 -0
  34. data/lib/rex/proto/acpp.rb +17 -0
  35. data/lib/rex/proto/acpp/client.rb +29 -0
  36. data/lib/rex/proto/acpp/message.rb +183 -0
  37. data/lib/rex/proto/http/client.rb +1 -2
  38. data/lib/rex/proto/iax2/call.rb +22 -3
  39. data/lib/rex/proto/iax2/client.rb +1 -0
  40. data/lib/rex/proto/kerberos.rb +13 -0
  41. data/lib/rex/proto/kerberos/client.rb +213 -0
  42. data/lib/rex/proto/kerberos/credential_cache.rb +19 -0
  43. data/lib/rex/proto/kerberos/credential_cache/cache.rb +81 -0
  44. data/lib/rex/proto/kerberos/credential_cache/credential.rb +151 -0
  45. data/lib/rex/proto/kerberos/credential_cache/element.rb +49 -0
  46. data/lib/rex/proto/kerberos/credential_cache/key_block.rb +62 -0
  47. data/lib/rex/proto/kerberos/credential_cache/principal.rb +70 -0
  48. data/lib/rex/proto/kerberos/credential_cache/time.rb +69 -0
  49. data/lib/rex/proto/kerberos/crypto.rb +21 -0
  50. data/lib/rex/proto/kerberos/crypto/rc4_hmac.rb +65 -0
  51. data/lib/rex/proto/kerberos/crypto/rsa_md5.rb +15 -0
  52. data/lib/rex/proto/kerberos/model.rb +133 -0
  53. data/lib/rex/proto/kerberos/model/ap_req.rb +98 -0
  54. data/lib/rex/proto/kerberos/model/authenticator.rb +143 -0
  55. data/lib/rex/proto/kerberos/model/authorization_data.rb +85 -0
  56. data/lib/rex/proto/kerberos/model/checksum.rb +59 -0
  57. data/lib/rex/proto/kerberos/model/element.rb +67 -0
  58. data/lib/rex/proto/kerberos/model/enc_kdc_response.rb +215 -0
  59. data/lib/rex/proto/kerberos/model/encrypted_data.rb +171 -0
  60. data/lib/rex/proto/kerberos/model/encryption_key.rb +106 -0
  61. data/lib/rex/proto/kerberos/model/kdc_request.rb +166 -0
  62. data/lib/rex/proto/kerberos/model/kdc_request_body.rb +315 -0
  63. data/lib/rex/proto/kerberos/model/kdc_response.rb +141 -0
  64. data/lib/rex/proto/kerberos/model/krb_error.rb +219 -0
  65. data/lib/rex/proto/kerberos/model/last_request.rb +82 -0
  66. data/lib/rex/proto/kerberos/model/pre_auth_data.rb +104 -0
  67. data/lib/rex/proto/kerberos/model/pre_auth_enc_time_stamp.rb +126 -0
  68. data/lib/rex/proto/kerberos/model/pre_auth_pac_request.rb +81 -0
  69. data/lib/rex/proto/kerberos/model/principal_name.rb +116 -0
  70. data/lib/rex/proto/kerberos/model/ticket.rb +151 -0
  71. data/lib/rex/proto/kerberos/pac.rb +36 -0
  72. data/lib/rex/proto/kerberos/pac/client_info.rb +53 -0
  73. data/lib/rex/proto/kerberos/pac/element.rb +52 -0
  74. data/lib/rex/proto/kerberos/pac/logon_info.rb +566 -0
  75. data/lib/rex/proto/kerberos/pac/priv_svr_checksum.rb +29 -0
  76. data/lib/rex/proto/kerberos/pac/server_checksum.rb +30 -0
  77. data/lib/rex/proto/kerberos/pac/type.rb +121 -0
  78. data/lib/rex/proto/rmi.rb +7 -0
  79. data/lib/rex/proto/rmi/model.rb +31 -0
  80. data/lib/rex/proto/rmi/model/call.rb +60 -0
  81. data/lib/rex/proto/rmi/model/continuation.rb +76 -0
  82. data/lib/rex/proto/rmi/model/dgc_ack.rb +62 -0
  83. data/lib/rex/proto/rmi/model/element.rb +143 -0
  84. data/lib/rex/proto/rmi/model/output_header.rb +86 -0
  85. data/lib/rex/proto/rmi/model/ping.rb +41 -0
  86. data/lib/rex/proto/rmi/model/ping_ack.rb +41 -0
  87. data/lib/rex/proto/rmi/model/protocol_ack.rb +100 -0
  88. data/lib/rex/proto/rmi/model/return_data.rb +60 -0
  89. data/lib/rex/socket.rb +9 -1
  90. data/lib/rex/socket/tcp_server.rb +3 -0
  91. data/lib/rex/ui/text/dispatcher_shell.rb +4 -4
  92. data/lib/rex/ui/text/output/tee.rb +2 -0
  93. data/lib/rex/zip/samples/comment.rb +0 -0
  94. data/lib/rex/zip/samples/mkwar.rb +0 -0
  95. data/lib/rex/zip/samples/mkzip.rb +0 -0
  96. data/lib/rex/zip/samples/recursive.rb +0 -0
  97. data/rex.gemspec +1 -1
  98. metadata +56 -2
@@ -0,0 +1,36 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Pac
7
+ VERSION = 0
8
+ NETLOGON_FLAG = 0x20000
9
+ SE_GROUP_MANDATORY = 1
10
+ SE_GROUP_ENABLED_BY_DEFAULT = 2
11
+ SE_GROUP_ENABLED = 4
12
+ SE_GROUP_ALL = SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT | SE_GROUP_ENABLED
13
+ USER_NORMAL_ACCOUNT = 0x00000010
14
+ USER_DONT_EXPIRE_PASSWORD = 0x00000200
15
+ PAC_LOGON_INFO = 1
16
+ PAC_SERVER_CHECKSUM = 6
17
+ PAC_PRIVSVR_CHECKSUM = 7
18
+ PAC_CLIENT_INFO = 10
19
+ AD_WIN2K_PAC = 128
20
+ SEC_TO_UNIX_EPOCH = 11644473600
21
+ WINDOWS_TICK = 10000000
22
+ NEVER_EXPIRE = 0x7fffffffffffffff
23
+ DOMAIN_USERS = 513
24
+ DEFAULT_USER_SID = 1000
25
+ NT_AUTHORITY_SID = 'S-1-5'
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ require 'rex/proto/kerberos/pac/element'
32
+ require 'rex/proto/kerberos/pac/priv_svr_checksum'
33
+ require 'rex/proto/kerberos/pac/server_checksum'
34
+ require 'rex/proto/kerberos/pac/client_info'
35
+ require 'rex/proto/kerberos/pac/logon_info'
36
+ require 'rex/proto/kerberos/pac/type'
@@ -0,0 +1,53 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Pac
7
+ # This class provides a representation of a PAC-CLIENT-INFO structure, containing the client's name
8
+ # and authentication time. It's used to verify which the ticket's client is the PAC's owner.
9
+ class ClientInfo < Element
10
+
11
+ # @!attribute client_id
12
+ # @return [Time] The auth_time field of the Kerberos KDC-AS response.
13
+ attr_accessor :client_id
14
+ # @!attribute name
15
+ # @return [String] The client name from the ticket
16
+ attr_accessor :name
17
+
18
+ # Encodes the Rex::Proto::Kerberos::Pac::ClientInfo
19
+ #
20
+ # @return [String]
21
+ def encode
22
+ encoded = ''
23
+ encoded << encode_client_id
24
+ encoded << [name.length * 2].pack('v')
25
+ encoded << encode_name
26
+
27
+ encoded
28
+ end
29
+
30
+ private
31
+
32
+ # Encodes the client_id attribute
33
+ #
34
+ # @return [String]
35
+ def encode_client_id
36
+ file_time = (client_id.to_i + 11644473600) * 10000000
37
+ encoded = ''
38
+ encoded << [file_time].pack('Q<')
39
+
40
+ encoded
41
+ end
42
+
43
+ # Encodes the name attribute
44
+ #
45
+ # @return [String]
46
+ def encode_name
47
+ Rex::Text.to_unicode(name)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,52 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Pac
7
+ class Element
8
+
9
+ include Rex::Proto::Kerberos::Crypto
10
+ include Rex::Proto::Kerberos::Pac
11
+
12
+ def self.attr_accessor(*vars)
13
+ @attributes ||= []
14
+ @attributes.concat vars
15
+ super(*vars)
16
+ end
17
+
18
+ # Retrieves the element class fields
19
+ #
20
+ # @return [Array]
21
+ def self.attributes
22
+ @attributes
23
+ end
24
+
25
+ def initialize(options = {})
26
+ self.class.attributes.each do |attr|
27
+ if options.has_key?(attr)
28
+ m = (attr.to_s + '=').to_sym
29
+ self.send(m, options[attr])
30
+ end
31
+ end
32
+ end
33
+
34
+ # Retrieves the element instance fields
35
+ #
36
+ # @return [Array]
37
+ def attributes
38
+ self.class.attributes
39
+ end
40
+
41
+ # Encodes the Rex::Proto::Kerberos::Pac::Element into an String. This
42
+ # method has been designed to be overridden by subclasses.
43
+ #
44
+ # @raise [NoMethodError]
45
+ def encode
46
+ raise ::NoMethodError, 'Method designed to be overridden'
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,566 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Pac
7
+ # @todo Make more fields user controllable, instead of constants.
8
+ # This class provides a representation of a PAC_LOGON_INFO structure, which contains the
9
+ # credential information for the client of the Kerberos ticket.
10
+ class LogonInfo < Element
11
+
12
+ # @!attribute logon_time
13
+ # @return [Time] The time the client last logged on
14
+ attr_accessor :logon_time
15
+ # @!attribute effective_name
16
+ # @return [String] The client's Windows 2000 user name
17
+ attr_accessor :effective_name
18
+ # @!attribute user_id
19
+ # @return [Fixnum] The relative ID for the client
20
+ attr_accessor :user_id
21
+ # @!attribute primary_group_id
22
+ # @return [Fixnum] The relative ID for the client's primary group
23
+ attr_accessor :primary_group_id
24
+ # @!attribute group_ids
25
+ # @return [Array<Fixnum>] Array of relative Ids of the groups which the client is a member
26
+ attr_accessor :group_ids
27
+ # @!attribute logon_domain_name
28
+ # @return [String] The netbios name of the client's domain
29
+ attr_accessor :logon_domain_name
30
+ # @!attribute logon_domain_sid
31
+ # @return [String] The SID of the client's domain
32
+ attr_accessor :logon_domain_id
33
+
34
+ # Encodes the Rex::Proto::Kerberos::Pac::LogonInfo
35
+ #
36
+ # @return [String]
37
+ def encode
38
+ elements = []
39
+ elements[0] = ''
40
+ elements[0] << encode_element_id
41
+ elements[0] << encode_logon_time
42
+ elements[0] << encode_logoff_time
43
+ elements[0] << encode_kickoff_time
44
+ elements[0] << encode_password_last_set
45
+ elements[0] << encode_password_can_change
46
+ elements[0] << encode_password_must_change
47
+ elements[0] << encode_effective_name
48
+ elements << encode_effective_name_info
49
+ elements[0] << encode_full_name
50
+ elements << encode_full_name_info
51
+ elements[0] << encode_logon_script
52
+ elements << encode_logon_script_info
53
+ elements[0] << encode_profile_path
54
+ elements << encode_profile_path_info
55
+ elements[0] << encode_home_directory
56
+ elements << encode_home_directory_info
57
+ elements[0] << encode_home_directory_drive
58
+ elements << encode_home_directory_drive_info
59
+ elements[0] << encode_logon_count
60
+ elements[0] << encode_bad_password_count
61
+ elements[0] << encode_user_id
62
+ elements[0] << encode_primary_group_id
63
+ elements[0] << encode_group_count
64
+ elements[0] << encode_group_ids
65
+ elements << encode_group_ids_info
66
+ elements[0] << encode_user_flags
67
+ elements[0] << encode_user_session_key
68
+ elements[0] << encode_logon_server
69
+ elements << encode_logon_server_info
70
+ elements[0] << encode_logon_domain_name
71
+ elements << encode_logon_domain_name_info
72
+ elements[0] << encode_logon_domain_id
73
+ elements << encode_logon_domain_id_info
74
+ elements[0] << encode_reserved_one
75
+ elements[0] << encode_user_account_control
76
+ elements[0] << encode_reserved_three
77
+ elements[0] << encode_sid_count
78
+ elements[0] << encode_extra_sids
79
+ elements[0] << encode_resource_group_domain_sid
80
+ elements[0] << encode_resource_group_count
81
+ elements[0] << encode_resource_group_ids
82
+
83
+ decoded = ''
84
+ elements.each do |elem|
85
+ decoded << elem
86
+ decoded << "\x00" * ((elem.length + 3) / 4 * 4 - elem.length)
87
+ end
88
+
89
+ header = "\x01\x10\x08\x00\xcc\xcc\xcc\xcc"
90
+ header << [decoded.length, 0].pack('VV')
91
+
92
+ header + decoded
93
+ end
94
+
95
+ private
96
+
97
+ # Encodes the netlogon type
98
+ #
99
+ # @return [String]
100
+ def encode_element_id
101
+ [NETLOGON_FLAG].pack('V')
102
+ end
103
+
104
+ # Encodes the logon_time attribute
105
+ #
106
+ # @return [String]
107
+ def encode_logon_time
108
+ file_time = (logon_time.to_i + SEC_TO_UNIX_EPOCH) * WINDOWS_TICK
109
+ encoded = ''
110
+ encoded << [file_time].pack('Q<')
111
+
112
+ encoded
113
+ end
114
+
115
+ # Encodes the logoff time (constant)
116
+ #
117
+ # @return [String]
118
+ def encode_logoff_time
119
+ [NEVER_EXPIRE].pack('Q<')
120
+ end
121
+
122
+ # Encodes the kickoff time (constant)
123
+ #
124
+ # @return [String]
125
+ def encode_kickoff_time
126
+ [NEVER_EXPIRE].pack('Q<')
127
+ end
128
+
129
+ # Encodes the password_last_set (constant)
130
+ #
131
+ # @return [String]
132
+ def encode_password_last_set
133
+ [0].pack('Q<')
134
+ end
135
+
136
+ # Encodes the password_can_change (constant)
137
+ #
138
+ # @return [String]
139
+ def encode_password_can_change
140
+ [0].pack('Q<')
141
+ end
142
+
143
+ # Encodes the password_must_change (constant)
144
+ #
145
+ # @return [String]
146
+ def encode_password_must_change
147
+ [NEVER_EXPIRE].pack('Q<')
148
+ end
149
+
150
+ # Encodes the effective_name id field
151
+ #
152
+ # @return [String]
153
+ def encode_effective_name
154
+ unicode = Rex::Text.to_unicode(effective_name)
155
+
156
+ encoded = ''
157
+ encoded << [
158
+ unicode.length,
159
+ unicode.length,
160
+ 0x20004
161
+ ].pack('vvV')
162
+
163
+ encoded
164
+ end
165
+
166
+ # Encodes the effective_name info field
167
+ #
168
+ # @return [String]
169
+ def encode_effective_name_info
170
+ unicode = Rex::Text.to_unicode(effective_name)
171
+
172
+ encoded = ''
173
+ encoded << [
174
+ effective_name.length,
175
+ effective_name.length
176
+ ].pack('Q<V')
177
+ encoded << unicode
178
+ end
179
+
180
+ # Encodes the full_name id
181
+ #
182
+ # @return [String]
183
+ def encode_full_name
184
+ unicode = Rex::Text.to_unicode('')
185
+ encoded = ''
186
+ encoded << [
187
+ unicode.length,
188
+ unicode.length,
189
+ 0x20008
190
+ ].pack('vvV')
191
+
192
+ encoded
193
+ end
194
+
195
+ # Encodes the full_name_info (constant)
196
+ #
197
+ # @return [String]
198
+ def encode_full_name_info
199
+ unicode = Rex::Text.to_unicode('')
200
+ encoded = ''
201
+ encoded << [
202
+ ''.length,
203
+ ''.length
204
+ ].pack('Q<V')
205
+ encoded << unicode
206
+ encoded
207
+ end
208
+
209
+ # Encodes the logon_script id
210
+ #
211
+ # @return [String]
212
+ def encode_logon_script
213
+ unicode = Rex::Text.to_unicode('')
214
+
215
+ encoded = ''
216
+ encoded << [
217
+ unicode.length,
218
+ unicode.length,
219
+ 0x2000c
220
+ ].pack('vvV')
221
+
222
+ encoded
223
+ end
224
+
225
+ # Encodes the logon_script info (constant)
226
+ #
227
+ # @return [String]
228
+ def encode_logon_script_info
229
+ unicode = Rex::Text.to_unicode('')
230
+ encoded = ''
231
+ encoded << [
232
+ ''.length,
233
+ ''.length
234
+ ].pack('Q<V')
235
+ encoded << unicode
236
+
237
+ encoded
238
+ end
239
+
240
+ # Encodes the profile_path id
241
+ #
242
+ # @return [String]
243
+ def encode_profile_path
244
+ unicode = Rex::Text.to_unicode('')
245
+
246
+ encoded = ''
247
+ encoded << [
248
+ unicode.length,
249
+ unicode.length,
250
+ 0x20010
251
+ ].pack('vvV')
252
+
253
+ encoded
254
+ end
255
+
256
+ # Encodes the profile_path info (constant)
257
+ #
258
+ # @return [String]
259
+ def encode_profile_path_info
260
+ unicode = Rex::Text.to_unicode('')
261
+ encoded = ''
262
+ encoded << [
263
+ ''.length,
264
+ ''.length
265
+ ].pack('Q<V')
266
+ encoded << unicode
267
+
268
+ encoded
269
+ end
270
+
271
+ # Encodes the home_directory id
272
+ #
273
+ # @return [String]
274
+ def encode_home_directory
275
+ unicode = Rex::Text.to_unicode('')
276
+
277
+ encoded = ''
278
+ encoded << [
279
+ unicode.length,
280
+ unicode.length,
281
+ 0x20014
282
+ ].pack('vvV')
283
+
284
+ encoded
285
+ end
286
+
287
+ # Encodes the home_directory info (constant)
288
+ #
289
+ # @return [String]
290
+ def encode_home_directory_info
291
+ unicode = Rex::Text.to_unicode('')
292
+ encoded = ''
293
+ encoded << [
294
+ ''.length,
295
+ ''.length
296
+ ].pack('Q<V')
297
+ encoded << unicode
298
+
299
+ encoded
300
+ end
301
+
302
+ # Encodes hte home_directory_drive id
303
+ #
304
+ # @return [String]
305
+ def encode_home_directory_drive
306
+ unicode = Rex::Text.to_unicode('')
307
+
308
+ encoded = ''
309
+ encoded << [
310
+ unicode.length,
311
+ unicode.length,
312
+ 0x20018
313
+ ].pack('vvV')
314
+ encoded
315
+ end
316
+
317
+ # Encodes the home_directory_drive info (constant)
318
+ #
319
+ # @return [String]
320
+ def encode_home_directory_drive_info
321
+ unicode = Rex::Text.to_unicode('')
322
+ encoded = ''
323
+ encoded << [
324
+ ''.length,
325
+ ''.length
326
+ ].pack('Q<V')
327
+ encoded << unicode
328
+
329
+ encoded
330
+ end
331
+
332
+ # Encodes the logon_count (constant)
333
+ #
334
+ # @return [String]
335
+ def encode_logon_count
336
+ [0].pack('v')
337
+ end
338
+
339
+ # Encodes the bad_password_count (constant)
340
+ #
341
+ # @return [String]
342
+ def encode_bad_password_count
343
+ [0].pack('v')
344
+ end
345
+
346
+ # Encodes the user_id field
347
+ #
348
+ # @return [String]
349
+ def encode_user_id
350
+ [user_id].pack('V')
351
+ end
352
+
353
+ # Encodes the primary_group_id field
354
+ #
355
+ # @return [String]
356
+ def encode_primary_group_id
357
+ [primary_group_id].pack('V')
358
+ end
359
+
360
+ # Encodes the group_count field
361
+ #
362
+ # @return [String]
363
+ def encode_group_count
364
+ [group_ids.length].pack('V')
365
+ end
366
+
367
+ # Encodes the group_ids id
368
+ #
369
+ # @return [String]
370
+ def encode_group_ids
371
+ encoded = ''
372
+ encoded << [0x2001c].pack('V')
373
+
374
+ encoded
375
+ end
376
+
377
+ # Encodes the group_ids info
378
+ #
379
+ # @return [String]
380
+ def encode_group_ids_info
381
+ encoded = ''
382
+ encoded << [group_ids.length].pack('V')
383
+ group_ids.each do |group|
384
+ encoded << [
385
+ group,
386
+ SE_GROUP_ALL
387
+ ].pack('VV')
388
+ end
389
+
390
+ encoded
391
+ end
392
+
393
+ # Encodes the user_flags (constant)
394
+ #
395
+ # @return [String]
396
+ def encode_user_flags
397
+ [0].pack('V')
398
+ end
399
+
400
+ # Encodes the user_session_key (constant)
401
+ #
402
+ # @return [String]
403
+ def encode_user_session_key
404
+ [0, 0].pack('Q<Q<')
405
+ end
406
+
407
+ # Encodes the logon_server id
408
+ #
409
+ # @return [String]
410
+ def encode_logon_server
411
+ unicode = Rex::Text.to_unicode('')
412
+
413
+ encoded = ''
414
+ encoded << [
415
+ unicode.length,
416
+ unicode.length,
417
+ 0x20020
418
+ ].pack('vvV')
419
+ encoded
420
+ end
421
+
422
+ # Encodes the logon_server info (constant)
423
+ #
424
+ # @return [String]
425
+ def encode_logon_server_info
426
+ unicode = Rex::Text.to_unicode('')
427
+ encoded = ''
428
+ encoded << [
429
+ ''.length,
430
+ ''.length
431
+ ].pack('Q<V')
432
+ encoded << unicode
433
+
434
+ encoded
435
+ end
436
+
437
+ # Encodes the logon_domain_name id
438
+ #
439
+ # @return [String]
440
+ def encode_logon_domain_name
441
+ unicode = Rex::Text.to_unicode(logon_domain_name)
442
+
443
+ encoded = ''
444
+ encoded << [
445
+ unicode.length,
446
+ unicode.length,
447
+ 0x20024
448
+ ].pack('vvV')
449
+
450
+ encoded
451
+ end
452
+
453
+ # Encodes the logon_domain_name info field
454
+ #
455
+ # @return [String]
456
+ def encode_logon_domain_name_info
457
+ unicode = Rex::Text.to_unicode(logon_domain_name)
458
+ encoded = ''
459
+ encoded << [
460
+ logon_domain_name.length,
461
+ logon_domain_name.length
462
+ ].pack('Q<V')
463
+ encoded << unicode
464
+
465
+ encoded
466
+ end
467
+
468
+ # Encodes the logon_domain_id id
469
+ #
470
+ # @return [String]
471
+ def encode_logon_domain_id
472
+ encoded = ''
473
+ encoded << [0x20028].pack('V')
474
+
475
+ encoded
476
+ end
477
+
478
+ # Encodes the logon_domain_id info field
479
+ #
480
+ # @return [String]
481
+ def encode_logon_domain_id_info
482
+ components = logon_domain_id.split('-')
483
+ unless components[0] == 'S'
484
+ raise ::RuntimeError, 'PAC-LOGON-INFO encoding failed: incorrect LogonDomainId'
485
+ end
486
+ components.slice!(0) # Delete the 'S' component
487
+
488
+ encoded = ''
489
+ encoded << [
490
+ components.length - 2,
491
+ components[0].to_i,
492
+ components.length - 2
493
+ ].pack('VCC')
494
+
495
+ encoded << [
496
+ components[1].to_i >> 16,
497
+ components[1].to_i & 0xffff
498
+ ].pack('Nn')
499
+
500
+ components[2, components.length].each do |c|
501
+ encoded << [c.to_i].pack('V')
502
+ end
503
+
504
+ encoded
505
+ end
506
+
507
+ # Encodes the reserved_one (constant)
508
+ #
509
+ # @return [String]
510
+ def encode_reserved_one
511
+ [0, 0].pack('VV')
512
+ end
513
+
514
+ # Encodes the user_account_control (constant)
515
+ #
516
+ # @return [String]
517
+ def encode_user_account_control
518
+ [USER_NORMAL_ACCOUNT | USER_DONT_EXPIRE_PASSWORD].pack('V')
519
+ end
520
+
521
+ # Encodes the reserved_three (constant)
522
+ #
523
+ # @return [String]
524
+ def encode_reserved_three
525
+ [0, 0, 0, 0, 0, 0, 0].pack('V*')
526
+ end
527
+
528
+ # Encodes the sid_count (constant)
529
+ #
530
+ # @return [String]
531
+ def encode_sid_count
532
+ [0].pack('V')
533
+ end
534
+
535
+ # Encodes the extra_sids (constant)
536
+ #
537
+ # @return [String]
538
+ def encode_extra_sids
539
+ [0].pack('V')
540
+ end
541
+
542
+ # Encodes the resource_group_domain_sid (constant)
543
+ #
544
+ # @return [String]
545
+ def encode_resource_group_domain_sid
546
+ [0].pack('V')
547
+ end
548
+
549
+ # Encodes the resource_group_count (constant)
550
+ #
551
+ # @return [String]
552
+ def encode_resource_group_count
553
+ [0].pack('V')
554
+ end
555
+
556
+ # Encodes the resource_group_ids (constant)
557
+ #
558
+ # @return [String]
559
+ def encode_resource_group_ids
560
+ [0].pack('V')
561
+ end
562
+ end
563
+ end
564
+ end
565
+ end
566
+ end