Skip to content

Commit 8163b7d

Browse files
author
Pedro Ribeiro
committed
Thanks for helping me clean up Todd!
1 parent 9d1e206 commit 8163b7d

File tree

1 file changed

+70
-60
lines changed

1 file changed

+70
-60
lines changed

modules/auxiliary/gather/trackit_sql_domain_creds.rb

Lines changed: 70 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -285,80 +285,90 @@ def run
285285
end
286286

287287
if loot[schema_owner] and loot[database_pw] and loot[database_type] and loot[database_server_name]
288-
289-
begin
290-
resolved_ip = ::Rex::Socket.getaddress(loot[database_server_name].split('\\')[0])
291-
rescue
292-
resolved_ip = nil
288+
# If it is Oracle we need to save the SID for creating the Credential Core, else we don't care
289+
if loot[database_type] =~ /Oracle/i
290+
sid = loot[database_server_name].split('\\')[1]
291+
else
292+
sid = nil
293293
end
294294

295-
service_data = {
296-
address: (resolved_ip == nil ? rhost : resolved_ip),
297-
port: rport,
298-
service_name: (resolved_ip == nil ? (ssl ? 'https' : 'http') : loot[database_type]),
299-
protocol: 'tcp',
300-
workspace_id: myworkspace_id
301-
}
302-
303-
credential_data = {
304-
origin_type: :service,
305-
module_fullname: self.fullname,
306-
private_type: :password,
307-
private_data: loot[database_pw],
308-
username: loot[schema_owner] ,
309-
# We store the SID for Oracle or the instance name for SQL Server.
310-
# There's no realm_key for SQL Server so store it as Oracle anyway.
311-
realm_key: (database_type == "SQLServer" ? nil : Metasploit::Model::Realm::Key::ORACLE_SYSTEM_IDENTIFIER),
312-
realm_value: (database_type == "SQLServer" ? nil : loot[database_server_name].split('\\')[1])
313-
}
314-
315-
credential_data.merge!(service_data)
316-
credential_core = create_credential(credential_data)
317-
318-
if resolved_ip == nil
319-
create_credential_origin(credential_core)
320-
else
321-
login_data = {
295+
credential_core = report_credential_core({
296+
password: loot[database_pw],
297+
username: loot[schema_owner],
298+
sid: sid
299+
})
300+
301+
# Get just the hostname
302+
db_address= loot[database_server_name].split('\\')[0]
303+
304+
begin
305+
database_login_data = {
306+
address: ::Rex::Socket.getaddress(db_address, true),
307+
service_name: loot[database_type],
308+
protocol: 'tcp',
309+
workspace_id: myworkspace_id,
322310
core: credential_core,
323311
status: Metasploit::Model::Login::Status::UNTRIED
324312
}
325-
login_data.merge!(service_data)
326-
create_credential_login(login_data)
313+
314+
# If it's Oracle, use the Oracle port, else use MSSQL
315+
if loot[database_type] =~ /Oracle/i
316+
database_login_data[:port] = 1521
317+
else
318+
database_login_data[:port] = 1433
319+
end
320+
create_credential_login(database_login_data)
321+
# Skip creating the Login, but tell the user about it if we cannot resolve the DB Server Hostname
322+
rescue SocketError
323+
print_error "Could not resolve Database Server Hostname."
327324
end
328325

329326
print_status("#{rhost}:#{rport} - Stored SQL credentials: #{loot[database_server_name]}:#{loot[schema_owner]}:#{loot[database_pw]}")
330327
end
331328

332329
if loot[domain_admin_name] and loot[domain_admin_pw]
333-
service_data = {
334-
address: rhost,
335-
# These are domain creds so it can be any port?
336-
port: rport,
337-
service_name: 'Domain',
338-
protocol: 'tcp',
339-
workspace_id: myworkspace_id
340-
}
341-
credential_data = {
342-
origin_type: :service,
343-
module_fullname: self.fullname,
344-
private_type: :password,
345-
private_data: loot[domain_admin_pw],
330+
report_credential_core({
331+
password: loot[domain_admin_pw],
346332
username: loot[domain_admin_name].split('\\')[1],
347-
realm_key: Metasploit::Model::Realm::Key::ACTIVE_DIRECTORY_DOMAIN,
348-
realm_value: loot[domain_admin_name].split('\\')[0]
349-
}
350-
351-
credential_data.merge!(service_data)
352-
credential_core = create_credential(credential_data)
353-
login_data = {
354-
core: credential_core,
355-
access_level: 'Domain Administrator',
356-
status: Metasploit::Model::Login::Status::UNTRIED
357-
}
358-
login_data.merge!(service_data)
359-
create_credential_login(login_data)
333+
domain: loot[domain_admin_name].split('\\')[0]
334+
})
360335

361336
print_status("#{rhost}:#{rport} - Stored domain credentials: #{loot[domain_admin_name]}:#{loot[domain_admin_pw]}")
362337
end
363338
end
339+
340+
341+
def report_credential_core(cred_opts={})
342+
# Set up the has for our Origin service
343+
origin_service_data = {
344+
address: rhost,
345+
port: rport,
346+
service_name: 'Domain',
347+
protocol: 'tcp',
348+
workspace_id: myworkspace_id
349+
}
350+
351+
credential_data = {
352+
origin_type: :service,
353+
module_fullname: self.fullname,
354+
private_type: :password,
355+
private_data: cred_opts[:password],
356+
username: cred_opts[:username]
357+
}
358+
359+
if cred_opts[:domain]
360+
credential_data.merge!({
361+
realm_key: Metasploit::Model::Realm::Key::ACTIVE_DIRECTORY_DOMAIN,
362+
realm_value: cred_opts[:domain]
363+
})
364+
elsif cred_opts[:sid]
365+
credential_data.merge!({
366+
realm_key: Metasploit::Model::Realm::Key::ORACLE_SYSTEM_IDENTIFIER,
367+
realm_value: cred_opts[:sid]
368+
})
369+
end
370+
371+
credential_data.merge!(origin_service_data)
372+
create_credential(credential_data)
373+
end
364374
end

0 commit comments

Comments
 (0)