o
    �õ±jüG  ã                   @   sü   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlmZ d dlmZ d dlmZ dd„ ZG dd„ dƒZ G dd„ dƒZ!ddede!fdd„Z"dS )é    N)Úlogger)ÚNTLMCredential)ÚNTLMServerInfo)ÚNegotiateFlags)ÚNTLMNegotiate)ÚNTLMChallenge)ÚNTLMAuthenticate)ÚNTLMCredentials)Ú
MsvAvFlagsÚ
AVPAIRTypeÚAVPair)ÚNTLMv2Response)ÚChannelBindingsStruct)ÚCallablec                 Ã   s   �t | ƒ d S ©N)Úprint)Úmsg© r   ú–/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asyauth/protocols/ntlm/relay/native.pyÚlog_cb_dummy   s   €r   c                   @   s   e Zd Zefdd„ZdS )ÚNTLMRelaySettingsc                 C   sP   t  d¡ ¡ | _|| _d| _d| _d| _d| _d | _	d | _
d | _d| _d| _d S )Né   Fé   )ÚosÚurandomÚhexÚlog_idÚlog_callbackÚforce_signdisableÚdropmicÚdropmic2Ú
reflectionÚmodify_negotiate_cbÚmodify_challenge_cbÚmodify_authenticate_cbÚguest_allowedÚtimeout)Úselfr   r   r   r   Ú__init__   s   
zNTLMRelaySettings.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r(   r   r   r   r   r      s    r   c                   @   sè   e Zd Zd6dd„Zdd„ Zd7dd„Zd7d	d
„Zd7dd„Zd7dd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd8dd„Zd8d d!„Zd"d#„ Zd8d$d%„Zd8d&d'„Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd9d4d5„ZdS ):ÚNTLMRelayHandlerNc                 C   sL  d | _ |d u r
tƒ }t d¡ ¡ | _|| _| jj| _| jj| _| jj	| _	| jj
| _
| jj| _| jj| _| jj| _| jj| _| jj| _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _d | _ d | _!d | _"d | _#d | _$d | _%d| _&d | _'d | _(t) *¡ | _+t) *¡ | _,t) *¡ | _-t) *¡ | _.d | _/d S )Nr   r   )0Ú
spnego_objr   r   r   r   r   Úsettingsr   r   r   r    r!   r"   r#   r$   r%   ÚflagsÚ	challengeÚntlmNegotiateÚntlmChallengeÚntlmAuthenticateÚntlmNegotiate_rawÚntlmChallenge_rawÚntlmAuthenticate_rawÚntlmNegotiate_serverÚntlmChallenge_serverÚntlmAuthenticate_serverÚntlmNegotiate_server_rawÚntlmChallenge_server_rawÚntlmAuthenticate_server_rawÚEncryptedRandomSessionKeyÚRandomSessionKeyÚSessionBaseKeyÚKeyExchangeKeyÚSignKey_clientÚSealKey_clientÚSignKey_serverÚSealKey_serverÚiteration_cntÚntlm_credentialsÚ
extra_infoÚasyncioÚEventÚnegotiate_evtÚchallenge_evtÚauthenticate_evtÚstart_client_evtÚclient_side_exception)r'   r.   r   r   r   r(   '   sX   













zNTLMRelayHandler.__init__c                 C   ó   dS ©NFr   ©r'   r   r   r   Úis_guest^   ó   zNTLMRelayHandler.is_guestTc                 C   ó2   |dkr|  j tjO  _ d S |  j tj M  _ d S ©NT)r/   r   ÚNEGOTIATE_SIGN©r'   Útfr   r   r   Úset_signa   ó   zNTLMRelayHandler.set_signc                 C   rT   rU   )r/   r   ÚNEGOTIATE_SEALrW   r   r   r   Úset_sealg   rZ   zNTLMRelayHandler.set_sealc                 C   rT   rU   )r/   r   ÚNEGOTIATE_VERSIONrW   r   r   r   Úset_versionm   rZ   zNTLMRelayHandler.set_versionc                 C   rT   rU   )r/   r   ÚNEGOTIATE_KEY_EXCHrW   r   r   r   Úset_kexs   rZ   zNTLMRelayHandler.set_kexc                 C   s   t j| jj v S r   )r   Ú"NEGOTIATE_EXTENDED_SESSIONSECURITYr2   rQ   r   r   r   Úis_extended_securityy   s   z%NTLMRelayHandler.is_extended_securityc                 C   rO   rP   )r   rV   r2   r[   rQ   r   r   r   Úsigning_needed|   rS   zNTLMRelayHandler.signing_neededc                 C   rO   rP   )r   r[   r2   rQ   r   r   r   Úencryption_neededƒ   rS   z"NTLMRelayHandler.encryption_neededc                 C   sB   | j d u rd S t | j ¡| _t | j| j | j¡}|d | j_| jS )Nr   )	r2   r   Úfrom_challengerG   r	   Ú	constructr1   r3   Úcreds)r'   rg   r   r   r   Úget_extra_info‡   s   
zNTLMRelayHandler.get_extra_infoc                 C   ó   t ƒ ‚©zO
		Not possible to perform this function due to unknown keys during relaying
		©ÚNotImplementedError)r'   ÚhandleÚ
