o
    àý°j>!  ã                   @   s  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lmZmZmZmZmZ d dlmZmZmZ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# dZ$G dd„ de%ƒZ&G dd„ deƒZ'G dd„ deƒZ(G dd„ deƒZ)dS )é    )Úunpack)ÚLOG)ÚProtocolClient)ÚSTATUS_SUCCESSÚSTATUS_ACCESS_DENIED)ÚNTLMAuthChallenge)ÚSPNEGO_NegTokenResp)Ú	transportÚrpcrtÚepmÚtschÚicpr)r	   r
   r   r   )ÚNDRCALL)Ú	DCERPC_v5Ú	MSRPCBindÚCtxItemÚMSRPCHeaderÚSEC_TRAILERÚMSRPCBindAckÚMSRPCRespHeaderÚMSRPCBindNakÚDCERPCExceptionÚRPC_C_AUTHN_WINNTÚRPC_C_AUTHN_LEVEL_CONNECTÚrpc_status_codesÚrpc_provider_reasonÚRPC_C_AUTHN_LEVEL_NONEÚRPCRelayClientc                   @   s   e Zd ZdS )ÚRPCRelayClientExceptionN)Ú__name__Ú
__module__Ú__qualname__© r"   r"   ú¦/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/clients/rpcrelayclient.pyr   !   s    r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚMYDCERPC_v5c                 C   s   t  | |¡ d S ©N)r   Ú__init__)Úselfr	   r"   r"   r#   r&   %   s   zMYDCERPC_v5.__init__c                 C   sÞ  t ƒ }tƒ }||d< | j|d< d|d< d|d< | |¡ tƒ }tj|d< | ¡ |d< d|d	< tƒ }t	|d
< t
|d< d|d< dt| ¡ ƒd  d }|dkr[|d  d| 7  < ||d< ||d< ||d< | j | ¡ ¡ | j ¡ }|dkryt|ƒ}	ndS |	d tjks‰|	d tjkr�t|	 ¡ ƒ}
nV|	d tjksž|	d tjkrÞ|	d tjkr¹t|	 ¡ ƒ}	td|	d d d… ƒd }n
t|	d ƒ}	|	d }|tv rÌt|d�‚|tv rØtdt|  ƒ‚td| ƒ‚td|	d  ƒ‚|  |
d ¡ |
S )NÚAbstractSyntaxÚTransferSyntaxr   Ú	ContextIDé   Ú
TransItemsÚtypeÚpduDataÚcall_idÚ	auth_typeÚ
auth_levelé5 Úauth_ctx_idé   ó   ÿÚauth_pad_lenÚsec_trailerÚ	auth_dataz<LÚRejectedReason)Ú
error_codezBind context rejected: %sz'Unknown DCE RPC fault status code: %.8xz(Unknown DCE RPC packet type received: %dÚ	max_rfrag)r   r   Útransfer_syntaxÚ
addCtxItemr   r
   Ú
MSRPC_BINDÚgetDatar   r   r   ÚlenÚ
get_packetÚ
_transportÚsendÚrecvÚMSRPC_BINDACKÚMSRPC_ALTERCTX_Rr   ÚMSRPC_BINDNAKÚMSRPC_FAULTr   r   r   r   r   r   Úset_max_tfrag)r'   Ú
iface_uuidr8   ÚbindÚitemÚpacketr7   ÚpadÚsÚrespÚbindRespÚstatus_coder"   r"   r#   ÚsendBindType1(   sT   





zMYDCERPC_v5.sendBindType1c                 C   sf   t ƒ }t|d< t|d< d|d< tƒ }tj|d< d|d< ||d< ||d	< d
|d< | jj| ¡ dd� d S )Nr0   r1   r2   r3   r-   s       r.   r7   r8   r   r/   r+   )ÚforceWriteAndx)	r   r   r   r   r
   ÚMSRPC_AUTH3rB   rC   rA   )r'   r8   r7   Úauth3r"   r"   r#   ÚsendBindType3c   s   
