Skip to content

Commit d7344e9

Browse files
committed
kirbi support
1 parent 6273f2c commit d7344e9

File tree

3 files changed

+51
-22
lines changed

3 files changed

+51
-22
lines changed

Diff for: msldap/authentication/kerberos/native.py

+26-10
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
from minikerberos.common import *
1313

1414

15-
from minikerberos.protocol.asn1_structs import AP_REP, EncAPRepPart, EncryptedData, AP_REQ
15+
from minikerberos.protocol.asn1_structs import AP_REP, EncAPRepPart, EncryptedData, AP_REQ, Ticket
1616
from msldap.authentication.kerberos.gssapi import get_gssapi, KRB5_MECH_INDEP_TOKEN
1717
from msldap.commons.proxy import MSLDAPProxyType
1818
from minikerberos.protocol.structures import ChecksumFlags
1919
from minikerberos.protocol.encryption import Enctype, Key, _enctype_table
2020
from minikerberos.protocol.constants import MESSAGE_TYPE
2121
from minikerberos.aioclient import AIOKerberosClient
2222
from minikerberos.network.aioclientsockssocket import AIOKerberosClientSocksSocket
23-
23+
from msldap import logger
2424

2525
# SMBKerberosCredential
2626

@@ -50,6 +50,7 @@ def __init__(self, settings):
5050
self.etype = None
5151
self.seq_number = 0
5252
self.expected_server_seq_number = None
53+
self.from_ccache = False
5354

5455
self.setup()
5556

@@ -143,31 +144,46 @@ async def authenticate(self, authData, flags = None, seq_number = 0, cb_data = N
143144
return None, None, err
144145

145146
if self.iterations == 0:
146-
self.seq_number = 0 #int.from_bytes(os.urandom(4), byteorder='big', signed=False)
147+
self.seq_number = 0
147148
self.iterations += 1
148-
149-
#tgt = await self.kc.get_TGT()
150-
tgt = await self.kc.get_TGT(override_etype = self.preferred_etypes)
151-
tgs, encpart, self.session_key = await self.kc.get_TGS(self.spn)#, override_etype = self.preferred_etypes)
149+
150+
try:
151+
#check TGS first, maybe ccache already has what we need
152+
for target in self.ccred.ccache.list_targets():
153+
# just printing this to debug...
154+
logger.debug('CCACHE SPN record: %s' % target)
155+
tgs, encpart, self.session_key = await self.kc.get_TGS(self.spn)
156+
157+
self.from_ccache = True
158+
except:
159+
tgt = await self.kc.get_TGT(override_etype = self.preferred_etypes)
160+
tgs, encpart, self.session_key = await self.kc.get_TGS(self.spn)#, override_etype = self.preferred_etypes)
152161

153162
#self.expected_server_seq_number = encpart.get('nonce', seq_number)
154163

155164
ap_opts = []
156165
if ChecksumFlags.GSS_C_MUTUAL_FLAG in self.flags or ChecksumFlags.GSS_C_DCE_STYLE in self.flags:
157166
if ChecksumFlags.GSS_C_MUTUAL_FLAG in self.flags:
158167
ap_opts.append('mutual-required')
159-
apreq = self.kc.construct_apreq(tgs, encpart, self.session_key, flags = self.flags, seq_number = self.seq_number, ap_opts=ap_opts, cb_data = cb_data)
168+
if self.from_ccache is False:
169+
apreq = self.kc.construct_apreq(tgs, encpart, self.session_key, flags = self.flags, seq_number = self.seq_number, ap_opts=ap_opts, cb_data = cb_data)
170+
else:
171+
apreq = self.kc.construct_apreq_from_ticket(Ticket(tgs['ticket']).dump(), self.session_key, tgs['crealm'], tgs['cname']['name-string'][0], flags = self.flags, seq_number = self.seq_number, ap_opts = ap_opts, cb_data = cb_data)
160172
return apreq, True, None
161173

162174
else:
163175
#no mutual or dce auth will take one step only
164-
apreq = self.kc.construct_apreq(tgs, encpart, self.session_key, flags = self.flags, seq_number = self.seq_number, ap_opts=[], cb_data = cb_data)
176+
if self.from_ccache is False:
177+
apreq = self.kc.construct_apreq(tgs, encpart, self.session_key, flags = self.flags, seq_number = self.seq_number, ap_opts=[], cb_data = cb_data)
178+
else:
179+
apreq = self.kc.construct_apreq_from_ticket(Ticket(tgs['ticket']).dump(), self.session_key, tgs['crealm'], tgs['cname']['name-string'][0], flags = self.flags, seq_number = self.seq_number, ap_opts = ap_opts, cb_data = cb_data)
180+
181+
165182
self.gssapi = get_gssapi(self.session_key)
166183
return apreq, False, None
167184

168185
else:
169186
self.iterations += 1
170-
#raise Exception('Not implemented!')
171187
if ChecksumFlags.GSS_C_DCE_STYLE in self.flags:
172188
# adata = authData[16:]
173189
# if ChecksumFlags.GSS_C_DCE_STYLE in self.flags:

Diff for: msldap/commons/authbuilder.py

+16-6
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ def build(self):
225225
LDAPAuthProtocol.KERBEROS_AES,
226226
LDAPAuthProtocol.KERBEROS_PASSWORD,
227227
LDAPAuthProtocol.KERBEROS_CCACHE,
228-
LDAPAuthProtocol.KERBEROS_KEYTAB]:
228+
LDAPAuthProtocol.KERBEROS_KEYTAB,
229+
LDAPAuthProtocol.KERBEROS_KIRBI]:
229230

