o
    àý°j  ã                   @   sÐ   d dl Z d dlZzd dlmZmZmZ W n ey'   d dlmZmZmZ Y nw d dlZd dl	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
gZG dd	„ d	eƒZG dd
„ d
eƒZdS )é    N)ÚHTTPConnectionÚHTTPSConnectionÚResponseNotReady)Úunpack)ÚLOG)ÚProtocolClient)ÚSTATUS_SUCCESSÚSTATUS_ACCESS_DENIED)ÚNTLMAuthChallenge)ÚSPNEGO_NegTokenRespÚHTTPRelayClientÚHTTPSRelayClientc                   @   sD   e Zd ZdZddd„Zdd„ Zdd	„ Zddd„Zdd„ Zdd„ Z	d
S )r   ÚHTTPéP   Tc                 C   s4   t  | ||||¡ || _d | _d | _d | _d | _d S ©N)r   Ú__init__ÚextendedSecurityÚnegotiateMessageÚauthenticateMessageBlobÚserverÚauthenticationMethod©ÚselfÚserverConfigÚtargetÚ
targetPortr   © r   ú§/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/clients/httprelayclient.pyr   '   s   
zHTTPRelayClient.__init__c                 C   sB   t | j| jƒ| _d | _| jjdkrd| _n| jj| _| jj| _dS )NÚ ú/T)r   Ú
targetHostr   ÚsessionÚ
lastresultr   ÚpathÚquery©r   r   r   r   ÚinitConnection/   s   

zHTTPRelayClient.initConnectionc              
   C   sÜ  | j r| j d| jd | j  ¡ n| j d| j¡ | j ¡ }| ¡  |jdkr/t d|j ¡ z2d| 	d¡vrKd| 	d¡vrKt 
d| 	d¡ ¡ W d	S d| 	d¡v rVd| _n
d| 	d¡v r`d| _W n# ttfy„   t 
d
| j ¡ | jjrt d¡ d| _nY d	S Y nw t |¡ d¡}dd| j|f i}| j r©| jjd| jd | j  |d� n
| jjd| j|d� | j ¡ }| ¡  zt d| j | 	d¡¡ d¡}t |¡}tƒ }| |¡ |W S  tttfyí   t 
d¡ Y d	S w )NÚGETú?é‘  zGStatus code returned: %d. Authentication does not seem required for URLÚNTLMzWWW-AuthenticateÚ	Negotiatez3NTLM Auth not offered by URL, offered protocols: %sFz4No authentication requested by the server for url %szMIIS cert server may allow anonymous authentication, sending NTLM auth anywaysÚasciiÚAuthorizationú%s %s©Úheadersz%s ([a-zA-Z0-9+/]+={0,2})é   z&No NTLM challenge returned from server)r$   r!   Úrequestr#   ÚgetresponseÚreadÚstatusr   ÚinfoÚ	getheaderÚerrorr   ÚKeyErrorÚ	TypeErrorr    r   ÚisADCSAttackÚbase64Ú	b64encodeÚdecodeÚreÚsearchÚgroupÚ	b64decoder
   Ú
fromStringÚ
IndexErrorÚAttributeError)r   r   ÚresÚ	negotiater0   ÚserverChallengeBase64ÚserverChallengeÚ	challenger   r   r   ÚsendNegotiate9   sR   

€
þü	 



þzHTTPRelayClient.sendNegotiateNc                 C   sÌ   t d|d d… ƒd tjkrt|ƒ}|d }n|}t |¡ d¡}dd| j|f i}| jr=| jj	d| j
d	 | j |d
� n
| jj	d| j
|d
� | j ¡ }|jdkrUd tfS t d|j ¡ | ¡ | _d tfS )NÚBr1   r   ÚResponseTokenr,   r-   r.   r'   r(   r/   r)   zBHTTP server returned error code %d, treating as a successful login)r   r   ÚSPNEGO_NEG_TOKEN_RESPr<   r=   r>   r   r$   r!   r2   r#   r3   r5   r	   r   r6   r4   r"   r   )r   r   rI   Ú
respToken2ÚtokenÚauthr0   rF   r   r   r   ÚsendAuthf   s   
 


zHTTPRelayClient.sendAuthc                 C   s"   | j d ur| j  ¡  d | _ d S d S r   )r!   Úcloser%   r   r   r   ÚkillConnection{   s   


þzHTTPRelayClient.killConnectionc                 C   s   | j  dd¡ | j  ¡  d S )NÚHEADz/favicon.ico)r!   r2   r3   r%   r   r   r   Ú	keepAlive€   s   zHTTPRelayClient.keepAlive)r   Tr   )
Ú__name__Ú
__module__Ú__qualname__ÚPLUGIN_NAMEr   r&   rK   rR   rT   rV   r   r   r   r   r   $   s    


-c                   @   s"   e Zd ZdZd	dd„Zdd„ ZdS )
r   ÚHTTPSé»  Tc                 C   s   t  | ||||¡ d S r   )r   r   r   r   r   r   r   ˆ   s   zHTTPSRelayClient.__init__c                 C   sz   d | _ | jjdkrd| _n| jj| _| jj| _zt tj¡}t| j| j	|d�| _
W dS  ty<   t| j| j	ƒ| _
Y dS w )Nr   r   )ÚcontextT)r"   r   r#   r$   ÚsslÚ
SSLContextÚPROTOCOL_SSLv23r   r    r   r!   rE   )r   Ú
uv_contextr   r   r   r&   ‹   s   

þþzHTTPSRelayClient.initConnectionN)r\   T)rW   rX   rY   rZ   r   r&   r   r   r   r   r   …   s    
)r?   r^   Úhttp.clientr   r   r   ÚImportErrorÚhttplibr<   Ústructr   Úimpacketr   Ú$impacket.examples.ntlmrelayx.clientsr   Úimpacket.nt_errorsr   r	   Úimpacket.ntlmr
   Úimpacket.spnegor   ÚPROTOCOL_CLIENT_CLASSESr   r   r   r   r   r   Ú<module>   s"   ÿa