o
    àý°jY  ã                   @   s<   d dl Z d dlmZ d dlmZ dZdZG dd„ deƒZdS )é    N)ÚLOG)Ú
SocksRelayÚSMTPSocksRelayz
c                   @   sP   e 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„ Zdd„ ZdS )r   zSMTP Socks PluginÚSMTPc                 C   s   t  | ||||¡ d| _d S )Ni    )r   Ú__init__Ú
packetSize)Ú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/smtp.pyr   !   s   
zSMTPSocksRelay.__init__c                   C   s   dS )Né   r   r   r   r   r   ÚgetProtocolPort%   s   zSMTPSocksRelay.getProtocolPortc                 C   sL   t | j ¡ ƒD ]}|dkr#|dkr#d| j| v r#| j| d jj  S qd S )NÚdataÚschemeÚprotocolClient)Úlistr   ÚkeysÚsessionÚ	ehlo_resp)r   Úkeyr   r   r   ÚgetServerEhlo)   s   €ýzSMTPSocksRelay.getServerEhloc                 C   s   d S ©Nr   )r   r   r   r   ÚinitConnection/   s   zSMTPSocksRelay.initConnectionc                 C   sŠ  | j  dt ¡ |  ¡  dd¡\}}| ¡ dkrm|  ¡  d¡}g d¢}|D ]}||v r0| |¡ q%d|vr:| d¡ d|vrC| d¡ t	 
d	d
 |¡ ¡ td }| |d d… ¡t d |d  t }| j  d| ¡ nt	 d||f ¡ dS |  ¡  dd¡\}}| d¡}| ¡ dkr¾|d dkr¾| j  dt ¡ | j  | j¡}	t |	 ¡ ¡}
|
 ¡ | _| j  dt ¡ | j  | j¡}	n+| ¡ dkrÞ|d dkrÞt |d  ¡ ¡}
|
 d¡d  ¡ | _nt	 d||f ¡ dS | j| jv �r"| j| j d du �r
t	 d| j| j| jf ¡ dS t	 d| j| j| jf ¡ | j| j d j| _nt	 d| j| j| jf ¡ dS | j  dt ¡ | jj| _| jj| _dS ) Nz&220 Microsoft ESMTP MAIL Service readyú é   ÚEHLOÚ
)zX-EXPS GSSAPI NTLMÚSTARTTLSz	AUTH NTLMz
AUTH PLAINz
AUTH LOGINz3SMTP: Sending mirrored capabilities from server: %sz, z250-éÿÿÿÿz250 z250-%sz8SMTP: Socks plugin expected EHLO command, but got: %s %sFÚAUTHr   ÚLOGINz334 VXNlcm5hbWU6z334 UGFzc3dvcmQ6ÚPLAINú zLSMTP: Socks plugin expected AUTH PLAIN or AUTH LOGIN command, but got: %s %sÚinUseTz;SMTP: Connection for %s@%s(%s) is being used at the moment!z+SMTP: Proxying client session for %s@%s(%s)r   z(SMTP: No session for %s@%s(%s) availablez%235 2.7.0 Authentication successful%s)r   ÚsendÚEOLÚrecvPacketClientÚsplitÚupperr   ÚremoveÚappendr   ÚdebugÚjoinÚerrorÚrecvr   Úbase64Ú	b64decodeÚstripÚusernamer   r	   r
   Úinfor   ÚsockÚrelaySocketÚfileÚrelaySocketFile)r   ÚcmdÚparamsÚclientcapabilitiesÚ	blacklistÚcapÚdelimÚcapsÚargsr   Úcredsr   r   r   ÚskipAuthentication2   sf   
€

&

ÿÿÿ

z!SMTPSocksRelay.skipAuthenticationc                 C   s  t d t  }	 | j | j¡}|dkrd S | ¡  d¡}|d  ¡ dkr2t d¡ | j 	dt  ¡ d S | j
 	|¡ | j
 | j¡}| j 	|¡ |d  ¡ d	kr�t d
¡ |dd … |kr{|}| j | j¡}| j
 	|¡ t|ƒdk rs|| }|dd … |ksZt d¡ | j
 | j¡}| j 	|¡ q)NÚ.TÚ r   r   ÚQUITz<Client sent QUIT command, closing socks connection to clientz0221 2.0.0 Service closing transmission channel%sÚDATAz&SMTP Socks entering DATA transfer modeéûÿÿÿé   z&SMTP Socks DATA transfer mode finished)r(   r   r1   r   r4   r*   r+   r   r.   r'   r8   Úlen)r   ÚdoneIndicatorr   r6   Úprevdatar   r   r   ÚtunnelConnection|   s4   

ù
ãzSMTPSocksRelay.tunnelConnectionc                 C   s   | j  | j¡}|S r   )r   r1   r   )r   r   r   r   r   r)   �   s   zSMTPSocksRelay.recvPacketClientN)Ú__name__Ú
__module__Ú__qualname__ÚPLUGIN_NAMEÚPLUGIN_SCHEMEr   Ústaticmethodr   r   r   rD   rN   r)   r   r   r   r   r      s    
J!)r2   Úimpacketr   Ú0impacket.examples.ntlmrelayx.servers.socksserverr   ÚPLUGIN_CLASSr(   r   r   r   r   r   Ú<module>   s   