rex 2.0.8 → 2.0.9

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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rex.rb +1 -0
  3. data/lib/rex/arch.rb +5 -0
  4. data/lib/rex/arch/x86.rb +19 -5
  5. data/lib/rex/arch/zarch.rb +17 -0
  6. data/lib/rex/compat.rb +5 -4
  7. data/lib/rex/constants.rb +3 -1
  8. data/lib/rex/encoder/alpha2/alpha_mixed.rb +70 -9
  9. data/lib/rex/encoder/alpha2/alpha_upper.rb +67 -8
  10. data/lib/rex/exploitation/cmdstager.rb +1 -0
  11. data/lib/rex/exploitation/cmdstager/certutil.rb +115 -0
  12. data/lib/rex/exploitation/cmdstager/echo.rb +6 -3
  13. data/lib/rex/exploitation/egghunter.rb +1 -1
  14. data/lib/rex/google/geolocation.rb +68 -0
  15. data/lib/rex/io/bidirectional_pipe.rb +0 -4
  16. data/lib/rex/java/serialization.rb +2 -0
  17. data/lib/rex/java/serialization/decode_error.rb +11 -0
  18. data/lib/rex/java/serialization/encode_error.rb +11 -0
  19. data/lib/rex/java/serialization/model.rb +2 -0
  20. data/lib/rex/java/serialization/model/annotation.rb +3 -3
  21. data/lib/rex/java/serialization/model/block_data.rb +3 -3
  22. data/lib/rex/java/serialization/model/block_data_long.rb +3 -3
  23. data/lib/rex/java/serialization/model/class_desc.rb +6 -6
  24. data/lib/rex/java/serialization/model/contents.rb +17 -10
  25. data/lib/rex/java/serialization/model/field.rb +12 -11
  26. data/lib/rex/java/serialization/model/long_utf.rb +3 -3
  27. data/lib/rex/java/serialization/model/new_array.rb +22 -23
  28. data/lib/rex/java/serialization/model/new_class.rb +57 -0
  29. data/lib/rex/java/serialization/model/new_class_desc.rb +15 -16
  30. data/lib/rex/java/serialization/model/new_enum.rb +5 -5
  31. data/lib/rex/java/serialization/model/new_object.rb +22 -17
  32. data/lib/rex/java/serialization/model/proxy_class_desc.rb +109 -0
  33. data/lib/rex/java/serialization/model/reference.rb +4 -4
  34. data/lib/rex/java/serialization/model/stream.rb +7 -7
  35. data/lib/rex/java/serialization/model/utf.rb +3 -3
  36. data/lib/rex/json_hash_file.rb +94 -0
  37. data/lib/rex/logging/log_sink.rb +1 -0
  38. data/lib/rex/logging/sinks/timestamp_flatfile.rb +21 -0
  39. data/lib/rex/parser/appscan_nokogiri.rb +13 -23
  40. data/lib/rex/parser/fs/ntfs.rb +10 -5
  41. data/lib/rex/parser/nmap_nokogiri.rb +3 -1
  42. data/lib/rex/parser/openvas_nokogiri.rb +70 -73
  43. data/lib/rex/parser/winscp.rb +108 -0
  44. data/lib/rex/parser/x509_certificate.rb +92 -0
  45. data/lib/rex/payloads.rb +0 -1
  46. data/lib/rex/payloads/meterpreter/config.rb +154 -0
  47. data/lib/rex/payloads/meterpreter/uri_checksum.rb +136 -0
  48. data/lib/rex/post/meterpreter.rb +1 -1
  49. data/lib/rex/post/meterpreter/client.rb +26 -3
  50. data/lib/rex/post/meterpreter/client_core.rb +387 -75
  51. data/lib/rex/post/meterpreter/extensions/android/android.rb +127 -37
  52. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +46 -25
  53. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +4 -0
  54. data/lib/rex/post/meterpreter/extensions/extapi/ntds/ntds.rb +39 -0
  55. data/lib/rex/post/meterpreter/extensions/extapi/pageant/pageant.rb +44 -0
  56. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +9 -0
  57. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +16 -1
  58. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +1 -1
  59. data/lib/rex/post/meterpreter/extensions/python/python.rb +114 -0
  60. data/lib/rex/post/meterpreter/extensions/python/tlv.rb +21 -0
  61. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +17 -14
  62. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +33 -12
  63. data/lib/rex/post/meterpreter/extensions/stdapi/fs/mount.rb +57 -0
  64. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3 -3
  65. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +3 -1
  66. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +2 -0
  67. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +16 -3
  68. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +29 -6
  69. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +5 -1
  70. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +18 -6
  71. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +2 -2
  72. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +34 -36
  73. data/lib/rex/post/meterpreter/packet.rb +29 -0
  74. data/lib/rex/post/meterpreter/packet_dispatcher.rb +20 -7
  75. data/lib/rex/post/meterpreter/ui/console.rb +1 -0
  76. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +230 -72
  77. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +544 -34
  78. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +188 -57
  79. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +115 -93
  80. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +1 -1
  81. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +1 -1
  82. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +49 -15
  83. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +11 -2
  84. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/python.rb +187 -0
  85. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +324 -133
  86. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +52 -2
  87. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +68 -65
  88. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +9 -1
  89. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +113 -118
  90. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +3 -0
  91. data/lib/rex/powershell.rb +62 -0
  92. data/lib/rex/powershell/command.rb +359 -0
  93. data/lib/rex/{exploitation/powershell → powershell}/function.rb +0 -2
  94. data/lib/rex/{exploitation/powershell → powershell}/obfu.rb +0 -2
  95. data/lib/rex/{exploitation/powershell → powershell}/output.rb +11 -5
  96. data/lib/rex/{exploitation/powershell → powershell}/param.rb +0 -2
  97. data/lib/rex/powershell/parser.rb +182 -0
  98. data/lib/rex/powershell/payload.rb +78 -0
  99. data/lib/rex/{exploitation/powershell → powershell}/psh_methods.rb +16 -2
  100. data/lib/rex/{exploitation/powershell → powershell}/script.rb +2 -4
  101. data/lib/rex/proto/dcerpc/client.rb +6 -6
  102. data/lib/rex/proto/dcerpc/exceptions.rb +26 -0
  103. data/lib/rex/proto/http/client.rb +3 -3
  104. data/lib/rex/proto/http/client_request.rb +0 -5
  105. data/lib/rex/proto/http/response.rb +86 -0
  106. data/lib/rex/proto/ipmi/utils.rb +30 -26
  107. data/lib/rex/proto/kerberos/client.rb +1 -1
  108. data/lib/rex/proto/kerberos/model/kdc_request.rb +2 -2
  109. data/lib/rex/proto/rfb/client.rb +8 -3
  110. data/lib/rex/proto/rfb/constants.rb +1 -1
  111. data/lib/rex/proto/rmi.rb +2 -0
  112. data/lib/rex/proto/rmi/decode_error.rb +10 -0
  113. data/lib/rex/proto/rmi/exception.rb +10 -0
  114. data/lib/rex/proto/rmi/model.rb +5 -0
  115. data/lib/rex/proto/rmi/model/call.rb +4 -4
  116. data/lib/rex/proto/rmi/model/call_data.rb +137 -0
  117. data/lib/rex/proto/rmi/model/dgc_ack.rb +2 -2
  118. data/lib/rex/proto/rmi/model/element.rb +26 -11
  119. data/lib/rex/proto/rmi/model/output_header.rb +4 -4
  120. data/lib/rex/proto/rmi/model/ping.rb +2 -2
  121. data/lib/rex/proto/rmi/model/ping_ack.rb +2 -2
  122. data/lib/rex/proto/rmi/model/protocol_ack.rb +2 -2
  123. data/lib/rex/proto/rmi/model/return_data.rb +5 -5
  124. data/lib/rex/proto/rmi/model/return_value.rb +124 -0
  125. data/lib/rex/proto/rmi/model/unique_identifier.rb +77 -0
  126. data/lib/rex/proto/steam.rb +3 -0
  127. data/lib/rex/proto/steam/message.rb +125 -0
  128. data/lib/rex/proto/tftp/client.rb +35 -14
  129. data/lib/rex/random_identifier_generator.rb +2 -0
  130. data/lib/rex/ropbuilder.rb +1 -1
  131. data/lib/rex/socket/parameters.rb +9 -0
  132. data/lib/rex/socket/ssl_tcp.rb +25 -41
  133. data/lib/rex/socket/ssl_tcp_server.rb +10 -21
  134. data/lib/rex/sslscan/result.rb +20 -1
  135. data/lib/rex/text.rb +241 -55
  136. data/lib/rex/ui/output.rb +0 -3
  137. data/lib/rex/ui/subscriber.rb +0 -10
  138. data/lib/rex/ui/text/color.rb +9 -0
  139. data/lib/rex/ui/text/dispatcher_shell.rb +1 -0
  140. data/lib/rex/ui/text/output.rb +15 -4
  141. data/lib/rex/ui/text/output/file.rb +1 -0
  142. data/lib/rex/ui/text/output/stdio.rb +0 -16
  143. data/lib/rex/ui/text/shell.rb +3 -0
  144. data/lib/rex/ui/text/table.rb +85 -19
  145. data/lib/rex/user_agent.rb +118 -0
  146. data/rex.gemspec +2 -2
  147. metadata +41 -14
  148. data/lib/rex/exploitation/powershell.rb +0 -62
  149. data/lib/rex/exploitation/powershell/parser.rb +0 -183
  150. data/lib/rex/payloads/meterpreter.rb +0 -2
  151. data/lib/rex/payloads/meterpreter/patch.rb +0 -136
