o
    jr                     @   s  d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d d	l)m*Z*m+Z+m,Z, d d
l-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z?m@Z@mAZAmBZBmCZC d dl-mDZD d dlEmFZFmGZG d dlHmIZI zeJ ZKW n eLy   eZKY nw d$ddZMd%ddZNd&ddZOdd ZP		d'ddZQG d d! d!eRZSG d"d# d#e<ZTdS )(    N)decoderencoder)PyAsn1Error)noValueSequence)GeneralizedTime)b)	unhexlifyhexlify)AS_REQAP_REQTGS_REQKERB_PA_PAC_REQUEST	KRB_ERRORPA_ENC_TS_ENCAS_REPTGS_REPEncryptedDataAuthenticatorEncASRepPartEncTGSRepPartseq_setseq_set_iterKERB_ERROR_DATAMETHOD_DATAETYPE_INFO2
ETYPE_INFOAP_REPEncAPRepPartKERB_SUPERSEDED_BY_USER)KerberosTime	PrincipalTicket)CheckSumFieldGSS_C_DCE_STYLEGSS_C_MUTUAL_FLAGGSS_C_REPLAY_FLAGGSS_C_SEQUENCE_FLAGGSS_C_CONF_FLAGGSS_C_INTEG_FLAG)	constants)Key_enctype_tableInvalidChecksum)SessionError)SPNEGO_NegTokenInit	TypesMechSPNEGO_NegTokenRespASN1_OID
asn1encodeASN1_AID)KRB5_AP_REQ)	nt_errorsLOG)CCacheX   c              
   C   s  |d u r|}n|}t dt| }td||f  zt||dtjd \}}}}	}
t|||}||
 W n tj	yO } z
t	d||f |d }~ww |
||   t d|dd }||}t||k r~|||t| 7 }t||k smzttj|t dd d}W n   | Y S | tjjjkrz3t|D ]*}t|tkrt|d D ]}t|tkrtj| d	d
}td|  qqW |   Y ||S )Nz!iz!Trying to connect to KDC at %s:%sr   zConnection error (%s:%s)   asn1Specpacket_componentValuesutf-8z%Y%m%d%H%M%SZzServer time (UTC): %s)structpacklenr7   debugsocketgetaddrinfoSOCK_STREAMconnecterrorsendallunpackrecvKerberosErrorr   decoder   getErrorCoder*   
ErrorCodesKDC_ERR_PREAUTH_REQUIREDvaluetyper   varsr   datetimestrptimeasOctets)datahostkdcHostport
targetHost
messageLenafsocktypeproto	canonnamesaserecvDataLenrkrbErrorikserver_time rk   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/krb5/kerberosv5.pysendReceive5   sL    
	rm    TFc
           .      C   s	  t |trzt|}W n	 ty   Y nw t |tr*zt|}W n	 ty)   Y nw t |tr?zt|}W n	 ty>   Y nw |d ur]t |ts]zt|tjjjd}W n	 ty\   Y nw t	 }
|
 }|d u rttd| tjjjd}n	t|tjjjd}t }||d< t|}d|
d< ttjj	j|
d< t|
d< t|
d d< ttjjj|
d d d	< ||
d d d
< t|
d}t }|tjjj |tjjj |tjjj t||d< t|d|j t|d| j |dkrtd||d< tjtjj tj!dd }t"#||d< t"#||d< t$%d|d< |d u r d}|dkrL|dkrCt&|dkr:ttj'j(jf}nttj'j)jf}nttj'j(jf}nttj'j*jf}t+|d| t|
}zt,|||}W nM t-y } z@|. tj/j0jkr|d tj'j)jtj'j(jfv r|dkrttj'j*jf}t+|d| t|
}t,|||}n  W Y d }~nd }~ww d}zt1j2|t3 dd }W n   t1j2|t4 dd }d}Y t5 }d}|du r|d }|||d < |}nt1j2|d t6 dd }|D ]}|d	 tjj7jkrJt1j2|d
 t8 dd }|D ]4}z|d d u s&|d 9 du r)d}n|d : }W n t;y<   d}Y nw |d ||d < qq|d	 tjj<jkrt1j2|d
 t= dd }|D ]4}z|d d u su|d 9 du rxd}n|d : }W n t;y   d}Y nw |d ||d < qbq|d }t>| } t |t?r|dkrt@| jA|}!n|dkrt@| jA|}!n	| B||| d }!|du r%||  v rdu rtd! tC }"tjtjj }t"#||"d"< |jD|"d#< t|"}#| E|!d|#d }$tF }%| jA|%d< |$|%d$< t|%}&t	 }
