Skip to content

Commit b51fc0a

Browse files
committed
Land rapid7#8489, more httpClient modules use store_valid_credential
2 parents eb4c4c9 + 99fb905 commit b51fc0a

17 files changed

+64
-532
lines changed

modules/exploits/linux/http/atutor_filemanager_traversal.rb

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -293,37 +293,10 @@ def login(username, password, check=false)
293293
return nil
294294
end
295295

296-
def report_cred(opts)
297-
service_data = {
298-
address: rhost,
299-
port: rport,
300-
service_name: ssl ? 'https' : 'http',
301-
protocol: 'tcp',
302-
workspace_id: myworkspace_id
303-
}
304-
305-
credential_data = {
306-
module_fullname: fullname,
307-
post_reference_name: self.refname,
308-
private_data: opts[:password],
309-
origin_type: :service,
310-
private_type: :password,
311-
username: opts[:user]
312-
}.merge(service_data)
313-
314-
login_data = {
315-
core: create_credential(credential_data),
316-
status: Metasploit::Model::Login::Status::SUCCESSFUL,
317-
last_attempted_at: Time.now
318-
}.merge(service_data)
319-
320-
create_credential_login(login_data)
321-
end
322-
323296
def exploit
324297
# login if needed
325298
if (not datastore['USERNAME'].empty? and not datastore['PASSWORD'].empty?)
326-
report_cred(user: datastore['USERNAME'], password: datastore['PASSWORD'])
299+
store_valid_credential(user: datastore['USERNAME'], private: datastore['PASSWORD'])
327300
student_cookie = login(datastore['USERNAME'], datastore['PASSWORD'])
328301
print_good("Logged in as #{datastore['USERNAME']}")
329302
# else, we reset the students password via a type juggle vulnerability
@@ -352,6 +325,10 @@ def exploit
352325
end
353326
end
354327

328+
def service_details
329+
super.merge({ post_reference_name: self.refname })
330+
end
331+
355332
=begin
356333
php.ini settings:
357334
display_errors = On

modules/exploits/linux/http/cisco_firepower_useradd.rb

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -158,33 +158,6 @@ def generate_new_password
158158
datastore['NEWSSHPASS'] || Rex::Text.rand_text_alpha(5)
159159
end
160160

161-
def report_cred(opts)
162-
service_data = {
163-
address: rhost,
164-
port: rport,
165-
service_name: 'cisco',
166-
protocol: 'tcp',
167-
workspace_id: myworkspace_id
168-
}
169-
170-
credential_data = {
171-
origin_type: :service,
172-
module_fullname: fullname,
173-
username: opts[:user],
174-
private_data: opts[:password],
175-
private_type: :password
176-
}.merge(service_data)
177-
178-
login_data = {
179-
last_attempted_at: DateTime.now,
180-
core: create_credential(credential_data),
181-
status: Metasploit::Model::Login::Status::SUCCESSFUL,
182-
proof: opts[:proof]
183-
}.merge(service_data)
184-
185-
create_credential_login(login_data)
186-
end
187-
188161
def do_login
189162
console_user = datastore['USERNAME']
190163
console_pass = datastore['PASSWORD']
@@ -211,7 +184,7 @@ def do_login
211184
cgi_sid = res_cookie.scan(/CGISESSID=(\w+);/).flatten.first
212185
print_status("CGI Session ID: #{cgi_sid}")
213186
print_good("Authenticated as #{console_user}:#{console_pass}")
214-
report_cred(username: console_user, password: console_pass)
187+
store_valid_credential(user: console_user, private: console_pass) # changes service_name to http || https
215188
return cgi_sid
216189
end
217190

modules/exploits/linux/http/kloxo_sqli.rb

Lines changed: 1 addition & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -71,33 +71,6 @@ def initialize(info = {})
7171
])
7272
end
7373

74-
def report_cred(opts)
75-
service_data = {
76-
address: opts[:ip],
77-
port: opts[:port],
78-
service_name: opts[:service_name],
79-
protocol: 'tcp',
80-
workspace_id: myworkspace_id
81-
}
82-
83-
credential_data = {
84-
module_fullname: fullname,
85-
post_reference_name: self.refname,
86-
private_data: opts[:password],
87-
origin_type: :service,
88-
private_type: :password,
89-
username: opts[:user]
90-
}.merge(service_data)
91-
92-
login_data = {
93-
core: create_credential(credential_data),
94-
status: Metasploit::Model::Login::Status::SUCCESSFUL,
95-
last_attempted_at: opts[:attempt_time]
96-
}.merge(service_data)
97-
98-
create_credential_login(login_data)
99-
end
100-
10174
def check
10275
return Exploit::CheckCode::Safe unless webcommand_exists?
10376
return Exploit::CheckCode::Safe if exploit_sqli(1, bad_char(0))
@@ -119,14 +92,7 @@ def exploit
11992
@session = send_login
12093
fail_with(Failure::NoAccess, "#{peer} - Login with admin/#{@password} failed...") if @session.nil?
12194

