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ÚHTTPSocksRelays   
c                   @   s`   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d„ ZdS )r   zHTTP Socks PluginÚHTTPc                 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/http.pyr   !   s   
zHTTPSocksRelay.__init__c                   C   s   dS )NéP   r   r   r   r   r   ÚgetProtocolPort%   s   zHTTPSocksRelay.getProtocolPortc                 C   s   d S )Nr   )r   r   r   r   ÚinitConnection)   s   zHTTPSocksRelay.initConnectionc           	      C   sˆ  | j  | j¡}|  |¡}z…|d }d|vrtƒ ‚t |dd … ¡ d¡}| d¡d  	¡ | _
d| j
v rH| j
 dd¡\}}d	| d
¡d |f | _
| j
| jv r€| j| j
 d du rht d| j
| j| jf ¡ W dS t d| j
| j| jf ¡ | j| j
 d j| _nt d| j
| j| jf ¡ W dS W n ty­   t d¡ g d¢}| j  t |¡¡ Y dS w | jj| _|  |¡}| j |¡ |  ¡  dS )NÚauthorizationÚBasicé   Úasciiú:r   ú@é   z%s/%sÚ.ÚinUseTz;HTTP: Connection for %s@%s(%s) is being used at the moment!Fz+HTTP: Proxying client session for %s@%s(%s)ÚprotocolClientz(HTTP: No session for %s@%s(%s) availablez>No authentication provided, prompting for basic authentication)s   HTTP/1.1 401 UnauthorizedsF   WWW-Authenticate: Basic realm="ntlmrelayx - provide a DOMAIN/username"s   Connection: closeó    r   )r   Úrecvr   Ú
getHeadersÚKeyErrorÚbase64Ú	b64decodeÚdecodeÚsplitÚupperÚusernamer   r   Úerrorr	   r
   ÚinfoÚsessionÚdebugÚsendÚEOLÚjoinÚsockÚrelaySocketÚprepareRequestÚtransferResponse)	r   ÚdataÚ
headerDictÚcredsÚ	basicAuthÚuserÚdomainÚreplyÚtosendr   r   r   ÚskipAuthentication,   sJ   

ÿÿÿü
û


z!HTTPSocksRelay.skipAuthenticationc                 C   sH   |  tt ¡}|d |…  t¡dd … }dd„ |D ƒ}dd„ |D ƒ}|S )Nr   c                 S   s   g | ]}|  d ¡‘qS )r   )r"   )Ú.0Úheaderr   r   r   Ú
<listcomp>h   s    z-HTTPSocksRelay.getHeaders.<locals>.<listcomp>c                 S   s4   i | ]}|  d ¡d  ¡ |  d d¡d dd… “qS )r   r   r   N)r#   Úlower)r:   ÚhdrKeyr   r   r   Ú
<dictcomp>i   s   4 z-HTTPSocksRelay.getHeaders.<locals>.<dictcomp>)Úfindr+   r#   )r   r1   Ú
headerSizeÚheadersr2   r   r   r   r   c   s
   zHTTPSocksRelay.getHeadersc                 C   s  | j  | j¡}| tt ¡}|  |¡}z9t|d ƒ}t|ƒ}| j 	|¡ ||| d k rJ| j  | j¡}|t|ƒ7 }| j 	|¡ ||| d k s,W d S W d S  t
y…   z |d dkrft d¡ |  ||¡ n
| j 	|¡ W Y d S W Y d S  t
y„   | j 	|¡ Y Y d S w w )Núcontent-lengthé   ztransfer-encodingÚchunkedz+Server sent chunked encoding - transferring)r.   r   r   r@   r+   r   ÚintÚlenr   r*   r   r   r)   ÚtransferChunked)r   r1   rA   rB   ÚbodySizeÚreadSizer   r   r   r0   l   s.   
ý
ýþ÷zHTTPSocksRelay.transferResponsec           	      C   s  |  tt ¡}| j |d |d … ¡ ||d d … }t|d |  t¡… dƒ}|dkry|  t¡d | d }t|ƒ}| j |¡ ||k rb|| }| j t| j	|ƒ¡}|t|ƒ7 }| j |¡ ||k sD| j | j	¡}t|d |  t¡… dƒ}|dks+t
 d¡ | j |¡ d S )NrD   é   r   é   z.Last chunk received - exiting chunked transfer)r@   r+   r   r*   rF   rG   r.   r   Úminr   r   r)   )	r   r1   rB   rA   ÚbodyÚdatasizerI   rJ   ÚmaxReadSizer   r   r   rH   †   s&   üô
zHTTPSocksRelay.transferChunkedc           	      C   s  g }|  t¡D ] }|dkr nd| ¡ v rqd| ¡ v r"| d¡ q| |¡ q| d¡ | |  tt ¡d ¡ t |¡}| tt ¡}|  |¡}z1t|d ƒ}t|ƒ}||| d k ry| j	 
| j¡}|t|ƒ7 }||7 }||| d k s]W |S W |S  ty…   Y |S w )	NÚ s   authorizations   connection: closezConnection: Keep-Aliver   r   rC   rD   )r#   r+   r=   Úappendr,   r@   r   rF   rG   r   r   r   r   )	r   r1   ÚresponseÚpartÚsenddatarA   rB   rI   rJ   r   r   r   r/   ž   s<   



ýøüüzHTTPSocksRelay.prepareRequestc                 C   s<   	 | j  | j¡}|dkrd S |  |¡}| j |¡ |  ¡  q)NTrQ   )r   r   r   r/   r.   r*   r0   )r   r1   r8   r   r   r   ÚtunnelConnectionÄ   s   
÷zHTTPSocksRelay.tunnelConnectionN)Ú__name__Ú
__module__Ú__qualname__ÚPLUGIN_NAMEÚPLUGIN_SCHEMEr   Ústaticmethodr   r   r9   r   r0   rH   r/   rV   r   r   r   r   r      s    
7	&)r    Úimpacketr   Ú0impacket.examples.ntlmrelayx.servers.socksserverr   ÚPLUGIN_CLASSr+   r   r   r   r   r   Ú<module>   s   