commit
68d8afc18d
|
@ -21,7 +21,7 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
|
|
||||||
def initialize
|
def initialize
|
||||||
super(
|
super(
|
||||||
'Name' => 'SMB Local User Enumeration (LookupSid)',
|
'Name' => 'SMB SID User Enumeration (LookupSid)',
|
||||||
'Description' => 'Determine what users exist via brute force SID lookups.
|
'Description' => 'Determine what users exist via brute force SID lookups.
|
||||||
This module can enumerate both local and domain accounts by setting
|
This module can enumerate both local and domain accounts by setting
|
||||||
ACTION to either LOCAL or DOMAIN',
|
ACTION to either LOCAL or DOMAIN',
|
||||||
|
@ -29,6 +29,8 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
'License' => MSF_LICENSE,
|
'License' => MSF_LICENSE,
|
||||||
'DefaultOptions' =>
|
'DefaultOptions' =>
|
||||||
{
|
{
|
||||||
|
# Samba doesn't like this option, so we disable so we are compatible with
|
||||||
|
# both Windows and Samba for enumeration.
|
||||||
'DCERPC::fake_bind_multi' => false
|
'DCERPC::fake_bind_multi' => false
|
||||||
},
|
},
|
||||||
'Actions' =>
|
'Actions' =>
|
||||||
|
@ -49,6 +51,10 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
deregister_options('RPORT', 'RHOST')
|
deregister_options('RPORT', 'RHOST')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Constants used by this module
|
||||||
|
LSA_UUID = '12345778-1234-abcd-ef00-0123456789ab'
|
||||||
|
LSA_VERS = '0.0'
|
||||||
|
LSA_PIPES = %W{ LSARPC NETLOGON SAMR BROWSER SRVSVC }
|
||||||
|
|
||||||
# Locate an available SMB PIPE for the specified service
|
# Locate an available SMB PIPE for the specified service
|
||||||
def smb_find_dcerpc_pipe(uuid, vers, pipes)
|
def smb_find_dcerpc_pipe(uuid, vers, pipes)
|
||||||
|
@ -128,11 +134,6 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
[ uinfo[3], name ]
|
[ uinfo[3], name ]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@lsa_uuid = '12345778-1234-abcd-ef00-0123456789ab'
|
|
||||||
@@lsa_vers = '0.0'
|
|
||||||
@@lsa_pipes = %W{ LSARPC NETLOGON SAMR BROWSER SRVSVC }
|
|
||||||
|
|
||||||
# Fingerprint a single host
|
# Fingerprint a single host
|
||||||
def run_host(ip)
|
def run_host(ip)
|
||||||
|
|
||||||
|
@ -145,7 +146,7 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
lsa_handle = nil
|
lsa_handle = nil
|
||||||
begin
|
begin
|
||||||
# find the lsarpc pipe
|
# find the lsarpc pipe
|
||||||
lsa_pipe = smb_find_dcerpc_pipe(@@lsa_uuid, @@lsa_vers, @@lsa_pipes)
|
lsa_pipe = smb_find_dcerpc_pipe(LSA_UUID, LSA_VERS, LSA_PIPES)
|
||||||
break if not lsa_pipe
|
break if not lsa_pipe
|
||||||
|
|
||||||
# OpenPolicy2()
|
# OpenPolicy2()
|
||||||
|
@ -201,11 +202,9 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
resp = dcerpc.last_response ? dcerpc.last_response.stub_data : nil
|
resp = dcerpc.last_response ? dcerpc.last_response.stub_data : nil
|
||||||
domain_sid, domain_name = smb_parse_sid(resp)
|
domain_sid, domain_name = smb_parse_sid(resp)
|
||||||
|
|
||||||
|
|
||||||
# Store SID, local domain name, joined domain name
|
# Store SID, local domain name, joined domain name
|
||||||
print_status("#{ip} PIPE(#{lsa_pipe}) LOCAL(#{host_name} - #{host_sid}) DOMAIN(#{domain_name} - #{domain_sid})")
|
print_status("#{ip} PIPE(#{lsa_pipe}) LOCAL(#{host_name} - #{host_sid}) DOMAIN(#{domain_name} - #{domain_sid})")
|
||||||
|
|
||||||
|
|
||||||
domain = {
|
domain = {
|
||||||
:name => host_name,
|
:name => host_name,
|
||||||
:txt_sid => host_sid,
|
:txt_sid => host_sid,
|
||||||
|
@ -213,8 +212,17 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
:groups => {}
|
:groups => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
target_sid = host_sid if action.name =~ /LOCAL/i
|
target_sid = case action.name.upcase
|
||||||
target_sid = domain_sid if action.name =~ /DOMAIN/i
|
when 'LOCAL'
|
||||||
|
host_sid
|
||||||
|
when 'DOMAIN'
|
||||||
|
# Fallthrough to the host SID if no domain SID was returned
|
||||||
|
unless domain_sid
|
||||||
|
print_error("#{ip} No domain SID identified, falling back to the local SID...")
|
||||||
|
end
|
||||||
|
domain_sid || host_sid
|
||||||
|
end
|
||||||
|
|
||||||
# Brute force through a common RID range
|
# Brute force through a common RID range
|
||||||
500.upto(datastore['MaxRID'].to_i) do |rid|
|
500.upto(datastore['MaxRID'].to_i) do |rid|
|
||||||
|
|
||||||
|
@ -269,10 +277,9 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
)
|
)
|
||||||
|
|
||||||
print_status("#{ip} #{domain[:name].upcase} [#{domain[:users].keys.map{|k| domain[:users][k]}.join(", ")} ]")
|
print_status("#{ip} #{domain[:name].upcase} [#{domain[:users].keys.map{|k| domain[:users][k]}.join(", ")} ]")
|
||||||
|
|
||||||
# cleanup
|
|
||||||
disconnect
|
disconnect
|
||||||
return
|
return
|
||||||
|
|
||||||
rescue ::Timeout::Error
|
rescue ::Timeout::Error
|
||||||
rescue ::Interrupt
|
rescue ::Interrupt
|
||||||
raise $!
|
raise $!
|
||||||
|
|
Loading…
Reference in New Issue