zMYDCERPC_v5.sendBindType3N)r   r    r!   r&   rS   rW   r"   r"   r"   r#   r$   $   s    ;r$   c                   @   s   e Zd ZdZdZdS )ÚDummyOpéÿ   r"   N)r   r    r!   ÚopnumÚ	structurer"   r"   r"   r#   rX   w   s    rX   c                   @   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   ÚRPCNTc                 C   sÎ   t  | ||||¡ |j| _| jdkrtj| _n| jdkr!tj| _nt	dƒ‚| j
jrD| jdkr4d|j | _| jdkr@d|j | _nt	dƒ‚t d|j| jf ¡ tj|j| jdd�| _t d	| j| jf ¡ d S )
NÚTSCHÚICPRzNot implemented!zncacn_np:%s[\pipe\atsvc]zncacn_np:%s[\pipe\cert]z@Connecting to ncacn_ip_tcp:%s[135] to determine %s stringbindingÚncacn_ip_tcp)Úprotocolz%s stringbinding is %s)r   r&   Úrpc_modeÚendpointr   ÚMSRPC_UUID_TSCHSÚendpoint_uuidr   ÚMSRPC_UUID_ICPRÚNotImplementedErrorÚserverConfigÚrpc_use_smbÚnetlocÚstringbindingr   Údebugr   Úhept_map)r'   rg   ÚtargetÚ
targetPortÚextendedSecurityr"   r"   r#   r&      s    





zRPCRelayClient.__init__c                 C   sÌ   t  | j¡}| jjr1t d| jj| jj	f ¡ | 
| jj| jj| jj| jj| jj¡ | | jj	¡ t|ƒ| _| j t¡ | j ¡  | jjrY| j t¡ t d| jj| jj	f ¡ n| j t¡ | j ¡  dS )Nz<Authenticating to smb://%s:%d with creds provided in cmdlinez'Authentication to smb://%s:%d succeededT)r	   ÚDCERPCTransportFactoryrj   rg   rh   r   Úinform   ri   Úrpc_smb_portÚset_credentialsÚsmbuserÚsmbpassÚ	smbdomainÚ	smblmhashÚ	smbnthashÚ	set_dportr$   ÚsessionÚset_auth_levelr   Úconnectr   )r'   Úrpctransportr"   r"   r#   ÚinitConnectionš   s    ÿ


zRPCRelayClient.initConnectionc                 C   s(   | j  | j|¡}tƒ }| |d ¡ |S )Nr8   )rz   rS   rd   r   Ú
fromString)r'   r8   rQ   Ú	challenger"   r"   r#   ÚsendNegotiate°   s   zRPCRelayClient.sendNegotiatec              
   C   sè   t d|d d… ƒd tjkrt|ƒ}|d }n|}| j |¡ ztƒ }| j |¡ W d S  tys } z<dt|ƒv s?dt|ƒv rId t	fW  Y d }~S dt|ƒv rYd t
fW  Y d }~S t d| jt|ƒf ¡ d t
fW  Y d }~S d }~ww )	NÚBr+   r   ÚResponseTokenÚnca_s_op_rng_errorÚRPC_E_INVALID_HEADERÚrpc_s_access_deniedz(Unexpected rpc code received from %s: %s)r   r   ÚSPNEGO_NEG_TOKEN_RESPrz   rW   rX   Úrequestr   Ústrr   r   r   rq   rj   )r'   ÚauthenticateMessageBlobÚserverChallengeÚ
respToken2r8   ÚreqÚer"   r"   r#   ÚsendAuth¸   s"   
€ùzRPCRelayClient.sendAuthc                 C   s&   | j d ur| j  ¡  ¡  d | _ d S d S r%   )rz   Úget_rpc_transportÚ
disconnect)r'   r"   r"   r#   ÚkillConnectionÍ   s   

þzRPCRelayClient.killConnectionc              
   C   sZ   zt ƒ }| j |¡ W d S  ty, } zdt|ƒvs dt|ƒvr!‚ W Y d }~d S d }~ww )Nr„   r…   )rX   rz   rˆ   r   r‰   )r'   r�   rŽ   r"   r"   r#   Ú	keepAliveÒ   s   ÿ€ÿzRPCRelayClient.keepAlive)NTr%   )
r   r    r!   ÚPLUGIN_NAMEr&   r~   r�   r�   r’   r“   r"   r"   r"   r#   r   |   s    

N)*Ústructr   Úimpacketr   Ú$impacket.examples.ntlmrelayx.clientsr   Úimpacket.nt_errorsr   r   Úimpacket.ntlmr   Úimpacket.spnegor   Úimpacket.dcerpc.v5r	   r
   r   r   r   Úimpacket.dcerpc.v5.ndrr   Úimpacket.dcerpc.v5.rpcrtr   r   r   r   r   r   r   r   r   r   r   r   r   r   ÚPROTOCOL_CLIENT_CLASSÚ	Exceptionr   r$   rX   r   r"   r"   r"   r#   Ú<module>   s   @S