@@ -0,0 +1,109 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Java
5
+ module Serialization
6
+ module Model
7
+ # This class provides a ProxyClassDesc representation
8
+ class ProxyClassDesc < Element
9
+
10
+ include Rex::Java::Serialization
11
+
12
+ # @!attribute interfaces
13
+ # @return [Array] An array of interface names
14
+ attr_accessor :interfaces
15
+ # @!attribute class_annotation
16
+ # @return [Rex::Java::Serialization::Model::Annotation] The java class annotations
17
+ attr_accessor :class_annotation
18
+ # @!attribute super_class
19
+ # @return [Rex::Java::Serialization::Model::ClassDesc] The java class superclass description
20
+ attr_accessor :super_class
21
+
22
+ # @param stream [Rex::Java::Serialization::Model::Stream] the stream where it belongs to
23
+ def initialize(stream = nil)
24
+ super(stream)
25
+ self.interfaces = []
26
+ self.class_annotation = nil
27
+ self.super_class = nil
28
+ end
29
+
30
+ # Deserializes a Rex::Java::Serialization::Model::ProxyClassDesc
31
+ #
32
+ # @param io [IO] the io to read from
33
+ # @return [self] if deserialization succeeds
34
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
35
+ def decode(io)
36
+ stream.add_reference(self) unless stream.nil?
37
+
38
+ interfaces_length = decode_interfaces_length(io)
39
+ interfaces_length.times do
40
+ interface = Utf.decode(io, stream)
41
+ self.interfaces << interface
42
+ end
43
+ self.class_annotation = Annotation.decode(io, stream)
44
+ self.super_class = ClassDesc.decode(io, stream)
45
+
46
+ self
47
+ end
48
+
49
+ # Serializes the Rex::Java::Serialization::Model::ProxyClassDesc
50
+ #
51
+ # @return [String] if serialization succeeds
52
+ # @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
53
+ def encode
54
+ unless class_annotation.class == Rex::Java::Serialization::Model::Annotation ||
55
+ super_class.class == Rex::Java::Serialization::Model::ClassDesc
56
+ raise Rex::Java::Serialization::EncodeError, 'Failed to serialize ProxyClassDesc'
57
+ end
58
+ encoded = ''
59
+ encoded << [interfaces.length].pack('N')
60
+ interfaces.each do |interface|
61
+ encoded << interface.encode
62
+ end
63
+ encoded << class_annotation.encode
64
+ encoded << super_class.encode
65
+
66
+ encoded
67
+ end
68
+
69
+ # Creates a print-friendly string representation
70
+ #
71
+ # @return [String]
72
+ def to_s
73
+ str = '[ '
74
+ interfaces_str = []
75
+ interfaces.each do |interface|
76
+ interfaces_str << interface.to_s
77
+ end
78
+ str << "#{interfaces_str.join(', ')} ]"
79
+
80
+ case super_class.description
81
+ when NewClassDesc
82
+ str << ", @super_class: #{super_class.description.class_name.to_s}"
83
+ when Reference
84
+ str << ", @super_class: #{super_class.description.to_s}"
85
+ end
86
+
87
+ str
88
+ end
89
+
90
+ private
91
+
92
+ # Deserializes the number of interface names
93
+ #
94
+ # @param io [IO] the io to read from
95
+ # @return [Fixnum] if deserialization is possible
96
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
97
+ def decode_interfaces_length(io)
98
+ fields_length = io.read(4)
99
+ if fields_length.nil? || fields_length.length != 4
100
+ raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize ProxyClassDesc'
101
+ end
102
+
103
+ fields_length.unpack('N')[0]
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -21,11 +21,11 @@ module Rex
21
21
  #
