o
    àý°jÑ%  ã                   @   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ÚIMAPSocksRelayz
c                   @   sX   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d„ ZdS )r   zIMAP Socks PluginÚIMAPc                 C   s(   t  | ||||¡ d| _d| _d| _d S )Ni    FT)r   Ú__init__Ú
packetSizeÚ	idleStateÚshouldClose)Ú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/imap.pyr   !   s   
zIMAPSocksRelay.__init__c                   C   s   dS )Né�   r   r   r   r   r   ÚgetProtocolPort'   s   zIMAPSocksRelay.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Úcapabilities)r
   Úkeyr   r   r   ÚgetServerCapabilities+   s   €ýz$IMAPSocksRelay.getServerCapabilitiesc                 C   s   d S )Nr   )r
   r   r   r   ÚinitConnection1   s   zIMAPSocksRelay.initConnectionc           	      C   s  | j  dt ¡ |  ¡ \}}| ¡ dkrXt|  ¡ ƒ}g d¢}|D ]}||v r+| |¡ q d|vr5| d¡ d|vr>| d¡ t	 
dd |¡ ¡ | j  dd |¡t|tf ¡ n	t	 d	| ¡ d
S |  ¡ \}}| d¡}| ¡ dkr“| j  dt ¡ | j  | j¡}t | ¡ ¡}| d¡d  ¡ | _n|d  ¡ dkr£|d  ¡ | _n	t	 d| ¡ 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||d  ¡ tf ¡ | jj| _| jj| _dS )Nz3* OK The Microsoft Exchange IMAP4 service is ready.Ú
CAPABILITY)zAUTH=GSSAPIz	AUTH=NTLMÚLOGINDISABLEDz
AUTH=PLAINÚLOGINz3IMAP: Sending mirrored capabilities from server: %sú z.* CAPABILITY %s%s%s OK CAPABILITY completed.%sz;IMAP: Socks plugin expected CAPABILITY command, but got: %sFzAUTHENTICATE PLAINú+ú é   r   zLIMAP: Socks plugin expected LOGIN or AUTHENTICATE PLAIN command, but got: %sÚinUseTz;IMAP: Connection for %s@%s(%s) is being used at the moment!z+IMAP: Proxying client session for %s@%s(%s)r   z(IMAP: No session for %s@%s(%s) availablez%s OK %s completed.%s)r   ÚsendallÚEOLÚrecvPacketClientÚupperr   r   ÚremoveÚappendr   ÚdebugÚjoinÚerrorÚsplitÚrecvr   Úbase64Ú	b64decodeÚstripÚusernamer   r   r   Úinfor   ÚsockÚrelaySocketÚfileÚrelaySocketFile)	r
   ÚtagÚcmdÚclientcapabilitiesÚ	blacklistÚcapÚargsr   Úcredsr   r   r   ÚskipAuthentication4   s\   
€

 
ÿÿÿ

z!IMAPSocksRelay.skipAuthenticationc              
   C   sü   d}d}	 z	| j  | j¡}W n! ty/ } zt||fƒ t dt|ƒ ¡ W Y d }~nd }~ww |dkr5n|  |||¡}|du rAn|\}}q|dkr|t	|ƒ}| j
du r`| j dt ¡ | j ¡  | jrv|d7 }| j d|tf ¡ | j ¡  |d | j_d S )NÚ TzIMAP: sockSocket recv(): %sFzDONE%sr#   z
%s CLOSE%s)r   r/   r   Ú	ExceptionÚprintr   r+   ÚstrÚprocessTunnelDataÚintr   r6   r%   r&   r8   Úreadliner	   r   Útagnum)r
   Úkeywordr9   r   ÚeÚresultr   r   r   ÚtunnelConnectionu   s:   €üï


zIMAPSocksRelay.tunnelConnectionc              
   C   s®  |  t¡d d… }|dkr| j | d¡t ¡ d}|D ]Ð}|  d¡}|d }z³|d  ¡ dkr4d| _n¥|d  ¡ d	kr@d
| _n™|d  ¡ dkrLd
| _n�|d  ¡ dkrb| j d|tf ¡ W  d
S |d  ¡ dkrÙt	 
d¡ | j |¡ t|ƒt|ƒ ttƒ }|d dd… }|d dkršd}	t|d d… ƒ}
nd
}	t|ƒ}
||
k rÂ| j | j¡}| j |¡ |t|ƒ7 }t	 
d| ¡ ||
k s¤|	rÑ| j | j¡}| j |¡ t	 
d¡ W  nW n	 tyã   Y nw | j |t ¡ q||k�rS|dk�rSz| j ¡ }W n t�y } zt	 
dt|ƒ ¡ W Y d }~d
S d }~ww |  dd¡d }z| j |¡ W n t�yI } zt	 
dt|ƒ ¡ W Y d }~d
S d }~ww ||k�rS|dks÷||fS )Néÿÿÿÿr!   r   rA   r    r#   ÚIDLETÚDONEFÚCLOSEÚLOGOUTz%s OK LOGOUT completed.%sÚAPPENDz9IMAP socks APPEND command detected, forwarding email dataé   zForwarded %d bytesz"IMAP socks APPEND command completezIMAP relaySocketFile: %sé   zIMAP socksSocket: %s)r.   r&   r6   r%   Úpopr(   r   r	   r   r   r+   ÚlenrF   r/   r   Ú
IndexErrorr8   rG   rB   rD   )r
   rI   r9   r   ÚanalyzeÚliner4   ÚsentÚliteralÚliteralPlusÚ	totalSizerJ   r   r   r   rE   ›   sz   

ü
€ÿ€ý€þöz IMAPSocksRelay.processTunnelDatac                 C   s4   | j  | j¡}| d¡}|d |… ||d …  ¡ fS )Nr    )r   r/   r   Úfindr2   )r
   r   Úspacer   r   r   r'   ê   s   
zIMAPSocksRelay.recvPacketClientN)Ú__name__Ú
__module__Ú__qualname__ÚPLUGIN_NAMEÚPLUGIN_SCHEMEr   Ústaticmethodr   r   r   r@   rL   rE   r'   r   r   r   r   r      s    
A&O)r0   Úimpacketr   Ú0impacket.examples.ntlmrelayx.servers.socksserverr   ÚPLUGIN_CLASSr&   r   r   r   r   r   Ú<module>   s   