o
    àý°j’9  ã                   @   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 r©t 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