22
22
  # @param io [IO] the io to read from
23
23
  # @return [self] if deserialization succeeds
24
- # @raise [RuntimeError] if deserialization doesn't succeed
24
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
25
25
  def decode(io)
26
26
  handle_raw = io.read(4)
27
27
  unless handle_raw && handle_raw.length == 4
28
- raise ::RuntimeError, 'Failed to unserialize Reference'
28
+ raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Reference'
29
29
  end
30
30
 
31
31
  self.handle = handle_raw.unpack('N')[0]
@@ -36,10 +36,10 @@ module Rex
36
36
  # Serializes the Rex::Java::Serialization::Model::Reference
37
37
  #
38
38
  # @return [String] if serialization succeeds
39
- # @raise [RuntimeError] if serialization doesn't succeed
39
+ # @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
40
40
  def encode
41
41
  if handle < BASE_WIRE_HANDLE
42
- raise ::RuntimeError, 'Failed to serialize Reference'
42
+ raise Rex::Java::Serialization::EncodeError, 'Failed to serialize Reference'
43
43
  end
44
44
 
45
45
  encoded = ''
@@ -34,7 +34,7 @@ module Rex
34
34
  #
35
35
  # @param io [IO] the io to read from
36
36
  # @return [self] if deserialization succeeds
37
- # @raise [RuntimeError] if deserialization doesn't succeed
37
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
38
38
  def decode(io)