signingKeyÚseqNumÚmessager   r   r   ÚMAC�   ó   zNTLMRelayHandler.MACc                 C   ri   rj   rk   )r'   rn   Ú
sealingKeyÚmessageToSignÚmessageToEncryptro   Úcipher_encryptr   r   r   ÚSEAL•   rr   zNTLMRelayHandler.SEALc                 C   ri   rj   rk   )r'   rn   rp   ro   rv   r   r   r   ÚSIGN›   rr   zNTLMRelayHandler.SIGNÚClientc                 C   ri   rj   rk   ©r'   Úmoder   r   r   Úcalc_sealkey¡   rr   zNTLMRelayHandler.calc_sealkeyc                 C   ri   rj   rk   rz   r   r   r   Úcalc_signkey§   rr   zNTLMRelayHandler.calc_signkeyc                 C   rO   ©Ns                   r   rQ   r   r   r   Úget_session_key­   rS   z NTLMRelayHandler.get_session_keyc                 C   rO   r~   r   rz   r   r   r   Úget_sealkey°   rS   zNTLMRelayHandler.get_sealkeyc                 C   rO   r~   r   rz   r   r   r   Úget_signkey³   rS   zNTLMRelayHandler.get_signkeyc                 Ã   sD   �| j d urd| j }|   d|||f ¡I d H  d S t ||¡ d S )NzNTLM-%sz[%s][%s] %s)r   r   r   Úlog)r'   Úlevelr   Úsrcr   r   r   Ú	log_async¶   s
   €

zNTLMRelayHandler.log_asyncc                 C   sX   | j d ur
| j  ¡  | jd ur| j ¡  | jd ur| j ¡  | jd ur*| j ¡  d S d S r   )rJ   ÚsetrK   rL   rM   rQ   r   r   r   Ú	terminate½   s   






ÿzNTLMRelayHandler.terminatec              
   Ã   s  �zå| j dur&|  tjd¡I dH  |   | j| j¡I dH \| _| _}d|fW S | jdu rb|  tjd¡I dH  | j| _| j j	t	j
 M  _	| j j	t	j M  _	| j j	t	j M  _	| j j	t	j M  _	n|| jdu rŠ|  tjd¡I dH  | j| _| j j	t	j
 M  _	| j j	t	j M  _	nT| jdu r²|  tjd¡I dH  | j| _| j j	t	j
 M  _	| j j	t	j M  _	n,| jdu rÐ|  tjd¡I dH  | j| _| j j	t	j M  _	n|  tjd¡I dH  | j| _| j ¡ | _W d	S  t�y } zt ¡  d
|fW  Y d}~S d}~ww )a\  
		By default we don't modify the structures because there can be all kinds of integrity protections.
		However, if you find some cool stuff then you can just populate the modify_negotiate_cb in the settings, 
		but you MUST return both ntlmNegotiate and ntlmNegotiate_raw structures and/or indicate an error 
		which must be of class Exception!
		Nz[NEGOTIATE] MODIFY EXTERNALTz[NEGOTIATE] DISABLING SINGINGz[NEGOTIATE] Drop MICz[NEGOTIATE] Drop MIC 2z4[NEGOTIATE] Reflection. Disabling extended security.z[NEGOTIATE] NO MODS©NNF)r"   r…   ÚloggingÚDEBUGr7   r:   r1   r4   r   r   ÚNEGOTIATE_ALWAYS_SIGNr_   r[   rV   r   r    r!   ra   Úto_bytesÚ	ExceptionÚ	tracebackÚ	print_exc©r'   ÚerrÚer   r   r   Úmodify_negotiateÉ   sH   €
 