d|
d< ttjj	j|
d< t|
d< t|
d d< ttjjGj|
d d d	< |&|
d d d
< t|
d d< ttjjj|
d d d	< ||
d d d
< t|
d}t }|tjjj |tjjj |tjjj t||d< t|d|j t|d| j ||d< tjtjj tj!dd }t"#||d< t"#||d< t$%d|d< t+|dt| jAf zt,t|
||}W nM ty } z@t|Hd%dkr|dkr|dkr|dks|d u rdd&lImJ}'mK}( |'|}|(|}tL| |||||||W  Y d }~S  d }~ww t1j2|t4 dd }|d' d$ })|du rXtMNd(|d' d | |tO|d' d$ P d d) tO|d' d$ P d)d  f  z	| Q|!d*|)}*W n; tRy } z.|du rd+t| }+|	rtMNtS|+|| |!|) |d |!d fW  Y d }~S tS|+|| |!|) d }~ww t1j2|*tT dd },t>|,d, d-  } t@| jA|,d, d. P }-|| |!|-fS )/NrS   z	krbtgt/%szinclude-pac   pvnomsg-typepadatar   padata-typepadata-valuereq-bodykdc-optionssnamecnamern   z$Empty Domain not allowed in Kerberosrealm   daystillrtime   nonce        etypeTr;   Fe-datasaltr@   zNo Encryption Data Available!patimestamppauseccipherKDC_ERR_ETYPE_NOSUPPcompute_lmhashcompute_nthashenc-partz$krb5asrep$%d$%s@%s:%s$%s      z!failed to decrypt session key: %skeykeytypekeyvalue)U
isinstancestrr	   	TypeErrorr!   r*   PrincipalNameTypeNT_PRINCIPALrR   r   upperr   r   encodeintApplicationTagNumbersr   PreAuthenticationDataTypesPA_PAC_REQUESTr   listappend
KDCOptionsforwardable	renewable	proxiableencodeFlagscomponents_to_asn1	ExceptionrU   nowtimezoneutc	timedeltar    to_asn1randgetrandbitsrC   EncryptionTypesaes256_cts_hmac_sha1_96aes128_cts_hmac_sha1_96rc4_hmacr   rm   rM   rO   rP   r   r   rN   r   r   dictr   PA_ETYPE_INFO2r   hasValueprettyPrintr   PA_ETYPE_INFOr   r,   bytesr+   enctypestring_to_keyr   microsecondencryptr   PA_ENC_TIMESTAMPfindimpacket.ntlmr   r   getKerberosTGTr7   rD   r
   rW   decryptr-   SessionKeyDecryptionErrorr   ).
clientNamepassworddomainlmhashnthashaesKeyrZ   
requestPAC
serverNamekerberoast_no_preauthasReq
pacRequestencodedPacRequestreqBodyoptsr   supportedCiphersmessagerf   rd   preAuthasRepencryptionTypesDatar   methodstgtmethodetypes2etype2etypesr   r   r   r   	timeStampencodedTimeStampencriptedTimeStampencryptedDataencodedEncryptedDatar   r   
cipherText	plainText	error_msgencASRepPart
sessionKeyrk   rk   rl   r   a   s  








(

 
 






("

.

r   c                 C   s  zt j|t dd }W n   t j|t dd }Y | }t }||d  t }	d|	d< tt	j
jj|	d< t }
t	|
|	d< t|	d|j t }d|d< |d	  |d	< t }||d	d
 t|d
