o
    j%                     @   s  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
 d dlmZ z
d dlmZmZ W n eyA   ed e d Y nw 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" d dl#m$Z$ ddgZ%G dd de&Z'G dd deZ(G dd de(Z)dS )    N)unpack)LOG)Server
ConnectionALLNTLM
MODIFY_ADD)bind)RESULT_SUCCESSRESULT_STRONGER_AUTH_REQUIREDzXntlmrelayx requires ldap3 > 2.0. To update, use: 'python -m pip install ldap3 --upgrade'   )ProtocolClient)STATUS_SUCCESSSTATUS_ACCESS_DENIED)
NTLMAuthChallengeNTLMSSP_AV_FLAGSAV_PAIRSNTLMAuthNegotiateNTLMSSP_NEGOTIATE_SIGNNTLMSSP_NEGOTIATE_SEALNTLMSSP_NEGOTIATE_ALWAYS_SIGNNTLMAuthChallengeResponseNTLMSSP_NEGOTIATE_KEY_EXCHNTLMSSP_NEGOTIATE_VERSION)SPNEGO_NegTokenRespLDAPRelayClientLDAPSRelayClientc                   @   s   e Zd ZdS )LDAPRelayClientExceptionN)__name__
__module____qualname__ r!   r!   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/clients/ldaprelayclient.pyr   2   s    r   c                   @   s`   e Zd ZdZeZdddZdd Zdd	 Zd
d Zdd Z	dddZ
dd Zdd Zdd ZdS )r   LDAP  Tc                 C   s.   t | |||| || _d | _d | _d | _d S N)r   __init__extendedSecuritynegotiateMessageauthenticateMessageBlobserverselfserverConfigtarget
targetPortr'   r!   r!   r"   r&   9   s
   
zLDAPRelayClient.__init__c                 C   s$   | j d ur| j j  d | _ d S d S r%   )sessionsocketcloser,   r!   r!   r"   killConnection@   s   

zLDAPRelayClient.killConnectionc                 C   >   t d| j| jf td| _t| jddtd| _| jd dS )Nzldap://%s:%sget_infoabuserpasswordauthenticationFT	r   
targetHostr/   r   r*   r   r   r0   openr3   r!   r!   r"   initConnectionE      zLDAPRelayClient.initConnectionc              	   C   s  t  }|| | jjs| jjr0|d t@ tkr |d  tN  < |d t@ tkr0|d  tN  < | jjrD|d t@ tkrD|d  tN  < | | _	|d t@ tkrVt
d | jj | jjsd| j_t| jjd}| j| jd|d }|d }z|d dd	}W n ty   td
| w d|v rt| jjd| }| j| jd|d }|d }|d tkrt }||d  || jd< |W  d    S ntdW d    d S W d    d S 1 sw   Y  d S )NflagszsThe client requested signing. Relaying to LDAP will not work! (This usually happens when relaying from SMB to LDAP)TSICILY_PACKAGE_DISCOVERYbindRequestr   server_credsascii;z=Could not discover authentication methods, server replied: %sr   SICILY_NEGOTIATE_NTLMresultCHALLENGE_MESSAGEz)Server did not offer NTLM authentication!)r   
fromStringr-   
remove_micremove_sign_sealr   r   r   getDatar(   r   warningr0   connection_locksasl_in_progressr	   bind_operationversionpost_send_single_responsesenddecodesplitKeyErrorr   r
   r   sessionData)r,   r(   negoMessagerequestresponserJ   sicily_packages	challenger!   r!   r"   sendNegotiateK   sP   




"zLDAPRelayClient.sendNegotiatec                 C      | j S r%   )r(   r3   r!   r!   r"   create_negotiate_message|      z(LDAPRelayClient.create_negotiate_messageNc           	      C   s  t d|d d d tjkrt|}|d }n|}t }|| | jjry|d t@ tkr5|d  tN  < |d t@ tkrE|d  tN  < |d t	@ t	krU|d  t	N  < |d t
@ t
kre|d  t
N  < d|d< d|d< d|d	< d|d
< | }| jjr|d t@ tkr|d  tN  < |d t@ tkr|d  tN  < |d t@ tkr|d  tN  < | }| jj% || _t| jjd| d }| j| jd|d }|d }W d    n1 sw   Y  d| j_|d tkrd| j_| j  d tfS |d tkr
| jdkr
tdd tfS )NBr   r   ResponseTokenrC       MICMICLenVersion
VersionLenSICILY_RESPONSE_NTLMrE   FrJ   TLDAPSzServer rejected authentication because LDAP signing is enabled. Try connecting with TLS enabled (specify target as ldaps://hostname ))r   r   SPNEGO_NEG_TOKEN_RESPr   rL   r-   rM   r   r   r   r   rO   rN   r   r0   rQ   r)   r	   rS   rT   rU   rV   rR   r
   boundrefresh_server_infor   r   PLUGIN_NAMEr   r   )	r,   r)   serverChallenge
respToken2tokenauthMessager\   r]   rJ   r!   r!   r"   sendAuth   sT   




zLDAPRelayClient.sendAuthc                 C   ra   r%   )r)   r3   r!   r!   r"   create_authenticate_message   rc   z+LDAPRelayClient.create_authenticate_messagec                 C   s   d S r%   r!   )r,   messager!   r!   r"   parse_challenge_message   s   z'LDAPRelayClient.parse_challenge_messagec                 C   s   | j jddddgd d S )N z(objectClass=*)BASEnamingContexts)search_basesearch_filtersearch_scope
attributes)r0   searchr3   r!   r!   r"   	keepAlive   s
   
zLDAPRelayClient.keepAlive)r$   Tr%   )r   r   r    rp   r   r&   r4   rA   r`   rb   ru   rv   rx   r   r!   r!   r!   r"   r   5   s    
1
3c                   @   s&   e Zd ZdZeZd	ddZdd ZdS )
r   rl   |  Tc                 C   s   t | |||| d S r%   )r   r&   r+   r!   r!   r"   r&      s   zLDAPSRelayClient.__init__c                 C   r5   )Nzldaps://%s:%sr6   r8   r9   r:   FTr>   r3   r!   r!   r"   rA      rB   zLDAPSRelayClient.initConnectionN)r   T)r   r   r    rp   r   r&   rA   r!   r!   r!   r"   r      s
    
)*sysstructr   impacketr   ldap3r   r   r   r   r   ldap3.operationr	   ldap3.core.resultsr
   r   ImportErrorfatalexit$impacket.examples.ntlmrelayx.clientsr   impacket.nt_errorsr   r   impacket.ntlmr   r   r   r   r   r   r   r   r   r   impacket.spnegor   PROTOCOL_CLIENT_CLASSES	Exceptionr   r   r   r!   r!   r!   r"   <module>   s(   
0 