rex 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rex/arch/x86.rb +16 -0
  3. data/lib/rex/constants.rb +1 -0
  4. data/lib/rex/constants/windows.rb +147 -0
  5. data/lib/rex/encoder/xdr.rb +3 -2
  6. data/lib/rex/exceptions.rb +37 -5
  7. data/lib/rex/exploitation/cmdstager/bourne.rb +9 -1
  8. data/lib/rex/exploitation/cmdstager/tftp.rb +5 -5
  9. data/lib/rex/java.rb +3 -0
  10. data/lib/rex/java/serialization.rb +54 -0
  11. data/lib/rex/java/serialization/model.rb +20 -0
  12. data/lib/rex/java/serialization/model/annotation.rb +69 -0
  13. data/lib/rex/java/serialization/model/block_data.rb +70 -0
  14. data/lib/rex/java/serialization/model/block_data_long.rb +72 -0
  15. data/lib/rex/java/serialization/model/class_desc.rb +64 -0
  16. data/lib/rex/java/serialization/model/contents.rb +156 -0
  17. data/lib/rex/java/serialization/model/element.rb +44 -0
  18. data/lib/rex/java/serialization/model/end_block_data.rb +12 -0
  19. data/lib/rex/java/serialization/model/field.rb +172 -0
  20. data/lib/rex/java/serialization/model/long_utf.rb +48 -0
  21. data/lib/rex/java/serialization/model/new_array.rb +225 -0
  22. data/lib/rex/java/serialization/model/new_class_desc.rb +155 -0
  23. data/lib/rex/java/serialization/model/new_enum.rb +79 -0
  24. data/lib/rex/java/serialization/model/new_object.rb +223 -0
  25. data/lib/rex/java/serialization/model/null_reference.rb +12 -0
  26. data/lib/rex/java/serialization/model/reference.rb +61 -0
  27. data/lib/rex/java/serialization/model/reset.rb +12 -0
  28. data/lib/rex/java/serialization/model/stream.rb +123 -0
  29. data/lib/rex/java/serialization/model/utf.rb +69 -0
  30. data/lib/rex/mime/message.rb +9 -14
  31. data/lib/rex/payloads.rb +1 -0
  32. data/lib/rex/payloads/meterpreter.rb +2 -0
  33. data/lib/rex/payloads/meterpreter/patch.rb +136 -0
  34. data/lib/rex/payloads/win32/kernel/stager.rb +26 -25
  35. data/lib/rex/post/meterpreter/client.rb +50 -60
  36. data/lib/rex/post/meterpreter/client_core.rb +18 -25
  37. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +102 -8
  38. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +24 -14
  39. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +18 -0
  40. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +1 -0
  41. data/lib/rex/post/meterpreter/packet_dispatcher.rb +1 -1
  42. data/lib/rex/post/meterpreter/ui/console.rb +1 -1
  43. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +43 -1
  44. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +1 -1
  45. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +9 -0
  46. data/lib/rex/proto/dcerpc/svcctl.rb +2 -0
  47. data/lib/rex/proto/dcerpc/svcctl/packet.rb +304 -0
  48. data/lib/rex/proto/kademlia.rb +8 -0
  49. data/lib/rex/proto/kademlia/bootstrap_request.rb +19 -0
  50. data/lib/rex/proto/kademlia/bootstrap_response.rb +79 -0
  51. data/lib/rex/proto/kademlia/message.rb +72 -0
  52. data/lib/rex/proto/kademlia/ping.rb +19 -0
  53. data/lib/rex/proto/kademlia/pong.rb +41 -0
  54. data/lib/rex/proto/kademlia/util.rb +22 -0
  55. data/lib/rex/proto/natpmp/packet.rb +30 -2
  56. data/lib/rex/proto/quake.rb +3 -0
  57. data/lib/rex/proto/quake/message.rb +73 -0
  58. data/lib/rex/proto/smb/client.rb +1 -0
  59. data/lib/rex/proto/smb/simpleclient.rb +4 -0
  60. data/lib/rex/proto/sunrpc/client.rb +14 -3
  61. data/lib/rex/socket/comm/local.rb +10 -7
  62. data/lib/rex/socket/ssl_tcp_server.rb +79 -40
  63. data/lib/rex/ui/text/input/readline.rb +33 -6
  64. data/lib/rex/ui/text/output/file.rb +2 -2
  65. data/lib/rex/ui/text/output/stdio.rb +70 -14
  66. data/rex.gemspec +1 -1
  67. metadata +38 -3
