@@ -285,80 +285,90 @@ def run
285
285
end
286
286
287
287
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
293
293
end
294
294
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 ,
322
310
core : credential_core ,
323
311
status : Metasploit ::Model ::Login ::Status ::UNTRIED
324
312
}
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."
327
324
end
328
325
329
326
print_status ( "#{ rhost } :#{ rport } - Stored SQL credentials: #{ loot [ database_server_name ] } :#{ loot [ schema_owner ] } :#{ loot [ database_pw ] } " )
330
327
end
331
328
332
329
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 ] ,
346
332
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
+ } )
360
335
361
336
print_status ( "#{ rhost } :#{ rport } - Stored domain credentials: #{ loot [ domain_admin_name ] } :#{ loot [ domain_admin_pw ] } " )
362
337
end
363
338
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
364
374
end
0 commit comments