122-
report_cred(
123-
ip: rhost,
124-
port: rport,
125-
user: 'admin',
126-
service_name: 'http',
127-
password: @password,
128-
attempt_time: DateTime.now
129-
)
95+
store_valid_credential(user: 'admin', private: @password)
13096

13197
print_status("Retrieving the server name...")
13298
@server = server_info

modules/exploits/linux/http/riverbed_netprofiler_netexpress_exec.rb

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -156,48 +156,16 @@ def do_login
156156
'encode_params' => false,
157157
'data' => post_data
158158
})
159-
160-
sessid_cookie = (res.get_cookies || '').scan(/SESSID=(\w+);/).flatten[0] || ''
161-
print_status("Saving login credentials into Metasploit DB")
162-
report_cred(uname, passwd)
163159
else
164160
print_status("Valid login credentials provided. Successfully logged in")
165-
sessid_cookie = (res.get_cookies || '').scan(/SESSID=(\w+);/).flatten[0] || ''
166-
print_status("Saving login credentials into Metasploit DB")
167-
report_cred(uname, passwd)
168161
end
169162

170-
return sessid_cookie
163+
sessid_cookie = (res.get_cookies || '').scan(/SESSID=(\w+);/).flatten[0] || ''
164+
print_status("Saving login credentials into Metasploit DB")
165+
store_valid_credential(user: uname, private: passwd)
171166

172-
end
167+
return sessid_cookie
173168

174-
def report_cred(username, password)
175-
# Function used to save login credentials into Metasploit database
176-
service_data = {
177-
address: rhost,
178-
port: rport,
179-
service_name: ssl ? 'https' : 'http',
180-
protocol: 'tcp',
181-
workspace_id: myworkspace_id
182-
}
183-
184-
credential_data = {
185-
module_fullname: self.fullname,
186-
origin_type: :service,
187-
username: username,
188-
private_data: password,
189-
private_type: :password
190-
}.merge(service_data)
191-
192-
credential_core = create_credential(credential_data)
193-
194-
login_data = {
195-
core: credential_core,
196-
last_attempted_at: DateTime.now,
197-
status: Metasploit::Model::Login::Status::SUCCESSFUL
198-
}.merge(service_data)
199-
200-
create_credential_login(login_data)
201169
end
202170

203171
def create_user

modules/exploits/linux/http/symantec_web_gateway_restore.rb

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -187,34 +187,6 @@ def inject_exec(sid)
187187
})
188188
end
189189

190-
def save_cred(username, password)
191-
service_data = {
192-
address: rhost,
193-
port: rport,
194-
service_name: protocol,
195-
protocol: 'tcp',
196-
workspace_id: myworkspace_id
197-
}
198-
199-
credential_data = {
200-
module_fullname: self.fullname,
201-
origin_type: :service,
202-
username: username,
203-
private_data: password,
204-
private_type: :password
205-
}.merge(service_data)
206-
207-
credential_core = create_credential(credential_data)
208-
209-
login_data = {
210-
core: credential_core,
211-
last_attempted_at: DateTime.now,
212-
status: Metasploit::Model::Login::Status::SUCCESSFUL
213-
}.merge(service_data)
214-
215-
create_credential_login(login_data)
216-
end
217-
218190
def exploit
219191
print_status("Getting the PHPSESSID...")
220192
sid = get_sid
@@ -230,7 +202,7 @@ def exploit
230202
return
231203
else
232204
# Good password, keep it
233-
save_cred(datastore['USERNAME'], datastore['PASSWORD'])
205+
store_valid_credential(user: datastore['USERNAME'], private: datastore['PASSWORD'])
234206
end
235207

236208
print_status("Trying restore.php...")