|j tjtjj}|j|d< t||d< t|}||d|d }t|	d< |j|	d d< ||	d d< t|	}t }d|d< tt	j
jj|d< t|d< t|d d< tt	j j!j|d d d< ||d d d< t|d}t }
|
"t	j#j$j |
"t	j#j%j |
"t	j#j&j |
"t	j#j'j |dkr|
"t	j#j(j t	|
|d< t|d| j ||d< tjtjjtj)dd }t||d< t*+d|d< t,|dtt	j-j.jtt	j-j/jtt	j-j0jt|jf t|}t1|||}t j|t dd }|d d }|2|d|}t j|t3 dd }t4|d  d! |d  d"  }t5|d  d!  }t j|t dd }t }||d dd |j6d | j6d kr||||fS |j6d }t7| |||||S )#Nr;   r   ticketrp   rq   rr   
ap-optionsauthenticator-vnocrealmry   cusecctime   authenticatorr   r   rs   rt   ru   rv   Trw   rx   rz   r{   r|   r~   r   r   r      r   r   r   )8r   rN   r   r   r   r"   	from_asn1r   r   r*   r   rR   r   r   r   r   r   rW   r!   r   rU   r   r   r   r   r    r   r   r   r   r   r   r   
PA_TGS_REQr   r   r   r   renewable_okcanonicalizerenewr   r   r   r   r   r   des3_cbc_sha1_kddes_cbc_md5rm   r   r   r+   r,   
componentsgetKerberosTGS)r   r   rZ   r   r   r   r   
decodedTGTr   apReqr   r   r   r   encodedAuthenticatorencryptedEncodedAuthenticatorencodedApReqtgsReqr   r   rf   tgsr   r   encTGSRepPartnewSessionKeyresspnrk   rk   rl   r   q  s   





	
r   c                 C   sn  t |}zttj|d dd  t dd d}W | ty#   Y nw tj|d t dd }|d d }| |d|}tj|t dd }t	t
|d	 d
   } t| j|d	 d  }	t
|d }
|d	   | }tjtjj}|j|d< t||d< |
|d< t|}| |d|d }|d   | j|d d< ||d d< t  }t||d< | |	| fS )NResponseToken   r;   r   r=   r   r      subkeyr   r   
seq-numberr   r   r   )r1   rM   r   rN   r   r   r   r   r   r,   r   r+   r   rW   clearclonerU   r   r   r   r   r    r   r   r   r   getData)r   r   	auth_datanegTokenResprg   ap_repr   r   encAPRepPartsessionKey2sequenceNumberr   r   r   resprk   rk   rl   getKerberosType3  s8   (

r  c              
   C   sX  t |trzt|}W n	 ty   Y nw t |tr*zt|}W n	 ty)   Y nw t |tr?zt|}W n	 ty>   Y nw d| }|d u rX|d u rX|
rXt|| |\}} }}t| tjj	j
d}	 |d u r|d u rzt|||||||	\}}}}W nW ty } z>| tjjj
kr|dkr|dkr|dks|d u r|d u r|d u rddlm}m} td ||}||}W Y d }~qa  d }~ww n|d }|d	 }|d
 }|d u rDt|tjjj
d}zt|||	|||\}}}}W nS tyB } zF| tjjj
kr7|dkr6|dkr6|dks|d u r6|d u r6|d u r6ddlm}m} td ||}||}n  W Y d }~nd }~ww n|d }|d	 }|d
 }nqbt }td g|d< tj|t dd }t }||d  t }d|d< ttj jj
|d< t! }|"tj#j$j
 t%||d< t&|d|j' t( }d|d< ||d< t&|d|j) t*j*+t*j,j-}|j.|d< t/'||d< t0|d< d|d d< t1 }d|d< t2t3B t4B t5B t6B t7B |d< |8 |d d< d|d< t9:|}|;|d |d }t0|d!< |j<|d! d"< ||d! d	< t=>d#t?t@t=>d#tAt@td$  tB t9:|  |d%< |||8 fS )&Nzhost/%sro   Tr   r   r   z)Got KDC_ERR_ETYPE_NOSUPP, fallback to RC4KDC_REPr   r   zMS KRB5 - Microsoft Kerberos 5	MechTypesr;   r   rp   rq   rr   r   r   r   ry   r   r   cksumi  	cksumtyper   LgthFlagschecksumr     r   r   BzKRB5 - Kerberos 5	MechToken)Cr   r   r	   r   r8   	parseFiler!   r*   r   r   rR   r   rM   rO   rP   r   r   r   r   r7   rD   NT_SRV_INSTr   r/   r0   r   rN   r   r"   r   r   r   r   r   r   	APOptionsmutual_requiredr   r   r   r   r   rU   r   r   r   r   r    r   r#   r(   r)   r'   r&   r%   r$   r
  r   r   r   r   rA   rB   r4   r3   r2   r5   )usernamer   r   r   r   r   TGTTGS