€þz!NTLMRelayHandler.modify_negotiatec              
   Ã   s   �zä| j dur&|  tjd¡I dH  |   | j| j¡I dH \| _| _}d|fW S | jdu r@|  tjd¡I dH  | j| _| j| _W dS |  tjd¡I dH  t	 
| j¡| _tƒ }tj|_d|_| jj jt| ¡ ƒ7  _| jj jt| ¡ ƒ7  _| jj d¡}|| ¡ 7 }|| jj ¡ 7 }| jj}|| jjjdd	dd
�7 }|| jj ¡ 7 }|| jjjdd	dd
�7 }|| jj7 }|| jj7 }|| jj ¡ 7 }| jjrÜt| jjt ƒrÔ|| jj7 }n|| jj ¡ 7 }||7 }|| _W dS  t!yÿ } zt" #¡  d|fW  Y d}~S d}~ww )am  
		By default we don't modify the structures because there can be all kinds of integrity protections.
		However, if you find some cool stuff then you can just populate the modify_authenticate_cb in the settings, 
		but you MUST return both ntlmChallenge_server and ntlmChallenge_server_raw structures and/or indicate an error 
		which must be of class Exception!
		Nz[CHALLENGE] MODIFY EXTERNALFz[CHALLENGE] NO MODSz[CHALLENGE] Drop MIC 2r   zutf-16ler   Úlittle)Ú	byteorderÚsignedrˆ   )$r#   r…   r‰   rŠ   r2   r5   r8   r;   r    ÚcopyÚdeepcopyr   r   r
   ÚtypeÚdataÚTargetInfoFieldsÚlengthÚlenrŒ   Ú	maxLengthÚ
TargetNameÚencodeÚ
TargetInfoÚ	SignatureÚMessageTypeÚTargetNameFieldsr   ÚServerChallengeÚReservedÚVersionÚ
isinstanceÚbytesr�   rŽ   r�   )r'   r‘   Úextra_avpairÚpayloadÚbuffr’   r   r   r   Úmodify_challengeý   sP   €
 

 â€þz!NTLMRelayHandler.modify_challengec              
   Ã   sä  ��zT| j dur'|  tjd¡I dH  |   | j| j¡I dH \| _| _}d|fW S | jdu ro|  tjd¡I dH  | j| _| j j	t	j
 M  _	| j j	t	j M  _	| j j	t	j M  _	| j j	t	j M  _	d| j_| j ¡ | _W d	S | jdu rý|  tjd¡I dH  | j| _| j j	t	j
 M  _	| j j	t	j M  _	| j j	t	j M  _	| j j	t	j M  _	d| j_t| jjtƒrôtj| jjjjv rôtj| jjjjtj v rì| jjjjtj  tj M  < | jjjjtj dkrì| jjjjtj= | jjjjtj= | j ¡ | _W d	S | jdu �rB|  tjd¡I dH  | j| _| j j	t	j
 M  _	| j j	t	j M  _	| j j	t	j M  _	| j j	t	j M  _	| j ¡ | _W d	S |  tjd¡I dH  | j| _| j| _W d	S  t�yq } zt ¡  d
|fW  Y d}~S d}~ww )ae  
		By default we don't modify the structures because there can be all kinds of integrity protections.
		However, if you find some cool stuff then you can just populate the modify_authenticate_cb in the settings, 
		but you MUST return both ntlmAuthenticate and ntlmAuthenticate_raw structures and/or indicate an error 
		which must be of class Exception!
		Nz[AUTHENTICATE] MODIFY EXTERNALTz[AUTHENTICATE] Drop MIC 2z[AUTHENTICATE] Drop MICr   z [AUTHENTICATE] DISABLING SINGINGz[AUTHENTICATE] NO MODSrˆ   F)r$   r…   r‰   rŠ   r9   r<   r3   r6   r    r   r‹   rV   r_   r[   ÚMICÚto_bytes_fullr   r¨   ÚNTChallenger   r   r
   ÚChallengeFromClinetÚDetailsÚMIC_PRESENTÚMsvAvSingleHostr   rŒ   r�   rŽ   r�   r�   r   r   r   Úmodify_authenticate2  sd   €
 

'
Û ðû€þz$NTLMRelayHandler.modify_authenticatec              
   Ã   sN  �zŽ|   tjd| ¡  ¡I dH  | jdu rp|| _t | j¡| _|   tjd¡I dH  | j	 
¡  |   tjd¡I dH  | j 
¡  |   tjd¡I dH  | j d¡I dH  t | j ¡ | jj¡I dH  |   tjd¡I dH  | jd| jfW S || _t |d¡| _| j 
¡  |   tjd	¡I dH  dd
| jfW S  ty¦ } zdd
|fW  Y d}~S d}~ww )z]
		This function is to be called by the server side which we obtain the auth material from
		z[SRV] AUTHDATA: %sNz[SRV] Negotiate event: setz[SRV] Client start event: setz[SRV] Waiting for challenge...ÚNTLMz[SRV] Challenge in!Tz[SRV] Authenticate event: setF)r…   r‰   rŠ   r   r1   r:   r   Ú