@@ -0,0 +1,223 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ # This class provides a NewObject (Java Object) representation
8
+ class NewObject < Element
9
+
10
+ include Rex::Java::Serialization::Model::Contents
11
+
12
+ # @!attribute class_desc
13
+ # @return [Rex::Java::Serialization::Model::ClassDesc] The description of the object
14
+ attr_accessor :class_desc
15
+ # @!attribute class_data
16
+ # @return [Array] The data of the object
17
+ attr_accessor :class_data
18
+
19
+ # @param stream [Rex::Java::Serialization::Model::Stream] the stream where it belongs to
20
+ def initialize(stream = nil)
21
+ super(stream)
22
+ self.class_desc = nil
23
+ self.class_data = []
24
+ end
25
+
26
+ # Deserializes a Rex::Java::Serialization::Model::NewObject
27
+ #
28
+ # @param io [IO] the io to read from
29
+ # @return [self] if deserialization succeeds
30
+ # @raise [RuntimeError] if deserialization doesn't succeed
31
+ def decode(io)
32
+ self.class_desc = ClassDesc.decode(io, stream)
33
+ stream.add_reference(self) unless stream.nil?
34
+
35
+ if class_desc.description.class == NewClassDesc
36
+ self.class_data = decode_class_data(io, class_desc.description)
37
+ elsif class_desc.description.class == Reference
38
+ ref = class_desc.description.handle - BASE_WIRE_HANDLE
39
+ self.class_data = decode_class_data(io, stream.references[ref])
40
+ end
41
+
42
+ self
43
+ end
44
+
45
+ # Serializes the Rex::Java::Serialization::Model::NewObject
46
+ #
47
+ # @return [String] if serialization succeeds
48
+ # @raise [RuntimeError] if serialization doesn't succeed
49
+ def encode
50
+ unless class_desc.class == ClassDesc
51
+ raise ::RuntimeError, 'Failed to serialize NewObject'
52
+ end
53
+
54
+ encoded = ''
55
+ encoded << class_desc.encode
56
+
57
+ class_data.each do |value|
58
+ if value.class == Array
59
+ encoded << encode_value(value)
60
+ else
61
+ encoded << encode_content(value)
62
+ end
63
+ end
64
+
65
+ encoded
66
+ end
67
+
68
+ # Creates a print-friendly string representation
69
+ #
70
+ # @return [String]
71
+ def to_s
72
+ str = ''
73
+ if class_desc.description.class == NewClassDesc
74
+ str << class_desc.description.class_name.to_s
75
+ elsif class_desc.description.class == Reference
76
+ str << (class_desc.description.handle - BASE_WIRE_HANDLE).to_s(16)
77
+ end
78
+
79
+ str << ' => { '
80
+ data = class_data.collect { |data| data.to_s }
81
+ str << data.join(', ')
82
+ str << ' }'
83
+ end
84
+
85
+ private
86
+
87
+ # Deserializes the class_data for a class_desc and its super classes
88
+ #
89
+ # @param io [IO] the io to read from
90
+ # @param my_class_desc [Rex::Java::Serialization::Model::NewClassDesc] the class description whose data is being extracted
91
+ # @return [Array] class_data values if deserialization succeeds
92
+ # @raise [RuntimeError] if deserialization doesn't succeed
93
+ def decode_class_data(io, my_class_desc)
94
+ values = []
95
+
96
+ unless my_class_desc.super_class.description.class == NullReference
97
+ values += decode_class_data(io, my_class_desc.super_class.description)
98
+ end
99
+
100
+ values += decode_class_fields(io, my_class_desc)
101
+
102
+ values
103
+ end
104
+
105
+ # Deserializes the fields data for a class_desc
106
+ #
107
+ # @param io [IO] the io to read from
108
+ # @param my_class_desc [Rex::Java::Serialization::Model::NewClassDesc] the class description whose data is being extracted
109
+ # @return [Array] class_data values if deserialization succeeds
110
+ # @raise [RuntimeError] if deserialization doesn't succeed
111
+ def decode_class_fields(io, my_class_desc)
112
+ values = []
113
+
114
+ my_class_desc.fields.each do |field|
115
+ if field.is_primitive?
116
+ values << decode_value(io, field.type)
117
+ else
118
+ content = decode_content(io, stream)
119
+ values << content
120
+ end
121
+ end
122
+
123
+ values
124
+ end
125
+
126
+ # Deserializes a class_data value
127
+ #
128
+ # @param io [IO] the io to read from
129
+ # @param type [String] the type of the value to deserialize
130
+ # @return [Array(String, <Fixnum, Float>)] type and value if deserialization succeeds
131
+ # @raise [RuntimeError] if deserialization fails
132
+ def decode_value(io, type)
133
+ value = []
134
+
135
+ case type
136
+ when 'byte'
137
+ value_raw = io.read(1)
138
+ raise ::RuntimeError, 'Failed to deserialize NewArray value' if value_raw.nil?
139
+ value.push('byte', value_raw.unpack('c')[0])
140
+ when 'char'
141
+ value_raw = io.read(2)
142
+ unless value_raw && value_raw.length == 2
143
+ raise ::RuntimeError, 'Failed to deserialize NewArray value'
144
+ end
145
+ value.push('char', value_raw.unpack('s>')[0])
146
+ when 'double'
147
+ value_raw = io.read(8)
148
+ unless value_raw && value_raw.length == 8
149
+ raise ::RuntimeError, 'Failed to deserialize NewArray value'
150
+ end
151
+ value.push('double', value = value_raw.unpack('G')[0])
152
+ when 'float'
153
+ value_raw = io.read(4)
154
+ unless value_raw && value_raw.length == 4
155
+ raise ::RuntimeError, 'Failed to deserialize NewArray value'
156
+ end
157
+ value.push('float', value_raw.unpack('g')[0])
158
+ when 'int'
159
+ value_raw = io.read(4)
160
+ unless value_raw && value_raw.length == 4
161
+ raise ::RuntimeError, 'Failed to deserialize NewArray value'
162
+ end
163
+ value.push('int', value_raw.unpack('l>')[0])
164
+ when 'long'
165
+ value_raw = io.read(8)
166
+ unless value_raw && value_raw.length == 8
167
+ raise ::RuntimeError, 'Failed to deserialize NewArray value'
168
+ end
169
+ value.push('long', value_raw.unpack('q>')[0])
170
+ when 'short'
171
+ value_raw = io.read(2)
172
+ unless value_raw && value_raw.length == 2
173
+ raise ::RuntimeError, 'Failed to deserialize NewArray value'
174
+ end
175
+ value.push('short', value_raw.unpack('s>')[0])
176
+ when 'boolean'
177
+ value_raw = io.read(1)
178
+ raise ::RuntimeError, 'Failed to deserialize NewArray value' if value_raw.nil?
179
+ value.push('boolean', value_raw.unpack('c')[0])
180
+ else
181
+ raise ::RuntimeError, 'Unsupported NewArray type'
182
+ end
183
+
184
+ value
185
+ end
186
+
187
+ # Serializes an class_data value
188
+ #
189
+ # @param value [Array] the type and value to serialize
190
+ # @return [String] the serialized value
191
+ # @raise [RuntimeError] if serialization fails
192
+ def encode_value(value)
193
+ res = ''
194
+
195
+ case value[0]
196
+ when 'byte'
197
+ res = [value[1]].pack('c')
198
+ when 'char'
199
+ res = [value[1]].pack('s>')
200
+ when 'double'
201
+ res = [value[1]].pack('G')
202
+ when 'float'
203
+ res = [value[1]].pack('g')
204
+ when 'int'
205
+ res = [value[1]].pack('l>')
206
+ when 'long'
207
+ res = [value[1]].pack('q>')
208
+ when 'short'
209
+ res = [value[1]].pack('s>')
210
+ when 'boolean'
211
+ res = [value[1]].pack('c')
212
+ else
213
+ raise ::RuntimeError, 'Unsupported NewArray type'
214
+ end
215
+
216
+ res
217
+ end
218
+
219
+ end
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,12 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ class NullReference < Element
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,61 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ # This class provides a Java Reference representation.
8
+ class Reference < Element
9
+
10
+ # @!attribute contents
11
+ # @return [Fixnum] The stream handle being referenced
12
+ attr_accessor :handle
13
+
14
+ # @param stream [Rex::Java::Serialization::Model::Stream] the stream where it belongs to
15
+ def initialize(stream = nil)
16
+ super(stream)
17
+ self.handle = 0
18
+ end
19
+
20
+ # Deserializes a Rex::Java::Serialization::Model::Reference
21
+ #
22
+ # @param io [IO] the io to read from
23
+ # @return [self] if deserialization succeeds
24
+ # @raise [RuntimeError] if deserialization doesn't succeed
25
+ def decode(io)
26
+ handle_raw = io.read(4)
27
+ unless handle_raw && handle_raw.length == 4
28
+ raise ::RuntimeError, 'Failed to unserialize Reference'
29
+ end
30
+
31
+ self.handle = handle_raw.unpack('N')[0]
32
+
33
+ self
34
+ end
35
+
36
+ # Serializes the Rex::Java::Serialization::Model::Reference
37
+ #
38
+ # @return [String] if serialization succeeds
39
+ # @raise [RuntimeError] if serialization doesn't succeed
40
+ def encode
41
+ if handle < BASE_WIRE_HANDLE
42
+ raise ::RuntimeError, 'Failed to serialize Reference'
43
+ end
44
+
45
+ encoded = ''
46
+ encoded << [handle].pack('N')
47
+
48
+ encoded
49
+ end
50
+
51
+ # Creates a print-friendly string representation
52
+ #
53
+ # @return [String]
54
+ def to_s
55
+ "0x#{handle.to_s(16)}"
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,12 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ class Reset < Element
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,123 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ # This class provides a Java Stream representation
8
+ class Stream < Element
9
+
10
+ include Rex::Java::Serialization::Model::Contents
11
+
12
+ # @!attribute magic
13
+ # @return [Fixnum] The stream signature
14
+ attr_accessor :magic
15
+ # @!attribute version
16
+ # @return [Fixnum] The stream version
17
+ attr_accessor :version
18
+ # @!attribute contents
19
+ # @return [Array] The stream contents
20
+ attr_accessor :contents
21
+ # @!attribute references
22
+ # @return [Array] The stream objects to be referenced through handles
23
+ attr_accessor :references
24
+
25
+ def initialize(stream = nil)
26
+ super(nil)
27
+ self.magic = STREAM_MAGIC
28
+ self.version = STREAM_VERSION
29
+ self.contents = []
30
+ self.references = []
31
+ end
32
+
33
+ # Deserializes a Rex::Java::Serialization::Model::Stream
34
+ #
35
+ # @param io [IO] the io to read from
36
+ # @return [self] if deserialization succeeds
37
+ # @raise [RuntimeError] if deserialization doesn't succeed
38
+ def decode(io)
39
+ self.magic = decode_magic(io)
40
+ self.version = decode_version(io)
41
+
42
+ until io.eof?
43
+ content = decode_content(io, self)
44
+ self.contents << content
45
+ end
46
+
47
+ self
48
+ end
49
+
50
+ # Serializes the Rex::Java::Serialization::Model::Stream
51
+ #
52
+ # @return [String] if serialization succeeds
53
+ # @raise [RuntimeError] if serialization doesn't succeed
54
+ def encode
55
+ encoded = ''
56
+ encoded << [magic].pack('n')
57
+ encoded << [version].pack('n')
58
+ contents.each do |content|
59
+ encoded << encode_content(content)
60
+ end
61
+ encoded
62
+ end
63
+
64
+ # Adds an element to the references array
65
+ #
66
+ # @param io [Rex::Java::Serialization::Model::Element] the object to save as reference dst
67
+ def add_reference(ref)
68
+ self.references.push(ref)
69
+ end
70
+
71
+ # Creates a print-friendly string representation
72
+ #
73
+ # @return [String]
74
+ def to_s
75
+ str = "@magic: 0x#{magic.to_s(16)}\n"
76
+ str << "@version: #{version}\n"
77
+ str << "@contents: [\n"
78
+ contents.each do |content|
79
+ str << " #{print_content(content)}\n"
80
+ end
81
+ str << "]\n"
82
+ str << "@references: [\n"
83
+ references.each do |ref|
84
+ str << " [#{(references.index(ref) + BASE_WIRE_HANDLE).to_s(16)}] #{print_content(ref)}\n"
85
+ end
86
+ str << "]\n"
87
+ end
88
+
89
+ private
90
+
91
+ # Deserializes the magic stream value
92
+ #
93
+ # @param io [IO] the io to read from
94
+ # @return [String] if deserialization succeeds
95
+ # @raise [RuntimeError] if deserialization doesn't succeed
96
+ def decode_magic(io)
97
+ magic = io.read(2)
98
+
99
+ unless magic && magic.length == 2 && magic.unpack('n')[0] == STREAM_MAGIC
100
+ raise ::RuntimeError, 'Failed to unserialize Stream'
101
+ end
102
+
103
+ STREAM_MAGIC
104
+ end
105
+
106
+ # Deserializes the version stream
107
+ #
108
+ # @param io [IO] the io to read from
109
+ # @return [Fixnum] if deserialization succeeds
110
+ # @raise [RuntimeError] if deserialization doesn't succeed
111
+ def decode_version(io)
112
+ version = io.read(2)
113
+ unless version && version.unpack('n')[0] == STREAM_VERSION
114
+ raise ::RuntimeError, 'Failed to unserialize Stream'
115
+ end
116
+
117
+ STREAM_VERSION
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,69 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ # This class provides a Utf string representation
8
+ class Utf < Element
9
+
10
+ # @!attribute length
11
+ # @return [Integer] the length of the string
12
+ attr_accessor :length
13
+ # @!attribute contents
14
+ # @return [String] the contents of the string
15
+ attr_accessor :contents
16
+
17
+ # @param stream [Rex::Java::Serialization::Model::Stream] the stream where it belongs to
18
+ # @param contents [String] the contents of the utf string
19
+ def initialize(stream = nil, contents = '')
20
+ super(stream)
21
+ self.contents = contents
22
+ self.length = contents.length
23
+ end
24
+
25
+ # Deserializes a Rex::Java::Serialization::Model::Utf
26
+ #
27
+ # @param io [IO] the io to read from
28
+ # @return [self] if deserialization succeeds
29
+ # @raise [RuntimeError] if deserialization doesn't succeed
30
+ def decode(io)
31
+ raw_length = io.read(2)
32
+ if raw_length.nil? || raw_length.length != 2
33
+ raise ::RuntimeError, 'Failed to unserialize Utf'
34
+ end
35
+ self.length = raw_length.unpack('n')[0]
36
+
37
+ if length == 0
38
+ self.contents = ''
39
+ else
40
+ self.contents = io.read(length)
41
+ if contents.nil? || contents.length != length
42
+ raise ::RuntimeError, 'Failed to unserialize Utf'
43
+ end
44
+ end
45
+
46
+ self
47
+ end
48
+
49
+ # Serializes the Rex::Java::Serialization::Model::Utf
50
+ #
51
+ # @return [String]
52
+ def encode
53
+ encoded = [length].pack('n')
54
+ encoded << contents
55
+
56
+ encoded
57
+ end
58
+
59
+ # Creates a print-friendly string representation
60
+ #
61
+ # @return [String]
62
+ def to_s
63
+ contents
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end