targetNamerZ   useCacheuserNamer   r   oldSessionKeyr   rd   r   r   r   r   blobr   r   r   r   r   chkFieldr   r   rk   rk   rl   getKerberosType1  s   


 0

<

9

r*  c                   @   s    e Zd ZdZdd Zdd ZdS )r   z
    Exception risen when we fail to decrypt a session key within an AS-REP
    message.
    It provides context information such as full AS-REP message but also the
    cipher, key and cipherText used when the error occurred.
    c                 C   s"   || _ || _|| _|| _|| _d S N)r   r   r   r   r   )selfr   r   r   r   r   rk   rk   rl   __init__  s
   
z"SessionKeyDecryptionError.__init__c                 C   s
   d| j  S )NzSessionKeyDecryptionError: %s)r   r,  rk   rk   rl   __str__  s   
z!SessionKeyDecryptionError.__str__N)__name__
__module____qualname____doc__r-  r/  rk   rk   rk   rl   r     s    r   c                   @   s:   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdS )rM   z
    This is the exception every client should catch regardless of the underlying
    SMB version used. We'll take care of that. NETBIOS exceptions are NOT included,
    since all SMB versions share the same NETBIOS instances.
    r   c                 C   s2   t |  || _|| _|dkr| jd | _d S d S )Nr   z
error-code)r.   r-  rI   r>   )r,  rI   r>   rk   rk   rl   r-    s   
zKerberosError.__init__c                 C      | j S r+  )rI   r.  rk   rk   rl   rO        zKerberosError.getErrorCodec                 C   r4  r+  r=   r.  rk   rk   rl   getErrorPacket  r5  zKerberosError.getErrorPacketc                 C   s   t j| j S r+  )r*   ERROR_MESSAGESrI   r.  rk   rk   rl   getErrorString  s   zKerberosError.getErrorStringc           
      C   sT  dt j| j  }z| jt jjjkrVtj| jd t	 dd }t
d|d  d d d }|tjv rMtj| d }tj| d }|d	|||f 7 }W |S |d
| 7 }W |S | jt jjjkrz3t| jd  \}}|d d  }tj|t d\}}|d d d  }	|d|	 7 }W W |S  ty   Y W |S w W |S  ty   Y |S w )NzKerberos SessionError: %s(%s)r   r;   r   z<Lz
data-valuer:   r{   z
NT ERROR: code: 0x%x - %s - %sz#
NT ERROR: unknown error code: 0x%xnamezname-stringz. Account is superseded by )r*   r7  rI   rP   KRB_ERR_GENERICrR   r   rN   r>   r   rA   rK   rW   r6   KDC_ERR_CLIENT_REVOKEDr   r   r   )
r,  	retStringeDatant_errorerror_msg_shorterror_msg_verbose_octet_string
supersededr9  rk   rk   rl   r/    s<    
zKerberosError.__str__N)r   r   )	r0  r1  r2  r3  r-  rO   r6  r8  r/  rk   rk   rk   rl   rM     s    
rM   )r9   )rn   NTNF)F)rn   NNrn   NT)UrU   randomrE   rA   pyasn1.codec.derr   r   pyasn1.errorr   pyasn1.type.univr   r   pyasn1.type.usefulr   sixr   binasciir	   r
   impacket.krb5.asn1r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   impacket.krb5.typesr    r!   r"   impacket.krb5.gssapir#   r$   r%   r&   r'   r(   r)   impacket.krb5r*   impacket.krb5.cryptor+   r,   r-   impacket.smbconnectionr.   impacket.spnegor/   r0   r1   r2   r3   r4   r5   impacketr6   r7   impacket.krb5.ccacher8   SystemRandomr   NotImplementedErrorrm   r   r   r  r*  r   r   rM   rk   rk   rk   rl   <module>   sL   \$ 

,  
z1
 