rex 2.0.8 → 2.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rex.rb +1 -0
- data/lib/rex/arch.rb +5 -0
- data/lib/rex/arch/x86.rb +19 -5
- data/lib/rex/arch/zarch.rb +17 -0
- data/lib/rex/compat.rb +5 -4
- data/lib/rex/constants.rb +3 -1
- data/lib/rex/encoder/alpha2/alpha_mixed.rb +70 -9
- data/lib/rex/encoder/alpha2/alpha_upper.rb +67 -8
- data/lib/rex/exploitation/cmdstager.rb +1 -0
- data/lib/rex/exploitation/cmdstager/certutil.rb +115 -0
- data/lib/rex/exploitation/cmdstager/echo.rb +6 -3
- data/lib/rex/exploitation/egghunter.rb +1 -1
- data/lib/rex/google/geolocation.rb +68 -0
- data/lib/rex/io/bidirectional_pipe.rb +0 -4
- data/lib/rex/java/serialization.rb +2 -0
- data/lib/rex/java/serialization/decode_error.rb +11 -0
- data/lib/rex/java/serialization/encode_error.rb +11 -0
- data/lib/rex/java/serialization/model.rb +2 -0
- data/lib/rex/java/serialization/model/annotation.rb +3 -3
- data/lib/rex/java/serialization/model/block_data.rb +3 -3
- data/lib/rex/java/serialization/model/block_data_long.rb +3 -3
- data/lib/rex/java/serialization/model/class_desc.rb +6 -6
- data/lib/rex/java/serialization/model/contents.rb +17 -10
- data/lib/rex/java/serialization/model/field.rb +12 -11
- data/lib/rex/java/serialization/model/long_utf.rb +3 -3
- data/lib/rex/java/serialization/model/new_array.rb +22 -23
- data/lib/rex/java/serialization/model/new_class.rb +57 -0
- data/lib/rex/java/serialization/model/new_class_desc.rb +15 -16
- data/lib/rex/java/serialization/model/new_enum.rb +5 -5
- data/lib/rex/java/serialization/model/new_object.rb +22 -17
- data/lib/rex/java/serialization/model/proxy_class_desc.rb +109 -0
- data/lib/rex/java/serialization/model/reference.rb +4 -4
- data/lib/rex/java/serialization/model/stream.rb +7 -7
- data/lib/rex/java/serialization/model/utf.rb +3 -3
- data/lib/rex/json_hash_file.rb +94 -0
- data/lib/rex/logging/log_sink.rb +1 -0
- data/lib/rex/logging/sinks/timestamp_flatfile.rb +21 -0
- data/lib/rex/parser/appscan_nokogiri.rb +13 -23
- data/lib/rex/parser/fs/ntfs.rb +10 -5
- data/lib/rex/parser/nmap_nokogiri.rb +3 -1
- data/lib/rex/parser/openvas_nokogiri.rb +70 -73
- data/lib/rex/parser/winscp.rb +108 -0
- data/lib/rex/parser/x509_certificate.rb +92 -0
- data/lib/rex/payloads.rb +0 -1
- data/lib/rex/payloads/meterpreter/config.rb +154 -0
- data/lib/rex/payloads/meterpreter/uri_checksum.rb +136 -0
- data/lib/rex/post/meterpreter.rb +1 -1
- data/lib/rex/post/meterpreter/client.rb +26 -3
- data/lib/rex/post/meterpreter/client_core.rb +387 -75
- data/lib/rex/post/meterpreter/extensions/android/android.rb +127 -37
- data/lib/rex/post/meterpreter/extensions/android/tlv.rb +46 -25
- data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +4 -0
- data/lib/rex/post/meterpreter/extensions/extapi/ntds/ntds.rb +39 -0
- data/lib/rex/post/meterpreter/extensions/extapi/pageant/pageant.rb +44 -0
- data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +9 -0
- data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +16 -1
- data/lib/rex/post/meterpreter/extensions/priv/priv.rb +1 -1
- data/lib/rex/post/meterpreter/extensions/python/python.rb +114 -0
- data/lib/rex/post/meterpreter/extensions/python/tlv.rb +21 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +17 -14
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +33 -12
- data/lib/rex/post/meterpreter/extensions/stdapi/fs/mount.rb +57 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3 -3
- data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +3 -1
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +2 -0
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +16 -3
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +29 -6
- data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +5 -1
- data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +18 -6
- data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +2 -2
- data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +34 -36
- data/lib/rex/post/meterpreter/packet.rb +29 -0
- data/lib/rex/post/meterpreter/packet_dispatcher.rb +20 -7
- data/lib/rex/post/meterpreter/ui/console.rb +1 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +230 -72
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +544 -34
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +188 -57
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +115 -93
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +1 -1
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +1 -1
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +49 -15
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +11 -2
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/python.rb +187 -0
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +324 -133
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +52 -2
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +68 -65
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +9 -1
- data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +113 -118
- data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +3 -0
- data/lib/rex/powershell.rb +62 -0
- data/lib/rex/powershell/command.rb +359 -0
- data/lib/rex/{exploitation/powershell → powershell}/function.rb +0 -2
- data/lib/rex/{exploitation/powershell → powershell}/obfu.rb +0 -2
- data/lib/rex/{exploitation/powershell → powershell}/output.rb +11 -5
- data/lib/rex/{exploitation/powershell → powershell}/param.rb +0 -2
- data/lib/rex/powershell/parser.rb +182 -0
- data/lib/rex/powershell/payload.rb +78 -0
- data/lib/rex/{exploitation/powershell → powershell}/psh_methods.rb +16 -2
- data/lib/rex/{exploitation/powershell → powershell}/script.rb +2 -4
- data/lib/rex/proto/dcerpc/client.rb +6 -6
- data/lib/rex/proto/dcerpc/exceptions.rb +26 -0
- data/lib/rex/proto/http/client.rb +3 -3
- data/lib/rex/proto/http/client_request.rb +0 -5
- data/lib/rex/proto/http/response.rb +86 -0
- data/lib/rex/proto/ipmi/utils.rb +30 -26
- data/lib/rex/proto/kerberos/client.rb +1 -1
- data/lib/rex/proto/kerberos/model/kdc_request.rb +2 -2
- data/lib/rex/proto/rfb/client.rb +8 -3
- data/lib/rex/proto/rfb/constants.rb +1 -1
- data/lib/rex/proto/rmi.rb +2 -0
- data/lib/rex/proto/rmi/decode_error.rb +10 -0
- data/lib/rex/proto/rmi/exception.rb +10 -0
- data/lib/rex/proto/rmi/model.rb +5 -0
- data/lib/rex/proto/rmi/model/call.rb +4 -4
- data/lib/rex/proto/rmi/model/call_data.rb +137 -0
- data/lib/rex/proto/rmi/model/dgc_ack.rb +2 -2
- data/lib/rex/proto/rmi/model/element.rb +26 -11
- data/lib/rex/proto/rmi/model/output_header.rb +4 -4
- data/lib/rex/proto/rmi/model/ping.rb +2 -2
- data/lib/rex/proto/rmi/model/ping_ack.rb +2 -2
- data/lib/rex/proto/rmi/model/protocol_ack.rb +2 -2
- data/lib/rex/proto/rmi/model/return_data.rb +5 -5
- data/lib/rex/proto/rmi/model/return_value.rb +124 -0
- data/lib/rex/proto/rmi/model/unique_identifier.rb +77 -0
- data/lib/rex/proto/steam.rb +3 -0
- data/lib/rex/proto/steam/message.rb +125 -0
- data/lib/rex/proto/tftp/client.rb +35 -14
- data/lib/rex/random_identifier_generator.rb +2 -0
- data/lib/rex/ropbuilder.rb +1 -1
- data/lib/rex/socket/parameters.rb +9 -0
- data/lib/rex/socket/ssl_tcp.rb +25 -41
- data/lib/rex/socket/ssl_tcp_server.rb +10 -21
- data/lib/rex/sslscan/result.rb +20 -1
- data/lib/rex/text.rb +241 -55
- data/lib/rex/ui/output.rb +0 -3
- data/lib/rex/ui/subscriber.rb +0 -10
- data/lib/rex/ui/text/color.rb +9 -0
- data/lib/rex/ui/text/dispatcher_shell.rb +1 -0
- data/lib/rex/ui/text/output.rb +15 -4
- data/lib/rex/ui/text/output/file.rb +1 -0
- data/lib/rex/ui/text/output/stdio.rb +0 -16
- data/lib/rex/ui/text/shell.rb +3 -0
- data/lib/rex/ui/text/table.rb +85 -19
- data/lib/rex/user_agent.rb +118 -0
- data/rex.gemspec +2 -2
- metadata +41 -14
- data/lib/rex/exploitation/powershell.rb +0 -62
- data/lib/rex/exploitation/powershell/parser.rb +0 -183
- data/lib/rex/payloads/meterpreter.rb +0 -2
- data/lib/rex/payloads/meterpreter/patch.rb +0 -136
@@ -11,11 +11,11 @@ module Rex
|
|
11
11
|
#
|
12
12
|
# @param io [IO] the io to read from
|
13
13
|
# @return [self] if deserialization succeeds
|
14
|
-
# @
|
14
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
15
15
|
def decode(io)
|
16
16
|
raw_length = io.read(8)
|
17
17
|
if raw_length.nil? || raw_length.length != 8
|
18
|
-
raise ::
|
18
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize LongUtf'
|
19
19
|
end
|
20
20
|
self.length = raw_length.unpack('Q>')[0]
|
21
21
|
|
@@ -24,7 +24,7 @@ module Rex
|
|
24
24
|
else
|
25
25
|
self.contents = io.read(length)
|
26
26
|
if contents.nil? || contents.length != length
|
27
|
-
raise ::
|
27
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize LongUtf'
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -31,7 +31,7 @@ module Rex
|
|
31
31
|
#
|
32
32
|
# @param io [IO] the io to read from
|
33
33
|
# @return [self] if deserialization succeeds
|
34
|
-
# @raise [
|
34
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
35
35
|
def decode(io)
|
36
36
|
self.array_description = ClassDesc.decode(io, stream)
|
37
37
|
stream.add_reference(self) unless stream.nil?
|
@@ -50,10 +50,10 @@ module Rex
|
|
50
50
|
# Serializes the Rex::Java::Serialization::Model::NewArray
|
51
51
|
#
|
52
52
|
# @return [String] if serialization succeeds
|
53
|
-
# @raise [
|
53
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
|
54
54
|
def encode
|
55
55
|
unless array_description.kind_of?(ClassDesc)
|
56
|
-
raise ::
|
56
|
+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize NewArray'
|
57
57
|
end
|
58
58
|
|
59
59
|
encoded = ''
|
@@ -83,11 +83,11 @@ module Rex
|
|
83
83
|
#
|
84
84
|
# @param io [IO] the io to read from
|
85
85
|
# @return [Integer] if deserialization succeeds
|
86
|
-
# @raise [
|
86
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
87
87
|
def decode_values_length(io)
|
88
88
|
values_length = io.read(4)
|
89
89
|
if values_length.nil? || values_length.length != 4
|
90
|
-
raise ::
|
90
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize NewArray'
|
91
91
|
end
|
92
92
|
|
93
93
|
values_length.unpack('N')[0]
|
@@ -96,15 +96,15 @@ module Rex
|
|
96
96
|
# Extracts the NewArray data type
|
97
97
|
#
|
98
98
|
# @return [String]
|
99
|
-
# @raise [
|
100
|
-
#
|
99
|
+
# @raise [Rex::Java::Serialization::DecodeError] if the NewArray description isn't valid
|
100
|
+
# or type isn't supported
|
101
101
|
def array_type
|
102
102
|
if array_description.nil?
|
103
|
-
raise ::
|
103
|
+
raise Rex::Java::Serialization::DecodeError, 'Empty NewArray description'
|
104
104
|
end
|
105
105
|
|
106
106
|
unless array_description.kind_of?(ClassDesc)
|
107
|
-
raise ::
|
107
|
+
raise Rex::Java::Serialization::DecodeError, 'Unsupported NewArray description class'
|
108
108
|
end
|
109
109
|
|
110
110
|
desc = array_description.description
|
@@ -115,7 +115,7 @@ module Rex
|
|
115
115
|
end
|
116
116
|
|
117
117
|
unless desc.class_name.contents[0] == '[' # Array
|
118
|
-
raise ::
|
118
|
+
raise Rex::Java::Serialization::DecodeError, 'Unsupported NewArray description'
|
119
119
|
end
|
120
120
|
|
121
121
|
decoded_type = desc.class_name.contents[1]
|
@@ -124,7 +124,7 @@ module Rex
|
|
124
124
|
elsif decoded_type == 'L' # L : Object
|
125
125
|
return desc.class_name.contents[2..desc.class_name.contents.index(';')] # Object class
|
126
126
|
else
|
127
|
-
raise ::
|
127
|
+
raise Rex::Java::Serialization::DecodeError, 'Unsupported NewArray Type'
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
@@ -132,54 +132,54 @@ module Rex
|
|
132
132
|
#
|
133
133
|
# @param io [IO] the io to read from
|
134
134
|
# @return [Fixnum, Float] if deserialization succeeds
|
135
|
-
# @raise [
|
135
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization fails
|
136
136
|
def decode_value(io)
|
137
137
|
value = nil
|
138
138
|
|
139
139
|
case type
|
140
140
|
when 'byte'
|
141
141
|
value = io.read(1)
|
142
|
-
raise ::
|
142
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value' if value.nil?
|
143
143
|
value = value.unpack('c')[0]
|
144
144
|
when 'char'
|
145
145
|
value = io.read(2)
|
146
146
|
unless value && value.length == 2
|
147
|
-
raise ::
|
147
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
148
148
|
end
|
149
149
|
value = value.unpack('s>')[0]
|
150
150
|
when 'double'
|
151
151
|
value = io.read(8)
|
152
152
|
unless value && value.length == 8
|
153
|
-
raise ::
|
153
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
154
154
|
end
|
155
155
|
value = value.unpack('G')[0]
|
156
156
|
when 'float'
|
157
157
|
value = io.read(4)
|
158
158
|
unless value && value.length == 4
|
159
|
-
raise ::
|
159
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
160
160
|
end
|
161
161
|
value = value.unpack('g')[0]
|
162
162
|
when 'int'
|
163
163
|
value = io.read(4)
|
164
164
|
unless value && value.length == 4
|
165
|
-
raise ::
|
165
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
166
166
|
end
|
167
167
|
value = value.unpack('l>')[0]
|
168
168
|
when 'long'
|
169
169
|
value = io.read(8)
|
170
170
|
unless value && value.length == 8
|
171
|
-
raise ::
|
171
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
172
172
|
end
|
173
173
|
value = value.unpack('q>')[0]
|
174
174
|
when 'short'
|
175
175
|
value = io.read(2)
|
176
176
|
unless value && value.length == 2
|
177
|
-
raise ::
|
177
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
178
178
|
end
|
179
179
|
value = value.unpack('s>')[0]
|
180
180
|
when 'boolean'
|
181
181
|
value = io.read(1)
|
182
|
-
raise ::
|
182
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value' if value.nil?
|
183
183
|
value = value.unpack('c')[0]
|
184
184
|
else # object
|
185
185
|
value = decode_content(io, stream)
|
@@ -190,10 +190,9 @@ module Rex
|
|
190
190
|
|
191
191
|
# Serializes an NewArray value
|
192
192
|
#
|
193
|
-
# @param value [Fixnum] the value to serialize
|
194
|
-
# @param value [Float] the value to serialize
|
193
|
+
# @param value [<Fixnum, Float>] the value to serialize
|
195
194
|
# @return [String] the serialized value
|
196
|
-
# @raise [
|
195
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization fails
|
197
196
|
def encode_value(value)
|
198
197
|
res = ''
|
199
198
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
module Rex
|
4
|
+
module Java
|
5
|
+
module Serialization
|
6
|
+
module Model
|
7
|
+
# This class provides a NewArray (Java Array) representation
|
8
|
+
class NewClass < Element
|
9
|
+
|
10
|
+
include Rex::Java::Serialization::Model::Contents
|
11
|
+
|
12
|
+
# @!attribute array_description
|
13
|
+
# @return [Java::Serialization::Model::ClassDesc] The description of the class
|
14
|
+
attr_accessor :class_description
|
15
|
+
|
16
|
+
# @param stream [Rex::Java::Serialization::Model::Stream] the stream where it belongs to
|
17
|
+
def initialize(stream = nil)
|
18
|
+
super(stream)
|
19
|
+
self.class_description = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
# Deserializes a Rex::Java::Serialization::Model::NewClass
|
23
|
+
#
|
24
|
+
# @param io [IO] the io to read from
|
25
|
+
# @return [self] if deserialization succeeds
|
26
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
27
|
+
def decode(io)
|
28
|
+
self.class_description = ClassDesc.decode(io, stream)
|
29
|
+
stream.add_reference(self) unless stream.nil?
|
30
|
+
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
# Serializes the Rex::Java::Serialization::Model::NewClass
|
35
|
+
#
|
36
|
+
# @return [String] if serialization succeeds
|
37
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
|
38
|
+
def encode
|
39
|
+
unless class_description.kind_of?(ClassDesc)
|
40
|
+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize NewClass'
|
41
|
+
end
|
42
|
+
|
43
|
+
encoded = ''
|
44
|
+
encoded << class_description.encode
|
45
|
+
end
|
46
|
+
|
47
|
+
# Creates a print-friendly string representation
|
48
|
+
#
|
49
|
+
# @return [String]
|
50
|
+
def to_s
|
51
|
+
print_content(class_description)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -12,16 +12,16 @@ module Rex
|
|
12
12
|
# @!attribute class_name
|
13
13
|
# @return [Rex::Java::Serialization::Model::Utf] The name of the class
|
14
14
|
attr_accessor :class_name
|
15
|
-
# @!attribute
|
16
|
-
# @return [
|
15
|
+
# @!attribute serial_version
|
16
|
+
# @return [Fixnum] The java class serial version
|
17
17
|
attr_accessor :serial_version
|
18
18
|
# @!attribute flags
|
19
|
-
# @return [
|
19
|
+
# @return [Fixnum] The java class flags
|
20
20
|
attr_accessor :flags
|
21
21
|
# @!attribute fields
|
22
22
|
# @return [Array] The java class fields
|
23
23
|
attr_accessor :fields
|
24
|
-
# @!attribute
|
24
|
+
# @!attribute class_annotation
|
25
25
|
# @return [Rex::Java::Serialization::Model::Annotation] The java class annotations
|
26
26
|
attr_accessor :class_annotation
|
27
27
|
# @!attribute super_class
|
@@ -39,11 +39,11 @@ module Rex
|
|
39
39
|
self.super_class = nil
|
40
40
|
end
|
41
41
|
|
42
|
-
# Deserializes a Rex::Java::Serialization::Model::
|
42
|
+
# Deserializes a Rex::Java::Serialization::Model::NewClassDesc
|
43
43
|
#
|
44
44
|
# @param io [IO] the io to read from
|
45
45
|
# @return [self] if deserialization succeeds
|
46
|
-
# @raise [
|
46
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
47
47
|
def decode(io)
|
48
48
|
self.class_name = Utf.decode(io, stream)
|
49
49
|
self.serial_version = decode_serial_version(io)
|
@@ -64,17 +64,16 @@ module Rex
|
|
64
64
|
# Serializes the Rex::Java::Serialization::Model::ClassDescription
|
65
65
|
#
|
66
66
|
# @return [String] if serialization succeeds
|
67
|
-
# @raise [
|
67
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
|
68
68
|
def encode
|
69
69
|
unless class_name.class == Rex::Java::Serialization::Model::Utf ||
|
70
70
|
class_annotation.class == Rex::Java::Serialization::Model::Annotation ||
|
71
71
|
super_class.class == Rex::Java::Serialization::Model::ClassDesc
|
72
|
-
raise ::
|
72
|
+
raise Rex::Java::Serialization::EncodeError, 'Filed to serialize NewClassDesc'
|
73
73
|
end
|
74
74
|
encoded = ''
|
75
75
|
encoded << class_name.encode
|
76
|
-
encoded << [serial_version].pack('
|
77
|
-
stream.add_reference(self) unless stream.nil?
|
76
|
+
encoded << [serial_version].pack('q>')
|
78
77
|
encoded << [flags].pack('C')
|
79
78
|
encoded << [fields.length].pack('n')
|
80
79
|
fields.each do |field|
|
@@ -113,11 +112,11 @@ module Rex
|
|
113
112
|
#
|
114
113
|
# @param io [IO] the io to read from
|
115
114
|
# @return [Integer] if deserialization succeeds
|
116
|
-
# @raise [
|
115
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
117
116
|
def decode_serial_version(io)
|
118
117
|
raw_serial = io.read(8)
|
119
118
|
if raw_serial.nil? || raw_serial.length != 8
|
120
|
-
raise ::
|
119
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize ClassDescription'
|
121
120
|
end
|
122
121
|
|
123
122
|
raw_serial.unpack('Q>')[0]
|
@@ -127,10 +126,10 @@ module Rex
|
|
127
126
|
#
|
128
127
|
# @param io [IO] the io to read from
|
129
128
|
# @return [Integer] if deserialization is possible
|
130
|
-
# @raise [
|
129
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
131
130
|
def decode_flags(io)
|
132
131
|
raw_flags = io.read(1)
|
133
|
-
raise ::
|
132
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize ClassDescription' if raw_flags.nil?
|
134
133
|
|
135
134
|
raw_flags.unpack('C')[0]
|
136
135
|
end
|
@@ -139,11 +138,11 @@ module Rex
|
|
139
138
|
#
|
140
139
|
# @param io [IO] the io to read from
|
141
140
|
# @return [Integer] if deserialization is possible
|
142
|
-
# @raise [
|
141
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
143
142
|
def decode_fields_length(io)
|
144
143
|
fields_length = io.read(2)
|
145
144
|
if fields_length.nil? || fields_length.length != 2
|
146
|
-
raise ::
|
145
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize ClassDescription'
|
147
146
|
end
|
148
147
|
|
149
148
|
fields_length.unpack('n')[0]
|
@@ -27,7 +27,7 @@ module Rex
|
|
27
27
|
#
|
28
28
|
# @param io [IO] the io to read from
|
29
29
|
# @return [self] if deserialization succeeds
|
30
|
-
# @raise [
|
30
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
31
31
|
def decode(io)
|
32
32
|
self.enum_description = ClassDesc.decode(io, stream)
|
33
33
|
stream.add_reference(self) unless stream.nil?
|
@@ -39,11 +39,11 @@ module Rex
|
|
39
39
|
# Serializes the Rex::Java::Serialization::Model::NewEnum
|
40
40
|
#
|
41
41
|
# @return [String] if serialization succeeds
|
42
|
-
# @raise [
|
42
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
|
43
43
|
def encode
|
44
44
|
unless enum_description.kind_of?(ClassDesc) &&
|
45
45
|
constant_name.kind_of?(Utf)
|
46
|
-
raise ::
|
46
|
+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize EnumDescription'
|
47
47
|
end
|
48
48
|
|
49
49
|
encoded = ''
|
@@ -65,10 +65,10 @@ module Rex
|
|
65
65
|
#
|
66
66
|
# @param io [IO] the io to read from
|
67
67
|
# @return [Rex::Java::Serialization::Model::Utf] if deserialization succeeds
|
68
|
-
# @raise [
|
68
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succed
|
69
69
|
def decode_constant_name(io)
|
70
70
|
content = decode_content(io, stream)
|
71
|
-
raise ::
|
71
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize NewEnum' unless content.kind_of?(Rex::Java::Serialization::Model::Utf)
|
72
72
|
|
73
73
|
content
|
74
74
|
end
|
@@ -27,7 +27,7 @@ module Rex
|
|
27
27
|
#
|
28
28
|
# @param io [IO] the io to read from
|
29
29
|
# @return [self] if deserialization succeeds
|
30
|
-
# @raise [
|
30
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
31
31
|
def decode(io)
|
32
32
|
self.class_desc = ClassDesc.decode(io, stream)
|
33
33
|
stream.add_reference(self) unless stream.nil?
|
@@ -46,10 +46,10 @@ module Rex
|
|
46
46
|
# Serializes the Rex::Java::Serialization::Model::NewObject
|
47
47
|
#
|
48
48
|
# @return [String] if serialization succeeds
|
49
|
-
# @raise [
|
49
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
|
50
50
|
def encode
|
51
51
|
unless class_desc.kind_of?(ClassDesc)
|
52
|
-
raise ::
|
52
|
+
raise Rex::Java::Serialization::EncodeError, 'Failed to serialize NewObject'
|
53
53
|
end
|
54
54
|
|
55
55
|
encoded = ''
|
@@ -71,9 +71,12 @@ module Rex
|
|
71
71
|
# @return [String]
|
72
72
|
def to_s
|
73
73
|
str = ''
|
74
|
+
|
74
75
|
case class_desc.description
|
75
76
|
when NewClassDesc
|
76
77
|
str << class_desc.description.class_name.to_s
|
78
|
+
when ProxyClassDesc
|
79
|
+
str << class_desc.description.interfaces.collect { |iface| iface.contents }.join(',')
|
77
80
|
when Reference
|
78
81
|
str << (class_desc.description.handle - BASE_WIRE_HANDLE).to_s(16)
|
79
82
|
end
|
@@ -82,6 +85,8 @@ module Rex
|
|
82
85
|
data_str = class_data.collect { |data| data.to_s }
|
83
86
|
str << data_str.join(', ')
|
84
87
|
str << ' }'
|
88
|
+
|
89
|
+
str
|
85
90
|
end
|
86
91
|
|
87
92
|
private
|
@@ -91,7 +96,7 @@ module Rex
|
|
91
96
|
# @param io [IO] the io to read from
|
92
97
|
# @param my_class_desc [Rex::Java::Serialization::Model::NewClassDesc] the class description whose data is being extracted
|
93
98
|
# @return [Array] class_data values if deserialization succeeds
|
94
|
-
# @raise [
|
99
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
95
100
|
def decode_class_data(io, my_class_desc)
|
96
101
|
values = []
|
97
102
|
|
@@ -114,7 +119,7 @@ module Rex
|
|
114
119
|
# @param io [IO] the io to read from
|
115
120
|
# @param my_class_desc [Rex::Java::Serialization::Model::NewClassDesc] the class description whose data is being extracted
|
116
121
|
# @return [Array] class_data values if deserialization succeeds
|
117
|
-
# @raise [
|
122
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
|
118
123
|
def decode_class_fields(io, my_class_desc)
|
119
124
|
values = []
|
120
125
|
|
@@ -135,57 +140,57 @@ module Rex
|
|
135
140
|
# @param io [IO] the io to read from
|
136
141
|
# @param type [String] the type of the value to deserialize
|
137
142
|
# @return [Array(String, <Fixnum, Float>)] type and value if deserialization succeeds
|
138
|
-
# @raise [
|
143
|
+
# @raise [Rex::Java::Serialization::DecodeError] if deserialization fails
|
139
144
|
def decode_value(io, type)
|
140
145
|
value = []
|
141
146
|
|
142
147
|
case type
|
143
148
|
when 'byte'
|
144
149
|
value_raw = io.read(1)
|
145
|
-
raise ::
|
150
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value' if value_raw.nil?
|
146
151
|
value.push('byte', value_raw.unpack('c')[0])
|
147
152
|
when 'char'
|
148
153
|
value_raw = io.read(2)
|
149
154
|
unless value_raw && value_raw.length == 2
|
150
|
-
raise ::
|
155
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
151
156
|
end
|
152
157
|
value.push('char', value_raw.unpack('s>')[0])
|
153
158
|
when 'double'
|
154
159
|
value_raw = io.read(8)
|
155
160
|
unless value_raw && value_raw.length == 8
|
156
|
-
raise ::
|
161
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
157
162
|
end
|
158
163
|
value.push('double', value = value_raw.unpack('G')[0])
|
159
164
|
when 'float'
|
160
165
|
value_raw = io.read(4)
|
161
166
|
unless value_raw && value_raw.length == 4
|
162
|
-
raise ::
|
167
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
163
168
|
end
|
164
169
|
value.push('float', value_raw.unpack('g')[0])
|
165
170
|
when 'int'
|
166
171
|
value_raw = io.read(4)
|
167
172
|
unless value_raw && value_raw.length == 4
|
168
|
-
raise ::
|
173
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
169
174
|
end
|
170
175
|
value.push('int', value_raw.unpack('l>')[0])
|
171
176
|
when 'long'
|
172
177
|
value_raw = io.read(8)
|
173
178
|
unless value_raw && value_raw.length == 8
|
174
|
-
raise ::
|
179
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
175
180
|
end
|
176
181
|
value.push('long', value_raw.unpack('q>')[0])
|
177
182
|
when 'short'
|
178
183
|
value_raw = io.read(2)
|
179
184
|
unless value_raw && value_raw.length == 2
|
180
|
-
raise ::
|
185
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value'
|
181
186
|
end
|
182
187
|
value.push('short', value_raw.unpack('s>')[0])
|
183
188
|
when 'boolean'
|
184
189
|
value_raw = io.read(1)
|
185
|
-
raise ::
|
190
|
+
raise Rex::Java::Serialization::DecodeError, 'Failed to deserialize NewArray value' if value_raw.nil?
|
186
191
|
value.push('boolean', value_raw.unpack('c')[0])
|
187
192
|
else
|
188
|
-
raise ::
|
193
|
+
raise Rex::Java::Serialization::DecodeError, 'Unsupported NewArray type'
|
189
194
|
end
|
190
195
|
|
191
196
|
value
|
@@ -195,7 +200,7 @@ module Rex
|
|
195
200
|
#
|
196
201
|
# @param value [Array] the type and value to serialize
|
197
202
|
# @return [String] the serialized value
|
198
|
-
# @raise [
|
203
|
+
# @raise [Rex::Java::Serialization::EncodeError] if serialization fails
|
199
204
|
def encode_value(value)
|
200
205
|
res = ''
|
201
206
|
|
@@ -217,7 +222,7 @@ module Rex
|
|
217
222
|
when 'boolean'
|
218
223
|
res = [value[1]].pack('c')
|
219
224
|
else
|
220
|
-
raise ::
|
225
|
+
raise Rex::Java::Serialization::EncodeError, 'Unsupported NewArray type'
|
221
226
|
end
|
222
227
|
|
223
228
|
res
|