from_bytesr7   rJ   r†   rM   r-   Únotify_relayrH   Úwait_forrK   Úwaitr.   r&   r;   rN   r<   r   r9   rL   r�   )r'   Úauthdatar’   r   r   r   Úauthenticate_relay_servert  s0   €



€ÿz*NTLMRelayHandler.authenticate_relay_serverc           	   
   Ë   s  �zß| j dkr(| jdu r(|  tjd¡I dH  | j ¡ I dH  |  tjd¡I dH  | j dkr\|dur5tdƒ‚|  ¡ I dH \}}|durD|‚|  j d7  _ |  tjd¡I dH  | j	ddfW S |  tjd	¡I dH  |  j d7  _ || _
t |¡| _|  tjd
| j ¡I dH  |  ¡ I dH \}}|dur’|‚| j ¡  |  tjd¡I dH  | j ¡ I dH  |  ¡ I dH \}}|dur¸|‚|  tjd¡I dH  | jjdkrÚ| jdu rÚtdƒ| _ddtdƒfW S | jddfW S  t�y } zt ¡  || _|  ¡ I dH  dd|fW  Y d}~S d}~ww )zL
		FRONT TOWARD ENEMY
		This function is to be called by the client side.
		r   Nz$[CLI] Waiting for negotiate event...z [CLI] Negotiate event triggered!z-First call as client MUST be with empty data!é   z[CLI] Sending Negotiate dataTz[CLI] Challenge data obtainedz[CLI] Challenge %sz'[CLI] Waiting for authenticate event...z#[CLI] Authenticate event triggered!Ú FzGuest auth!)rE   r1   r…   r‰   rŠ   rJ   rº   r�   r“   r4   r5   r   r·   r2   r­   rK   r†   rL   rµ   r3   ÚUserNamer%   rN   r6   rŽ   r�   r‡   )	r'   ÚauthDatar/   Úcb_dataÚspnÚkwargsÚ_r‘   r’   r   r   r   Úauthenticate‘  sR   €


€üzNTLMRelayHandler.authenticater   )T)ry   )NNN)r)   r*   r+   r(   rR   rY   r\   r^   r`   rb   rc   rd   rh   rq   rw   rx   r|   r}   r   r€   r�   r…   r‡   r“   r­   rµ   r¼   rÅ   r   r   r   r   r,   &   s4    
7







45Br,   Úntlm_settings_factoryÚreturnc                 C   s"   | d u rt ƒ }n| ƒ }t|ƒ}|S r   )r   r,   )rÆ   Úntlm_settingsÚntlm_ctxr   r   r   Úntlmrelay_factoryÇ  s
   rÊ   r   )#rŽ   rH   r‰   r—   r   Úasyauthr   Úasyauth.common.credentials.ntlmr   Ú,asyauth.protocols.ntlm.structures.serverinfor   Ú1asyauth.protocols.ntlm.structures.negotiate_flagsr   Ú)asyauth.protocols.ntlm.messages.negotiater   Ú)asyauth.protocols.ntlm.messages.challenger   Ú,asyauth.protocols.ntlm.messages.authenticater   Ú!asyauth.protocols.ntlm.creds_calcr	   Ú(asyauth.protocols.ntlm.structures.avpairr
   r   r   Ú4asyauth.protocols.ntlm.structures.challenge_responser   Ú#minikerberos.gssapi.channelbindingsr   Útypingr   r   r   r,   rÊ   r   r   r   r   Ú<module>   s0      $