39
39
  self.magic = decode_magic(io)
40
40
  self.version = decode_version(io)
@@ -50,7 +50,7 @@ module Rex
50
50
  # Serializes the Rex::Java::Serialization::Model::Stream
51
51
  #
52
52
  # @return [String] if serialization succeeds
53
- # @raise [RuntimeError] if serialization doesn't succeed
53
+ # @raise [Rex::Java::Serialization::EncodeError] if serialization doesn't succeed
54
54
  def encode
55
55
  encoded = ''
56
56
  encoded << [magic].pack('n')
@@ -63,7 +63,7 @@ module Rex
63
63
 
64
64
  # Adds an element to the references array
65
65
  #
66
- # @param io [Rex::Java::Serialization::Model::Element] the object to save as reference dst
66
+ # @param ref [Rex::Java::Serialization::Model::Element] the object to save as reference dst
67
67
  def add_reference(ref)
68
68
  self.references.push(ref)
69
69
  end
@@ -92,12 +92,12 @@ module Rex
92
92
  #
93
93
  # @param io [IO] the io to read from
94
94
  # @return [String] if deserialization succeeds
95
- # @raise [RuntimeError] if deserialization doesn't succeed
95
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
96
96
  def decode_magic(io)
97
97
  magic = io.read(2)
98
98
 
99
99
  unless magic && magic.length == 2 && magic.unpack('n')[0] == STREAM_MAGIC
100
- raise ::RuntimeError, 'Failed to unserialize Stream'
100
+ raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Stream'
101
101
  end
102
102
 
103
103
  STREAM_MAGIC
@@ -107,11 +107,11 @@ module Rex
107
107
  #
108
108
  # @param io [IO] the io to read from
109
109
  # @return [Fixnum] if deserialization succeeds
110
- # @raise [RuntimeError] if deserialization doesn't succeed
110
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
111
111
  def decode_version(io)
112
112
  version = io.read(2)
113
113
  unless version && version.unpack('n')[0] == STREAM_VERSION
114
- raise ::RuntimeError, 'Failed to unserialize Stream'
114
+ raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Stream'
115
115
  end
116
116
 
117
117
  STREAM_VERSION
@@ -26,11 +26,11 @@ module Rex
26
26
  #
27
27
  # @param io [IO] the io to read from
28
28
  # @return [self] if deserialization succeeds
29
- # @raise [RuntimeError] if deserialization doesn't succeed
29
+ # @raise [Rex::Java::Serialization::DecodeError] if deserialization doesn't succeed
30
30
  def decode(io)
31
31
  raw_length = io.read(2)
32
32
  if raw_length.nil? || raw_length.length != 2
33
- raise ::RuntimeError, 'Failed to unserialize Utf'
33
+ raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Utf'
34
34
  end
35
35
  self.length = raw_length.unpack('n')[0]
36
36
 
@@ -39,7 +39,7 @@ module Rex
39
39
  else
40
40
  self.contents = io.read(length)
41
41
  if contents.nil? || contents.length != length
