|
12 | 12 | from minikerberos.common import *
|
13 | 13 |
|
14 | 14 |
|
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 |
16 | 16 | from msldap.authentication.kerberos.gssapi import get_gssapi, KRB5_MECH_INDEP_TOKEN
|
17 | 17 | from msldap.commons.proxy import MSLDAPProxyType
|
18 | 18 | from minikerberos.protocol.structures import ChecksumFlags
|
19 | 19 | from minikerberos.protocol.encryption import Enctype, Key, _enctype_table
|
20 | 20 | from minikerberos.protocol.constants import MESSAGE_TYPE
|
21 | 21 | from minikerberos.aioclient import AIOKerberosClient
|
22 | 22 | from minikerberos.network.aioclientsockssocket import AIOKerberosClientSocksSocket
|
23 |
| - |
| 23 | +from msldap import logger |
24 | 24 |
|
25 | 25 | # SMBKerberosCredential
|
26 | 26 |
|
@@ -50,6 +50,7 @@ def __init__(self, settings):
|
50 | 50 | self.etype = None
|
51 | 51 | self.seq_number = 0
|
52 | 52 | self.expected_server_seq_number = None
|
| 53 | + self.from_ccache = False |
53 | 54 |
|
54 | 55 | self.setup()
|
55 | 56 |
|
@@ -143,31 +144,46 @@ async def authenticate(self, authData, flags = None, seq_number = 0, cb_data = N
|
143 | 144 | return None, None, err
|
144 | 145 |
|
145 | 146 | if self.iterations == 0:
|
146 |
| - self.seq_number = 0 #int.from_bytes(os.urandom(4), byteorder='big', signed=False) |
| 147 | + self.seq_number = 0 |
147 | 148 | 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) |
152 | 161 |
|
153 | 162 | #self.expected_server_seq_number = encpart.get('nonce', seq_number)
|
154 | 163 |
|
155 | 164 | ap_opts = []
|
156 | 165 | if ChecksumFlags.GSS_C_MUTUAL_FLAG in self.flags or ChecksumFlags.GSS_C_DCE_STYLE in self.flags:
|
157 | 166 | if ChecksumFlags.GSS_C_MUTUAL_FLAG in self.flags:
|
158 | 167 | 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) |
160 | 172 | return apreq, True, None
|
161 | 173 |
|
162 | 174 | else:
|
163 | 175 | #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 | + |
165 | 182 | self.gssapi = get_gssapi(self.session_key)
|
166 | 183 | return apreq, False, None
|
167 | 184 |
|
168 | 185 | else:
|
169 | 186 | self.iterations += 1
|
170 |
| - #raise Exception('Not implemented!') |
171 | 187 | if ChecksumFlags.GSS_C_DCE_STYLE in self.flags:
|
172 | 188 | # adata = authData[16:]
|
173 | 189 | # if ChecksumFlags.GSS_C_DCE_STYLE in self.flags:
|
|
0 commit comments