modules/exploits/linux/http/tp_link_sc2020n_authenticated_telnet_injection.rb

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def test_login(user, pass)
8989
fail_with(Failure::Unknown, "Could not connect to web service - invalid credentials (response code: #{res.code}")
9090
else
9191
print_good("Successful login #{user} : #{pass}")
92-
save_cred(user, pass)
92+
store_valid_credential(user: user, private: pass) # service_name becomes http || https, a conflicting service_details could occur in future. Telnet lib does not yet provide service_details.
9393
end
9494
rescue ::Rex::ConnectionError
9595
fail_with(Failure::Unknown, "Could not connect to the web service")
@@ -172,32 +172,4 @@ def negotiate_telnet(sock)
172172
return nil
173173
end
174174
end
175-
176-
def save_cred(username, password)
177-
service_data = {
178-
address: rhost,
179-
port: rport,
180-
service_name: 'telnet',
181-
protocol: 'tcp',
182-
workspace_id: myworkspace_id
183-
}
184-
185-
credential_data = {
186-
module_fullname: self.fullname,
187-
origin_type: :service,
188-
username: username,
189-
private_data: password,
190-
private_type: :password
191-
}.merge(service_data)
192-
193-
credential_core = create_credential(credential_data)
194-
195-
login_data = {
196-
core: credential_core,
197-
last_attempted_at: DateTime.now,
198-
status: Metasploit::Model::Login::Status::SUCCESSFUL
199-
}.merge(service_data)
200-
201-
create_credential_login(login_data)
202-
end
203175
end

modules/exploits/linux/http/trendmicro_sps_exec.rb

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -154,46 +154,13 @@ def login
154154
sid = res.get_cookies.scan(/([^=]*)=[^;]*;/).last.first
155155
sid_value = res.get_cookies.scan(/#{sid}=([^;]*);/).last.first
156156
end
157-
report_cred(
158-
ip: datastore['RHOST'],
159-
port: datastore['RPORT'],
160-
service_name: (ssl ? "https" : "http"),
161-
user: datastore['ADMINACCOUNT'],
162-
password: datastore['ADMINPASS'],
163-
proof: "#{sid}=#{sid_value}"
164-
)
157+
store_valid_credential(user: datastore['ADMINACCOUNT'], private: datastore['ADMINPASS'], proof: "#{sid}=#{sid_value}")
165158
return {"sid" => sid, "sid_value" => sid_value}
166159
end
167160
end
168161
nil
169162
end
170163

171-
def report_cred(opts)
172-
service_data = {
173-
address: opts[:ip],
174-
port: opts[:port],
175-
service_name: opts[:service_name],
176-
protocol: 'tcp',
177-
workspace_id: myworkspace_id
178-
}
179-
180-
credential_data = {
181-
origin_type: :service,
182-
module_fullname: fullname,
183-
username: opts[:user],
184-
private_data: opts[:password],
185-
private_type: :password
186-
}.merge(service_data)
187-
188-
login_data = {
189-
core: create_credential(credential_data),
190-
status: Metasploit::Model::Login::Status::SUCCESSFUL,
191-
proof: opts[:proof]
192-
}.merge(service_data)
193-
194-
create_credential_login(login_data)
195-
end
196-
197164
def exploit
198165
opts = login
199166
if opts

modules/exploits/multi/http/atutor_sqli.rb

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def login(username, hash)
136136
cookie = "ATutorID=#{$4};" if res.get_cookies =~ /ATutorID=(.*); ATutorID=(.*); ATutorID=(.*); ATutorID=(.*);/
137137
if res && res.code == 302 && res.redirection.to_s.include?('admin/index.php')
138138
# if we made it here, we are admin
139-
report_cred(user: username, password: hash)
139+
store_valid_credential(user: username, private: hash, private_type: :nonreplayable_hash)
140140
return cookie
141141
end
142142
# auth failed if we land here, bail
@@ -227,32 +227,8 @@ def test_injection
227227
return false
228228
end
229229

230-
def report_cred(opts)
231-
service_data = {
232-
address: rhost,
233-
port: rport,
234-
service_name: ssl ? 'https' : 'http',
235-
protocol: 'tcp',
236-
workspace_id: myworkspace_id
237-
}
238-
239-
credential_data = {
240-
module_fullname: fullname,
241-
post_reference_name: self.refname,
242-
private_data: opts[:password],
243-
origin_type: :service,
244-
private_type: :nonreplayable_hash,
245-
jtr_format: 'sha512',
246-
username: opts[:user]
247-
}.merge(service_data)
248-
249-
login_data = {
250-
core: create_credential(credential_data),
251-
status: Metasploit::Model::Login::Status::SUCCESSFUL,
252-
last_attempted_at: Time.now
253-
}.merge(service_data)
254-
255-
create_credential_login(login_data)
230+
def service_details
231+
super.merge({ post_reference_name: self.refname, jtr_format: 'sha512' })
256232
end
257233

258234
def exploit

0 commit comments

Comments
 (0)