42
- raise ::RuntimeError, 'Failed to unserialize Utf'
42
+ raise Rex::Java::Serialization::DecodeError, 'Failed to unserialize Utf'
43
43
  end
44
44
  end
45
45
 
@@ -0,0 +1,94 @@
1
+ # -*- coding => binary -*-
2
+
3
+ require 'json'
4
+ require 'fileutils'
5
+
6
+ #
7
+ # This class provides a thread-friendly hash file store in JSON format
8
+ #
9
+ module Rex
10
+ class JSONHashFile
11
+
12
+ attr_accessor :path
13
+
14
+ def initialize(path)
15
+ self.path = path
16
+ @lock = Mutex.new
17
+ @hash = {}
18
+ @last = 0
19
+ end
20
+
21
+ def [](k)
22
+ synced_update
23
+ @hash[k]
24
+ end
25
+
26
+ def []=(k,v)
27
+ synced_update do
28
+ @hash[k] = v
29
+ end
30
+ end
31
+
32
+ def keys
33
+ synced_update
34
+ @hash.keys
35
+ end
36
+
37
+ def delete(k)
38
+ synced_update do
39
+ @hash.delete(k)
40
+ end
41
+ end
42
+
43
+ def clear
44
+ synced_update do
45
+ @hash.clear
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ # Save the file, but prevent thread & process contention
52
+ def synced_update(&block)
53
+ @lock.synchronize do
54
+ ::FileUtils.mkdir_p(::File.dirname(path))
55
+ ::File.open(path, ::File::RDWR|::File::CREAT) do |fd|
56
+ fd.flock(::File::LOCK_EX)
57
+
58
+ # Reload and merge if the file has changed recently
59
+ if fd.stat.mtime.to_f > @last
60
+ parse_data(fd.read).merge(@hash).each_pair do |k,v|
61
+ @hash[k] = v
62
+ end
63
+ end
64
+
65
+ res = nil
66
+
67
+ # Update the file on disk if new data is written
68
+ if block_given?
69
+ res = block.call
70
+ fd.rewind
71
+ fd.write(JSON.pretty_generate(@hash))
72
+ fd.sync
73
+ fd.truncate(fd.pos)
74
+ end
75
+
76
+ @last = fd.stat.mtime.to_f
77
+
78
+ res
79
+ end
80
+ end
81
+ end
82
+
83
+ def parse_data(data)
84
+ return {} if data.to_s.strip.length == 0
85
+ begin
86
+ JSON.parse(data)
87
+ rescue JSON::ParserError => e
88
+ # elog("JSONHashFile @ #{path} was corrupt: #{e.class} #{e}"
89
+ {}
90
+ end
91
+ end
92
+
93
+ end
94
+ end
@@ -41,3 +41,4 @@ end
41
41
 
42
42
  require 'rex/logging/sinks/flatfile'
43
43
  require 'rex/logging/sinks/stderr'
