o
    j9                     @   s   d dl 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 d dl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 d d	l m!Z!m"Z" d
Z#G dd
 d
eZ$dS )    N)encoderdecoder)SubstrateUnderrunError)univ)LOGntlm)
SocksRelay)LDAPSessionError)KNOWN_NOTIFICATIONSLDAPDNNOTIFICATION_DISCONNECTBindRequestBindResponseSearchRequestSearchResultEntrySearchResultDoneLDAPMessage
LDAPString
ResultCodePartialAttributeListPartialAttributeAttributeValueUnbindRequestExtendedRequest)NTLMSSP_NEGOTIATE_SIGNNTLMSSP_NEGOTIATE_SEALLDAPSocksRelayc                   @   sv   e Zd ZdZdZdZdd Ze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d Zdd ZdS )r   zLDAP Socks PluginLDAPi   c                 C   s   t | |||| d S N)r   __init__)self
targetHost
targetPortsocksSocketactiveRelays r%   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/servers/socksplugins/ldap.pyr         zLDAPSocksRelay.__init__c                   C   s   dS )Ni  r%   r%   r%   r%   r&   getProtocolPort      zLDAPSocksRelay.getProtocolPortc                 C   s   d S r   r%   r    r%   r%   r&   initConnection   r)   zLDAPSocksRelay.initConnectionc                 C   s  	 |   }|d u rtd dS tdt| d |D ]O}|d  }|tr|d t	dkrXtd	 t
 }td
|d< td|d< td|d< | ||d  qd|d v rtd t }||d d   | jd }|d  t M  < |d  t M  < t
 }td
|d< t| |d< td|d< | ||d  qd|d v rzt }||d d   |d d}|d d}	|	 d| | _|	 d|  | jv r|	 d|  | _n3|	ddd  d|  | jv r|	ddd  d|  | _ntd|| j| jf   dS | j| j d du r:td| j| j| jf   dS t d| j| j| jf  d| j| j d< | j| j d  j!j"| _!t
 }td
|d< td|d< td|d< | ||d   dS td!  dS |d  }|t#rm|d" d td#krt$ }
td|
d$< t% |
d"< t& }|'d%d# |'d&tj(t) d' |*d&+dt)d( |*d&+dt)d) |*d&+d*t)d+ |*d&+d,t)d- |*d&+d.t)d/ |*d&+d0t)d1 |
d" ,| nC|d" d td2krEt$ }
td|
d$< t% |
d"< t& }|'d%d2 |'d&tj(t) d' |*d&+dt)d |
d" ,| n dS | |
|d  t- }td
|d< td|d< td|d< | ||d  qq)3NTz<LDAP: Client did not send ldap messages or closed connectionFzLDAP: Received z message(s)
protocolOpauthentication zLDAP: Got empty bind requestsuccess
resultCodeNTLM	matchedDNdiagnosticMessage	messageIDsicilyNegotiatezLDAP: Got NTLM bind requestCHALLENGE_MESSAGEflagssicilyResponse	user_namezutf-16ledomain_name/.   r   z(LDAP: No session for %s@%s(%s) availableinUsez;LDAP: Connection for %s@%s(%s) is being used at the moment!z+LDAP: Proxying client session for %s@%s(%s)protocolClientz?LDAP: Received an unknown LDAP binding request, cannot continue
attributessupportedCapabilities
objectNametypevals)componentTypez1.2.840.113556.1.4.800z1.2.840.113556.1.4.1670   z1.2.840.113556.1.4.1791   z1.2.840.113556.1.4.1935   z1.2.840.113556.1.4.2080   z1.2.840.113556.1.4.2237supportedSASLMechanisms).recv_ldap_msgr   warningdebuglengetComponentisSameTypeWithr   r   OctetStringr   r   r   r   send_ldap_msgr   NTLMAuthNegotiate
fromStringasOctetssessionDatar   r   getDataNTLMAuthChallengeResponsedecodeusernameupperr$   spliterrorr!   r"   infosessionsocketr   r   r   r   setComponentByNameSetOfr   getComponentByNamesetComponentByPositionappendr   )r    messagesmessagemsg_componentbindresponsenegotiateMessagechallengeMessagechall_responserZ   domainresponseattribsresult_doner%   r%   r&   skipAuthentication   s   




