Skip to content

Commit b40dbe8

Browse files
committed
Always return an array of PreAuthData
1 parent 09c3130 commit b40dbe8

File tree

3 files changed

+22
-22
lines changed

3 files changed

+22
-22
lines changed

lib/metasploit/framework/login_scanner/kerberos.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,11 @@ def self.login_status_for_kerberos_error(krb_err)
8787
# It doesn't appear to be documented anywhere, but Microsoft gives us a bit
8888
# of extra information in the e-data section
8989
begin
90-
pa_data_entry = krb_err.res.e_data_as_pa_data_entry
91-
if pa_data_entry && pa_data_entry.type == Rex::Proto::Kerberos::Model::PreAuthType::PA_PW_SALT
90+
pa_data_entry = krb_err.res.e_data_as_pa_data.find do |pa_data|
91+
pa_data.type == Rex::Proto::Kerberos::Model::PreAuthType::PA_PW_SALT
92+
end
93+
94+
if pa_data_entry
9295
pw_salt = pa_data_entry.decoded_value
9396
if pw_salt.nt_status
9497
case pw_salt.nt_status.value
@@ -107,7 +110,7 @@ def self.login_status_for_kerberos_error(krb_err)
107110
Metasploit::Model::Login::Status::DISABLED
108111
end
109112
else
110-
Metasploit::Model::Login::Status::DISABLED
113+
Metasploit::Model::Login::Status::DISABLED
111114
end
112115
rescue Rex::Proto::Kerberos::Model::Error::KerberosDecodingError
113116
# Could be a non-MS implementation?

lib/rex/proto/kerberos/model/error.rb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,12 @@ def message_for(error_code)
176176
pa_datas = res.e_data_as_pa_data
177177
rescue OpenSSL::ASN1::ASN1Error
178178
else
179-
superseded_pa_data = pa_datas.find { |pa_data| pa_data.type == Rex::Proto::Kerberos::Model::PreAuthType::KERB_SUPERSEDED_BY_USER }
180-
if superseded_pa_data
181-
error_code = "#{error_code}. This account has been superseded by #{superseded_pa_data.decoded_value}."
179+
pa_data_entry = pa_datas.find do |pa_data|
180+
pa_data.type == Rex::Proto::Kerberos::Model::PreAuthType::KERB_SUPERSEDED_BY_USER
181+
end
182+
183+
if pa_data_entry
184+
error_code = "#{error_code}. This account has been superseded by #{pa_data_entry.decoded_value}."
182185
end
183186
end
184187
end

lib/rex/proto/kerberos/model/krb_error.rb

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,30 +72,24 @@ def encode
7272
raise ::NotImplementedError, 'KrbError encoding not supported'
7373
end
7474

75-
# Decodes the e_data field as an Array<PreAuthDataEntry>
75+
# Decodes the e_data field as an Array<PreAuthDataEntry>.
7676
#
7777
# @return [Array<Rex::Proto::Kerberos::Model::PreAuthDataEntry>]
7878
def e_data_as_pa_data
79+
return [] unless self.e_data
80+
7981
pre_auth = []
8082
decoded = OpenSSL::ASN1.decode(self.e_data)
81-
decoded.each do |pre_auth_data|
82-
pre_auth << Rex::Proto::Kerberos::Model::PreAuthDataEntry.decode(pre_auth_data)
83-
end
84-
85-
pre_auth
86-
end
8783

88-
# Decodes the e_data field as a PreAuthData
89-
#
90-
# @return [Rex::Proto::Kerberos::Model::PreAuthData]
91-
def e_data_as_pa_data_entry
92-
if self.e_data
93-
decoded = OpenSSL::ASN1.decode(self.e_data)
94-
Rex::Proto::Kerberos::Model::PreAuthDataEntry.decode(decoded)
84+
if decoded.first.tag_class == :UNIVERSAL && decoded.first.tag == 16
85+
decoded.each do |pre_auth_data|
86+
pre_auth << Rex::Proto::Kerberos::Model::PreAuthDataEntry.decode(pre_auth_data)
87+
end
9588
else
96-
# This is implementation-defined, so may be different in some cases
97-
nil
89+
pre_auth << Rex::Proto::Kerberos::Model::PreAuthDataEntry.decode(decoded)
9890
end
91+
92+
pre_auth
9993
end
10094

10195
private

0 commit comments

Comments
 (0)