230231
if self.target is None:
231232
raise Exception('Target must be specified with Kerberos!')
@@ -237,9 +238,16 @@ def build(self):
237238
raise Exception('target must have a dc_ip for kerberos!')
238239

239240
kcred = MSLDAPKerberosCredential()
240-
kc = KerberosCredential()
241-
kc.username = self.creds.username
242-
kc.domain = self.creds.domain
241+
if self.creds.auth_method == LDAPAuthProtocol.KERBEROS_KIRBI:
242+
kc = KerberosCredential.from_kirbi(self.creds.password, self.creds.username, self.creds.domain)
243+
elif self.creds.auth_method == LDAPAuthProtocol.KERBEROS_CCACHE:
244+
kc = KerberosCredential.from_ccache_file(self.creds.password, self.creds.username, self.creds.domain)
245+
elif self.creds.auth_method == LDAPAuthProtocol.KERBEROS_KEYTAB:
246+
kc = KerberosCredential.from_kirbi(self.creds.password, self.creds.username, self.creds.domain)
247+
else:
248+
kc = KerberosCredential()
249+
kc.username = self.creds.username
250+
kc.domain = self.creds.domain
243251
kcred.enctypes = []
244252
if self.creds.auth_method == LDAPAuthProtocol.KERBEROS_PASSWORD:
245253
kc.password = self.creds.password
@@ -262,10 +270,12 @@ def build(self):
262270

263271
elif self.creds.auth_method == LDAPAuthProtocol.KERBEROS_CCACHE:
264272
kc.ccache = self.creds.password
265-
kcred.enctypes = [23,17,18]
273+
kcred.enctypes = [23,17,18] # TODO: fix this
266274
elif self.creds.auth_method == LDAPAuthProtocol.KERBEROS_KEYTAB:
267275
kc.keytab = self.creds.password
268-
kcred.enctypes = [23,17,18]
276+
kcred.enctypes = [23,17,18] # TODO: fix this
277+
elif self.creds.auth_method == LDAPAuthProtocol.KERBEROS_KIRBI:
278+
kcred.enctypes = [23,17,18] # TODO: fix this
269279
else:
270280
raise Exception('No suitable secret type found to set up kerberos!')
271281

Diff for: msldap/commons/credential.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@ class LDAPAuthProtocol(enum.Enum):
2929
SICILY = 'SICILY' #NTLM (old proprietary from MS)
3030
NTLM_PASSWORD = 'NTLM_PASSWORD' #actually SASL-GSSAPI-SPNEGO-NTLM
3131
NTLM_NT = 'NTLM_NT' #actually SASL-GSSAPI-SPNEGO-NTLM
32-
KERBEROS_RC4 = 'KERBEROS_RC4' #actually SASL-GSSAPI-SPNEGO-KERBEROS
33-
KERBEROS_NT = 'KERBEROS_NT' #actually SASL-GSSAPI-SPNEGO-KERBEROS
34-
KERBEROS_AES = 'KERBEROS_AES' #actually SASL-GSSAPI-SPNEGO-KERBEROS
35-
KERBEROS_PASSWORD = 'KERBEROS_PASSWORD' #actually SASL-GSSAPI-SPNEGO-KERBEROS
36-
KERBEROS_CCACHE = 'KERBEROS_CCACHE' #actually SASL-GSSAPI-SPNEGO-KERBEROS
37-
KERBEROS_KEYTAB = 'KERBEROS_KEYTAB' #actually SASL-GSSAPI-SPNEGO-KERBEROS
32+
KERBEROS_RC4 = 'KERBEROS_RC4'
33+
KERBEROS_NT = 'KERBEROS_NT'
34+
KERBEROS_AES = 'KERBEROS_AES'
35+
KERBEROS_PASSWORD = 'KERBEROS_PASSWORD'
36+
KERBEROS_CCACHE = 'KERBEROS_CCACHE'
37+
KERBEROS_KEYTAB = 'KERBEROS_KEYTAB'
38+
KERBEROS_KIRBI = 'KERBEROS_KIRBI'
3839
MULTIPLEXOR_KERBEROS = 'MULTIPLEXOR_KERBEROS'
3940
MULTIPLEXOR_NTLM = 'MULTIPLEXOR_NTLM'
4041
MULTIPLEXOR_SSL_KERBEROS = 'MULTIPLEXOR_SSL_KERBEROS'
@@ -55,6 +56,7 @@ class LDAPAuthProtocol(enum.Enum):
5556
LDAPAuthProtocol.KERBEROS_PASSWORD ,
5657
LDAPAuthProtocol.KERBEROS_CCACHE ,
5758
LDAPAuthProtocol.KERBEROS_KEYTAB ,
59+
LDAPAuthProtocol.KERBEROS_KIRBI ,
5860
LDAPAuthProtocol.SSPI_NTLM ,
5961
LDAPAuthProtocol.SSPI_KERBEROS,
6062
LDAPAuthProtocol.MULTIPLEXOR_KERBEROS,
@@ -74,6 +76,7 @@ class LDAPAuthProtocol(enum.Enum):
7476
LDAPAuthProtocol.KERBEROS_PASSWORD ,
7577
LDAPAuthProtocol.KERBEROS_CCACHE ,
7678
LDAPAuthProtocol.KERBEROS_KEYTAB ,
79+
LDAPAuthProtocol.KERBEROS_KIRBI ,
7780
]
7881

7982
class MSLDAPCredential:

0 commit comments

Comments
 (0)