44
+ require 'rex/logging/sinks/timestamp_flatfile'
@@ -0,0 +1,21 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Logging
4
+ module Sinks
5
+
6
+ ###
7
+ #
8
+ # This class implements the LogSink interface and backs it against a
9
+ # file on disk with a Timestamp.
10
+ #
11
+ ###
12
+ class TimestampFlatfile < Flatfile
13
+
14
+ def log(sev, src, level, msg, from) # :nodoc:
15
+ msg = msg.chop.gsub(/\x1b\[[0-9;]*[mG]/,'').gsub(/[\x01-\x02]/, " ")
16
+ fd.write("[#{get_current_timestamp}] #{msg}\n")
17
+ fd.flush
18
+ end
19
+ end
20
+
21
+ end end end
@@ -141,9 +141,9 @@ module Rex
141
141
 
142
142
  def report_web_page(&block)
143
143
  return unless(in_issue && has_text)
144
- return unless @state[:web_site]
145
- return unless @state[:response_headers]
146
- return unless @state[:uri]
144
+ return unless @state[:web_site].present?
145
+ return unless @state[:response_headers].present?
146
+ return unless @state[:uri].present?
147
147
  web_page_info = {}
148
148
  web_page_info[:web_site] = @state[:web_site]
149
149
  web_page_info[:path] = @state[:uri].path
@@ -187,31 +187,21 @@ module Rex
187
187
 
188
188
  def record_request_and_response
189
189
  return unless(in_issue && has_text)
190
- return unless @state[:web_site]
190
+ return unless @state[:web_site].present?
191
191
  really_original_traffic = unindent_and_crlf(@text)
192
- split_traffic = really_original_traffic.split(/\r\n\r\n/)
193
- request_headers_text = split_traffic.first
194
- content_length = 0
195
- if request_headers_text =~ /\ncontent-length:\s+([0-9]+)/mni
196
- content_length = $1.to_i
197
- end
198
- if(content_length > 0) and (split_traffic[1].to_s.size >= content_length)
199
- request_body_text = split_traffic[1].to_s[0,content_length]
200
- else
201
- request_body_text = nil
202
- end
203
- response_headers_text = split_traffic[1].to_s[content_length,split_traffic[1].to_s.size].lstrip
204
- request = request_headers_text
205
- return unless(request && response_headers_text)
206
- response_body_text = split_traffic[2]
192
+ request_headers, request_body, response_headers, response_body = really_original_traffic.split(/\r\n\r\n/)
193
+ return unless(request_headers && response_headers)
207
194
  req_header = Rex::Proto::Http::Packet::Header.new
208
195
  res_header = Rex::Proto::Http::Packet::Header.new
209
- req_header.from_s request_headers_text.dup
210
- res_header.from_s response_headers_text.dup
196
+ req_header.from_s request_headers.lstrip
197
+ res_header.from_s response_headers.lstrip
198
+ if response_body.blank?
199
+ response_body = ''
200
+ end
211
201
  @state[:request_headers] = req_header
212
- @state[:request_body] = request_body_text
202
+ @state[:request_body] = request_body.lstrip
213
203
  @state[:response_headers] = res_header
214
- @state[:response_body] = response_body_text
204
+ @state[:response_body] = response_body.lstrip
215
205
  end
216
206
 
217
207
  # Appscan tab-indents which makes parsing a little difficult. They
@@ -181,7 +181,8 @@ module Rex
181
181
 
182
182
  data = ''
183
183
  while data.length < size_wanted
184
- data << @file_handler.read(size_wanted - data.length)
184
+ # Use a 4Mb block size to avoid target memory consumption
185
+ data << @file_handler.read([size_wanted - data.length, 2**22].min)
185
186
  end
186
187
  attribut << data
187
188
  end
@@ -196,8 +197,11 @@ module Rex
196
197
  #
197
198
  # return the attribute list from the MFT record
198
199
  # deal with resident and non resident attributes (but not $DATA due to performance issue)
200
+ # if lazy = True, this function only gather essential non resident attributes
201
+ # (INDEX_ALLOCATION). Non resident attributes can still be gathered later with
202
+ # cluster_from_attribute_non_resident function.
199
203
  #
200
- def mft_record_attribute(mft_record)
204
+ def mft_record_attribute(mft_record, lazy=true)
201
205
  attribute_list_offset = mft_record[20, 2].unpack('C')[0]
202
206
  curs = attribute_list_offset
203
207
  attribute_identifier = mft_record[curs, 4].unpack('V')[0]
@@ -213,10 +217,11 @@ module Rex
213
217
  res[attribute_identifier] = mft_record[curs + content_offset, content_size]
214
218
  else
215
219
  # non resident
216
- if attribute_identifier == DATA_ATTRIBUTE_ID
217
- res[attribute_identifier] = mft_record[curs, attribute_size]
218
- else
220
+ if attribute_identifier == INDEX_ALLOCATION_ID or
221
+ (!lazy and attribute_identifier != DATA_ATTRIBUTE_ID)
219
222
  res[attribute_identifier] = cluster_from_attribute_non_resident(mft_record[curs, attribute_size])
223
+ else
224
+ res[attribute_identifier] = mft_record[curs, attribute_size]
220
225
  end
221
226
  end
222
227
  if attribute_identifier == DATA_ATTRIBUTE_ID
@@ -17,7 +17,7 @@ module Rex
17
17
  Msf::ServiceState::Closed
18
18
  when "filtered"
19
19
  Msf::ServiceState::Filtered
20
- when "unknown"
20
+ else
21
21
  Msf::ServiceState::Unknown
22
22
  end
23
23
  end
@@ -277,6 +277,8 @@ module Rex
277
277
  port_hash[:state] = determine_port_state(v)
278
278
  when "name"
279
279
  port_hash[:name] = v
280
+ when "tunnel"
281
+ port_hash[:name] = "#{v}/#{port_hash[:name] || 'unknown'}"
280
282
  when "reason"
281
283
  port_hash[:reason] = v
282
284
  when "product"