&"



 z!LDAPSocksRelay.skipAuthenticationc                 C   s   d}d}|s"| j | j}|dkrdS t|| jk rd}||7 }|rg }t|dkr_ztj|t d\}}W n tyQ   | j | j}|dkrKY dS || }Y nw || |}t|dks*|S )zBReceive LDAP messages during the SOCKS client LDAP authentication.    FNTr   asn1Spec)	r#   recvMSG_SIZErN   r   rY   r   r   re   )r    datadonerecvDatarn   rg   	remainingnew_datar%   r%   r&   rK      s0   	
zLDAPSocksRelay.recv_ldap_msgNc                 C   sN   t  }||d< |d | | |dur|d j|  t|}| j|S )z?Send LDAP messages during the SOCKS client LDAP authentication.r4   r,   Ncontrols)r   setComponentByType	getTagSetsetComponentsr   encoder#   sendall)r    rn   
message_idr|   rg   rw   r%   r%   r&   rR      s   
zLDAPSocksRelay.send_ldap_msgc                 C   s   t  ||gg g d S )Nr   )select)r    socket1socket2r%   r%   r&   wait_for_data   r'   zLDAPSocksRelay.wait_for_datac              	   C   s   	 |  ||}|D ]q}||krIz|| j}W n ty"   d}Y nw |s( d S | |s0 d S | |s6q	z|| W q	 tyH   tdw ||krzz|| j}W n ty`   d}Y nw |sgtdz|| W q	 tyy   Y  d S w q	q)NTr.   z Broken pipe: LDAP server is gone)r   ru   rv   	Exceptionis_allowed_requestis_forwardable_requestsendBrokenPipeError)r    client_sockserver_sockrreadysockreadr%   r%   r&   passthrough_sockets   sF   

z"LDAPSocksRelay.passthrough_socketsc                 C   s.   |  | j| j d| j| j d< td dS )z0Charged of tunneling the rest of the connection.Fr>   zLDAP: Finished tunnellingT)r   r#   r_   r$   rZ   r   rM   r*   r%   r%   r&   tunnelConnection  s   
zLDAPSocksRelay.tunnelConnectionc                 C   sV   z t j|t d\}}|d  }|trtd W dS W dS  ty*   Y dS w )Nrs   r,   z>LDAP: Client tried to unbind LDAP connection, skipping messageFT)	r   rY   r   rO   rP   r   r   rL   r   r    rw   rg   rz   rh   r%   r%   r&   r     s   

z%LDAPSocksRelay.is_forwardable_requestc                 C   sl   z+t j|t d\}}|d  }|tr&|d  dkr)td W dS W dS W dS  t	y5   Y dS w )Nrs   r,   requestNames   1.3.6.1.4.1.1466.20037z<LDAP: Client tried to initiate Start TLS, closing connectionFT)
r   rY   r   rO   rP   r   rU   r   rL   r   r   r%   r%   r&   r   +  s   
z!LDAPSocksRelay.is_allowed_requestr   )__name__
__module____qualname__PLUGIN_NAMEPLUGIN_SCHEMErv   r   staticmethodr(   r+   rq   rK   rR   r   r   r   r   r   r%   r%   r%   r&   r      s"    
 
*)%r   pyasn1.codec.berr   r   pyasn1.errorr   pyasn1.typer   impacketr   r   0impacket.examples.ntlmrelayx.servers.socksserverr   impacket.ldap.ldapr	   impacket.ldap.ldapasn1r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   impacket.ntlmr   r   PLUGIN_CLASSr   r%   r%   r%   r&   <module>   s    H