o
    jG                     @   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rt| 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rtj| jjjjv rt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 rt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      $